=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Implement SM5 imm_atomic_consume instruction.
Alexandre Julliard
julliard at winehq.org
Fri Mar 3 14:20:35 CST 2017
Module: wine
Branch: master
Commit: 35de12fcd56a1b4d58508bd9dd79d0af140e7c78
URL: http://source.winehq.org/git/wine.git/?a=commit;h=35de12fcd56a1b4d58508bd9dd79d0af140e7c78
Author: Józef Kucia <jkucia at codeweavers.com>
Date: Fri Mar 3 01:30:31 2017 +0100
wined3d: Implement SM5 imm_atomic_consume instruction.
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wined3d/glsl_shader.c | 11 ++++++++---
dlls/wined3d/shader.c | 6 ++----
2 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 8948e67..8e54a68 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -5152,10 +5152,15 @@ static void shader_glsl_atomic(const struct wined3d_shader_instruction *ins)
static void shader_glsl_uav_counter(const struct wined3d_shader_instruction *ins)
{
const char *prefix = shader_glsl_get_prefix(ins->ctx->reg_maps->shader_version.type);
+ const char *op;
+
+ if (ins->handler_idx == WINED3DSIH_IMM_ATOMIC_ALLOC)
+ op = "atomicCounterIncrement";
+ else
+ op = "atomicCounterDecrement";
shader_glsl_append_dst(ins->ctx->buffer, ins);
- shader_addline(ins->ctx->buffer, "atomicCounterIncrement(%s_counter%u));\n",
- prefix, ins->src[0].reg.idx[0].offset);
+ shader_addline(ins->ctx->buffer, "%s(%s_counter%u));\n", op, prefix, ins->src[0].reg.idx[0].offset);
}
static void shader_glsl_ld_uav(const struct wined3d_shader_instruction *ins)
@@ -9653,7 +9658,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB
/* WINED3DSIH_IMM_ATOMIC_ALLOC */ shader_glsl_uav_counter,
/* WINED3DSIH_IMM_ATOMIC_AND */ shader_glsl_atomic,
/* WINED3DSIH_IMM_ATOMIC_CMP_EXCH */ shader_glsl_atomic,
- /* WINED3DSIH_IMM_ATOMIC_CONSUME */ NULL,
+ /* WINED3DSIH_IMM_ATOMIC_CONSUME */ shader_glsl_uav_counter,
/* WINED3DSIH_IMM_ATOMIC_EXCH */ shader_glsl_atomic,
/* WINED3DSIH_IMM_ATOMIC_IADD */ shader_glsl_atomic,
/* WINED3DSIH_IMM_ATOMIC_IMAX */ shader_glsl_atomic,
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 10018ed..b07131d 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -1370,7 +1370,7 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, const st
}
}
- if (ins.handler_idx == WINED3DSIH_IMM_ATOMIC_ALLOC)
+ if (ins.handler_idx == WINED3DSIH_IMM_ATOMIC_ALLOC || ins.handler_idx == WINED3DSIH_IMM_ATOMIC_CONSUME)
{
unsigned int reg_idx = ins.src[0].reg.idx[0].offset;
if (reg_idx >= MAX_UNORDERED_ACCESS_VIEWS)
@@ -1381,9 +1381,7 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, const st
reg_maps->uav_counter_mask |= (1u << reg_idx);
}
else if ((WINED3DSIH_ATOMIC_AND <= ins.handler_idx && ins.handler_idx <= WINED3DSIH_ATOMIC_XOR)
- || (WINED3DSIH_IMM_ATOMIC_AND <= ins.handler_idx
- && ins.handler_idx <= WINED3DSIH_IMM_ATOMIC_XOR
- && ins.handler_idx != WINED3DSIH_IMM_ATOMIC_CONSUME)
+ || (WINED3DSIH_IMM_ATOMIC_AND <= ins.handler_idx && ins.handler_idx <= WINED3DSIH_IMM_ATOMIC_XOR)
|| ins.handler_idx == WINED3DSIH_LD_UAV_TYPED
|| (ins.handler_idx == WINED3DSIH_LD_RAW && ins.src[1].reg.type == WINED3DSPR_UAV)
|| (ins.handler_idx == WINED3DSIH_LD_STRUCTURED && ins.src[2].reg.type == WINED3DSPR_UAV))
More information about the wine-cvs
mailing list