Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/KhronosGroup/SPIRV-Cross.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Kristian Arntzen <post@arntzen-software.no>2022-08-09 14:48:28 +0300
committerHans-Kristian Arntzen <post@arntzen-software.no>2022-08-09 14:49:40 +0300
commitbc3987e59ab7a6881ad0782d49e70756c3f57a14 (patch)
tree6478fe2113fdcad37048faf9201b44b2dff3900d /reference
parentc084973c67aca615e3f24f04bfa29f735f5e97dc (diff)
MSL: Fix various bugs with Ptr/U bitcasts.
Diffstat (limited to 'reference')
-rw-r--r--reference/opt/shaders-msl/comp/buffer_device_address-packed-vec-and-cast-to-and-from-uvec2.msl23.comp6
-rw-r--r--reference/shaders-msl-no-opt/asm/comp/buffer-device-address-ptr-casting.msl24.asm.comp33
-rw-r--r--reference/shaders-msl/comp/buffer_device_address-packed-vec-and-cast-to-and-from-uvec2.msl23.comp8
-rw-r--r--reference/shaders-no-opt/asm/comp/buffer-device-address-ptr-casting.vk.nocompat.asm.comp.vk37
4 files changed, 77 insertions, 7 deletions
diff --git a/reference/opt/shaders-msl/comp/buffer_device_address-packed-vec-and-cast-to-and-from-uvec2.msl23.comp b/reference/opt/shaders-msl/comp/buffer_device_address-packed-vec-and-cast-to-and-from-uvec2.msl23.comp
index f2ba5416..fb561482 100644
--- a/reference/opt/shaders-msl/comp/buffer_device_address-packed-vec-and-cast-to-and-from-uvec2.msl23.comp
+++ b/reference/opt/shaders-msl/comp/buffer_device_address-packed-vec-and-cast-to-and-from-uvec2.msl23.comp
@@ -18,10 +18,10 @@ struct SSBO
kernel void main0(constant UBO& _10 [[buffer(0)]])
{
- ((device SSBO*)as_type<uint64_t>(_10.b))->a1 = float3(1.0, 2.0, 3.0);
- uint2 _35 = as_type<uint2>((uint64_t)((device SSBO*)as_type<uint64_t>(_10.b + uint2(32u))));
+ (reinterpret_cast<device SSBO*>(as_type<ulong>(_10.b)))->a1 = float3(1.0, 2.0, 3.0);
+ uint2 _35 = as_type<uint2>(reinterpret_cast<ulong>(reinterpret_cast<device SSBO*>(as_type<ulong>(_10.b + uint2(32u)))));
uint2 v2 = _35;
- device SSBO* _39 = ((device SSBO*)as_type<uint64_t>(_35));
+ device SSBO* _39 = reinterpret_cast<device SSBO*>(as_type<ulong>(_35));
float3 v3 = float3(_39->a1);
_39->a1 = float3(_39->a1) + float3(1.0);
}
diff --git a/reference/shaders-msl-no-opt/asm/comp/buffer-device-address-ptr-casting.msl24.asm.comp b/reference/shaders-msl-no-opt/asm/comp/buffer-device-address-ptr-casting.msl24.asm.comp
new file mode 100644
index 00000000..74464092
--- /dev/null
+++ b/reference/shaders-msl-no-opt/asm/comp/buffer-device-address-ptr-casting.msl24.asm.comp
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+
+using namespace metal;
+
+struct SomeBuffer;
+
+struct SomeBuffer
+{
+ float4 v;
+ ulong a;
+ uint2 b;
+};
+
+struct Registers
+{
+ ulong address;
+ uint2 address2;
+};
+
+kernel void main0(constant Registers& registers [[buffer(0)]])
+{
+ device SomeBuffer* _44 = reinterpret_cast<device SomeBuffer*>(registers.address);
+ device SomeBuffer* _45 = reinterpret_cast<device SomeBuffer*>(registers.address);
+ device SomeBuffer* _46 = reinterpret_cast<device SomeBuffer*>(as_type<ulong>(registers.address2));
+ _44->v = float4(1.0, 2.0, 3.0, 4.0);
+ _45->v = float4(1.0, 2.0, 3.0, 4.0);
+ _46->v = float4(1.0, 2.0, 3.0, 4.0);
+ _44->a = reinterpret_cast<ulong>(_44);
+ _45->a = reinterpret_cast<ulong>(_45);
+ _46->b = as_type<uint2>(reinterpret_cast<ulong>(_46));
+}
+
diff --git a/reference/shaders-msl/comp/buffer_device_address-packed-vec-and-cast-to-and-from-uvec2.msl23.comp b/reference/shaders-msl/comp/buffer_device_address-packed-vec-and-cast-to-and-from-uvec2.msl23.comp
index 474d5092..f79a8b52 100644
--- a/reference/shaders-msl/comp/buffer_device_address-packed-vec-and-cast-to-and-from-uvec2.msl23.comp
+++ b/reference/shaders-msl/comp/buffer_device_address-packed-vec-and-cast-to-and-from-uvec2.msl23.comp
@@ -18,9 +18,9 @@ struct SSBO
kernel void main0(constant UBO& _10 [[buffer(0)]])
{
- ((device SSBO*)as_type<uint64_t>(_10.b))->a1 = float3(1.0, 2.0, 3.0);
- uint2 v2 = as_type<uint2>((uint64_t)((device SSBO*)as_type<uint64_t>(_10.b + uint2(32u))));
- float3 v3 = float3(((device SSBO*)as_type<uint64_t>(v2))->a1);
- ((device SSBO*)as_type<uint64_t>(v2))->a1 = v3 + float3(1.0);
+ (reinterpret_cast<device SSBO*>(as_type<ulong>(_10.b)))->a1 = float3(1.0, 2.0, 3.0);
+ uint2 v2 = as_type<uint2>(reinterpret_cast<ulong>(reinterpret_cast<device SSBO*>(as_type<ulong>(_10.b + uint2(32u)))));
+ float3 v3 = float3((reinterpret_cast<device SSBO*>(as_type<ulong>(v2)))->a1);
+ (reinterpret_cast<device SSBO*>(as_type<ulong>(v2)))->a1 = v3 + float3(1.0);
}
diff --git a/reference/shaders-no-opt/asm/comp/buffer-device-address-ptr-casting.vk.nocompat.asm.comp.vk b/reference/shaders-no-opt/asm/comp/buffer-device-address-ptr-casting.vk.nocompat.asm.comp.vk
new file mode 100644
index 00000000..f082267f
--- /dev/null
+++ b/reference/shaders-no-opt/asm/comp/buffer-device-address-ptr-casting.vk.nocompat.asm.comp.vk
@@ -0,0 +1,37 @@
+#version 450
+#if defined(GL_ARB_gpu_shader_int64)
+#extension GL_ARB_gpu_shader_int64 : require
+#else
+#error No extension available for 64-bit integers.
+#endif
+#extension GL_EXT_buffer_reference : require
+#extension GL_EXT_buffer_reference_uvec2 : require
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+
+layout(buffer_reference) buffer SomeBuffer;
+layout(buffer_reference, buffer_reference_align = 16, std430) buffer SomeBuffer
+{
+ vec4 v;
+ uint64_t a;
+ uvec2 b;
+};
+
+layout(push_constant, std430) uniform Registers
+{
+ uint64_t address;
+ uvec2 address2;
+} registers;
+
+void main()
+{
+ SomeBuffer _44 = SomeBuffer(registers.address);
+ SomeBuffer _45 = SomeBuffer(registers.address);
+ SomeBuffer _46 = SomeBuffer(registers.address2);
+ _44.v = vec4(1.0, 2.0, 3.0, 4.0);
+ _45.v = vec4(1.0, 2.0, 3.0, 4.0);
+ _46.v = vec4(1.0, 2.0, 3.0, 4.0);
+ _44.a = uint64_t(_44);
+ _45.a = uint64_t(_45);
+ _46.b = uvec2(_46);
+}
+