Skip to content

Commit bdc2512

Browse files
PipelineStateWebGPU: implemented GetStatus(true)
Also use GetStatus(true) to wait for async compilation completion in ArchiveTest
1 parent 0f6c295 commit bdc2512

File tree

3 files changed

+63
-77
lines changed

3 files changed

+63
-77
lines changed

Graphics/GraphicsEngineWebGPU/src/PipelineStateWebGPUImpl.cpp

Lines changed: 52 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -625,34 +625,61 @@ PIPELINE_STATE_STATUS PipelineStateWebGPUImpl::GetStatus(bool WaitForCompletion)
625625

626626
if (m_AsyncBuilder)
627627
{
628-
AsyncPipelineBuilder::CallbackStatus CallbackStatus = m_AsyncBuilder->Status.load();
629-
switch (CallbackStatus)
628+
#if PLATFORM_EMSCRIPTEN
629+
if (WaitForCompletion)
630630
{
631-
case AsyncPipelineBuilder::CallbackStatus::NotStarted:
632-
m_AsyncBuilder->Status.store(AsyncPipelineBuilder::CallbackStatus::InProgress);
633-
if (m_Desc.IsAnyGraphicsPipeline())
634-
InitializeWebGPURenderPipeline(m_AsyncBuilder->ShaderStages, m_AsyncBuilder);
635-
else if (m_Desc.IsComputePipeline())
636-
InitializeWebGPUComputePipeline(m_AsyncBuilder->ShaderStages, m_AsyncBuilder);
637-
else
638-
UNEXPECTED("Unexpected pipeline type");
639-
// Do not change the m_Status
640-
return PIPELINE_STATE_STATUS_COMPILING;
641-
642-
case AsyncPipelineBuilder::CallbackStatus::InProgress:
643-
// Keep waiting
644-
return PIPELINE_STATE_STATUS_COMPILING;
645-
646-
case AsyncPipelineBuilder::CallbackStatus::Completed:
647-
m_wgpuRenderPipeline = std::move(m_AsyncBuilder->wgpuRenderPipeline);
648-
m_wgpuComputePipeline = std::move(m_AsyncBuilder->wgpuComputePipeline);
649-
m_AsyncBuilder.Release();
650-
m_Status.store(m_wgpuRenderPipeline || m_wgpuComputePipeline ? PIPELINE_STATE_STATUS_READY : PIPELINE_STATE_STATUS_FAILED);
631+
LOG_ERROR_MESSAGE("Waiting for asynchronous pipeline initialization is not supported on the Web");
632+
WaitForCompletion = false;
633+
}
634+
#endif
635+
636+
do
637+
{
638+
AsyncPipelineBuilder::CallbackStatus CallbackStatus = m_AsyncBuilder->Status.load();
639+
switch (CallbackStatus)
640+
{
641+
case AsyncPipelineBuilder::CallbackStatus::NotStarted:
642+
{
643+
m_AsyncBuilder->Status.store(AsyncPipelineBuilder::CallbackStatus::InProgress);
644+
if (m_Desc.IsAnyGraphicsPipeline())
645+
InitializeWebGPURenderPipeline(m_AsyncBuilder->ShaderStages, m_AsyncBuilder);
646+
else if (m_Desc.IsComputePipeline())
647+
InitializeWebGPUComputePipeline(m_AsyncBuilder->ShaderStages, m_AsyncBuilder);
648+
else
649+
UNEXPECTED("Unexpected pipeline type");
650+
651+
// Do not change m_Status
652+
Status = PIPELINE_STATE_STATUS_COMPILING;
653+
}
651654
break;
652655

653-
default:
654-
UNEXPECTED("Unexpected status");
655-
}
656+
case AsyncPipelineBuilder::CallbackStatus::InProgress:
657+
{
658+
// Keep waiting
659+
Status = PIPELINE_STATE_STATUS_COMPILING;
660+
}
661+
break;
662+
663+
case AsyncPipelineBuilder::CallbackStatus::Completed:
664+
{
665+
m_wgpuRenderPipeline = std::move(m_AsyncBuilder->wgpuRenderPipeline);
666+
m_wgpuComputePipeline = std::move(m_AsyncBuilder->wgpuComputePipeline);
667+
m_AsyncBuilder.Release();
668+
Status = m_wgpuRenderPipeline || m_wgpuComputePipeline ? PIPELINE_STATE_STATUS_READY : PIPELINE_STATE_STATUS_FAILED;
669+
m_Status.store(Status);
670+
}
671+
break;
672+
673+
default:
674+
UNEXPECTED("Unexpected status");
675+
}
676+
677+
// Note: DeviceTick() when WaitForCompletion == true is not required here since we use
678+
// WGPUCallbackMode_AllowSpontaneous callback mode.
679+
680+
} while (WaitForCompletion && m_AsyncBuilder);
681+
682+
return Status;
656683
}
657684

658685
return m_Status.load();

Tests/DiligentCoreAPITest/src/ArchiveTest.cpp

Lines changed: 10 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626

2727
#include <array>
2828
#include <unordered_set>
29-
#include <thread>
3029

3130
#include "GPUTestingEnvironment.hpp"
3231
#include "TestingSwapChainBase.hpp"
@@ -424,16 +423,7 @@ TEST_P(TestBrokenShader, CompileFailure)
424423
if (CompileAsync)
425424
{
426425
ASSERT_NE(pSerializedShader, nullptr);
427-
SHADER_STATUS Status = SHADER_STATUS_UNINITIALIZED;
428-
do
429-
{
430-
Status = pSerializedShader->GetStatus();
431-
if (Status == SHADER_STATUS_COMPILING)
432-
{
433-
std::this_thread::sleep_for(std::chrono::milliseconds{10});
434-
}
435-
} while (Status == SHADER_STATUS_COMPILING);
436-
EXPECT_EQ(Status, SHADER_STATUS_FAILED);
426+
EXPECT_EQ(pSerializedShader->GetStatus(true), SHADER_STATUS_FAILED);
437427
}
438428
else
439429
{
@@ -480,16 +470,7 @@ TEST_P(TestBrokenShader, MissingSourceFile)
480470
if (CompileAsync)
481471
{
482472
ASSERT_NE(pSerializedShader, nullptr);
483-
SHADER_STATUS Status = SHADER_STATUS_UNINITIALIZED;
484-
do
485-
{
486-
Status = pSerializedShader->GetStatus();
487-
if (Status == SHADER_STATUS_COMPILING)
488-
{
489-
std::this_thread::sleep_for(std::chrono::milliseconds{10});
490-
}
491-
} while (Status == SHADER_STATUS_COMPILING);
492-
EXPECT_EQ(Status, SHADER_STATUS_FAILED);
473+
EXPECT_EQ(pSerializedShader->GetStatus(true), SHADER_STATUS_FAILED);
493474
}
494475
else
495476
{
@@ -782,22 +763,6 @@ void RenderGraphicsPSOTestImage(IDeviceContext* pContext,
782763
pContext->EndRenderPass();
783764
}
784765

785-
void WaitPSOCompilation(bool CompileAsync, IPipelineState* pPSO)
786-
{
787-
if (CompileAsync)
788-
{
789-
size_t Iteration = 0;
790-
Timer T;
791-
while (pPSO->GetStatus() == PIPELINE_STATE_STATUS_COMPILING)
792-
{
793-
std::this_thread::sleep_for(std::chrono::milliseconds{10});
794-
++Iteration;
795-
}
796-
ASSERT_EQ(pPSO->GetStatus(), PIPELINE_STATE_STATUS_READY);
797-
LOG_INFO_MESSAGE("Waited for PSO '", pPSO->GetDesc().Name, "' compilation: ", T.GetElapsedTime() * 1000, " ms, ", Iteration, (Iteration > 1 ? " iterations" : " iteration"));
798-
}
799-
}
800-
801766
void TestGraphicsPipeline(PSO_ARCHIVE_FLAGS ArchiveFlags, bool CompileAsync = false)
802767
{
803768
auto* pEnv = GPUTestingEnvironment::GetInstance();
@@ -1077,8 +1042,7 @@ void TestGraphicsPipeline(PSO_ARCHIVE_FLAGS ArchiveFlags, bool CompileAsync = fa
10771042
RefCntAutoPtr<IPipelineState> pUnpackedPSOWithLayout;
10781043
pDearchiver->UnpackPipelineState(UnpackInfo, &pUnpackedPSOWithLayout);
10791044
ASSERT_NE(pUnpackedPSOWithLayout, nullptr);
1080-
1081-
WaitPSOCompilation(CompileAsync, pUnpackedPSOWithLayout);
1045+
ASSERT_EQ(pUnpackedPSOWithLayout->GetStatus(CompileAsync), PIPELINE_STATE_STATUS_READY);
10821046

10831047
EXPECT_EQ(pUnpackedPSOWithLayout->GetGraphicsPipelineDesc(), pRefPSOWithLayout->GetGraphicsPipelineDesc());
10841048
EXPECT_EQ(pUnpackedPSOWithLayout->GetResourceSignatureCount(), pRefPSOWithLayout->GetResourceSignatureCount());
@@ -1105,8 +1069,7 @@ void TestGraphicsPipeline(PSO_ARCHIVE_FLAGS ArchiveFlags, bool CompileAsync = fa
11051069
UnpackInfo.Name = PSOWithResLayoutName2;
11061070
pDearchiver->UnpackPipelineState(UnpackInfo, &pUnpackedPSOWithLayout2);
11071071
ASSERT_NE(pUnpackedPSOWithLayout2, nullptr);
1108-
1109-
WaitPSOCompilation(CompileAsync, pUnpackedPSOWithLayout2);
1072+
ASSERT_EQ(pUnpackedPSOWithLayout2->GetStatus(CompileAsync), PIPELINE_STATE_STATUS_READY);
11101073

11111074
EXPECT_EQ(pUnpackedPSOWithLayout2->GetResourceSignatureCount(), 1u);
11121075
EXPECT_TRUE(pUnpackedPSOWithLayout2->GetResourceSignature(0)->IsCompatibleWith(pUnpackedPSOWithLayout->GetResourceSignature(0)));
@@ -1123,9 +1086,8 @@ void TestGraphicsPipeline(PSO_ARCHIVE_FLAGS ArchiveFlags, bool CompileAsync = fa
11231086

11241087
pDearchiver->UnpackPipelineState(UnpackInfo, &pUnpackedPSOWithSign);
11251088
ASSERT_NE(pUnpackedPSOWithSign, nullptr);
1126-
1127-
WaitPSOCompilation(CompileAsync, pUnpackedPSOWithSign);
1128-
WaitPSOCompilation(CompileAsync, pRefPSOWithSign);
1089+
ASSERT_EQ(pUnpackedPSOWithSign->GetStatus(CompileAsync), PIPELINE_STATE_STATUS_READY);
1090+
ASSERT_EQ(pRefPSOWithSign->GetStatus(CompileAsync), PIPELINE_STATE_STATUS_READY);
11291091

11301092
EXPECT_EQ(pUnpackedPSOWithSign->GetGraphicsPipelineDesc(), pRefPSOWithSign->GetGraphicsPipelineDesc());
11311093
EXPECT_EQ(pUnpackedPSOWithSign->GetGraphicsPipelineDesc().pRenderPass, pUnpackedRenderPass);
@@ -1546,7 +1508,7 @@ void TestComputePipeline(PSO_ARCHIVE_FLAGS ArchiveFlags, bool CompileAsync = fal
15461508
pContext->DispatchCompute(DispatchAttribs);
15471509
};
15481510

1549-
WaitPSOCompilation(CompileAsync, pRefPSO);
1511+
ASSERT_EQ(pRefPSO->GetStatus(CompileAsync), PIPELINE_STATE_STATUS_READY);
15501512

15511513
// Dispatch reference
15521514
Dispatch(pRefPSO, pTestingSwapChain->GetCurrentBackBufferUAV());
@@ -1560,7 +1522,7 @@ void TestComputePipeline(PSO_ARCHIVE_FLAGS ArchiveFlags, bool CompileAsync = fal
15601522

15611523
pTestingSwapChain->TakeSnapshot(pTexUAV);
15621524

1563-
WaitPSOCompilation(CompileAsync, pUnpackedPSO);
1525+
ASSERT_EQ(pUnpackedPSO->GetStatus(CompileAsync), PIPELINE_STATE_STATUS_READY);
15641526

15651527
// Dispatch
15661528
Dispatch(pUnpackedPSO, pTestingSwapChain->GetCurrentBackBufferUAV());
@@ -1901,8 +1863,8 @@ void TestRayTracingPipeline(bool CompileAsync = false)
19011863
pContext->UpdateSBT(pSBT);
19021864
};
19031865

1904-
WaitPSOCompilation(CompileAsync, pUnpackedPSO);
1905-
WaitPSOCompilation(CompileAsync, pRefPSO);
1866+
ASSERT_EQ(pUnpackedPSO->GetStatus(CompileAsync), PIPELINE_STATE_STATUS_READY);
1867+
ASSERT_EQ(pRefPSO->GetStatus(CompileAsync), PIPELINE_STATE_STATUS_READY);
19061868

19071869
RefCntAutoPtr<IShaderBindingTable> pRefPSO_SBT;
19081870
CreateSBT(pRefPSO_SBT, pRefPSO);

Tests/DiligentCoreAPITest/src/RenderStateCacheTest.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
*/
2626

2727
#include <functional>
28-
#include <thread>
2928

3029
#include "GPUTestingEnvironment.hpp"
3130
#include "TestingSwapChainBase.hpp"
@@ -445,9 +444,7 @@ void TestBrokenShader(bool CompileAsync)
445444
if (CompileAsync)
446445
{
447446
EXPECT_NE(pShader, nullptr);
448-
while (pShader->GetStatus() == SHADER_STATUS_COMPILING)
449-
std::this_thread::yield();
450-
EXPECT_EQ(pShader->GetStatus(), SHADER_STATUS_FAILED);
447+
EXPECT_EQ(pShader->GetStatus(true), SHADER_STATUS_FAILED);
451448
}
452449
else
453450
{

0 commit comments

Comments
 (0)