@@ -463,4 +463,150 @@ TEST(ComputeShaderTest, FillTexturePS_InRenderPass)
463463 TestFillTexturePS (true );
464464}
465465
466+ TEST (ComputeShaderTest, FillTexturePS_Signatures)
467+ {
468+ GPUTestingEnvironment* pEnv = GPUTestingEnvironment::GetInstance ();
469+ IRenderDevice* pDevice = pEnv->GetDevice ();
470+ const RenderDeviceInfo& DeviceInfo = pDevice->GetDeviceInfo ();
471+ if (!DeviceInfo.Features .ComputeShaders )
472+ {
473+ GTEST_SKIP () << " Compute shaders are not supported by this device" ;
474+ }
475+
476+ ISwapChain* pSwapChain = pEnv->GetSwapChain ();
477+ IDeviceContext* pContext = pEnv->GetDeviceContext ();
478+
479+ const SwapChainDesc& SCDesc = pSwapChain->GetDesc ();
480+
481+ GPUTestingEnvironment::ScopedReset EnvironmentAutoReset;
482+
483+ RefCntAutoPtr<ITestingSwapChain> pTestingSwapChain{pSwapChain, IID_TestingSwapChain};
484+ if (!pTestingSwapChain)
485+ {
486+ GTEST_SKIP () << " Compute shader test requires testing swap chain" ;
487+ }
488+
489+ RefCntAutoPtr<ITextureView> pDummyRTV;
490+ if (DeviceInfo.IsWebGPUDevice ())
491+ {
492+ // WebGPU does not support render passes without attachments (https://github.com/gpuweb/gpuweb/issues/503)
493+ RefCntAutoPtr<ITexture> pDummyTex = pEnv->CreateTexture (" Dummy render target" , SCDesc.ColorBufferFormat , BIND_RENDER_TARGET, SCDesc.Width , SCDesc.Height );
494+ ASSERT_TRUE (pDummyTex != nullptr );
495+ pDummyRTV = pDummyTex->GetDefaultView (TEXTURE_VIEW_RENDER_TARGET);
496+ }
497+
498+ pContext->Flush ();
499+ pContext->InvalidateState ();
500+
501+ ComputeShaderReference (pSwapChain);
502+
503+ ShaderCreateInfo ShaderCI;
504+ ShaderCI.SourceLanguage = SHADER_SOURCE_LANGUAGE_HLSL;
505+ ShaderCI.ShaderCompiler = pEnv->GetDefaultCompiler (ShaderCI.SourceLanguage );
506+
507+ ShaderCI.Desc = {" Compute shader test - FillTextureVS" , SHADER_TYPE_VERTEX, true };
508+ ShaderCI.EntryPoint = " main" ;
509+ ShaderCI.Source = HLSL::FillTextureVS.c_str ();
510+ RefCntAutoPtr<IShader> pVS;
511+ pDevice->CreateShader (ShaderCI, &pVS);
512+ ASSERT_NE (pVS, nullptr );
513+
514+ ShaderCI.Desc = {" Compute shader test - FillTexturePS" , SHADER_TYPE_PIXEL, true };
515+ ShaderCI.EntryPoint = " main" ;
516+ ShaderCI.Source = HLSL::FillTexturePS2.c_str ();
517+ RefCntAutoPtr<IShader> pPS;
518+ pDevice->CreateShader (ShaderCI, &pPS);
519+ ASSERT_NE (pPS, nullptr );
520+
521+ RefCntAutoPtr<IPipelineResourceSignature> pSignature0;
522+ {
523+ PipelineResourceSignatureDescX SignDesc{" ComputeShaderTest.FillTexturePS_InRenderPass - Signature 0" };
524+ SignDesc.AddResource (SHADER_TYPE_PIXEL, " Constants" , 1u , SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE);
525+ pDevice->CreatePipelineResourceSignature (SignDesc, &pSignature0);
526+ ASSERT_NE (pSignature0, nullptr );
527+ }
528+
529+ RefCntAutoPtr<IPipelineResourceSignature> pSignature1;
530+ {
531+ PipelineResourceSignatureDescX SignDesc{" ComputeShaderTest.FillTexturePS_InRenderPass - Signature 1" };
532+ SignDesc.AddResource (SHADER_TYPE_PIXEL, " g_tex2DUAV" , 1u , SHADER_RESOURCE_TYPE_TEXTURE_UAV, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE, PIPELINE_RESOURCE_FLAG_NONE,
533+ WebGPUResourceAttribs{WEB_GPU_BINDING_TYPE_WRITE_ONLY_TEXTURE_UAV, RESOURCE_DIM_TEX_2D, TEX_FORMAT_RGBA8_UNORM});
534+ SignDesc.SetBindingIndex (1 );
535+ pDevice->CreatePipelineResourceSignature (SignDesc, &pSignature1);
536+ ASSERT_NE (pSignature1, nullptr );
537+ }
538+
539+ GraphicsPipelineStateCreateInfoX PSOCreateInfo{" Compute shader test - output from PS" };
540+
541+ PSOCreateInfo.AddSignature (pSignature0);
542+ PSOCreateInfo.AddSignature (pSignature1);
543+
544+ PSOCreateInfo.GraphicsPipeline .RasterizerDesc .CullMode = CULL_MODE_NONE;
545+ PSOCreateInfo.GraphicsPipeline .DepthStencilDesc .DepthEnable = False;
546+
547+ PSOCreateInfo.pVS = pVS;
548+ PSOCreateInfo.pPS = pPS;
549+
550+ if (DeviceInfo.IsWebGPUDevice ())
551+ {
552+ PSOCreateInfo.GraphicsPipeline .NumRenderTargets = 1 ;
553+ PSOCreateInfo.GraphicsPipeline .RTVFormats [0 ] = SCDesc.ColorBufferFormat ;
554+ PSOCreateInfo.GraphicsPipeline .BlendDesc .RenderTargets [0 ].RenderTargetWriteMask = COLOR_MASK_NONE;
555+ }
556+
557+ RefCntAutoPtr<IPipelineState> pPSO;
558+ pDevice->CreateGraphicsPipelineState (PSOCreateInfo, &pPSO);
559+ ASSERT_NE (pPSO, nullptr );
560+
561+ const float4 Zero{0 };
562+ const float4 One{1 };
563+
564+ RefCntAutoPtr<IBuffer> pBuffer0 = pEnv->CreateBuffer ({" ComputeShaderTest.FillTexturePS_InRenderPass - Buffer 0" , sizeof (Zero), BIND_UNIFORM_BUFFER}, &Zero);
565+ ASSERT_NE (pBuffer0, nullptr );
566+ RefCntAutoPtr<IBuffer> pBuffer1 = pEnv->CreateBuffer ({" ComputeShaderTest.FillTexturePS_InRenderPass - Buffer 1" , sizeof (One), BIND_UNIFORM_BUFFER}, &One);
567+ ASSERT_NE (pBuffer1, nullptr );
568+
569+ RefCntAutoPtr<IShaderResourceBinding> pSRB0[2 ];
570+ pSignature0->CreateShaderResourceBinding (&pSRB0[0 ], true );
571+ ASSERT_NE (pSRB0[0 ], nullptr );
572+ pSRB0[0 ]->GetVariableByName (SHADER_TYPE_PIXEL, " Constants" )->Set (pBuffer0);
573+
574+ pSignature0->CreateShaderResourceBinding (&pSRB0[1 ], true );
575+ ASSERT_NE (pSRB0[1 ], nullptr );
576+ pSRB0[1 ]->GetVariableByName (SHADER_TYPE_PIXEL, " Constants" )->Set (pBuffer1);
577+
578+
579+ RefCntAutoPtr<IShaderResourceBinding> pSRB1;
580+ pSignature1->CreateShaderResourceBinding (&pSRB1, true );
581+ ASSERT_NE (pSRB1, nullptr );
582+ pSRB1->GetVariableByName (SHADER_TYPE_PIXEL, " g_tex2DUAV" )->Set (pTestingSwapChain->GetCurrentBackBufferUAV ());
583+
584+ ITextureView* pRTVs[] = {pSwapChain->GetCurrentBackBufferRTV ()};
585+ pContext->SetRenderTargets (1 , pRTVs, pSwapChain->GetDepthBufferDSV (), RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
586+
587+ pContext->SetPipelineState (pPSO);
588+ pContext->CommitShaderResources (pSRB0[0 ], RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
589+ pContext->CommitShaderResources (pSRB1, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
590+
591+ if (DeviceInfo.IsWebGPUDevice ())
592+ {
593+ ITextureView* pDummyRTVs[] = {pDummyRTV};
594+ pContext->SetRenderTargets (1 , pDummyRTVs, nullptr , RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
595+ }
596+ else
597+ {
598+ pContext->SetRenderTargets (0 , nullptr , nullptr , RESOURCE_STATE_TRANSITION_MODE_NONE);
599+ }
600+
601+ Viewport VP{SCDesc};
602+ pContext->SetViewports (1 , &VP, SCDesc.Width , SCDesc.Height );
603+
604+ pContext->Draw (DrawAttribs{3 , DRAW_FLAG_VERIFY_ALL});
605+
606+ pContext->CommitShaderResources (pSRB0[1 ], RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
607+ pContext->Draw (DrawAttribs{3 , DRAW_FLAG_VERIFY_ALL});
608+
609+ pSwapChain->Present ();
610+ }
611+
466612} // namespace
0 commit comments