@@ -97,6 +97,9 @@ float4 g_Colors[] = {
9797 float4{0 .f , 0 .f , 1 .f , 1 .f },
9898};
9999
100+ constexpr Uint32 kNumPosConstants = sizeof (g_Positions) / 4 ;
101+ constexpr Uint32 kNumColConstants = sizeof (g_Colors) / 4 ;
102+
100103class InlineConstants : public ::testing::Test
101104{
102105protected:
@@ -171,6 +174,13 @@ TEST_F(InlineConstants, ResourceSignature)
171174 GTEST_SKIP ();
172175 }
173176
177+ RefCntAutoPtr<IBuffer> pConstBuffer = pEnv->CreateBuffer ({" InlineConstants - dummy const buffer" , 256 , BIND_UNIFORM_BUFFER});
178+ ASSERT_TRUE (pConstBuffer);
179+ RefCntAutoPtr<ITexture> pTexture = pEnv->CreateTexture (" InlineConstants - dummy texture" , TEX_FORMAT_RGBA8_UNORM, BIND_SHADER_RESOURCE, 64 , 64 );
180+ ASSERT_TRUE (pTexture);
181+ ITextureView* pTexSRV = pTexture->GetDefaultView (TEXTURE_VIEW_SHADER_RESOURCE);
182+ ASSERT_TRUE (pTexSRV);
183+
174184 for (Uint32 pos_type = 0 ; pos_type < SHADER_RESOURCE_VARIABLE_TYPE_NUM_TYPES; ++pos_type)
175185 {
176186 for (Uint32 col_type = 0 ; col_type < SHADER_RESOURCE_VARIABLE_TYPE_NUM_TYPES; ++col_type)
@@ -183,12 +193,41 @@ TEST_F(InlineConstants, ResourceSignature)
183193
184194 PipelineResourceSignatureDescX SignDesc;
185195 SignDesc
186- .AddResource (SHADER_TYPE_VERTEX, " cbInlinePositions" , Uint32{sizeof (g_Positions) / 4 }, SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, PosType, PIPELINE_RESOURCE_FLAG_INLINE_CONSTANTS)
187- .AddResource (SHADER_TYPE_VERTEX, " cbInlineColors" , Uint32{sizeof (g_Colors) / 4 }, SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, ColType, PIPELINE_RESOURCE_FLAG_INLINE_CONSTANTS);
196+ .AddResource (SHADER_TYPE_VERTEX, " cb0_stat" , 1u , SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_STATIC)
197+ .AddResource (SHADER_TYPE_VERTEX, " cb0_mut" , 1u , SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE)
198+ .AddResource (SHADER_TYPE_VERTEX, " cb0_dyn" , 1u , SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC)
199+ .AddResource (SHADER_TYPE_VERTEX, " tex0_stat" , SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_STATIC)
200+ .AddResource (SHADER_TYPE_VERTEX, " tex0_mut" , SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE)
201+ .AddResource (SHADER_TYPE_VERTEX, " tex0_dyn" , SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC)
202+
203+ .AddResource (SHADER_TYPE_VERTEX, " cbInlinePositions" , kNumPosConstants , SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, PosType, PIPELINE_RESOURCE_FLAG_INLINE_CONSTANTS)
204+
205+ .AddResource (SHADER_TYPE_VERTEX, " cb1_stat" , 1u , SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_STATIC)
206+ .AddResource (SHADER_TYPE_VERTEX, " cb1_mut" , 1u , SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE)
207+ .AddResource (SHADER_TYPE_VERTEX, " cb1_dyn" , 1u , SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC)
208+ .AddResource (SHADER_TYPE_VERTEX, " tex1_stat" , SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_STATIC)
209+ .AddResource (SHADER_TYPE_VERTEX, " tex1_mut" , SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE)
210+ .AddResource (SHADER_TYPE_VERTEX, " tex1_dyn" , SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC)
211+
212+ .AddResource (SHADER_TYPE_VERTEX, " cbInlineColors" , kNumColConstants , SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, ColType, PIPELINE_RESOURCE_FLAG_INLINE_CONSTANTS)
213+
214+ .AddResource (SHADER_TYPE_VERTEX, " cb2_stat" , 1u , SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_STATIC)
215+ .AddResource (SHADER_TYPE_VERTEX, " cb2_mut" , 1u , SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE)
216+ .AddResource (SHADER_TYPE_VERTEX, " cb2_dyn" , 1u , SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC)
217+ .AddResource (SHADER_TYPE_VERTEX, " tex2_stat" , SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_STATIC)
218+ .AddResource (SHADER_TYPE_VERTEX, " tex2_mut" , SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE)
219+ .AddResource (SHADER_TYPE_VERTEX, " tex2_dyn" , SHADER_RESOURCE_TYPE_TEXTURE_SRV, SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC);
188220 RefCntAutoPtr<IPipelineResourceSignature> pSign;
189221 pDevice->CreatePipelineResourceSignature (SignDesc, &pSign);
190222 ASSERT_TRUE (pSign);
191223
224+ pSign->GetStaticVariableByName (SHADER_TYPE_VERTEX, " cb0_stat" )->Set (pConstBuffer);
225+ pSign->GetStaticVariableByName (SHADER_TYPE_VERTEX, " tex0_stat" )->Set (pTexSRV);
226+ pSign->GetStaticVariableByName (SHADER_TYPE_VERTEX, " cb1_stat" )->Set (pConstBuffer);
227+ pSign->GetStaticVariableByName (SHADER_TYPE_VERTEX, " tex1_stat" )->Set (pTexSRV);
228+ pSign->GetStaticVariableByName (SHADER_TYPE_VERTEX, " cb2_stat" )->Set (pConstBuffer);
229+ pSign->GetStaticVariableByName (SHADER_TYPE_VERTEX, " tex2_stat" )->Set (pTexSRV);
230+
192231 GraphicsPipelineStateCreateInfoX PsoCI{" Inline constants test" };
193232 PsoCI
194233 .AddRenderTarget (pSwapChain->GetDesc ().ColorBufferFormat )
@@ -206,44 +245,90 @@ TEST_F(InlineConstants, ResourceSignature)
206245 {
207246 IShaderResourceVariable* pVar = pSign->GetStaticVariableByName (SHADER_TYPE_VERTEX, " cbInlinePositions" );
208247 ASSERT_TRUE (pVar);
209- pVar->SetInlineConstants (g_Positions, 0 , sizeof (g_Positions) / 4 );
248+ pVar->SetInlineConstants (g_Positions, 0 , kNumPosConstants );
210249 }
211250
212251 if (ColType == SHADER_RESOURCE_VARIABLE_TYPE_STATIC)
213252 {
214253 IShaderResourceVariable* pVar = pSign->GetStaticVariableByName (SHADER_TYPE_VERTEX, " cbInlineColors" );
215254 ASSERT_TRUE (pVar);
216- pVar->SetInlineConstants (g_Colors, 0 , sizeof (g_Colors) / 4 );
255+ pVar->SetInlineConstants (g_Colors, 0 , kNumColConstants );
217256 }
218257
219258 RefCntAutoPtr<IShaderResourceBinding> pSRB;
220259 pSign->CreateShaderResourceBinding (&pSRB, true );
221260 ASSERT_TRUE (pSRB);
222261
262+ pSRB->GetVariableByName (SHADER_TYPE_VERTEX, " cb0_mut" )->Set (pConstBuffer);
263+ pSRB->GetVariableByName (SHADER_TYPE_VERTEX, " tex0_mut" )->Set (pTexSRV);
264+ pSRB->GetVariableByName (SHADER_TYPE_VERTEX, " cb1_mut" )->Set (pConstBuffer);
265+ pSRB->GetVariableByName (SHADER_TYPE_VERTEX, " tex1_mut" )->Set (pTexSRV);
266+ pSRB->GetVariableByName (SHADER_TYPE_VERTEX, " cb2_mut" )->Set (pConstBuffer);
267+ pSRB->GetVariableByName (SHADER_TYPE_VERTEX, " tex2_mut" )->Set (pTexSRV);
268+ pSRB->GetVariableByName (SHADER_TYPE_VERTEX, " cb0_dyn" )->Set (pConstBuffer);
269+ pSRB->GetVariableByName (SHADER_TYPE_VERTEX, " tex0_dyn" )->Set (pTexSRV);
270+ pSRB->GetVariableByName (SHADER_TYPE_VERTEX, " cb1_dyn" )->Set (pConstBuffer);
271+ pSRB->GetVariableByName (SHADER_TYPE_VERTEX, " tex1_dyn" )->Set (pTexSRV);
272+ pSRB->GetVariableByName (SHADER_TYPE_VERTEX, " cb2_dyn" )->Set (pConstBuffer);
273+ pSRB->GetVariableByName (SHADER_TYPE_VERTEX, " tex2_dyn" )->Set (pTexSRV);
274+
275+ IShaderResourceVariable* pPosVar = nullptr ;
223276 if (PosType != SHADER_RESOURCE_VARIABLE_TYPE_STATIC)
224277 {
225- IShaderResourceVariable* pVar = pSRB->GetVariableByName (SHADER_TYPE_VERTEX, " cbInlinePositions" );
226- ASSERT_TRUE (pVar);
227- pVar->SetInlineConstants (g_Positions, 0 , sizeof (g_Positions) / 4 );
278+ pPosVar = pSRB->GetVariableByName (SHADER_TYPE_VERTEX, " cbInlinePositions" );
279+ ASSERT_TRUE (pPosVar);
228280 }
229281
282+ IShaderResourceVariable* pColVar = nullptr ;
230283 if (ColType != SHADER_RESOURCE_VARIABLE_TYPE_STATIC)
231284 {
232- IShaderResourceVariable* pVar = pSRB->GetVariableByName (SHADER_TYPE_VERTEX, " cbInlineColors" );
233- ASSERT_TRUE (pVar);
234- pVar->SetInlineConstants (g_Colors, 0 , sizeof (g_Colors) / 4 );
285+ pColVar = pSRB->GetVariableByName (SHADER_TYPE_VERTEX, " cbInlineColors" );
286+ ASSERT_TRUE (pColVar);
235287 }
236288
237289 ITextureView* pRTVs[] = {pSwapChain->GetCurrentBackBufferRTV ()};
238290 pContext->SetRenderTargets (1 , pRTVs, nullptr , RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
239291 pContext->ClearRenderTarget (pRTVs[0 ], ClearColor, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
240292
293+
294+ if (pColVar != nullptr )
295+ {
296+ // Set first half of color constants before committing SRB
297+ pColVar->SetInlineConstants (g_Colors, 0 , kNumColConstants / 2 );
298+ }
299+
241300 pContext->CommitShaderResources (pSRB, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
242301 pContext->CommitShaderResources (pSRB, RESOURCE_STATE_TRANSITION_MODE_VERIFY);
302+
303+ if (pColVar != nullptr )
304+ {
305+ // Set second half of color constants after committing SRB
306+ pColVar->SetInlineConstants (g_Colors[0 ].Data () + kNumColConstants / 2 , kNumColConstants / 2 , kNumColConstants / 2 );
307+ }
308+
243309 pContext->SetPipelineState (pPSO);
244- pContext->Draw ({6 , DRAW_FLAG_VERIFY_ALL});
310+
311+ if (pPosVar == nullptr )
312+ {
313+ // Draw both triangles as positions are static
314+ pContext->Draw ({6 , DRAW_FLAG_VERIFY_ALL});
315+ }
316+ else
317+ {
318+ // Draw first triangle
319+ pPosVar->SetInlineConstants (g_Positions, 0 , kNumPosConstants / 2 );
320+ pContext->Draw ({3 , DRAW_FLAG_VERIFY_ALL});
321+
322+ // Draw second triangle
323+ pPosVar->SetInlineConstants (g_Positions[0 ].Data () + kNumPosConstants / 2 , 0 , kNumPosConstants / 2 );
324+ pContext->Draw ({3 , DRAW_FLAG_VERIFY_ALL});
325+ }
245326
246327 Present ();
328+
329+ std::cout << TestingEnvironment::GetCurrentTestStatusString () << ' '
330+ << " Pos " << GetShaderVariableTypeLiteralName (PosType) << ' ,'
331+ << " Col " << GetShaderVariableTypeLiteralName (ColType) << std::endl;
247332 }
248333 }
249334}
0 commit comments