summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-c-like.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-08-21 17:07:34 -0700
committerGitHub <noreply@github.com>2023-08-21 17:07:34 -0700
commitbd6dbaf7c3ea720b4ed39904fe08878f9dcbd947 (patch)
tree9e8c436e0888d192c462f75e4655a63b51f41648 /source/slang/slang-emit-c-like.cpp
parentf94b2f7a328a898c5e3dc1389d08e0b7ce6e092e (diff)
Compile append and consume structured buffers to glsl. (#3142)
* Compile append and consume structured buffers to glsl. * Fix. * Update CI config. --------- Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-emit-c-like.cpp')
-rw-r--r--source/slang/slang-emit-c-like.cpp92
1 files changed, 91 insertions, 1 deletions
diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp
index e1f631283..75a15d0c9 100644
--- a/source/slang/slang-emit-c-like.cpp
+++ b/source/slang/slang-emit-c-like.cpp
@@ -455,6 +455,66 @@ void CLikeSourceEmitter::emitRTTIObject(IRRTTIObject* rttiObject)
// This is only used in targets that support dynamic dispatching.
}
+void CLikeSourceEmitter::defaultEmitInstStmt(IRInst* inst)
+{
+ switch (inst->getOp())
+ {
+ case kIROp_AtomicCounterIncrement:
+ {
+ auto oldValName = getName(inst);
+ m_writer->emit("int ");
+ m_writer->emit(oldValName);
+ m_writer->emit(";\n");
+ m_writer->emit("InterlockedAdd(");
+ emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
+ m_writer->emit(", 1, ");
+ m_writer->emit(oldValName);
+ m_writer->emit(");\n");
+ }
+ break;
+ case kIROp_AtomicCounterDecrement:
+ {
+ auto oldValName = getName(inst);
+ m_writer->emit("int ");
+ m_writer->emit(oldValName);
+ m_writer->emit(";\n");
+ m_writer->emit("InterlockedAdd(");
+ emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
+ m_writer->emit(", -1, ");
+ m_writer->emit(oldValName);
+ m_writer->emit(");\n");
+ }
+ break;
+ case kIROp_StructuredBufferGetDimensions:
+ {
+ auto count = _generateUniqueName(UnownedStringSlice("_elementCount"));
+ auto stride = _generateUniqueName(UnownedStringSlice("_stride"));
+
+ m_writer->emit("uint ");
+ m_writer->emit(count);
+ m_writer->emit(";\n");
+ m_writer->emit("uint ");
+ m_writer->emit(stride);
+ m_writer->emit(";\n");
+ emitOperand(inst->getOperand(0), leftSide(getInfo(EmitOp::General), getInfo(EmitOp::Postfix)));
+ m_writer->emit(".GetDimensions(");
+ m_writer->emit(count);
+ m_writer->emit(", ");
+ m_writer->emit(stride);
+ m_writer->emit(");\n");
+ emitInstResultDecl(inst);
+ m_writer->emit("uint2(");
+ m_writer->emit(count);
+ m_writer->emit(", ");
+ m_writer->emit(stride);
+ m_writer->emit(");\n");
+ }
+ break;
+ default:
+ diagnoseUnhandledInst(inst);
+ }
+}
+
void CLikeSourceEmitter::emitTypeImpl(IRType* type, const StringSliceLoc* nameAndLoc)
{
@@ -1874,6 +1934,16 @@ void CLikeSourceEmitter::emitInstExpr(IRInst* inst, const EmitOpInfo& inOuterPre
defaultEmitInstExpr(inst, inOuterPrec);
}
+void CLikeSourceEmitter::emitInstStmt(IRInst* inst)
+{
+ // Try target specific impl first
+ if (tryEmitInstStmtImpl(inst))
+ {
+ return;
+ }
+ defaultEmitInstStmt(inst);
+}
+
void CLikeSourceEmitter::diagnoseUnhandledInst(IRInst* inst)
{
getSink()->diagnose(inst, Diagnostics::unimplemented, "unexpected IR opcode during code emit");
@@ -2193,6 +2263,23 @@ void CLikeSourceEmitter::defaultEmitInstExpr(IRInst* inst, const EmitOpInfo& inO
}
break;
+ case kIROp_StructuredBufferAppend:
+ {
+ auto outer = getInfo(EmitOp::General);
+ emitOperand(inst->getOperand(0), leftSide(outer, getInfo(EmitOp::Postfix)));
+ m_writer->emit(".Append(");
+ emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
+ m_writer->emit(")");
+ }
+ break;
+ case kIROp_StructuredBufferConsume:
+ {
+ auto outer = getInfo(EmitOp::General);
+ emitOperand(inst->getOperand(0), leftSide(outer, getInfo(EmitOp::Postfix)));
+ m_writer->emit(".Consume()");
+ }
+ break;
+
case kIROp_Call:
{
emitCallExpr((IRCall*)inst, outerPrec);
@@ -2562,7 +2649,10 @@ void CLikeSourceEmitter::_emitInst(IRInst* inst)
// Insts that needs to be emitted as code blocks.
case kIROp_CudaKernelLaunch:
- emitInstStmtImpl(inst);
+ case kIROp_AtomicCounterIncrement:
+ case kIROp_AtomicCounterDecrement:
+ case kIROp_StructuredBufferGetDimensions:
+ emitInstStmt(inst);
break;
case kIROp_LiveRangeStart: