Skip to content

Commit 11eeb27

Browse files
Archiver: implemented asynchronous pipeline state compilation
1 parent cad9137 commit 11eeb27

File tree

12 files changed

+330
-68
lines changed

12 files changed

+330
-68
lines changed

Graphics/Archiver/include/SerializedPipelineStateImpl.hpp

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,10 @@ class SerializedPipelineStateImpl final : public ObjectBase<ISerializedPipelineS
8787

8888
UNSUPPORTED_CONST_METHOD(Uint32, GetResourceSignatureCount)
8989
UNSUPPORTED_CONST_METHOD(IPipelineResourceSignature*, GetResourceSignature, Uint32 Index)
90-
UNSUPPORTED_METHOD (PIPELINE_STATE_STATUS, GetStatus, bool WaitForCompletion)
9190
// clang-format on
9291

92+
virtual PIPELINE_STATE_STATUS DILIGENT_CALL_TYPE GetStatus(bool WaitForCompletion = false) override;
93+
9394
virtual Uint32 DILIGENT_CALL_TYPE GetPatchedShaderCount(ARCHIVE_DEVICE_DATA_FLAGS DeviceType) const override final;
9495

9596
virtual ShaderCreateInfo DILIGENT_CALL_TYPE GetPatchedShaderCreateInfo(
@@ -118,10 +119,17 @@ class SerializedPipelineStateImpl final : public ObjectBase<ISerializedPipelineS
118119
bool DoNotPackSignatures = false;
119120
};
120121

121-
const Data& GetData() const { return m_Data; }
122-
123-
const SerializedData& GetCommonData() const { return m_Data.Common; };
122+
const Data& GetData() const
123+
{
124+
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", m_Desc.Name, "' is not ready. Use GetStatus() to check the pipeline state status.");
125+
return m_Data;
126+
}
124127

128+
const SerializedData& GetCommonData() const
129+
{
130+
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", m_Desc.Name, "' is not ready. Use GetStatus() to check the pipeline state status.");
131+
return m_Data.Common;
132+
}
125133

126134
using RayTracingShaderMapType = std::unordered_map<const IShader*, /*Index in TShaderIndices*/ Uint32>;
127135

@@ -148,9 +156,17 @@ class SerializedPipelineStateImpl final : public ObjectBase<ISerializedPipelineS
148156
}
149157

150158
using SignaturesVector = std::vector<RefCntAutoPtr<IPipelineResourceSignature>>;
151-
const SignaturesVector& GetSignatures() { return m_Signatures; }
159+
const SignaturesVector& GetSignatures()
160+
{
161+
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", m_Desc.Name, "' is not ready. Use GetStatus() to check the pipeline state status.");
162+
return m_Signatures;
163+
}
152164

153165
private:
166+
template <typename PSOCreateInfoType>
167+
void Initialize(const PSOCreateInfoType& CreateInfo,
168+
const PipelineStateArchiveInfo& ArchiveInfo);
169+
154170
template <typename CreateInfoType>
155171
void PatchShadersVk(const CreateInfoType& CreateInfo) noexcept(false);
156172

@@ -185,7 +201,7 @@ class SerializedPipelineStateImpl final : public ObjectBase<ISerializedPipelineS
185201
const ShaderStagesArrayType& ShaderStages,
186202
const ExtraArgsType&... ExtraArgs);
187203

188-
protected:
204+
private:
189205
SerializationDeviceImpl* const m_pSerializationDevice;
190206

191207
Data m_Data;
@@ -196,6 +212,9 @@ class SerializedPipelineStateImpl final : public ObjectBase<ISerializedPipelineS
196212
RefCntAutoPtr<IRenderPass> m_pRenderPass;
197213
RefCntAutoPtr<SerializedResourceSignatureImpl> m_pDefaultSignature;
198214
SignaturesVector m_Signatures;
215+
216+
std::atomic<PIPELINE_STATE_STATUS> m_Status{PIPELINE_STATE_STATUS_UNINITIALIZED};
217+
std::unique_ptr<AsyncInitializer> m_AsyncInitializer;
199218
};
200219

201220
#define INSTANTIATE_SERIALIZED_PSO_CTOR(CreateInfoType) \

Graphics/Archiver/include/SerializedShaderImpl.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ class SerializedShaderImpl final : public ObjectBase<ISerializedShader>
8080
virtual IShader* GetDeviceShader() = 0;
8181

8282
virtual bool IsCompiling() const = 0;
83+
84+
virtual RefCntAutoPtr<IAsyncTask> GetCompileTask() const = 0;
8385
};
8486

8587
template <typename CompiledShaderType>
@@ -104,6 +106,8 @@ class SerializedShaderImpl final : public ObjectBase<ISerializedShader>
104106
return !(*this == Rhs);
105107
}
106108

109+
std::vector<RefCntAutoPtr<IAsyncTask>> GetCompileTasks() const;
110+
107111
private:
108112
SerializationDeviceImpl* m_pDevice;
109113
ShaderCreateInfoWrapper m_CreateInfo;

Graphics/Archiver/src/ArchiverImpl.cpp

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,29 @@ Bool ArchiverImpl::SerializeToBlob(Uint32 ContentVersion, IDataBlob** ppBlob)
8585
{
8686
const auto* Name = pso_it.first.GetName();
8787
const auto ResType = pso_it.first.GetType();
88-
const auto& SrcPSO = *pso_it.second;
88+
auto& SrcPSO = *pso_it.second;
89+
90+
const PIPELINE_STATE_STATUS PSOStatus = SrcPSO.GetStatus(/*WaitForCompletion = */ true);
91+
if (PSOStatus != PIPELINE_STATE_STATUS_READY)
92+
{
93+
LOG_ERROR_MESSAGE("Pipeline state '", Name, "' is in ", GetPipelineStateStatusString(PSOStatus),
94+
" state and cannot be serialized. Only ready pipeline states can be serialized."
95+
" Use GetStatus() to check the pipeline state status before calling SerializeToBlob().");
96+
continue;
97+
}
98+
99+
if (!SrcPSO.GetData().DoNotPackSignatures)
100+
{
101+
const auto& Signatures = SrcPSO.GetSignatures();
102+
for (auto& pSign : Signatures)
103+
{
104+
if (!AddPipelineResourceSignature(pSign))
105+
{
106+
LOG_ERROR_MESSAGE("Failed to add pipeline resource signature '", pSign->GetDesc().Name, "' to the archive.");
107+
}
108+
}
109+
}
110+
89111
const auto& SrcData = SrcPSO.GetData();
90112
VERIFY_EXPR(SafeStrEqual(Name, SrcPSO.GetDesc().Name));
91113
VERIFY_EXPR(ResType == PipelineTypeToArchiveResourceType(SrcPSO.GetDesc().PipelineType));
@@ -326,16 +348,6 @@ Bool ArchiverImpl::AddPipelineState(IPipelineState* pPSO)
326348
Res = false;
327349
}
328350

329-
if (!pSerializedPSO->GetData().DoNotPackSignatures)
330-
{
331-
const auto& Signatures = pSerializedPSO->GetSignatures();
332-
for (auto& pSign : Signatures)
333-
{
334-
if (!AddPipelineResourceSignature(pSign))
335-
Res = false;
336-
}
337-
}
338-
339351
return Res;
340352
}
341353

Graphics/Archiver/src/Archiver_D3D11.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ struct CompiledShaderD3D11 final : SerializedShaderImpl::CompiledShader
8383
{
8484
return ShaderD3D11.IsCompiling();
8585
}
86+
87+
virtual RefCntAutoPtr<IAsyncTask> GetCompileTask() const override final
88+
{
89+
return ShaderD3D11.GetCompileTask();
90+
}
8691
};
8792

8893
struct ShaderStageInfoD3D11

Graphics/Archiver/src/Archiver_D3D12.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ struct CompiledShaderD3D12 final : SerializedShaderImpl::CompiledShader
7272
{
7373
return ShaderD3D12.IsCompiling();
7474
}
75+
76+
virtual RefCntAutoPtr<IAsyncTask> GetCompileTask() const override final
77+
{
78+
return ShaderD3D12.GetCompileTask();
79+
}
7580
};
7681

7782
inline const ShaderD3D12Impl* GetShaderD3D12(const SerializedShaderImpl* pShader)

Graphics/Archiver/src/Archiver_GL.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,11 @@ struct CompiledShaderGL final : SerializedShaderImpl::CompiledShader
279279
return false;
280280
}
281281

282+
virtual RefCntAutoPtr<IAsyncTask> GetCompileTask() const override final
283+
{
284+
return {};
285+
}
286+
282287
private:
283288
static String UnrollSource(const ShaderCreateInfo& CI)
284289
{

Graphics/Archiver/src/Archiver_Mtl.mm

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,11 @@ virtual bool IsCompiling() const override final
309309
{
310310
return ShaderMtl.IsCompiling();
311311
}
312+
313+
virtual RefCntAutoPtr<IAsyncTask> GetCompileTask() const override final
314+
{
315+
return ShaderMtl.GetCompileTask();
316+
}
312317
};
313318

314319
inline const ParsedMSLInfo* GetParsedMsl(const SerializedShaderImpl* pShader, SerializedShaderImpl::DeviceType Type)

Graphics/Archiver/src/Archiver_Vk.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ struct CompiledShaderVk : SerializedShaderImpl::CompiledShader
7272
{
7373
return ShaderVk.IsCompiling();
7474
}
75+
76+
virtual RefCntAutoPtr<IAsyncTask> GetCompileTask() const override final
77+
{
78+
return ShaderVk.GetCompileTask();
79+
}
7580
};
7681

7782
inline const ShaderVkImpl* GetShaderVk(const SerializedShaderImpl* pShader)

Graphics/Archiver/src/Archiver_WebGPU.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ struct CompiledShaderWebGPU final : SerializedShaderImpl::CompiledShader
7676
{
7777
return ShaderWebGPU.IsCompiling();
7878
}
79+
80+
virtual RefCntAutoPtr<IAsyncTask> GetCompileTask() const override final
81+
{
82+
return ShaderWebGPU.GetCompileTask();
83+
}
7984
};
8085

8186

0 commit comments

Comments
 (0)