Skip to content

Commit ade379c

Browse files
committed
Complete 4. **Create-info lifetime, copy, and serialization**: Extend PipelineStateCreateInfoX, Extend PSO serialization/deserialization, Add tests to TestSerializePSOCreateInfo.
1 parent 00a98e7 commit ade379c

2 files changed

Lines changed: 57 additions & 0 deletions

File tree

Graphics/GraphicsEngine/interface/GraphicsTypesX.hpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1236,6 +1236,8 @@ struct PipelineStateCreateInfoX : CreateInfoType
12361236
AddSignature(CI.ppResourceSignatures[i]);
12371237
if (CI.pPSOCache != nullptr)
12381238
SetPipelineStateCache(CI.pPSOCache);
1239+
for (Uint32 i = 0; i < CI.NumSpecializationConstants; ++i)
1240+
AddSpecializationConstant(CI.pSpecializationConstants[i]);
12391241
this->PSODesc.ResourceLayout = ResourceLayout;
12401242
this->pInternalData = InternalData.get();
12411243
}
@@ -1356,6 +1358,44 @@ struct PipelineStateCreateInfoX : CreateInfoType
13561358
return static_cast<DerivedType&>(*this);
13571359
}
13581360

1361+
DerivedType& AddSpecializationConstant(const SpecializationConstant& SpecConst)
1362+
{
1363+
SpecConstCopy.push_back(SpecConst);
1364+
auto& Entry = SpecConstCopy.back();
1365+
1366+
// Deep-copy name
1367+
if (SpecConst.Name != nullptr)
1368+
Entry.Name = StringPool.emplace(SpecConst.Name).first->c_str();
1369+
1370+
// Deep-copy data
1371+
if (SpecConst.Size > 0 && SpecConst.pData != nullptr)
1372+
{
1373+
const auto* pSrcData = static_cast<const Uint8*>(SpecConst.pData);
1374+
SpecConstDataCopy.emplace_back(pSrcData, pSrcData + SpecConst.Size);
1375+
Entry.pData = SpecConstDataCopy.back().data();
1376+
}
1377+
else
1378+
{
1379+
SpecConstDataCopy.emplace_back();
1380+
Entry.pData = nullptr;
1381+
}
1382+
1383+
this->pSpecializationConstants = SpecConstCopy.data();
1384+
this->NumSpecializationConstants = static_cast<Uint32>(SpecConstCopy.size());
1385+
1386+
return static_cast<DerivedType&>(*this);
1387+
}
1388+
1389+
DerivedType& ClearSpecializationConstants()
1390+
{
1391+
SpecConstCopy.clear();
1392+
SpecConstDataCopy.clear();
1393+
this->pSpecializationConstants = nullptr;
1394+
this->NumSpecializationConstants = 0;
1395+
1396+
return static_cast<DerivedType&>(*this);
1397+
}
1398+
13591399
protected:
13601400
DerivedType& SetShader(IShader*& pDstShader, IShader* pShader)
13611401
{
@@ -1389,6 +1429,8 @@ struct PipelineStateCreateInfoX : CreateInfoType
13891429
std::vector<RefCntAutoPtr<IDeviceObject>> Objects;
13901430
std::vector<IPipelineResourceSignature*> Signatures;
13911431
std::unique_ptr<Uint8[]> InternalData;
1432+
std::vector<SpecializationConstant> SpecConstCopy;
1433+
std::vector<std::vector<Uint8>> SpecConstDataCopy;
13921434
};
13931435

13941436

Tests/DiligentCoreTest/src/GraphicsEngine/PSOSerializerTest.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,21 @@ static void TestSerializePSOCreateInfo(HelperType&& Helper)
271271
for (Uint32 i = 0; i < SrcPSO.ResourceSignaturesCount; ++i)
272272
SrcPRSNames[i] = PRSNames[i].c_str();
273273

274+
const Uint32 SpecConstData0 = 0x12345678u;
275+
const float SpecConstData1 = 3.14f;
276+
const Uint32 SpecConstData2 = 42u;
277+
278+
SpecializationConstant SpecConsts[] =
279+
{
280+
{"ConstA", SHADER_TYPE_VERTEX, sizeof(SpecConstData0), &SpecConstData0},
281+
{"ConstB", SHADER_TYPE_PIXEL, sizeof(SpecConstData1), &SpecConstData1},
282+
{"ConstC", SHADER_TYPE_GEOMETRY, sizeof(SpecConstData2), &SpecConstData2} //
283+
};
284+
285+
SrcPSO.NumSpecializationConstants = Val(0u, _countof(SpecConsts));
286+
if (SrcPSO.NumSpecializationConstants > 0)
287+
SrcPSO.pSpecializationConstants = SpecConsts;
288+
274289
Helper.Init(SrcPSO, Val);
275290

276291
Serializer<SerializerMode::Measure> MSer;

0 commit comments

Comments
 (0)