diff options
| author | Yong He <yonghe@outlook.com> | 2023-08-21 17:07:34 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-21 17:07:34 -0700 |
| commit | bd6dbaf7c3ea720b4ed39904fe08878f9dcbd947 (patch) | |
| tree | 9e8c436e0888d192c462f75e4655a63b51f41648 /source/slang/slang-emit-c-like.cpp | |
| parent | f94b2f7a328a898c5e3dc1389d08e0b7ce6e092e (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.cpp | 92 |
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: |
