diff options
author | Hans-Kristian Arntzen <post@arntzen-software.no> | 2022-08-09 14:48:28 +0300 |
---|---|---|
committer | Hans-Kristian Arntzen <post@arntzen-software.no> | 2022-08-09 14:49:40 +0300 |
commit | bc3987e59ab7a6881ad0782d49e70756c3f57a14 (patch) | |
tree | 6478fe2113fdcad37048faf9201b44b2dff3900d /reference | |
parent | c084973c67aca615e3f24f04bfa29f735f5e97dc (diff) |
MSL: Fix various bugs with Ptr/U bitcasts.
Diffstat (limited to 'reference')
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); +} + |