From 6ac94bdf4a722ee9cce71e2ed56f15aba5a3bc49 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Sun, 1 Jan 2023 19:49:46 +0100 Subject: [PATCH] Tests/ComputeTest: Reload pipeline on main thread --- tests/ComputeTest/main.cpp | 101 ++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 51 deletions(-) diff --git a/tests/ComputeTest/main.cpp b/tests/ComputeTest/main.cpp index 4790dbf4f..970c76c89 100644 --- a/tests/ComputeTest/main.cpp +++ b/tests/ComputeTest/main.cpp @@ -86,8 +86,16 @@ int main() std::shared_ptr moduleResolver = std::make_shared(); moduleResolver->RegisterModuleDirectory(resourceDir / "../shaders/", true); - std::shared_ptr computePipeline = BuildComputePipeline(*device, computePipelineLayout, moduleResolver); - std::shared_ptr newComputePipeline; + std::shared_ptr computePipeline; + 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::shared_ptr computeBinding = computePipelineLayout->AllocateShaderBinding(0); @@ -107,22 +115,13 @@ int main() } } }); - + moduleResolver->OnModuleUpdated.Connect([&](nzsl::ModuleResolver*, const std::string& moduleName) { - try - { - 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::cout << moduleName << " has been updated" << std::endl; + hasNewPipeline = true; }); - std::string windowTitle = "Compute test"; Nz::RenderWindow window; @@ -156,9 +155,17 @@ int main() if (hasNewPipeline) { - frame.PushForRelease(std::move(computePipeline)); - computePipeline = std::move(newComputePipeline); - hasNewPipeline = false; + try + { + hasNewPipeline = false; + std::shared_ptr 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(); @@ -224,43 +231,35 @@ int main() std::shared_ptr BuildComputePipeline(Nz::RenderDevice& device, std::shared_ptr pipelineLayout, std::shared_ptr moduleResolver) { - try + nzsl::Ast::ModulePtr shaderModule = moduleResolver->Resolve("Compute.Sepia"); + if (!shaderModule) { - nzsl::Ast::ModulePtr shaderModule = moduleResolver->Resolve("Compute.Sepia"); - 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 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::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 pipeline = device.InstantiateComputePipeline(computePipelineInfo); + if (!pipeline) + { + std::cout << "Failed to instantiate compute pipeline" << std::endl; + std::abort(); + } + + return pipeline; } const char fragVertSource[] = R"(