@@ -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+
13591399protected:
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
0 commit comments