diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 8948e67ceee..8e54a68d950 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 10018edf58a..b07131dd802 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))