summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-wgsl.cpp
diff options
context:
space:
mode:
authorDarren Wihandi <65404740+fairywreath@users.noreply.github.com>2025-03-14 18:32:37 -0400
committerGitHub <noreply@github.com>2025-03-14 15:32:37 -0700
commitc8c9e424e91e72e718529ed76df14f7586624cd6 (patch)
treeb9846efaec0dc5cf96ddbdceb4362020761374d7 /source/slang/slang-emit-wgsl.cpp
parentc2e8f9c1ebe316d7f3b2932fa1c24065fdf83d37 (diff)
Implement GetDimensions for structured buffers on WGSL (#6609)
* Implement structured buffer GetDimensions for WGSL * byte address buffer fix * enable wgsl test and minor fixups * maybe fix get equivalent structured buffer * remove unnecessary include * clean up some code in meta file
Diffstat (limited to 'source/slang/slang-emit-wgsl.cpp')
-rw-r--r--source/slang/slang-emit-wgsl.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/source/slang/slang-emit-wgsl.cpp b/source/slang/slang-emit-wgsl.cpp
index d87cd06de..227c6cf75 100644
--- a/source/slang/slang-emit-wgsl.cpp
+++ b/source/slang/slang-emit-wgsl.cpp
@@ -1,5 +1,6 @@
#include "slang-emit-wgsl.h"
+#include "slang-ir-layout.h"
#include "slang-ir-util.h"
// A note on row/column "terminology reversal".
@@ -1240,6 +1241,35 @@ bool WGSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
m_writer->emit("(1));\n");
return true;
}
+ case kIROp_StructuredBufferGetDimensions:
+ {
+ IRIntegerValue strideValue;
+ auto dataType = inst->getOperand(0)->getDataType();
+ auto structuredBufferType = as<IRHLSLStructuredBufferTypeBase>(dataType);
+ if (structuredBufferType)
+ {
+ auto elementType = structuredBufferType->getElementType();
+ auto sizeDecor = elementType->findDecoration<IRSizeAndAlignmentDecoration>();
+ SLANG_ASSERT(sizeDecor);
+ strideValue = align(sizeDecor->getSize(), (int)sizeDecor->getAlignment());
+ }
+ else
+ {
+ SLANG_ASSERT(as<IRByteAddressBufferTypeBase>(dataType));
+ // ByteAddressBuffer(s) are an array of 32 bit integers, stride is 4 bytes.
+ strideValue = 4;
+ }
+
+ emitInstResultDecl(inst);
+ m_writer->emit("vec2<u32>(");
+ m_writer->emit("arrayLength(&");
+ emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
+ m_writer->emit(")");
+ m_writer->emit(", ");
+ m_writer->emit(strideValue);
+ m_writer->emit(");\n");
+ return true;
+ }
}
}