diff options
| author | Jay Kwak <82421531+jkwak-work@users.noreply.github.com> | 2025-05-15 02:57:47 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-14 19:57:47 -0700 |
| commit | b4d3d3017640581c21b52a12413d3f074ab1c5c1 (patch) | |
| tree | 2a3fc8350a590e7f342df328b7d9c4469ac40298 /source/slang/slang-emit-c-like.cpp | |
| parent | 2275e18fc052239fe67f3fda68252ad92bb83ca9 (diff) | |
Support the new CoopVec builtins (#7108)
**NOTE: This is a breaking change for users who were using POC variant of DXC.
In order to keep the compatibility, the users will have to use -capability hlsl_coopvec_poc to their command line.
This PR adds a new capability "hlsl_coopvec_poc".
When it is used, the HLSL for CoopVec will be emitted for the POC variant of DXC.
When it is not used, the HLSL for CoopVec will be emitted for the DXC that officially supports the cooperative vector.
Diffstat (limited to 'source/slang/slang-emit-c-like.cpp')
| -rw-r--r-- | source/slang/slang-emit-c-like.cpp | 65 |
1 files changed, 47 insertions, 18 deletions
diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp index 56668d092..141a843f2 100644 --- a/source/slang/slang-emit-c-like.cpp +++ b/source/slang/slang-emit-c-like.cpp @@ -109,6 +109,9 @@ CLikeSourceEmitter::CLikeSourceEmitter(const Desc& desc) m_codeGenContext = desc.codeGenContext; m_entryPointStage = desc.entryPointStage; m_effectiveProfile = desc.effectiveProfile; + + auto targetCaps = getTargetReq()->getTargetCaps(); + isCoopvecPoc = targetCaps.implies(CapabilityAtom::hlsl_coopvec_poc); } SlangResult CLikeSourceEmitter::init() @@ -3118,18 +3121,32 @@ void CLikeSourceEmitter::_emitInst(IRInst* inst) case kIROp_MakeCoopVector: { emitType(coopVecType, getName(inst)); - m_writer->emit(";\n"); + m_writer->emit(isCoopvecPoc ? ";\n" : " = { "); auto elemCount = as<IRIntLit>(coopVecType->getOperand(1)); IRIntegerValue elemCountValue = elemCount->getValue(); - for (IRIntegerValue i = 0; i < elemCountValue; ++i) + if (isCoopvecPoc) { - m_writer->emit(getName(inst)); - m_writer->emit(".WriteToIndex("); - m_writer->emit(i); - m_writer->emit(", "); + for (IRIntegerValue i = 0; i < elemCountValue; ++i) + { + m_writer->emit(getName(inst)); + m_writer->emit(".WriteToIndex("); + m_writer->emit(i); + m_writer->emit(", "); + emitDereferenceOperand(inst->getOperand(i), getInfo(EmitOp::General)); + m_writer->emit(");\n"); + } + } + else + { + IRIntegerValue i = 0; + for (; i < elemCountValue - 1; ++i) + { + emitDereferenceOperand(inst->getOperand(i), getInfo(EmitOp::General)); + m_writer->emit(", "); + } emitDereferenceOperand(inst->getOperand(i), getInfo(EmitOp::General)); - m_writer->emit(");\n"); + m_writer->emit("};\n"); } return; } @@ -3138,7 +3155,7 @@ void CLikeSourceEmitter::_emitInst(IRInst* inst) m_writer->emit(";\n"); m_writer->emit(getName(inst)); - m_writer->emit(".CopyFrom("); + m_writer->emit(isCoopvecPoc ? ".CopyFrom(" : " = ("); emitCallExpr((IRCall*)inst, getInfo(EmitOp::General)); m_writer->emit(");\n"); return; @@ -3147,7 +3164,7 @@ void CLikeSourceEmitter::_emitInst(IRInst* inst) m_writer->emit(";\n"); m_writer->emit(getName(inst)); - m_writer->emit(".CopyFrom("); + m_writer->emit(isCoopvecPoc ? ".CopyFrom(" : " = ("); emitDereferenceOperand(inst->getOperand(0), getInfo(EmitOp::General)); m_writer->emit(");\n"); return; @@ -3409,10 +3426,21 @@ void CLikeSourceEmitter::_emitStoreImpl(IRStore* store) auto dstPtr = store->getPtr(); if (isPointerOfType(dstPtr->getDataType(), kIROp_CoopVectorType)) { - emitDereferenceOperand(dstPtr, getInfo(EmitOp::General)); - m_writer->emit(".CopyFrom("); - emitDereferenceOperand(srcVal, getInfo(EmitOp::General)); - m_writer->emit(");\n"); + if (isCoopvecPoc) + { + emitDereferenceOperand(dstPtr, getInfo(EmitOp::General)); + m_writer->emit(".CopyFrom("); + emitDereferenceOperand(srcVal, getInfo(EmitOp::General)); + m_writer->emit(");\n"); + } + else + { + auto prec = getInfo(EmitOp::Assign); + emitDereferenceOperand(dstPtr, leftSide(getInfo(EmitOp::General), prec)); + m_writer->emit(" = "); + emitOperand(srcVal, rightSide(prec, getInfo(EmitOp::General))); + m_writer->emit(";\n"); + } } else { @@ -4705,7 +4733,7 @@ void CLikeSourceEmitter::emitVar(IRVar* varDecl) { m_writer->emit(";\n"); m_writer->emit(getName(varDecl)); - m_writer->emit(".CopyFrom("); + m_writer->emit(isCoopvecPoc ? ".CopyFrom(" : " = ("); emitDereferenceOperand(store->getVal()->getOperand(0), getInfo(EmitOp::General)); m_writer->emit(")"); } @@ -4713,7 +4741,7 @@ void CLikeSourceEmitter::emitVar(IRVar* varDecl) { m_writer->emit(";\n"); m_writer->emit(getName(varDecl)); - m_writer->emit(".CopyFrom("); + m_writer->emit(isCoopvecPoc ? ".CopyFrom(" : " = ("); emitCallExpr((IRCall*)store->getVal(), getInfo(EmitOp::General)); m_writer->emit(")"); } @@ -4726,13 +4754,14 @@ void CLikeSourceEmitter::emitVar(IRVar* varDecl) { m_writer->emit(";\n"); m_writer->emit(getName(varDecl)); - m_writer->emit(".WriteToIndex("); + m_writer->emit(isCoopvecPoc ? ".WriteToIndex(" : "["); m_writer->emit(i); - m_writer->emit(", "); + m_writer->emit(isCoopvecPoc ? ", " : "] = "); emitDereferenceOperand( store->getVal()->getOperand(i), getInfo(EmitOp::General)); - m_writer->emit(")"); + if (isCoopvecPoc) + m_writer->emit(")"); } } else |
