From: Kimmo Myllyvirta Subject: [PATCH v2] wined3d: Implement SM5 atomic_umax/min instructions. Message-Id: Date: Sun, 4 Dec 2016 19:49:29 +0200 Superseeds: https://source.winehq.org/patches/data/128258 v2: Fix the commit message. From f4448ac1fcfdbb8f6afd300b6eab3736d7b66fd0 Mon Sep 17 00:00:00 2001 From: Kimmo Myllyvirta Date: Sun, 4 Dec 2016 17:52:54 +0200 Subject: [PATCH] wined3d: Implement SM5 atomic_umax/min instructions. Signed-off-by: Kimmo Myllyvirta --- dlls/wined3d/arb_program_shader.c | 2 ++ dlls/wined3d/glsl_shader.c | 4 ++++ dlls/wined3d/shader.c | 10 +++++++--- dlls/wined3d/shader_sm4.c | 4 ++++ dlls/wined3d/wined3d_private.h | 2 ++ 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 7048021..bf33ae9 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -5203,6 +5203,8 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL /* WINED3DSIH_ADD */ shader_hw_map2gl, /* WINED3DSIH_AND */ NULL, /* WINED3DSIH_ATOMIC_IADD */ NULL, + /* WINED3DSIH_ATOMIC_UMAX */ NULL, + /* WINED3DSIH_ATOMIC_UMIN */ NULL, /* WINED3DSIH_BEM */ pshader_hw_bem, /* WINED3DSIH_BFI */ NULL, /* WINED3DSIH_BFREV */ NULL, diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index f1f615d..2c75151 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -4751,6 +4751,8 @@ static void shader_glsl_atomic(const struct wined3d_shader_instruction *ins) switch (ins->handler_idx) { case WINED3DSIH_ATOMIC_IADD: op = "imageAtomicAdd"; break; + case WINED3DSIH_ATOMIC_UMAX: op = "imageAtomicMax"; break; + case WINED3DSIH_ATOMIC_UMIN: op = "imageAtomicMin"; break; default: ERR("Unhandled opcode %#x.\n", ins->handler_idx); return; @@ -8866,6 +8868,8 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB /* WINED3DSIH_ADD */ shader_glsl_binop, /* WINED3DSIH_AND */ shader_glsl_binop, /* WINED3DSIH_ATOMIC_IADD */ shader_glsl_atomic, + /* WINED3DSIH_ATOMIC_UMAX */ shader_glsl_atomic, + /* WINED3DSIH_ATOMIC_UMIN */ shader_glsl_atomic, /* WINED3DSIH_BEM */ shader_glsl_bem, /* WINED3DSIH_BFI */ NULL, /* WINED3DSIH_BFREV */ NULL, diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index bf4b421..afcd5bd 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -44,6 +44,8 @@ static const char * const shader_opcode_names[] = /* WINED3DSIH_ADD */ "add", /* WINED3DSIH_AND */ "and", /* WINED3DSIH_ATOMIC_IADD */ "atomic_iadd", + /* WINED3DSIH_ATOMIC_UMAX */ "atomic_umax", + /* WINED3DSIH_ATOMIC_UMIN */ "atomic_umin", /* WINED3DSIH_BEM */ "bem", /* WINED3DSIH_BFI */ "bfi", /* WINED3DSIH_BFREV */ "bfrev", @@ -1232,13 +1234,15 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, const st } if (ins.handler_idx == WINED3DSIH_ATOMIC_IADD + || ins.handler_idx == WINED3DSIH_ATOMIC_UMAX + || ins.handler_idx == WINED3DSIH_ATOMIC_UMIN || ins.handler_idx == WINED3DSIH_LD_UAV_TYPED) { unsigned int reg_idx; - if (ins.handler_idx == WINED3DSIH_ATOMIC_IADD) - reg_idx = ins.dst[0].reg.idx[0].offset; - else + if (ins.handler_idx == WINED3DSIH_LD_UAV_TYPED) reg_idx = ins.src[1].reg.idx[0].offset; + else + reg_idx = ins.dst[0].reg.idx[0].offset; if (reg_idx >= MAX_UNORDERED_ACCESS_VIEWS) { ERR("Invalid UAV index %u.\n", reg_idx); diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c index 02e121c..bf19f9d 100644 --- a/dlls/wined3d/shader_sm4.c +++ b/dlls/wined3d/shader_sm4.c @@ -252,6 +252,8 @@ enum wined3d_sm4_opcode WINED3D_SM5_OP_LD_STRUCTURED = 0xa7, WINED3D_SM5_OP_STORE_STRUCTURED = 0xa8, WINED3D_SM5_OP_ATOMIC_IADD = 0xad, + WINED3D_SM5_OP_ATOMIC_UMAX = 0xb0, + WINED3D_SM5_OP_ATOMIC_UMIN = 0xb1, WINED3D_SM5_OP_IMM_ATOMIC_ALLOC = 0xb2, WINED3D_SM5_OP_IMM_ATOMIC_CONSUME = 0xb3, WINED3D_SM5_OP_SYNC = 0xbe, @@ -897,6 +899,8 @@ static const struct wined3d_sm4_opcode_info opcode_table[] = {WINED3D_SM5_OP_LD_STRUCTURED, WINED3DSIH_LD_STRUCTURED, "u", "iiR"}, {WINED3D_SM5_OP_STORE_STRUCTURED, WINED3DSIH_STORE_STRUCTURED, "U", "iiu"}, {WINED3D_SM5_OP_ATOMIC_IADD, WINED3DSIH_ATOMIC_IADD, "U", "ii"}, + {WINED3D_SM5_OP_ATOMIC_UMAX, WINED3DSIH_ATOMIC_UMAX, "U", "uu"}, + {WINED3D_SM5_OP_ATOMIC_UMIN, WINED3DSIH_ATOMIC_UMIN, "U", "uu"}, {WINED3D_SM5_OP_IMM_ATOMIC_ALLOC, WINED3DSIH_IMM_ATOMIC_ALLOC, "u", "U"}, {WINED3D_SM5_OP_IMM_ATOMIC_CONSUME, WINED3DSIH_IMM_ATOMIC_CONSUME, "u", "U"}, {WINED3D_SM5_OP_SYNC, WINED3DSIH_SYNC, "", "", diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index cc3dd58..1a4f5bc 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -570,6 +570,8 @@ enum WINED3D_SHADER_INSTRUCTION_HANDLER WINED3DSIH_ADD, WINED3DSIH_AND, WINED3DSIH_ATOMIC_IADD, + WINED3DSIH_ATOMIC_UMAX, + WINED3DSIH_ATOMIC_UMIN, WINED3DSIH_BEM, WINED3DSIH_BFI, WINED3DSIH_BFREV, -- 2.7.4