Skip to content

Commit d9d0fe6

Browse files
GraphicsAccessories: added ProcessPipelineStateCreateInfoShaders helper functions
1 parent bdc2512 commit d9d0fe6

File tree

2 files changed

+133
-0
lines changed

2 files changed

+133
-0
lines changed

Graphics/GraphicsAccessories/interface/GraphicsAccessories.hpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -846,4 +846,54 @@ inline void WriteShaderMatrices(void* pDst, const float4x4* pMat, size_t NumMatr
846846
}
847847
}
848848

849+
template <typename CreateInfoType, typename HandlerType>
850+
typename std::enable_if<std::is_same<typename std::decay<CreateInfoType>::type, GraphicsPipelineStateCreateInfo>::value>::type
851+
ProcessPipelineStateCreateInfoShaders(CreateInfoType&& CI, HandlerType&& Handler)
852+
{
853+
Handler(CI.pVS);
854+
Handler(CI.pPS);
855+
Handler(CI.pDS);
856+
Handler(CI.pHS);
857+
Handler(CI.pGS);
858+
Handler(CI.pAS);
859+
Handler(CI.pMS);
860+
}
861+
862+
template <typename CreateInfoType, typename HandlerType>
863+
typename std::enable_if<std::is_same<typename std::decay<CreateInfoType>::type, ComputePipelineStateCreateInfo>::value>::type
864+
ProcessPipelineStateCreateInfoShaders(CreateInfoType&& CI, HandlerType&& Handler)
865+
{
866+
Handler(CI.pCS);
867+
}
868+
869+
template <typename CreateInfoType, typename HandlerType>
870+
typename std::enable_if<std::is_same<typename std::decay<CreateInfoType>::type, TilePipelineStateCreateInfo>::value>::type
871+
ProcessPipelineStateCreateInfoShaders(CreateInfoType&& CI, HandlerType&& Handler)
872+
{
873+
Handler(CI.pTS);
874+
}
875+
876+
template <typename CreateInfoType, typename HandlerType>
877+
typename std::enable_if<std::is_same<typename std::decay<CreateInfoType>::type, RayTracingPipelineStateCreateInfo>::value>::type
878+
ProcessPipelineStateCreateInfoShaders(CreateInfoType&& CI, HandlerType&& Handler)
879+
{
880+
for (Uint32 i = 0; i < CI.GeneralShaderCount; ++i)
881+
{
882+
Handler(CI.pGeneralShaders[i].pShader);
883+
}
884+
885+
for (Uint32 i = 0; i < CI.TriangleHitShaderCount; ++i)
886+
{
887+
Handler(CI.pTriangleHitShaders[i].pClosestHitShader);
888+
Handler(CI.pTriangleHitShaders[i].pAnyHitShader);
889+
}
890+
891+
for (Uint32 i = 0; i < CI.ProceduralHitShaderCount; ++i)
892+
{
893+
Handler(CI.pProceduralHitShaders[i].pIntersectionShader);
894+
Handler(CI.pProceduralHitShaders[i].pClosestHitShader);
895+
Handler(CI.pProceduralHitShaders[i].pAnyHitShader);
896+
}
897+
}
898+
849899
} // namespace Diligent

Tests/DiligentCoreTest/src/GraphicsAccessories/GraphicsAccessoriesTest.cpp

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,4 +1444,87 @@ TEST(GraphicsAccessories_GraphicsAccessories, TextureComponentAttribsToTextureFo
14441444
}
14451445
}
14461446

1447+
1448+
TEST(GraphicsAccessories_GraphicsAccessories, ProcessPipelineStateCreateInfoShaders)
1449+
{
1450+
{
1451+
GraphicsPipelineStateCreateInfo CI;
1452+
1453+
ptrdiff_t Ptr = 0x1000;
1454+
ProcessPipelineStateCreateInfoShaders(CI, [&Ptr](IShader*& pShader) {
1455+
pShader = reinterpret_cast<IShader*>(Ptr);
1456+
Ptr += 0x1000;
1457+
});
1458+
1459+
EXPECT_EQ(CI.pVS, reinterpret_cast<IShader*>(0x1000));
1460+
EXPECT_EQ(CI.pPS, reinterpret_cast<IShader*>(0x2000));
1461+
EXPECT_EQ(CI.pDS, reinterpret_cast<IShader*>(0x3000));
1462+
EXPECT_EQ(CI.pHS, reinterpret_cast<IShader*>(0x4000));
1463+
EXPECT_EQ(CI.pGS, reinterpret_cast<IShader*>(0x5000));
1464+
EXPECT_EQ(CI.pAS, reinterpret_cast<IShader*>(0x6000));
1465+
EXPECT_EQ(CI.pMS, reinterpret_cast<IShader*>(0x7000));
1466+
1467+
Ptr = 0x1000;
1468+
ProcessPipelineStateCreateInfoShaders(static_cast<const GraphicsPipelineStateCreateInfo&>(CI), [&Ptr](IShader* pShader) {
1469+
EXPECT_EQ(pShader, reinterpret_cast<IShader*>(Ptr));
1470+
Ptr += 0x1000;
1471+
});
1472+
}
1473+
1474+
{
1475+
ComputePipelineStateCreateInfo CI;
1476+
ProcessPipelineStateCreateInfoShaders(CI, [](IShader*& pShader) {
1477+
pShader = reinterpret_cast<IShader*>(0x1000);
1478+
});
1479+
1480+
EXPECT_EQ(CI.pCS, reinterpret_cast<IShader*>(0x1000));
1481+
1482+
ProcessPipelineStateCreateInfoShaders(static_cast<const ComputePipelineStateCreateInfo&>(CI), [](IShader* pShader) {
1483+
EXPECT_EQ(pShader, reinterpret_cast<IShader*>(0x1000));
1484+
});
1485+
}
1486+
1487+
{
1488+
TilePipelineStateCreateInfo CI;
1489+
ProcessPipelineStateCreateInfoShaders(CI, [](IShader*& pShader) {
1490+
pShader = reinterpret_cast<IShader*>(0x1000);
1491+
});
1492+
1493+
EXPECT_EQ(CI.pTS, reinterpret_cast<IShader*>(0x1000));
1494+
1495+
ProcessPipelineStateCreateInfoShaders(static_cast<const TilePipelineStateCreateInfo&>(CI), [](IShader* pShader) {
1496+
EXPECT_EQ(pShader, reinterpret_cast<IShader*>(0x1000));
1497+
});
1498+
}
1499+
1500+
{
1501+
RayTracingPipelineStateCreateInfo CI;
1502+
1503+
RayTracingGeneralShaderGroup GeneralGroup;
1504+
GeneralGroup.pShader = reinterpret_cast<IShader*>(0x1000);
1505+
1506+
RayTracingTriangleHitShaderGroup TriangleHitGroup;
1507+
TriangleHitGroup.pClosestHitShader = reinterpret_cast<IShader*>(0x2000);
1508+
TriangleHitGroup.pAnyHitShader = reinterpret_cast<IShader*>(0x3000);
1509+
1510+
RayTracingProceduralHitShaderGroup ProceduralHitGroup;
1511+
ProceduralHitGroup.pIntersectionShader = reinterpret_cast<IShader*>(0x4000);
1512+
ProceduralHitGroup.pClosestHitShader = reinterpret_cast<IShader*>(0x5000);
1513+
ProceduralHitGroup.pAnyHitShader = reinterpret_cast<IShader*>(0x6000);
1514+
1515+
CI.pGeneralShaders = &GeneralGroup;
1516+
CI.GeneralShaderCount = 1;
1517+
CI.pTriangleHitShaders = &TriangleHitGroup;
1518+
CI.TriangleHitShaderCount = 1;
1519+
CI.pProceduralHitShaders = &ProceduralHitGroup;
1520+
CI.ProceduralHitShaderCount = 1;
1521+
1522+
ptrdiff_t Ptr = 0x1000;
1523+
ProcessPipelineStateCreateInfoShaders(static_cast<const RayTracingPipelineStateCreateInfo&>(CI), [&Ptr](IShader* pShader) {
1524+
EXPECT_EQ(pShader, reinterpret_cast<IShader*>(Ptr));
1525+
Ptr += 0x1000;
1526+
});
1527+
}
1528+
}
1529+
14471530
} // namespace

0 commit comments

Comments
 (0)