@@ -1250,6 +1250,17 @@ void PBR_Renderer::CreateSignature()
12501250 }
12511251
12521252 CreateCustomSignature (std::move (SignatureDesc));
1253+
1254+ if (m_Settings.OITLayerCount > 0 )
1255+ {
1256+ PipelineResourceSignatureDescX OITLayersSignDesc{" RW OIT Layers" };
1257+ OITLayersSignDesc
1258+ .SetBindingIndex (static_cast <Uint8>(m_ResourceSignatures.size ()))
1259+ .SetUseCombinedTextureSamplers (m_Device.GetDeviceInfo ().IsGLDevice ())
1260+ .AddResource (SHADER_TYPE_PIXEL, " g_rwOITLayers" , SHADER_RESOURCE_TYPE_BUFFER_UAV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE);
1261+ m_RWOITLayersSignature = m_Device.CreatePipelineResourceSignature (OITLayersSignDesc);
1262+ VERIFY_EXPR (m_RWOITLayersSignature);
1263+ }
12531264}
12541265
12551266void PBR_Renderer::CreateCustomSignature (PipelineResourceSignatureDescX&& SignatureDesc)
@@ -1861,6 +1872,12 @@ void PBR_Renderer::CreatePSO(PsoHashMapType& PsoHashMap,
18611872 Macros.Add (" USE_GL_POINT_SIZE" , " 1" );
18621873 }
18631874
1875+ const Uint32 OITLayerCount = (Key.GetType () == RenderPassType::OITLayers) ||
1876+ (Key.GetType () == RenderPassType::Main && Key.GetAlphaMode () == ALPHA_MODE_BLEND) ?
1877+ m_Settings.OITLayerCount :
1878+ 0 ;
1879+ Macros.Add (" NUM_OIT_LAYERS" , static_cast <int >(OITLayerCount));
1880+
18641881 const bool UseCombinedSamplers = m_Device.GetDeviceInfo ().IsGLDevice ();
18651882
18661883 const SHADER_COMPILE_FLAGS ShaderCompileFlags =
@@ -1970,14 +1987,24 @@ void PBR_Renderer::CreatePSO(PsoHashMapType& PsoHashMap,
19701987 pPS = m_Device.CreateShader (ShaderCI);
19711988 }
19721989
1973- GraphicsPipeline = GraphicsDesc;
1990+ GraphicsPipeline = GraphicsDesc;
1991+ if (Key.GetType () == RenderPassType::OITLayers)
1992+ {
1993+ GraphicsPipeline.DepthStencilDesc .DepthWriteEnable = False;
1994+ }
1995+
19741996 GraphicsPipeline.InputLayout = InputLayout;
19751997
19761998 IPipelineResourceSignature* ppSignatures[MAX_RESOURCE_SIGNATURES];
19771999 for (size_t i = 0 ; i < m_ResourceSignatures.size (); ++i)
19782000 ppSignatures[i] = m_ResourceSignatures[i];
19792001 PSOCreateInfo.ppResourceSignatures = ppSignatures;
19802002 PSOCreateInfo.ResourceSignaturesCount = static_cast <Uint32>(m_ResourceSignatures.size ());
2003+ if (Key.GetType () == RenderPassType::OITLayers)
2004+ {
2005+ ppSignatures[PSOCreateInfo.ResourceSignaturesCount ] = m_RWOITLayersSignature;
2006+ ++PSOCreateInfo.ResourceSignaturesCount ;
2007+ }
19812008
19822009 PSOCreateInfo.pVS = pVS;
19832010 PSOCreateInfo.pPS = pPS;
@@ -2193,8 +2220,21 @@ void PBR_Renderer::CreateClearOITLayersSRB(IBuffer* pFrameAttribs, IBuffer* OITL
21932220
21942221 m_ClearOITLayersPSO->CreateShaderResourceBinding (ppSRB, true );
21952222 VERIFY_EXPR (*ppSRB);
2196- (*ppSRB)->GetVariableByName (SHADER_TYPE_COMPUTE, " cbFrameAttribs" )->Set (pFrameAttribs);
2197- (*ppSRB)->GetVariableByName (SHADER_TYPE_COMPUTE, " g_rwOITLayers" )->Set (OITLayers->GetDefaultView (BUFFER_VIEW_UNORDERED_ACCESS));
2223+ ShaderResourceVariableX{*ppSRB, SHADER_TYPE_COMPUTE, " cbFrameAttribs" }.Set (pFrameAttribs);
2224+ ShaderResourceVariableX{*ppSRB, SHADER_TYPE_COMPUTE, " g_rwOITLayers" }.Set (OITLayers->GetDefaultView (BUFFER_VIEW_UNORDERED_ACCESS));
2225+ }
2226+
2227+ void PBR_Renderer::CreateRWOITLayersSRB (IBuffer* OITLayers, IShaderResourceBinding** ppSRB) const
2228+ {
2229+ if (!m_RWOITLayersSignature)
2230+ {
2231+ LOG_ERROR_MESSAGE (" RW OIT Layers signature is not initialized" );
2232+ return ;
2233+ }
2234+
2235+ m_RWOITLayersSignature->CreateShaderResourceBinding (ppSRB, true );
2236+ VERIFY_EXPR (*ppSRB);
2237+ ShaderResourceVariableX{*ppSRB, SHADER_TYPE_PIXEL, " g_rwOITLayers" }.Set (OITLayers->GetDefaultView (BUFFER_VIEW_UNORDERED_ACCESS));
21982238}
21992239
22002240void PBR_Renderer::ClearOITLayers (IDeviceContext* pCtx, IShaderResourceBinding* pSRB, Uint32 Width, Uint32 Height) const
0 commit comments