From b4d3d3017640581c21b52a12413d3f074ab1c5c1 Mon Sep 17 00:00:00 2001 From: Jay Kwak <82421531+jkwak-work@users.noreply.github.com> Date: Thu, 15 May 2025 02:57:47 +0000 Subject: 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. --- source/slang/slang-emit-c-like.cpp | 65 +++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 18 deletions(-) (limited to 'source/slang/slang-emit-c-like.cpp') 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(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 -- cgit v1.2.3