diff options
| -rw-r--r-- | source/slang/hlsl.meta.slang | 4 | ||||
| -rw-r--r-- | source/slang/hlsl.meta.slang.h | 6 | ||||
| -rw-r--r-- | tests/cross-compile/rw-buffer.slang | 14 | ||||
| -rw-r--r-- | tests/cross-compile/rw-buffer.slang.glsl | 26 |
4 files changed, 47 insertions, 3 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 2930494c0..a646c1b77 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -1504,7 +1504,9 @@ for (int aa = 0; aa < kBaseBufferAccessLevelCount; ++aa) if (access != SLANG_RESOURCE_ACCESS_READ) { - sb << "ref;\n"; + sb << "__target_intrinsic(glsl, \"imageStore($0, int($1), $V2)\") set;\n"; + + sb << "__intrinsic_op(" << int(kIROp_ImageSubscript) << ") ref;\n"; } sb << "}\n"; diff --git a/source/slang/hlsl.meta.slang.h b/source/slang/hlsl.meta.slang.h index a58709087..b66f43103 100644 --- a/source/slang/hlsl.meta.slang.h +++ b/source/slang/hlsl.meta.slang.h @@ -1580,14 +1580,16 @@ for (int aa = 0; aa < kBaseBufferAccessLevelCount; ++aa) if (access != SLANG_RESOURCE_ACCESS_READ) { - sb << "ref;\n"; + sb << "__target_intrinsic(glsl, \"imageStore($0, int($1), $V2)\") set;\n"; + + sb << "__intrinsic_op(" << int(kIROp_ImageSubscript) << ") ref;\n"; } sb << "}\n"; sb << "};\n"; } -SLANG_RAW("#line 1514 \"hlsl.meta.slang\"") +SLANG_RAW("#line 1516 \"hlsl.meta.slang\"") SLANG_RAW("\n") SLANG_RAW("\n") SLANG_RAW("\n") diff --git a/tests/cross-compile/rw-buffer.slang b/tests/cross-compile/rw-buffer.slang new file mode 100644 index 000000000..f5246ed78 --- /dev/null +++ b/tests/cross-compile/rw-buffer.slang @@ -0,0 +1,14 @@ +// rw-buffer.slang + +// Confirm that writing into a `RWBuffer` generates appropriate GLSL/SPIR-V. + +//TEST:CROSS_COMPILE: -profile ps_5_0 -entry main -target spirv-assembly + +RWBuffer<float> buffer; + + +float4 main(float u : U, int idx : IDX) : SV_Target +{ + buffer[idx] = u; + return u; +} diff --git a/tests/cross-compile/rw-buffer.slang.glsl b/tests/cross-compile/rw-buffer.slang.glsl new file mode 100644 index 000000000..55e25656e --- /dev/null +++ b/tests/cross-compile/rw-buffer.slang.glsl @@ -0,0 +1,26 @@ +// rw-buffer.slang.glsl +//TEST_IGNORE_FILE: + +#version 450 +layout(row_major) uniform; +layout(row_major) buffer; + +layout(r32f) +layout(binding = 0) +uniform imageBuffer buffer_0; + +layout(location = 0) +out vec4 _S1; + +layout(location = 0) +in float _S2; + +flat layout(location = 1) +in int _S3; + +void main() +{ + imageStore(buffer_0, int(uint(_S3)), vec4(_S2, float(0), float(0), float(0))); + _S1 = vec4(_S2); + return; +} |
