From 802d7317cb3aa3b39fda9e44c0f9711bb397d4c1 Mon Sep 17 00:00:00 2001 From: Shaun Ren Date: Wed, 18 Dec 2024 19:47:04 -0500 Subject: [PATCH] vkd3d-shader/hlsl: Implement the InterlockedXor() intrinsic. --- libs/vkd3d-shader/hlsl.c | 1 + libs/vkd3d-shader/hlsl.h | 1 + libs/vkd3d-shader/hlsl.y | 7 +++++++ libs/vkd3d-shader/hlsl_codegen.c | 2 ++ libs/vkd3d-shader/tpf.c | 2 ++ tests/hlsl/uav-atomics.shader_test | 10 +++++----- 6 files changed, 18 insertions(+), 5 deletions(-) diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c index ec713fa2..48d9d4e0 100644 --- a/libs/vkd3d-shader/hlsl.c +++ b/libs/vkd3d-shader/hlsl.c @@ -3513,6 +3513,7 @@ static void dump_ir_interlocked(struct vkd3d_string_buffer *buffer, const struct [HLSL_INTERLOCKED_MAX] = "max", [HLSL_INTERLOCKED_MIN] = "min", [HLSL_INTERLOCKED_OR] = "or", + [HLSL_INTERLOCKED_XOR] = "xor", }; VKD3D_ASSERT(interlocked->op < ARRAY_SIZE(op_names)); diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h index 571f5517..cf15ac1e 100644 --- a/libs/vkd3d-shader/hlsl.h +++ b/libs/vkd3d-shader/hlsl.h @@ -960,6 +960,7 @@ enum hlsl_interlocked_op HLSL_INTERLOCKED_MAX, HLSL_INTERLOCKED_MIN, HLSL_INTERLOCKED_OR, + HLSL_INTERLOCKED_XOR, }; /* Represents an interlocked operation. diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index e7b55117..60170d76 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -5548,6 +5548,12 @@ static bool intrinsic_InterlockedOr(struct hlsl_ctx *ctx, return intrinsic_interlocked(ctx, HLSL_INTERLOCKED_OR, params, loc, "InterlockedOr"); } +static bool intrinsic_InterlockedXor(struct hlsl_ctx *ctx, + const struct parse_initializer *params, const struct vkd3d_shader_location *loc) +{ + return intrinsic_interlocked(ctx, HLSL_INTERLOCKED_XOR, params, loc, "InterlockedXor"); +} + static const struct intrinsic_function { const char *name; @@ -5569,6 +5575,7 @@ intrinsic_functions[] = {"InterlockedMax", -1, true, intrinsic_InterlockedMax}, {"InterlockedMin", -1, true, intrinsic_InterlockedMin}, {"InterlockedOr", -1, true, intrinsic_InterlockedOr}, + {"InterlockedXor", -1, true, intrinsic_InterlockedXor}, {"abs", 1, true, intrinsic_abs}, {"acos", 1, true, intrinsic_acos}, {"all", 1, true, intrinsic_all}, diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 20433094..061bf2dd 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -10006,6 +10006,7 @@ static bool sm4_generate_vsir_instr_interlocked(struct hlsl_ctx *ctx, [HLSL_INTERLOCKED_MAX] = VKD3DSIH_ATOMIC_UMAX, [HLSL_INTERLOCKED_MIN] = VKD3DSIH_ATOMIC_UMIN, [HLSL_INTERLOCKED_OR] = VKD3DSIH_ATOMIC_OR, + [HLSL_INTERLOCKED_XOR] = VKD3DSIH_ATOMIC_XOR, }; static const enum vkd3d_shader_opcode imm_opcodes[] = @@ -10017,6 +10018,7 @@ static bool sm4_generate_vsir_instr_interlocked(struct hlsl_ctx *ctx, [HLSL_INTERLOCKED_MAX] = VKD3DSIH_IMM_ATOMIC_UMAX, [HLSL_INTERLOCKED_MIN] = VKD3DSIH_IMM_ATOMIC_UMIN, [HLSL_INTERLOCKED_OR] = VKD3DSIH_IMM_ATOMIC_OR, + [HLSL_INTERLOCKED_XOR] = VKD3DSIH_IMM_ATOMIC_XOR, }; struct hlsl_ir_node *cmp_value = interlocked->cmp_value.node, *value = interlocked->value.node; diff --git a/libs/vkd3d-shader/tpf.c b/libs/vkd3d-shader/tpf.c index 04b1077c..1ecfe32d 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -4034,6 +4034,7 @@ static void tpf_handle_instruction(struct tpf_compiler *tpf, const struct vkd3d_ case VKD3DSIH_ATOMIC_UMAX: case VKD3DSIH_ATOMIC_UMIN: case VKD3DSIH_ATOMIC_OR: + case VKD3DSIH_ATOMIC_XOR: case VKD3DSIH_AND: case VKD3DSIH_BREAK: case VKD3DSIH_CASE: @@ -4085,6 +4086,7 @@ static void tpf_handle_instruction(struct tpf_compiler *tpf, const struct vkd3d_ case VKD3DSIH_IMM_ATOMIC_UMAX: case VKD3DSIH_IMM_ATOMIC_UMIN: case VKD3DSIH_IMM_ATOMIC_OR: + case VKD3DSIH_IMM_ATOMIC_XOR: case VKD3DSIH_IMUL: case VKD3DSIH_INE: case VKD3DSIH_INEG: diff --git a/tests/hlsl/uav-atomics.shader_test b/tests/hlsl/uav-atomics.shader_test index 71c0ac8f..323a3503 100644 --- a/tests/hlsl/uav-atomics.shader_test +++ b/tests/hlsl/uav-atomics.shader_test @@ -8,7 +8,7 @@ size (buffer, 11) 0xd 5 6 0x10 4 4 7 2 0 5 0 -[compute shader fail(sm<5) todo(sm>=5)] +[compute shader fail(sm<5)] RWBuffer u : register(u1); uniform uint4 v; @@ -32,7 +32,7 @@ void main() [test] uniform 0 uint4 3 5 0 0 -todo(sm<6) dispatch 1 1 1 +todo(glsl | msl) dispatch 1 1 1 probe uav 1 (0) rui (1) probe uav 1 (1) rui (3) probe uav 1 (2) rui (15) @@ -46,7 +46,7 @@ probe uav 1 (9) rui (3) probe uav 1 (10) rui (1) uniform 0 uint4 1 2 0 0 -todo(sm<6) dispatch 2 1 1 +todo(glsl | msl) dispatch 2 1 1 probe uav 1 (0) rui (1) probe uav 1 (1) rui (3) probe uav 1 (2) rui (21) @@ -96,7 +96,7 @@ size (2d, 11, 1) 0xd 5 6 0x10 4 4 7 2 0 5 0 -[compute shader fail(sm<5) todo(sm>=5)] +[compute shader fail(sm<5)] RWTexture2D u : register(u1); uniform uint4 v; @@ -120,7 +120,7 @@ void main() [test] uniform 0 uint4 3 5 0 0 -todo(sm<6) dispatch 1 1 1 +todo(glsl | msl) dispatch 1 1 1 probe uav 1 (0) rui (1) probe uav 1 (1) rui (3) probe uav 1 (2) rui (15)