From 3b19a4aaf3a76d0b8538a0c93bf71cc9b7342af2 Mon Sep 17 00:00:00 2001 From: Shaun Ren Date: Thu, 12 Dec 2024 17:57:27 -0500 Subject: [PATCH] vkd3d-shader/hlsl: Implement the InterlockedAnd() 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 ++ 5 files changed, 13 insertions(+) diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c index aed5b8c5..cf43ca3a 100644 --- a/libs/vkd3d-shader/hlsl.c +++ b/libs/vkd3d-shader/hlsl.c @@ -3507,6 +3507,7 @@ static void dump_ir_interlocked(struct vkd3d_string_buffer *buffer, const struct static const char *const op_names[] = { [HLSL_INTERLOCKED_ADD] = "add", + [HLSL_INTERLOCKED_AND] = "and", }; VKD3D_ASSERT(interlocked->op < ARRAY_SIZE(op_names)); diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h index aea7e82e..059013e0 100644 --- a/libs/vkd3d-shader/hlsl.h +++ b/libs/vkd3d-shader/hlsl.h @@ -954,6 +954,7 @@ struct hlsl_ir_stateblock_constant enum hlsl_interlocked_op { HLSL_INTERLOCKED_ADD, + HLSL_INTERLOCKED_AND, }; /* Represents an interlocked operation. diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 686037f8..d72cc9fd 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -5478,6 +5478,12 @@ static bool intrinsic_InterlockedAdd(struct hlsl_ctx *ctx, return intrinsic_interlocked(ctx, HLSL_INTERLOCKED_ADD, params, loc, "InterlockedAdd"); } +static bool intrinsic_InterlockedAnd(struct hlsl_ctx *ctx, + const struct parse_initializer *params, const struct vkd3d_shader_location *loc) +{ + return intrinsic_interlocked(ctx, HLSL_INTERLOCKED_AND, params, loc, "InterlockedAnd"); +} + static const struct intrinsic_function { const char *name; @@ -5492,6 +5498,7 @@ intrinsic_functions[] = {"D3DCOLORtoUBYTE4", 1, true, intrinsic_d3dcolor_to_ubyte4}, {"GetRenderTargetSampleCount", 0, true, intrinsic_GetRenderTargetSampleCount}, {"InterlockedAdd", -1, true, intrinsic_InterlockedAdd}, + {"InterlockedAnd", -1, true, intrinsic_InterlockedAnd}, {"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 40891a61..736b911e 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -10001,11 +10001,13 @@ static bool sm4_generate_vsir_instr_interlocked(struct hlsl_ctx *ctx, static const enum vkd3d_shader_opcode opcodes[] = { [HLSL_INTERLOCKED_ADD] = VKD3DSIH_ATOMIC_IADD, + [HLSL_INTERLOCKED_AND] = VKD3DSIH_ATOMIC_AND, }; static const enum vkd3d_shader_opcode imm_opcodes[] = { [HLSL_INTERLOCKED_ADD] = VKD3DSIH_IMM_ATOMIC_IADD, + [HLSL_INTERLOCKED_AND] = VKD3DSIH_IMM_ATOMIC_AND, }; struct hlsl_ir_node *coords = interlocked->coords.node, *value = interlocked->value.node; diff --git a/libs/vkd3d-shader/tpf.c b/libs/vkd3d-shader/tpf.c index 957ddb10..13099aad 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -4026,6 +4026,7 @@ static void tpf_handle_instruction(struct tpf_compiler *tpf, const struct vkd3d_ break; case VKD3DSIH_ADD: + case VKD3DSIH_ATOMIC_AND: case VKD3DSIH_ATOMIC_IADD: case VKD3DSIH_AND: case VKD3DSIH_BREAK: @@ -4069,6 +4070,7 @@ static void tpf_handle_instruction(struct tpf_compiler *tpf, const struct vkd3d_ case VKD3DSIH_IMAD: case VKD3DSIH_IMAX: case VKD3DSIH_IMIN: + case VKD3DSIH_IMM_ATOMIC_AND: case VKD3DSIH_IMM_ATOMIC_IADD: case VKD3DSIH_IMUL: case VKD3DSIH_INE: