Tests/ComputeTest: Reload pipeline on main thread

This commit is contained in:
SirLynix 2023-01-01 19:49:46 +01:00
parent a8b6d9cb42
commit 6ac94bdf4a
1 changed files with 50 additions and 51 deletions

View File

@ -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);
@ -109,20 +117,11 @@ 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; std::cout << moduleName << " has been updated" << std::endl;
newComputePipeline = BuildComputePipeline(*device, computePipelineLayout, moduleResolver);
hasNewPipeline = true; 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)
{ {
try
{
hasNewPipeline = false;
std::shared_ptr<Nz::ComputePipeline> newComputePipeline = BuildComputePipeline(*device, computePipelineLayout, moduleResolver);
frame.PushForRelease(std::move(computePipeline)); frame.PushForRelease(std::move(computePipeline));
computePipeline = std::move(newComputePipeline); computePipeline = std::move(newComputePipeline);
hasNewPipeline = false; }
catch (const std::exception& e)
{
std::cerr << e.what() << std::endl;
}
} }
const Nz::RenderTarget* windowRT = window.GetRenderTarget(); const Nz::RenderTarget* windowRT = window.GetRenderTarget();
@ -224,8 +231,6 @@ 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"); nzsl::Ast::ModulePtr shaderModule = moduleResolver->Resolve("Compute.Sepia");
if (!shaderModule) if (!shaderModule)
{ {
@ -255,12 +260,6 @@ std::shared_ptr<Nz::ComputePipeline> BuildComputePipeline(Nz::RenderDevice& devi
} }
return pipeline; return pipeline;
}
catch (const std::exception& e)
{
std::cerr << e.what() << std::endl;
std::abort();
}
} }
const char fragVertSource[] = R"( const char fragVertSource[] = R"(