@@ -706,6 +706,51 @@ class DXBuilder {
706706 toAttr (ubound), toAttr (space));
707707 }
708708
709+ dxsa::UAVFlagsAttr buildUavFlagsAttr (std::optional<dxsa::UAVFlags> flags) {
710+ return flags ? dxsa::UAVFlagsAttr::get (builder.getContext (), *flags)
711+ : dxsa::UAVFlagsAttr ();
712+ }
713+
714+ Instruction buildDclUavTyped (
715+ uint32_t id, dxsa::ResourceDimension dim, dxsa::ResourceReturnType x,
716+ dxsa::ResourceReturnType y, dxsa::ResourceReturnType z,
717+ dxsa::ResourceReturnType w, std::optional<dxsa::UAVFlags> flags,
718+ std::optional<uint32_t > lbound, std::optional<uint32_t > ubound,
719+ std::optional<uint32_t > space, Location loc) {
720+ auto toAttr = [&](std::optional<uint32_t > v) -> IntegerAttr {
721+ return v ? builder.getI32IntegerAttr (*v) : IntegerAttr ();
722+ };
723+ return dxsa::DclUavTyped::create (builder, loc, id, dim, x, y, z, w,
724+ buildUavFlagsAttr (flags), toAttr (lbound),
725+ toAttr (ubound), toAttr (space));
726+ }
727+
728+ Instruction buildDclUavRaw (uint32_t id, std::optional<dxsa::UAVFlags> flags,
729+ std::optional<uint32_t > lbound,
730+ std::optional<uint32_t > ubound,
731+ std::optional<uint32_t > space, Location loc) {
732+ auto toAttr = [&](std::optional<uint32_t > v) -> IntegerAttr {
733+ return v ? builder.getI32IntegerAttr (*v) : IntegerAttr ();
734+ };
735+ return dxsa::DclUavRaw::create (builder, loc, id, buildUavFlagsAttr (flags),
736+ toAttr (lbound), toAttr (ubound),
737+ toAttr (space));
738+ }
739+
740+ Instruction buildDclUavStructured (uint32_t id, uint32_t structByteStride,
741+ std::optional<dxsa::UAVFlags> flags,
742+ std::optional<uint32_t > lbound,
743+ std::optional<uint32_t > ubound,
744+ std::optional<uint32_t > space,
745+ Location loc) {
746+ auto toAttr = [&](std::optional<uint32_t > v) -> IntegerAttr {
747+ return v ? builder.getI32IntegerAttr (*v) : IntegerAttr ();
748+ };
749+ return dxsa::DclUavStructured::create (
750+ builder, loc, id, structByteStride, buildUavFlagsAttr (flags),
751+ toAttr (lbound), toAttr (ubound), toAttr (space));
752+ }
753+
709754private:
710755 MLIRContext *context;
711756 ModuleOp module ;
@@ -1398,6 +1443,105 @@ class Parser {
13981443 lbound, ubound, space, loc);
13991444 }
14001445
1446+ std::optional<dxsa::UAVFlags> decodeUavFlags (uint32_t opcodeToken) {
1447+ auto flags = static_cast <dxsa::UAVFlags>(0 );
1448+ if (opcodeToken & D3D11_SB_GLOBALLY_COHERENT_ACCESS)
1449+ flags = flags | dxsa::UAVFlags::globallyCoherent;
1450+ if (opcodeToken & D3D11_SB_RASTERIZER_ORDERED_ACCESS)
1451+ flags = flags | dxsa::UAVFlags::rasterizerOrdered;
1452+ if (opcodeToken & D3D11_SB_UAV_HAS_ORDER_PRESERVING_COUNTER)
1453+ flags = flags | dxsa::UAVFlags::hasOrderPreservingCounter;
1454+ if (static_cast <uint32_t >(flags) == 0 )
1455+ return std::nullopt ;
1456+ return flags;
1457+ }
1458+
1459+ struct UavOperand {
1460+ uint32_t id;
1461+ std::optional<uint32_t > lbound;
1462+ std::optional<uint32_t > ubound;
1463+ };
1464+
1465+ FailureOr<UavOperand> parseUavOperand (Location loc) {
1466+ auto operand = parseInlineOperand ();
1467+ FAILURE_IF_FAILED (operand);
1468+ if (operand->getType () != dxsa::InlineOperandType::uav)
1469+ return emitError (loc, " operand must be a uav register, got " )
1470+ << dxsa::stringifyInlineOperandType (operand->getType ());
1471+ auto indexArray = operand->getIndex ();
1472+ auto indexDim = indexArray ? indexArray.size () : 0 ;
1473+ if (indexDim != 1 && indexDim != 3 )
1474+ return emitError (loc, " operand must have a 1D or 3D index, got " )
1475+ << indexDim;
1476+ UavOperand uav{static_cast <uint32_t >(indexArray[0 ]), std::nullopt ,
1477+ std::nullopt };
1478+ if (indexDim == 3 ) {
1479+ uav.lbound = static_cast <uint32_t >(indexArray[1 ]);
1480+ uav.ubound = static_cast <uint32_t >(indexArray[2 ]);
1481+ }
1482+ return uav;
1483+ }
1484+
1485+ FailureOr<std::optional<uint32_t >> parseUavSpace (const UavOperand &uav) {
1486+ if (!uav.lbound )
1487+ return std::optional<uint32_t >(std::nullopt );
1488+ auto spaceToken = parseToken ();
1489+ FAILURE_IF_FAILED (spaceToken);
1490+ return std::optional<uint32_t >(*spaceToken);
1491+ }
1492+
1493+ FailureOr<Instruction> parseDclUavTyped (uint32_t opcodeToken, Location loc) {
1494+ auto rawDim = DECODE_D3D10_SB_RESOURCE_DIMENSION (opcodeToken);
1495+ auto dim = dxsa::symbolizeResourceDimension (rawDim);
1496+ if (!dim)
1497+ return emitError (loc, " unknown resource dimension: " ) << rawDim;
1498+
1499+ auto flags = decodeUavFlags (opcodeToken);
1500+
1501+ auto uav = parseUavOperand (loc);
1502+ FAILURE_IF_FAILED (uav);
1503+
1504+ auto returnTypeToken = parseToken ();
1505+ FAILURE_IF_FAILED (returnTypeToken);
1506+ auto x = parseResourceReturnType (*returnTypeToken, 0 , loc);
1507+ FAILURE_IF_FAILED (x);
1508+ auto y = parseResourceReturnType (*returnTypeToken, 1 , loc);
1509+ FAILURE_IF_FAILED (y);
1510+ auto z = parseResourceReturnType (*returnTypeToken, 2 , loc);
1511+ FAILURE_IF_FAILED (z);
1512+ auto w = parseResourceReturnType (*returnTypeToken, 3 , loc);
1513+ FAILURE_IF_FAILED (w);
1514+
1515+ auto space = parseUavSpace (*uav);
1516+ FAILURE_IF_FAILED (space);
1517+
1518+ return builder.buildDclUavTyped (uav->id , *dim, *x, *y, *z, *w, flags,
1519+ uav->lbound , uav->ubound , *space, loc);
1520+ }
1521+
1522+ FailureOr<Instruction> parseDclUavRaw (uint32_t opcodeToken, Location loc) {
1523+ auto flags = decodeUavFlags (opcodeToken);
1524+ auto uav = parseUavOperand (loc);
1525+ FAILURE_IF_FAILED (uav);
1526+ auto space = parseUavSpace (*uav);
1527+ FAILURE_IF_FAILED (space);
1528+ return builder.buildDclUavRaw (uav->id , flags, uav->lbound , uav->ubound ,
1529+ *space, loc);
1530+ }
1531+
1532+ FailureOr<Instruction> parseDclUavStructured (uint32_t opcodeToken,
1533+ Location loc) {
1534+ auto flags = decodeUavFlags (opcodeToken);
1535+ auto uav = parseUavOperand (loc);
1536+ FAILURE_IF_FAILED (uav);
1537+ auto strideToken = parseToken ();
1538+ FAILURE_IF_FAILED (strideToken);
1539+ auto space = parseUavSpace (*uav);
1540+ FAILURE_IF_FAILED (space);
1541+ return builder.buildDclUavStructured (uav->id , *strideToken, flags,
1542+ uav->lbound , uav->ubound , *space, loc);
1543+ }
1544+
14011545 OptionalParseResult parseDclInstruction (uint32_t opcodeToken, Location loc,
14021546 Instruction &out) {
14031547 FailureOr<Instruction> result;
@@ -1477,6 +1621,15 @@ class Parser {
14771621 case D3D10_SB_OPCODE_DCL_RESOURCE:
14781622 result = parseDclResource (opcodeToken, loc);
14791623 break ;
1624+ case D3D11_SB_OPCODE_DCL_UNORDERED_ACCESS_VIEW_TYPED:
1625+ result = parseDclUavTyped (opcodeToken, loc);
1626+ break ;
1627+ case D3D11_SB_OPCODE_DCL_UNORDERED_ACCESS_VIEW_RAW:
1628+ result = parseDclUavRaw (opcodeToken, loc);
1629+ break ;
1630+ case D3D11_SB_OPCODE_DCL_UNORDERED_ACCESS_VIEW_STRUCTURED:
1631+ result = parseDclUavStructured (opcodeToken, loc);
1632+ break ;
14801633 default :
14811634 return std::nullopt ;
14821635 }
0 commit comments