=?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 = ®_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