Skip to content

Commit ef23750

Browse files
committed
More robust SpecializationConstants_DistinctEntries.
1 parent b6aa8a4 commit ef23750

1 file changed

Lines changed: 84 additions & 71 deletions

File tree

Tests/DiligentCoreAPITest/src/RenderStateCacheTest.cpp

Lines changed: 84 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -2075,88 +2075,101 @@ TEST(RenderStateCacheTest, SpecializationConstants_DistinctEntries)
20752075

20762076
GPUTestingEnvironment::ScopedReset AutoReset;
20772077

2078-
auto pCache = CreateCache(pDevice, /*HotReload=*/false);
2079-
ASSERT_TRUE(pCache);
2080-
2081-
// Create shaders
2082-
ShaderCreateInfo ShaderCI;
2083-
ShaderCI.SourceLanguage = SHADER_SOURCE_LANGUAGE_HLSL;
2084-
ShaderCI.ShaderCompiler = pEnv->GetDefaultCompiler(ShaderCI.SourceLanguage);
2085-
2086-
RefCntAutoPtr<IShader> pVS, pPS;
2087-
{
2088-
ShaderCI.Desc = {"SpecConst Distinct VS", SHADER_TYPE_VERTEX, true};
2089-
ShaderCI.EntryPoint = "main";
2090-
ShaderCI.Source = HLSL::DrawTest_ProceduralTriangleVS.c_str();
2091-
CreateShader(pCache, ShaderCI, false, pVS);
2092-
ASSERT_TRUE(pVS);
2093-
}
2094-
{
2095-
ShaderCI.Desc = {"SpecConst Distinct PS", SHADER_TYPE_PIXEL, true};
2096-
ShaderCI.EntryPoint = "main";
2097-
ShaderCI.Source = HLSL::DrawTest_PS.c_str();
2098-
CreateShader(pCache, ShaderCI, false, pPS);
2099-
ASSERT_TRUE(pPS);
2100-
}
2101-
21022078
auto* pSwapChain = pEnv->GetSwapChain();
21032079

2104-
auto CreatePSO = [&](const SpecializationConstant* pSpecConsts,
2105-
Uint32 NumSpecConsts,
2106-
bool PresentInCache) -> RefCntAutoPtr<IPipelineState> {
2107-
GraphicsPipelineStateCreateInfo PsoCI;
2108-
PsoCI.PSODesc.Name = "Spec Const Distinct Test";
2109-
2110-
PsoCI.pVS = pVS;
2111-
PsoCI.pPS = pPS;
2112-
2113-
PsoCI.GraphicsPipeline.NumRenderTargets = 1;
2114-
PsoCI.GraphicsPipeline.RTVFormats[0] = pSwapChain->GetDesc().ColorBufferFormat;
2115-
PsoCI.GraphicsPipeline.DepthStencilDesc.DepthEnable = False;
2116-
2117-
PsoCI.pSpecializationConstants = pSpecConsts;
2118-
PsoCI.NumSpecializationConstants = NumSpecConsts;
2119-
2120-
RefCntAutoPtr<IPipelineState> pPSO;
2121-
bool PSOFound = pCache->CreateGraphicsPipelineState(PsoCI, &pPSO);
2122-
EXPECT_EQ(PSOFound, PresentInCache);
2123-
return pPSO;
2124-
};
2125-
2126-
// Create PSO with value A
21272080
const float ValueA = 1.0f;
21282081
SpecializationConstant SpecConstsA[] = {
21292082
{"TestConstant", SHADER_TYPE_VERTEX, sizeof(ValueA), &ValueA},
21302083
};
2131-
auto pPSO_A = CreatePSO(SpecConstsA, _countof(SpecConstsA), false);
2132-
ASSERT_NE(pPSO_A, nullptr);
2133-
ASSERT_EQ(pPSO_A->GetStatus(), PIPELINE_STATE_STATUS_READY);
21342084

2135-
// Create PSO with value B (different value, same name)
21362085
const float ValueB = 2.0f;
21372086
SpecializationConstant SpecConstsB[] = {
21382087
{"TestConstant", SHADER_TYPE_VERTEX, sizeof(ValueB), &ValueB},
21392088
};
2140-
auto pPSO_B = CreatePSO(SpecConstsB, _countof(SpecConstsB), false);
2141-
ASSERT_NE(pPSO_B, nullptr);
2142-
ASSERT_EQ(pPSO_B->GetStatus(), PIPELINE_STATE_STATUS_READY);
2143-
2144-
// PSOs must be different objects (different spec constant values => different hash)
2145-
EXPECT_NE(pPSO_A, pPSO_B);
2146-
2147-
// Request PSO A again - should find exact match in cache
2148-
auto pPSO_A2 = CreatePSO(SpecConstsA, _countof(SpecConstsA), true);
2149-
EXPECT_EQ(pPSO_A, pPSO_A2);
2150-
2151-
// Request PSO B again - should find exact match in cache
2152-
auto pPSO_B2 = CreatePSO(SpecConstsB, _countof(SpecConstsB), true);
2153-
EXPECT_EQ(pPSO_B, pPSO_B2);
2154-
2155-
// A PSO with no spec constants must also be distinct from both A and B
2156-
auto pPSO_None = CreatePSO(nullptr, 0, false);
2157-
ASSERT_NE(pPSO_None, nullptr);
2158-
EXPECT_NE(pPSO_None, pPSO_A);
2159-
EXPECT_NE(pPSO_None, pPSO_B);
2089+
2090+
RefCntAutoPtr<IDataBlob> pData;
2091+
for (Uint32 pass = 0; pass < 3; ++pass)
2092+
{
2093+
// 0: empty cache
2094+
// 1: loaded cache
2095+
// 2: reloaded cache (loaded -> stored -> loaded)
2096+
2097+
auto pCache = CreateCache(pDevice, /*HotReload=*/false, pData);
2098+
ASSERT_TRUE(pCache);
2099+
2100+
// Create shaders
2101+
ShaderCreateInfo ShaderCI;
2102+
ShaderCI.SourceLanguage = SHADER_SOURCE_LANGUAGE_HLSL;
2103+
ShaderCI.ShaderCompiler = pEnv->GetDefaultCompiler(ShaderCI.SourceLanguage);
2104+
2105+
RefCntAutoPtr<IShader> pVS, pPS;
2106+
{
2107+
ShaderCI.Desc = {"SpecConst Distinct VS", SHADER_TYPE_VERTEX, true};
2108+
ShaderCI.EntryPoint = "main";
2109+
ShaderCI.Source = HLSL::DrawTest_ProceduralTriangleVS.c_str();
2110+
CreateShader(pCache, ShaderCI, pData != nullptr, pVS);
2111+
ASSERT_TRUE(pVS);
2112+
}
2113+
{
2114+
ShaderCI.Desc = {"SpecConst Distinct PS", SHADER_TYPE_PIXEL, true};
2115+
ShaderCI.EntryPoint = "main";
2116+
ShaderCI.Source = HLSL::DrawTest_PS.c_str();
2117+
CreateShader(pCache, ShaderCI, pData != nullptr, pPS);
2118+
ASSERT_TRUE(pPS);
2119+
}
2120+
2121+
auto CreatePSO = [&](const SpecializationConstant* pSpecConsts,
2122+
Uint32 NumSpecConsts,
2123+
bool PresentInCache) -> RefCntAutoPtr<IPipelineState> {
2124+
GraphicsPipelineStateCreateInfo PsoCI;
2125+
PsoCI.PSODesc.Name = "Spec Const Distinct Test";
2126+
2127+
PsoCI.pVS = pVS;
2128+
PsoCI.pPS = pPS;
2129+
2130+
PsoCI.GraphicsPipeline.NumRenderTargets = 1;
2131+
PsoCI.GraphicsPipeline.RTVFormats[0] = pSwapChain->GetDesc().ColorBufferFormat;
2132+
PsoCI.GraphicsPipeline.DepthStencilDesc.DepthEnable = False;
2133+
2134+
PsoCI.pSpecializationConstants = pSpecConsts;
2135+
PsoCI.NumSpecializationConstants = NumSpecConsts;
2136+
2137+
RefCntAutoPtr<IPipelineState> pPSO;
2138+
bool PSOFound = pCache->CreateGraphicsPipelineState(PsoCI, &pPSO);
2139+
EXPECT_EQ(PSOFound, PresentInCache);
2140+
return pPSO;
2141+
};
2142+
2143+
// Create PSO with value A
2144+
auto pPSO_A = CreatePSO(SpecConstsA, _countof(SpecConstsA), pData != nullptr);
2145+
ASSERT_NE(pPSO_A, nullptr);
2146+
ASSERT_EQ(pPSO_A->GetStatus(), PIPELINE_STATE_STATUS_READY);
2147+
2148+
// Create PSO with value B (different value, same name)
2149+
auto pPSO_B = CreatePSO(SpecConstsB, _countof(SpecConstsB), pData != nullptr);
2150+
ASSERT_NE(pPSO_B, nullptr);
2151+
ASSERT_EQ(pPSO_B->GetStatus(), PIPELINE_STATE_STATUS_READY);
2152+
2153+
// PSOs must be different objects (different spec constant values => different hash)
2154+
EXPECT_NE(pPSO_A, pPSO_B);
2155+
2156+
// Request PSO A again - should find exact match in cache
2157+
auto pPSO_A2 = CreatePSO(SpecConstsA, _countof(SpecConstsA), true);
2158+
EXPECT_EQ(pPSO_A, pPSO_A2);
2159+
2160+
// Request PSO B again - should find exact match in cache
2161+
auto pPSO_B2 = CreatePSO(SpecConstsB, _countof(SpecConstsB), true);
2162+
EXPECT_EQ(pPSO_B, pPSO_B2);
2163+
2164+
// A PSO with no spec constants must also be distinct from both A and B
2165+
auto pPSO_None = CreatePSO(nullptr, 0, pData != nullptr);
2166+
ASSERT_NE(pPSO_None, nullptr);
2167+
EXPECT_NE(pPSO_None, pPSO_A);
2168+
EXPECT_NE(pPSO_None, pPSO_B);
2169+
2170+
pData.Release();
2171+
pCache->WriteToBlob(pass == 0 ? ContentVersion : ~0u, &pData);
2172+
}
21602173
}
21612174

21622175
} // namespace

0 commit comments

Comments
 (0)