From c8c9e424e91e72e718529ed76df14f7586624cd6 Mon Sep 17 00:00:00 2001 From: Darren Wihandi <65404740+fairywreath@users.noreply.github.com> Date: Fri, 14 Mar 2025 18:32:37 -0400 Subject: 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 --- source/slang/hlsl.meta.slang | 19 ++++++++----------- source/slang/slang-emit-wgsl.cpp | 30 ++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 11 deletions(-) (limited to 'source') diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index c26a7613b..c7e4925be 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -67,15 +67,15 @@ __intrinsic_op($(kIROp_StructuredBufferGetDimensions)) uint2 __structuredBufferGetDimensions(ConsumeStructuredBuffer buffer); __intrinsic_op($(kIROp_StructuredBufferGetDimensions)) -[require(cpp_cuda_glsl_hlsl_metal_spirv, structuredbuffer)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, structuredbuffer)] uint2 __structuredBufferGetDimensions(StructuredBuffer buffer); __intrinsic_op($(kIROp_StructuredBufferGetDimensions)) -[require(cpp_cuda_glsl_hlsl_metal_spirv, structuredbuffer_rw)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, structuredbuffer_rw)] uint2 __structuredBufferGetDimensions(RWStructuredBuffer buffer); __intrinsic_op($(kIROp_StructuredBufferGetDimensions)) -[require(cpp_cuda_glsl_hlsl_metal_spirv, structuredbuffer_rw)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, structuredbuffer_rw)] uint2 __structuredBufferGetDimensions(RasterizerOrderedStructuredBuffer buffer); //@public: @@ -143,7 +143,7 @@ struct ByteAddressBuffer ///@param[out] dim The number of bytes in the buffer. [__readNone] [ForceInline] - [require(cpp_cuda_glsl_hlsl_metal_spirv, structuredbuffer)] + [require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, structuredbuffer)] void GetDimensions(out uint dim) { __target_switch @@ -151,9 +151,7 @@ struct ByteAddressBuffer case cpp: __intrinsic_asm ".GetDimensions"; case cuda: __intrinsic_asm ".GetDimensions"; case hlsl: __intrinsic_asm ".GetDimensions"; - case glsl: - case metal: - case spirv: + default: dim = __structuredBufferGetDimensions(__getEquivalentStructuredBuffer(this)).x*4; } } @@ -4922,7 +4920,7 @@ struct $(item.name) /// Get the number of bytes in the buffer. ///@param[out] dim The number of bytes in the buffer. [ForceInline] - [require(cpp_cuda_glsl_hlsl_spirv, structuredbuffer_rw)] + [require(cpp_cuda_glsl_hlsl_spirv_wgsl, structuredbuffer_rw)] void GetDimensions(out uint dim) { __target_switch @@ -4930,8 +4928,7 @@ struct $(item.name) case cpp: __intrinsic_asm ".GetDimensions"; case cuda: __intrinsic_asm ".GetDimensions"; case hlsl: __intrinsic_asm ".GetDimensions"; - case glsl: - case spirv: + default: dim = __structuredBufferGetDimensions(__getEquivalentStructuredBuffer(this)).x*4; } } @@ -5939,7 +5936,7 @@ struct $(item.name) /// @param stride The stride, in bytes, of each structure element. [__readNone] [ForceInline] - [require(cpp_cuda_glsl_hlsl_metal_spirv, structuredbuffer_rw)] + [require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, structuredbuffer_rw)] void GetDimensions( out uint numStructs, out uint stride) 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(dataType); + if (structuredBufferType) + { + auto elementType = structuredBufferType->getElementType(); + auto sizeDecor = elementType->findDecoration(); + SLANG_ASSERT(sizeDecor); + strideValue = align(sizeDecor->getSize(), (int)sizeDecor->getAlignment()); + } + else + { + SLANG_ASSERT(as(dataType)); + // ByteAddressBuffer(s) are an array of 32 bit integers, stride is 4 bytes. + strideValue = 4; + } + + emitInstResultDecl(inst); + m_writer->emit("vec2("); + 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; + } } } -- cgit v1.2.3