From cf23af4d260b8ed49838fb99243f524705bb0aab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tur=C3=A1nszki=20J=C3=A1nos?= Date: Fri, 16 Aug 2024 13:53:12 +0200 Subject: [PATCH] fix --- WickedEngine/wiRenderer.cpp | 64 ++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index c97f29dca..952a37a0a 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -1234,39 +1234,6 @@ void LoadShaders() wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { LoadShader(ShaderStage::DS, shaders[DSTYPE_OBJECT_PREPASS_ALPHATEST], "objectDS_prepass_alphatest.cso"); }); wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { LoadShader(ShaderStage::DS, shaders[DSTYPE_OBJECT_SIMPLE], "objectDS_simple.cso"); }); - if (device->CheckCapability(GraphicsDeviceCapability::MESH_SHADER)) - { - // Note: Mesh shader loading is very slow in Vulkan, so all mesh shader loading will be executed on a separate context - // and only waited by mesh shader PSO jobs, not holding back the rest of initialization - wi::jobsystem::Wait(mesh_shader_ctx); - mesh_shader_ctx.priority = wi::jobsystem::Priority::Low; - - wi::jobsystem::Execute(mesh_shader_ctx, [](wi::jobsystem::JobArgs args) { - LoadShader(ShaderStage::AS, shaders[ASTYPE_OBJECT], "objectAS.cso"); - LoadShader(ShaderStage::MS, shaders[MSTYPE_OBJECT_SIMPLE], "objectMS_simple.cso"); - - PipelineStateDesc desc; - desc.vs = &shaders[VSTYPE_OBJECT_SIMPLE]; - desc.ps = &shaders[PSTYPE_OBJECT_SIMPLE]; - desc.rs = &rasterizers[RSTYPE_WIRE]; - desc.bs = &blendStates[BSTYPE_OPAQUE]; - desc.dss = &depthStencils[DSSTYPE_DEFAULT]; - desc.pt = PrimitiveTopology::TRIANGLELIST; - desc.as = &shaders[ASTYPE_OBJECT]; - desc.ms = &shaders[MSTYPE_OBJECT_SIMPLE]; - device->CreatePipelineState(&desc, &PSO_object_wire_mesh_shader); - }); - - wi::jobsystem::Execute(mesh_shader_ctx, [](wi::jobsystem::JobArgs args) { LoadShader(ShaderStage::MS, shaders[MSTYPE_OBJECT], "objectMS.cso"); }); - wi::jobsystem::Execute(mesh_shader_ctx, [](wi::jobsystem::JobArgs args) { LoadShader(ShaderStage::MS, shaders[MSTYPE_OBJECT_PREPASS], "objectMS_prepass.cso"); }); - wi::jobsystem::Execute(mesh_shader_ctx, [](wi::jobsystem::JobArgs args) { LoadShader(ShaderStage::MS, shaders[MSTYPE_OBJECT_PREPASS_ALPHATEST], "objectMS_prepass_alphatest.cso"); }); - - wi::jobsystem::Execute(mesh_shader_ctx, [](wi::jobsystem::JobArgs args) { LoadShader(ShaderStage::MS, shaders[MSTYPE_SHADOW], "shadowMS.cso"); }); - wi::jobsystem::Execute(mesh_shader_ctx, [](wi::jobsystem::JobArgs args) { LoadShader(ShaderStage::MS, shaders[MSTYPE_SHADOW_ALPHATEST], "shadowMS_alphatest.cso"); }); - wi::jobsystem::Execute(mesh_shader_ctx, [](wi::jobsystem::JobArgs args) { LoadShader(ShaderStage::MS, shaders[MSTYPE_SHADOW_TRANSPARENT], "shadowMS_transparent.cso"); }); - - } - wi::jobsystem::Dispatch(objectps_ctx, MaterialComponent::SHADERTYPE_COUNT, 1, [](wi::jobsystem::JobArgs args) { LoadShader( @@ -1333,6 +1300,37 @@ void LoadShaders() wi::jobsystem::Wait(ctx); + if (device->CheckCapability(GraphicsDeviceCapability::MESH_SHADER)) + { + // Note: Mesh shader loading is very slow in Vulkan, so all mesh shader loading will be executed on a separate context + // and only waited by mesh shader PSO jobs, not holding back the rest of initialization + wi::jobsystem::Wait(mesh_shader_ctx); + mesh_shader_ctx.priority = wi::jobsystem::Priority::Low; + + wi::jobsystem::Execute(mesh_shader_ctx, [](wi::jobsystem::JobArgs args) { + LoadShader(ShaderStage::AS, shaders[ASTYPE_OBJECT], "objectAS.cso"); + LoadShader(ShaderStage::MS, shaders[MSTYPE_OBJECT_SIMPLE], "objectMS_simple.cso"); + + PipelineStateDesc desc; + desc.as = &shaders[ASTYPE_OBJECT]; + desc.ms = &shaders[MSTYPE_OBJECT_SIMPLE]; + desc.ps = &shaders[PSTYPE_OBJECT_SIMPLE]; // this is created in a different thread, so wait for the ctx before getting here + desc.rs = &rasterizers[RSTYPE_WIRE]; + desc.bs = &blendStates[BSTYPE_OPAQUE]; + desc.dss = &depthStencils[DSSTYPE_DEFAULT]; + desc.pt = PrimitiveTopology::TRIANGLELIST; + device->CreatePipelineState(&desc, &PSO_object_wire_mesh_shader); + }); + + wi::jobsystem::Execute(mesh_shader_ctx, [](wi::jobsystem::JobArgs args) { LoadShader(ShaderStage::MS, shaders[MSTYPE_OBJECT], "objectMS.cso"); }); + wi::jobsystem::Execute(mesh_shader_ctx, [](wi::jobsystem::JobArgs args) { LoadShader(ShaderStage::MS, shaders[MSTYPE_OBJECT_PREPASS], "objectMS_prepass.cso"); }); + wi::jobsystem::Execute(mesh_shader_ctx, [](wi::jobsystem::JobArgs args) { LoadShader(ShaderStage::MS, shaders[MSTYPE_OBJECT_PREPASS_ALPHATEST], "objectMS_prepass_alphatest.cso"); }); + + wi::jobsystem::Execute(mesh_shader_ctx, [](wi::jobsystem::JobArgs args) { LoadShader(ShaderStage::MS, shaders[MSTYPE_SHADOW], "shadowMS.cso"); }); + wi::jobsystem::Execute(mesh_shader_ctx, [](wi::jobsystem::JobArgs args) { LoadShader(ShaderStage::MS, shaders[MSTYPE_SHADOW_ALPHATEST], "shadowMS_alphatest.cso"); }); + wi::jobsystem::Execute(mesh_shader_ctx, [](wi::jobsystem::JobArgs args) { LoadShader(ShaderStage::MS, shaders[MSTYPE_SHADOW_TRANSPARENT], "shadowMS_transparent.cso"); }); + } + wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { PipelineStateDesc desc; desc.vs = &shaders[VSTYPE_OBJECT_SIMPLE];