summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/hlsl.meta.slang10
-rw-r--r--source/slang/slang-emit-wgsl.cpp40
-rw-r--r--tests/compute/byte-address-buffer.slang1
3 files changed, 43 insertions, 8 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index 907822060..cf3f25e8f 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -107,7 +107,7 @@ struct AppendStructuredBuffer
/// @category buffer_types
__magic_type(HLSLByteAddressBufferType)
__intrinsic_type($(kIROp_HLSLByteAddressBufferType))
-[require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, byteaddressbuffer)]
struct ByteAddressBuffer
{
[__readNone]
@@ -4388,15 +4388,15 @@ uint64_t __asuint64(uint2 i)
//
__intrinsic_op($(kIROp_ByteAddressBufferLoad))
-[require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, byteaddressbuffer)]
T __byteAddressBufferLoad<T>(ByteAddressBuffer buffer, int offset, int alignment);
__intrinsic_op($(kIROp_ByteAddressBufferLoad))
-[require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, byteaddressbuffer_rw)]
T __byteAddressBufferLoad<T>(RWByteAddressBuffer buffer, int offset, int alignment);
__intrinsic_op($(kIROp_ByteAddressBufferLoad))
-[require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, byteaddressbuffer_rw)]
T __byteAddressBufferLoad<T>(RasterizerOrderedByteAddressBuffer buffer, int offset, int alignment);
__intrinsic_op($(kIROp_ByteAddressBufferStore))
@@ -4583,7 +4583,7 @@ struct $(item.name)
[__NoSideEffect]
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, byteaddressbuffer_rw)]
uint Load(int location)
{
__target_switch
diff --git a/source/slang/slang-emit-wgsl.cpp b/source/slang/slang-emit-wgsl.cpp
index a05e03afc..b1a723dc5 100644
--- a/source/slang/slang-emit-wgsl.cpp
+++ b/source/slang/slang-emit-wgsl.cpp
@@ -348,6 +348,13 @@ void WGSLSourceEmitter::emitSimpleTypeImpl(IRType* type)
}
break;
+ case kIROp_HLSLByteAddressBufferType:
+ case kIROp_HLSLRWByteAddressBufferType:
+ {
+ m_writer->emit("array<u32>");
+ }
+ break;
+
case kIROp_VoidType:
{
// There is no void type in WGSL.
@@ -590,13 +597,15 @@ void WGSLSourceEmitter::emitVarKeywordImpl(IRType * type, IRInst* varDecl)
m_writer->emit("<workgroup>");
}
else if (type->getOp() == kIROp_HLSLRWStructuredBufferType ||
- type->getOp() == kIROp_HLSLRasterizerOrderedStructuredBufferType)
+ type->getOp() == kIROp_HLSLRasterizerOrderedStructuredBufferType ||
+ type->getOp() == kIROp_HLSLRWByteAddressBufferType)
{
m_writer->emit("<");
m_writer->emit("storage, read_write");
m_writer->emit(">");
}
- else if (type->getOp() == kIROp_HLSLStructuredBufferType)
+ else if (type->getOp() == kIROp_HLSLStructuredBufferType ||
+ type->getOp() == kIROp_HLSLByteAddressBufferType)
{
m_writer->emit("<");
m_writer->emit("storage, read");
@@ -1178,6 +1187,33 @@ bool WGSLSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOu
}
}
break;
+
+ case kIROp_ByteAddressBufferLoad:
+ {
+ // Indices in Slang code count bytes, but in WASM they count u32's since
+ // byte address buffers translate to array<u32> in WASM, so divide by 4.
+ emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
+ m_writer->emit("[(");
+ emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
+ m_writer->emit(")/4]");
+ return true;
+ }
+ break;
+
+ case kIROp_ByteAddressBufferStore:
+ {
+ // Indices in Slang code count bytes, but in WASM they count u32's since
+ // byte address buffers translate to array<u32> in WASM, so divide by 4.
+ auto base = inst->getOperand(0);
+ emitOperand(base, EmitOpInfo());
+ m_writer->emit("[(");
+ emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
+ m_writer->emit(")/4] = ");
+ emitOperand(inst->getOperand(inst->getOperandCount() - 1), getInfo(EmitOp::General));
+ return true;
+ }
+ break;
+
}
return false;
diff --git a/tests/compute/byte-address-buffer.slang b/tests/compute/byte-address-buffer.slang
index 77748eb60..65356ec22 100644
--- a/tests/compute/byte-address-buffer.slang
+++ b/tests/compute/byte-address-buffer.slang
@@ -4,7 +4,6 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX:-d3d12 -compute -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -wgpu
// Confirm cross-compilation of `(RW)ByteAddressBuffer`
//