Tests/ComputeTest: Reload pipeline on main thread
This commit is contained in:
parent
a8b6d9cb42
commit
6ac94bdf4a
|
|
@ -86,8 +86,16 @@ int main()
|
||||||
std::shared_ptr<nzsl::FilesystemModuleResolver> moduleResolver = std::make_shared<nzsl::FilesystemModuleResolver>();
|
std::shared_ptr<nzsl::FilesystemModuleResolver> moduleResolver = std::make_shared<nzsl::FilesystemModuleResolver>();
|
||||||
moduleResolver->RegisterModuleDirectory(resourceDir / "../shaders/", true);
|
moduleResolver->RegisterModuleDirectory(resourceDir / "../shaders/", true);
|
||||||
|
|
||||||
std::shared_ptr<Nz::ComputePipeline> computePipeline = BuildComputePipeline(*device, computePipelineLayout, moduleResolver);
|
std::shared_ptr<Nz::ComputePipeline> computePipeline;
|
||||||
std::shared_ptr<Nz::ComputePipeline> newComputePipeline;
|
try
|
||||||
|
{
|
||||||
|
computePipeline = BuildComputePipeline(*device, computePipelineLayout, moduleResolver);
|
||||||
|
}
|
||||||
|
catch (const std::exception& e)
|
||||||
|
{
|
||||||
|
std::cerr << "failed to compile compute shaders: " << e.what() << std::endl;
|
||||||
|
std::abort();
|
||||||
|
}
|
||||||
std::atomic_bool hasNewPipeline = false;
|
std::atomic_bool hasNewPipeline = false;
|
||||||
|
|
||||||
std::shared_ptr<Nz::ShaderBinding> computeBinding = computePipelineLayout->AllocateShaderBinding(0);
|
std::shared_ptr<Nz::ShaderBinding> computeBinding = computePipelineLayout->AllocateShaderBinding(0);
|
||||||
|
|
@ -107,22 +115,13 @@ int main()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
moduleResolver->OnModuleUpdated.Connect([&](nzsl::ModuleResolver*, const std::string& moduleName)
|
moduleResolver->OnModuleUpdated.Connect([&](nzsl::ModuleResolver*, const std::string& moduleName)
|
||||||
{
|
{
|
||||||
try
|
std::cout << moduleName << " has been updated" << std::endl;
|
||||||
{
|
hasNewPipeline = true;
|
||||||
std::cout << moduleName << " has been updated" << std::endl;
|
|
||||||
newComputePipeline = BuildComputePipeline(*device, computePipelineLayout, moduleResolver);
|
|
||||||
hasNewPipeline = true;
|
|
||||||
}
|
|
||||||
catch (const std::exception& e)
|
|
||||||
{
|
|
||||||
std::cerr << e.what() << std::endl;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
std::string windowTitle = "Compute test";
|
std::string windowTitle = "Compute test";
|
||||||
|
|
||||||
Nz::RenderWindow window;
|
Nz::RenderWindow window;
|
||||||
|
|
@ -156,9 +155,17 @@ int main()
|
||||||
|
|
||||||
if (hasNewPipeline)
|
if (hasNewPipeline)
|
||||||
{
|
{
|
||||||
frame.PushForRelease(std::move(computePipeline));
|
try
|
||||||
computePipeline = std::move(newComputePipeline);
|
{
|
||||||
hasNewPipeline = false;
|
hasNewPipeline = false;
|
||||||
|
std::shared_ptr<Nz::ComputePipeline> newComputePipeline = BuildComputePipeline(*device, computePipelineLayout, moduleResolver);
|
||||||
|
frame.PushForRelease(std::move(computePipeline));
|
||||||
|
computePipeline = std::move(newComputePipeline);
|
||||||
|
}
|
||||||
|
catch (const std::exception& e)
|
||||||
|
{
|
||||||
|
std::cerr << e.what() << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const Nz::RenderTarget* windowRT = window.GetRenderTarget();
|
const Nz::RenderTarget* windowRT = window.GetRenderTarget();
|
||||||
|
|
@ -224,43 +231,35 @@ int main()
|
||||||
|
|
||||||
std::shared_ptr<Nz::ComputePipeline> BuildComputePipeline(Nz::RenderDevice& device, std::shared_ptr<Nz::RenderPipelineLayout> pipelineLayout, std::shared_ptr<nzsl::ModuleResolver> moduleResolver)
|
std::shared_ptr<Nz::ComputePipeline> BuildComputePipeline(Nz::RenderDevice& device, std::shared_ptr<Nz::RenderPipelineLayout> pipelineLayout, std::shared_ptr<nzsl::ModuleResolver> moduleResolver)
|
||||||
{
|
{
|
||||||
try
|
nzsl::Ast::ModulePtr shaderModule = moduleResolver->Resolve("Compute.Sepia");
|
||||||
|
if (!shaderModule)
|
||||||
{
|
{
|
||||||
nzsl::Ast::ModulePtr shaderModule = moduleResolver->Resolve("Compute.Sepia");
|
std::cout << "Failed to parse shader module" << std::endl;
|
||||||
if (!shaderModule)
|
|
||||||
{
|
|
||||||
std::cout << "Failed to parse shader module" << std::endl;
|
|
||||||
std::abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
nzsl::ShaderWriter::States states;
|
|
||||||
states.optimize = true;
|
|
||||||
|
|
||||||
auto computeShader = device.InstantiateShaderModule(nzsl::ShaderStageType::Compute, *shaderModule, states);
|
|
||||||
if (!computeShader)
|
|
||||||
{
|
|
||||||
std::cout << "Failed to instantiate shader" << std::endl;
|
|
||||||
std::abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
Nz::ComputePipelineInfo computePipelineInfo;
|
|
||||||
computePipelineInfo.pipelineLayout = pipelineLayout;
|
|
||||||
computePipelineInfo.shaderModule = computeShader;
|
|
||||||
|
|
||||||
std::shared_ptr<Nz::ComputePipeline> pipeline = device.InstantiateComputePipeline(computePipelineInfo);
|
|
||||||
if (!pipeline)
|
|
||||||
{
|
|
||||||
std::cout << "Failed to instantiate compute pipeline" << std::endl;
|
|
||||||
std::abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
return pipeline;
|
|
||||||
}
|
|
||||||
catch (const std::exception& e)
|
|
||||||
{
|
|
||||||
std::cerr << e.what() << std::endl;
|
|
||||||
std::abort();
|
std::abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nzsl::ShaderWriter::States states;
|
||||||
|
states.optimize = true;
|
||||||
|
|
||||||
|
auto computeShader = device.InstantiateShaderModule(nzsl::ShaderStageType::Compute, *shaderModule, states);
|
||||||
|
if (!computeShader)
|
||||||
|
{
|
||||||
|
std::cout << "Failed to instantiate shader" << std::endl;
|
||||||
|
std::abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
Nz::ComputePipelineInfo computePipelineInfo;
|
||||||
|
computePipelineInfo.pipelineLayout = pipelineLayout;
|
||||||
|
computePipelineInfo.shaderModule = computeShader;
|
||||||
|
|
||||||
|
std::shared_ptr<Nz::ComputePipeline> pipeline = device.InstantiateComputePipeline(computePipelineInfo);
|
||||||
|
if (!pipeline)
|
||||||
|
{
|
||||||
|
std::cout << "Failed to instantiate compute pipeline" << std::endl;
|
||||||
|
std::abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
return pipeline;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char fragVertSource[] = R"(
|
const char fragVertSource[] = R"(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue