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);
@ -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"(