diff options
| author | Darren Wihandi <65404740+fairywreath@users.noreply.github.com> | 2025-03-14 18:32:37 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-14 15:32:37 -0700 |
| commit | c8c9e424e91e72e718529ed76df14f7586624cd6 (patch) | |
| tree | b9846efaec0dc5cf96ddbdceb4362020761374d7 /source/slang/slang-emit-wgsl.cpp | |
| parent | c2e8f9c1ebe316d7f3b2932fa1c24065fdf83d37 (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.cpp | 30 |
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; + } } } |
