Module: wine Branch: master Commit: 29aa581cdd2411ef82aa55a99c171b031ae69e5c URL: http://source.winehq.org/git/wine.git/?a=commit;h=29aa581cdd2411ef82aa55a99c...
Author: Józef Kucia jkucia@codeweavers.com Date: Wed Nov 23 14:36:08 2016 +0100
wined3d: Implement SM5 atomic_iadd instruction.
Signed-off-by: Józef Kucia jkucia@codeweavers.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wined3d/arb_program_shader.c | 1 + dlls/wined3d/glsl_shader.c | 66 ++++++++++++++++++++++++++++++++++++--- dlls/wined3d/shader.c | 1 + dlls/wined3d/shader_sm4.c | 2 ++ dlls/wined3d/wined3d_private.h | 1 + 5 files changed, 67 insertions(+), 4 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 762b8a7..bbafe69 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -5202,6 +5202,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL /* WINED3DSIH_ABS */ shader_hw_map2gl, /* WINED3DSIH_ADD */ shader_hw_map2gl, /* WINED3DSIH_AND */ NULL, + /* WINED3DSIH_ATOMIC_IADD */ 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 f0df045..fa233c7 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -2821,8 +2821,9 @@ static void shader_glsl_get_swizzle(const struct wined3d_shader_src_param *param /* From a given parameter token, generate the corresponding GLSL string. * Also, return the actual register name and swizzle in case the * caller needs this information as well. */ -static void shader_glsl_add_src_param(const struct wined3d_shader_instruction *ins, - const struct wined3d_shader_src_param *wined3d_src, DWORD mask, struct glsl_src_param *glsl_src) +static void shader_glsl_add_src_param_ext(const struct wined3d_shader_instruction *ins, + const struct wined3d_shader_src_param *wined3d_src, DWORD mask, struct glsl_src_param *glsl_src, + enum wined3d_data_type data_type) { BOOL is_color = FALSE; char swizzle_str[6]; @@ -2842,7 +2843,7 @@ static void shader_glsl_add_src_param(const struct wined3d_shader_instruction *i { char reg_name[200];
- switch (wined3d_src->reg.data_type) + switch (data_type) { case WINED3D_DATA_FLOAT: sprintf(reg_name, "%s", glsl_src->reg_name); @@ -2856,7 +2857,7 @@ static void shader_glsl_add_src_param(const struct wined3d_shader_instruction *i sprintf(reg_name, "floatBitsToUint(%s)", glsl_src->reg_name); break; default: - FIXME("Unhandled data type %#x.\n", wined3d_src->reg.data_type); + FIXME("Unhandled data type %#x.\n", data_type); sprintf(reg_name, "%s", glsl_src->reg_name); break; } @@ -2865,6 +2866,12 @@ static void shader_glsl_add_src_param(const struct wined3d_shader_instruction *i } }
+static void shader_glsl_add_src_param(const struct wined3d_shader_instruction *ins, + const struct wined3d_shader_src_param *wined3d_src, DWORD mask, struct glsl_src_param *glsl_src) +{ + shader_glsl_add_src_param_ext(ins, wined3d_src, mask, glsl_src, wined3d_src->reg.data_type); +} + /* From a given parameter token, generate the corresponding GLSL string. * Also, return the actual register name and swizzle in case the * caller needs this information as well. */ @@ -4720,6 +4727,56 @@ static unsigned int shader_glsl_find_sampler(const struct wined3d_shader_sampler return ~0u; }
+static void shader_glsl_atomic(const struct wined3d_shader_instruction *ins) +{ + static const unsigned int image_coord_size[] = + { + 0, /* WINED3D_SHADER_RESOURCE_NONE */ + 0, /* WINED3D_SHADER_RESOURCE_BUFFER */ + 1, /* WINED3D_SHADER_RESOURCE_TEXTURE_1D */ + 2, /* WINED3D_SHADER_RESOURCE_TEXTURE_2D */ + 0, /* WINED3D_SHADER_RESOURCE_TEXTURE_2DMS */ + 3, /* WINED3D_SHADER_RESOURCE_TEXTURE_3D */ + 0, /* WINED3D_SHADER_RESOURCE_TEXTURE_CUBE */ + 2, /* WINED3D_SHADER_RESOURCE_TEXTURE_1DARRAY */ + 3, /* WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY */ + 0, /* WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY */ + }; + + const struct wined3d_shader_reg_maps *reg_maps = ins->ctx->reg_maps; + const struct wined3d_shader_version *version = ®_maps->shader_version; + struct glsl_src_param image_coord_param, image_data_param; + enum wined3d_shader_resource_type resource_type; + enum wined3d_data_type data_type; + unsigned int uav_idx; + DWORD coord_mask; + const char *op; + + switch (ins->handler_idx) + { + case WINED3DSIH_ATOMIC_IADD: op = "imageAtomicAdd"; break; + default: + ERR("Unhandled opcode %#x.\n", ins->handler_idx); + return; + } + + uav_idx = ins->dst[0].reg.idx[0].offset; + resource_type = reg_maps->uav_resource_info[uav_idx].type; + if (resource_type >= ARRAY_SIZE(image_coord_size)) + { + ERR("Unexpected resource type %#x.\n", resource_type); + resource_type = WINED3D_SHADER_RESOURCE_TEXTURE_2D; + } + data_type = reg_maps->uav_resource_info[uav_idx].data_type; + coord_mask = (1u << image_coord_size[resource_type]) - 1; + + shader_glsl_add_src_param(ins, &ins->src[0], coord_mask, &image_coord_param); + shader_glsl_add_src_param_ext(ins, &ins->src[1], WINED3DSP_WRITEMASK_ALL, &image_data_param, data_type); + shader_addline(ins->ctx->buffer, "%s(%s_image%u, %s, %s);\n", + op, shader_glsl_get_prefix(version->type), uav_idx, + image_coord_param.param_str, image_data_param.param_str); +} + static void shader_glsl_resinfo(const struct wined3d_shader_instruction *ins) { static const unsigned int texture_size_component_count[] = @@ -8765,6 +8822,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB /* WINED3DSIH_ABS */ shader_glsl_map2gl, /* WINED3DSIH_ADD */ shader_glsl_binop, /* WINED3DSIH_AND */ shader_glsl_binop, + /* WINED3DSIH_ATOMIC_IADD */ 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 4201db3..ed64e89 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -43,6 +43,7 @@ static const char * const shader_opcode_names[] = /* WINED3DSIH_ABS */ "abs", /* WINED3DSIH_ADD */ "add", /* WINED3DSIH_AND */ "and", + /* WINED3DSIH_ATOMIC_IADD */ "atomic_iadd", /* WINED3DSIH_BEM */ "bem", /* WINED3DSIH_BFI */ "bfi", /* WINED3DSIH_BFREV */ "bfrev", diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c index 520e3c6..84b22c3 100644 --- a/dlls/wined3d/shader_sm4.c +++ b/dlls/wined3d/shader_sm4.c @@ -243,6 +243,7 @@ enum wined3d_sm4_opcode WINED3D_SM5_OP_STORE_RAW = 0xa6, WINED3D_SM5_OP_LD_STRUCTURED = 0xa7, WINED3D_SM5_OP_STORE_STRUCTURED = 0xa8, + WINED3D_SM5_OP_ATOMIC_IADD = 0xad, WINED3D_SM5_OP_IMM_ATOMIC_ALLOC = 0xb2, WINED3D_SM5_OP_IMM_ATOMIC_CONSUME = 0xb3, }; @@ -858,6 +859,7 @@ static const struct wined3d_sm4_opcode_info opcode_table[] = {WINED3D_SM5_OP_STORE_RAW, WINED3DSIH_STORE_RAW, "U", "iu"}, {WINED3D_SM5_OP_LD_STRUCTURED, WINED3DSIH_LD_STRUCTURED, "u", "uuR"}, {WINED3D_SM5_OP_STORE_STRUCTURED, WINED3DSIH_STORE_STRUCTURED, "U", "iiu"}, + {WINED3D_SM5_OP_ATOMIC_IADD, WINED3DSIH_ATOMIC_IADD, "U", "ii"}, {WINED3D_SM5_OP_IMM_ATOMIC_ALLOC, WINED3DSIH_IMM_ATOMIC_ALLOC, "u", "U"}, {WINED3D_SM5_OP_IMM_ATOMIC_CONSUME, WINED3DSIH_IMM_ATOMIC_CONSUME, "u", "U"}, }; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index d16d031..8d2bb75 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -557,6 +557,7 @@ enum WINED3D_SHADER_INSTRUCTION_HANDLER WINED3DSIH_ABS, WINED3DSIH_ADD, WINED3DSIH_AND, + WINED3DSIH_ATOMIC_IADD, WINED3DSIH_BEM, WINED3DSIH_BFI, WINED3DSIH_BFREV,