mirror of
https://bitbucket.org/CPMADevs/cnq3
synced 2025-02-17 01:11:20 +00:00
fixed CRP PSO caches running out of memory
This commit is contained in:
parent
0e692f6fed
commit
68c28996e1
6 changed files with 22 additions and 17 deletions
|
@ -157,9 +157,10 @@ int PSOCache::AddPipeline(const GraphicsPipelineDesc& desc, const char* name)
|
||||||
GraphicsPipelineDesc namedDesc = desc;
|
GraphicsPipelineDesc namedDesc = desc;
|
||||||
namedDesc.name = name;
|
namedDesc.name = name;
|
||||||
|
|
||||||
|
// @NOTE: we keep the original desc and its padding bytes for proper comparison results
|
||||||
const uint32_t index = entryCount++;
|
const uint32_t index = entryCount++;
|
||||||
Entry& entry = entries[index];
|
Entry& entry = entries[index];
|
||||||
entry.desc = desc; // keep the original desc for proper comparison results
|
memcpy(&entry.desc, &desc, sizeof(entry.desc));
|
||||||
entry.handle = CreateGraphicsPipeline(namedDesc);
|
entry.handle = CreateGraphicsPipeline(namedDesc);
|
||||||
|
|
||||||
return (int)index;
|
return (int)index;
|
||||||
|
|
|
@ -168,14 +168,13 @@ void WorldOpaque::ProcessShader(shader_t& shader)
|
||||||
const unsigned int stateBits = stage.stateBits & (~GLS_POLYMODE_LINE);
|
const unsigned int stateBits = stage.stateBits & (~GLS_POLYMODE_LINE);
|
||||||
int a = 0;
|
int a = 0;
|
||||||
|
|
||||||
// @NOTE: we are not using any CTOR because we deliberately want to 0-init the struct
|
// @NOTE: we 0-init the struct so that padding bytes don't mess up comparisons in the PSO cache
|
||||||
// this is necessary for padding bytes not to mess up comparisons in the PSO cache
|
|
||||||
GraphicsPipelineDesc desc = {};
|
GraphicsPipelineDesc desc = {};
|
||||||
desc.name = "opaque";
|
desc.name = "opaque";
|
||||||
desc.rootSignature = RHI_MAKE_NULL_HANDLE();
|
desc.rootSignature = RHI_MAKE_NULL_HANDLE();
|
||||||
desc.shortLifeTime = true; // the PSO cache is only valid for this map!
|
desc.shortLifeTime = true; // the PSO cache is only valid for this map!
|
||||||
desc.vertexShader = g_opaque_vs;
|
desc.vertexShader.Set(g_opaque_vs);
|
||||||
desc.pixelShader = g_opaque_ps;
|
desc.pixelShader.Set(g_opaque_ps);
|
||||||
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::Position, DataType::Float32, 3, 0);
|
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::Position, DataType::Float32, 3, 0);
|
||||||
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::Normal, DataType::Float32, 3, 0);
|
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::Normal, DataType::Float32, 3, 0);
|
||||||
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::TexCoord, DataType::Float32, 2, 0);
|
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::TexCoord, DataType::Float32, 2, 0);
|
||||||
|
|
|
@ -169,14 +169,13 @@ void Prepass::ProcessShader(shader_t& shader)
|
||||||
Q_assert((stateBits & GLS_DEPTHFUNC_EQUAL) == 0); // depth comparison GE
|
Q_assert((stateBits & GLS_DEPTHFUNC_EQUAL) == 0); // depth comparison GE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// @NOTE: we are not using any CTOR because we deliberately want to 0-init the struct
|
// @NOTE: we 0-init the struct so that padding bytes don't mess up comparisons in the PSO cache
|
||||||
// this is necessary for padding bytes not to mess up comparisons in the PSO cache
|
|
||||||
GraphicsPipelineDesc desc = {};
|
GraphicsPipelineDesc desc = {};
|
||||||
desc.name = "pre-pass";
|
desc.name = "pre-pass";
|
||||||
desc.rootSignature = RHI_MAKE_NULL_HANDLE();
|
desc.rootSignature = RHI_MAKE_NULL_HANDLE();
|
||||||
desc.shortLifeTime = true; // the PSO cache is only valid for this map!
|
desc.shortLifeTime = true; // the PSO cache is only valid for this map!
|
||||||
desc.vertexShader = g_prepass_vs;
|
desc.vertexShader.Set(g_prepass_vs);
|
||||||
desc.pixelShader = g_prepass_ps;
|
desc.pixelShader.Set(g_prepass_ps);
|
||||||
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::Position, DataType::Float32, 3, 0);
|
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::Position, DataType::Float32, 3, 0);
|
||||||
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::Normal, DataType::Float32, 3, 0);
|
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::Normal, DataType::Float32, 3, 0);
|
||||||
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::TexCoord, DataType::Float32, 2, 0);
|
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::TexCoord, DataType::Float32, 2, 0);
|
||||||
|
|
|
@ -185,14 +185,13 @@ void WorldTransp::ProcessShader(shader_t& shader)
|
||||||
{
|
{
|
||||||
int a = 0;
|
int a = 0;
|
||||||
|
|
||||||
// @NOTE: we are not using any CTOR because we deliberately want to 0-init the struct
|
// @NOTE: we 0-init the struct so that padding bytes don't mess up comparisons in the PSO cache
|
||||||
// this is necessary for padding bytes not to mess up comparisons in the PSO cache
|
|
||||||
GraphicsPipelineDesc desc = {};
|
GraphicsPipelineDesc desc = {};
|
||||||
desc.name = "transp";
|
desc.name = "transp";
|
||||||
desc.rootSignature = RHI_MAKE_NULL_HANDLE();
|
desc.rootSignature = RHI_MAKE_NULL_HANDLE();
|
||||||
desc.shortLifeTime = true; // the PSO cache is only valid for this map!
|
desc.shortLifeTime = true; // the PSO cache is only valid for this map!
|
||||||
desc.vertexShader = g_transp_draw_vs;
|
desc.vertexShader.Set(g_transp_draw_vs);
|
||||||
desc.pixelShader = g_transp_draw_ps;
|
desc.pixelShader.Set(g_transp_draw_ps);
|
||||||
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::Position, DataType::Float32, 3, 0);
|
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::Position, DataType::Float32, 3, 0);
|
||||||
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::Normal, DataType::Float32, 3, 0);
|
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::Normal, DataType::Float32, 3, 0);
|
||||||
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::TexCoord, DataType::Float32, 2, 0);
|
desc.vertexLayout.AddAttribute(a++, ShaderSemantic::TexCoord, DataType::Float32, 2, 0);
|
||||||
|
|
|
@ -4139,13 +4139,13 @@ namespace RHI
|
||||||
{
|
{
|
||||||
ASSERT_DR_DISABLED();
|
ASSERT_DR_DISABLED();
|
||||||
|
|
||||||
RootSignature rhiSignature = { 0 };
|
RootSignature rhiSignature = {};
|
||||||
rhiSignature.genericTableIndex = UINT32_MAX;
|
rhiSignature.genericTableIndex = UINT32_MAX;
|
||||||
rhiSignature.samplerTableIndex = UINT32_MAX;
|
rhiSignature.samplerTableIndex = UINT32_MAX;
|
||||||
rhiSignature.genericDescCount = 0;
|
rhiSignature.genericDescCount = 0;
|
||||||
rhiSignature.samplerDescCount = rhiDesc.samplerCount;
|
rhiSignature.samplerDescCount = rhiDesc.samplerCount;
|
||||||
|
|
||||||
bool shaderVis[ShaderStage::Count] = { 0 };
|
bool shaderVis[ShaderStage::Count] = {};
|
||||||
|
|
||||||
//
|
//
|
||||||
// root constants
|
// root constants
|
||||||
|
|
|
@ -262,7 +262,7 @@ namespace RHI
|
||||||
struct RootSignatureDesc
|
struct RootSignatureDesc
|
||||||
{
|
{
|
||||||
RootSignatureDesc() = default;
|
RootSignatureDesc() = default;
|
||||||
RootSignatureDesc(const char* name_)
|
explicit RootSignatureDesc(const char* name_)
|
||||||
{
|
{
|
||||||
name = name_;
|
name = name_;
|
||||||
}
|
}
|
||||||
|
@ -308,7 +308,14 @@ namespace RHI
|
||||||
}
|
}
|
||||||
|
|
||||||
template<uint32_t N>
|
template<uint32_t N>
|
||||||
ShaderByteCode(const uint8_t (&byteCode)[N])
|
explicit ShaderByteCode(const uint8_t (&byteCode)[N])
|
||||||
|
{
|
||||||
|
data = byteCode;
|
||||||
|
byteCount = N;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<uint32_t N>
|
||||||
|
void Set(const uint8_t (&byteCode)[N])
|
||||||
{
|
{
|
||||||
data = byteCode;
|
data = byteCode;
|
||||||
byteCount = N;
|
byteCount = N;
|
||||||
|
|
Loading…
Reference in a new issue