summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-glsl.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-glsl.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-glsl.cpp')
-rw-r--r--source/slang/slang-emit-glsl.cpp38
1 files changed, 36 insertions, 2 deletions
diff --git a/source/slang/slang-emit-glsl.cpp b/source/slang/slang-emit-glsl.cpp
index 0920c236c..e1f74f70d 100644
--- a/source/slang/slang-emit-glsl.cpp
+++ b/source/slang/slang-emit-glsl.cpp
@@ -201,8 +201,11 @@ void GLSLSourceEmitter::_emitGLSLStructuredBuffer(IRGlobalParam* varDecl, IRHLSL
m_writer->emit("buffer ");
// Generate a dummy name for the block
- m_writer->emit("_S");
- m_writer->emit(m_uniqueIDCounter++);
+ StringBuilder blockTypeName;
+ blockTypeName << "StructuredBuffer_";
+ getTypeNameHint(blockTypeName, structuredBufferType->getElementType());
+ blockTypeName << "_t";
+ m_writer->emit(_generateUniqueName(blockTypeName.produceString().getUnownedSlice()));
m_writer->emit(" {\n");
m_writer->indent();
@@ -2007,6 +2010,37 @@ bool GLSLSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOu
return false;
}
+bool GLSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
+{
+ switch (inst->getOp())
+ {
+ case kIROp_AtomicCounterIncrement:
+ {
+ auto oldValName = getName(inst);
+ m_writer->emit("int ");
+ m_writer->emit(oldValName);
+ m_writer->emit(" = ");
+ m_writer->emit("atomicAdd(");
+ emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
+ m_writer->emit(", 1);\n");
+ return true;
+ }
+ case kIROp_AtomicCounterDecrement:
+ {
+ auto oldValName = getName(inst);
+ m_writer->emit("int ");
+ m_writer->emit(oldValName);
+ m_writer->emit(" = ");
+ m_writer->emit("atomicAdd(");
+ emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
+ m_writer->emit(", -1);\n");
+ return true;
+ }
+ default:
+ return false;
+ }
+}
+
void GLSLSourceEmitter::handleRequiredCapabilitiesImpl(IRInst* inst)
{
// Does this function declare any requirements on GLSL version or