@@ -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