@@ -1900,6 +1900,30 @@ void DxilMDHelper::LoadDxilEntryProperties(const MDOperand &MDO,
19001900 auto &Node = props.Node ;
19011901 Node.MaxRecursionDepth = ConstMDToUint32 (MDO);
19021902 } break ;
1903+ case DxilMDHelper::kDxilNodeMeshOutputTopologyTag : {
1904+ hasNodeTag = true ;
1905+ auto &Node = props.Node ;
1906+ Node.OutputTopology = (DXIL::MeshOutputTopology)ConstMDToUint32 (MDO);
1907+ } break ;
1908+ case DxilMDHelper::kDxilNodeMeshMaxVertexCountTag : {
1909+ hasNodeTag = true ;
1910+ auto &Node = props.Node ;
1911+ Node.MaxVertexCount = ConstMDToUint32 (MDO);
1912+ } break ;
1913+ case DxilMDHelper::kDxilNodeMeshMaxPrimitiveCountTag : {
1914+ hasNodeTag = true ;
1915+ auto &Node = props.Node ;
1916+ Node.MaxPrimitiveCount = ConstMDToUint32 (MDO);
1917+ } break ;
1918+ case DxilMDHelper::kDxilNodeMaxInputRecordsPerGraphEntryRecordTag : {
1919+ hasNodeTag = true ;
1920+ auto &Node = props.Node ;
1921+ MDNode *pNode = cast<MDNode>(MDO.get ());
1922+ Node.MaxInputRecordsPerGraphEntryRecord =
1923+ ConstMDToUint32 (pNode->getOperand (0 ));
1924+ Node.MaxInputRecSharedAcrossNodeArray =
1925+ ConstMDToBool (pNode->getOperand (1 ));
1926+ } break ;
19031927 case DxilMDHelper::kDxilNodeInputsTag : {
19041928 hasNodeTag = true ;
19051929 const MDTuple *pNodeInputs = dyn_cast<MDTuple>(MDO.get ());
@@ -1957,6 +1981,14 @@ void DxilMDHelper::SerializeNodeProps(SmallVectorImpl<llvm::Metadata *> &MDVals,
19571981 MDVals.push_back (Uint32ToConstMD (NodeProps.MaxDispatchGrid [1 ]));
19581982 MDVals.push_back (Uint32ToConstMD (NodeProps.MaxDispatchGrid [2 ]));
19591983 MDVals.push_back (Uint32ToConstMD (NodeProps.MaxRecursionDepth ));
1984+ if (DXIL::CompareVersions (m_MinValMajor, m_MinValMinor, 1 , 9 ) >= 0 ) {
1985+ MDVals.emplace_back (Uint32ToConstMD ((unsigned )NodeProps.OutputTopology ));
1986+ MDVals.emplace_back (Uint32ToConstMD (NodeProps.MaxVertexCount ));
1987+ MDVals.emplace_back (Uint32ToConstMD (NodeProps.MaxPrimitiveCount ));
1988+ MDVals.push_back (
1989+ Uint32ToConstMD (NodeProps.MaxInputRecordsPerGraphEntryRecord ));
1990+ MDVals.push_back (BoolToConstMD (NodeProps.MaxInputRecSharedAcrossNodeArray ));
1991+ }
19601992 for (auto &nodeinput : props->InputNodes ) {
19611993 MDVals.push_back (Uint32ToConstMD (nodeinput.Flags ));
19621994 MDVals.push_back (Uint32ToConstMD (nodeinput.MaxRecords ));
@@ -2010,6 +2042,16 @@ void DxilMDHelper::DeserializeNodeProps(const MDTuple *pProps, unsigned &idx,
20102042 NodeProps.MaxDispatchGrid [1 ] = ConstMDToUint32 (pProps->getOperand (idx++));
20112043 NodeProps.MaxDispatchGrid [2 ] = ConstMDToUint32 (pProps->getOperand (idx++));
20122044 NodeProps.MaxRecursionDepth = ConstMDToUint32 (pProps->getOperand (idx++));
2045+ if (DXIL::CompareVersions (m_MinValMajor, m_MinValMinor, 1 , 9 ) >= 0 ) {
2046+ NodeProps.OutputTopology =
2047+ (DXIL::MeshOutputTopology)ConstMDToUint32 (pProps->getOperand (idx++));
2048+ NodeProps.MaxVertexCount = ConstMDToUint32 (pProps->getOperand (idx++));
2049+ NodeProps.MaxPrimitiveCount = ConstMDToUint32 (pProps->getOperand (idx++));
2050+ NodeProps.MaxInputRecordsPerGraphEntryRecord =
2051+ ConstMDToUint32 (pProps->getOperand (idx++));
2052+ NodeProps.MaxInputRecSharedAcrossNodeArray =
2053+ ConstMDToBool (pProps->getOperand (idx++));
2054+ }
20132055 for (auto &nodeinput : props->InputNodes ) {
20142056 nodeinput.Flags = NodeFlags (ConstMDToUint32 (pProps->getOperand (idx++)));
20152057 nodeinput.MaxRecords = ConstMDToUint32 (pProps->getOperand (idx++));
@@ -2748,6 +2790,36 @@ void DxilMDHelper::EmitDxilNodeState(std::vector<llvm::Metadata *> &MDVals,
27482790 MDVals.emplace_back (Uint32ToConstMD (Node.MaxRecursionDepth ));
27492791 }
27502792
2793+ // Experimental mesh node shader properties
2794+ if (Node.OutputTopology != DXIL::MeshOutputTopology::Undefined) {
2795+ MDVals.emplace_back (
2796+ Uint32ToConstMD (DxilMDHelper::kDxilNodeMeshOutputTopologyTag ));
2797+ MDVals.emplace_back (Uint32ToConstMD ((unsigned )Node.OutputTopology ));
2798+ }
2799+
2800+ if (Node.MaxVertexCount > 0 ) {
2801+ MDVals.emplace_back (
2802+ Uint32ToConstMD (DxilMDHelper::kDxilNodeMeshMaxVertexCountTag ));
2803+ MDVals.emplace_back (Uint32ToConstMD (Node.MaxVertexCount ));
2804+ }
2805+
2806+ if (Node.MaxPrimitiveCount > 0 ) {
2807+ MDVals.emplace_back (
2808+ Uint32ToConstMD (DxilMDHelper::kDxilNodeMeshMaxPrimitiveCountTag ));
2809+ MDVals.emplace_back (Uint32ToConstMD (Node.MaxPrimitiveCount ));
2810+ }
2811+
2812+ if (Node.MaxInputRecordsPerGraphEntryRecord ) {
2813+ MDVals.emplace_back (Uint32ToConstMD (
2814+ DxilMDHelper::kDxilNodeMaxInputRecordsPerGraphEntryRecordTag ));
2815+ vector<Metadata *> MaxInputRecsVals;
2816+ MaxInputRecsVals.emplace_back (
2817+ Uint32ToConstMD (Node.MaxInputRecordsPerGraphEntryRecord ));
2818+ MaxInputRecsVals.emplace_back (
2819+ BoolToConstMD (Node.MaxInputRecSharedAcrossNodeArray ));
2820+ MDVals.emplace_back (MDNode::get (m_Ctx, MaxInputRecsVals));
2821+ }
2822+
27512823 if (props.InputNodes .size ()) {
27522824 MDVals.emplace_back (Uint32ToConstMD (DxilMDHelper::kDxilNodeInputsTag ));
27532825 vector<Metadata *> NodeInputVals;
0 commit comments