=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Implement SM5 atomic_iadd instruction.

Alexandre Julliard julliard at winehq.org
Thu Nov 24 16:27:59 CST 2016


Module: wine
Branch: master
Commit: 29aa581cdd2411ef82aa55a99c171b031ae69e5c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=29aa581cdd2411ef82aa55a99c171b031ae69e5c

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Wed Nov 23 14:36:08 2016 +0100

wined3d: Implement SM5 atomic_iadd 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/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 = &reg_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,




More information about the wine-cvs mailing list