[PATCH 3/5] wined3d: Handle SM4 resource declarations.
Henri Verbeet
hverbeet at codeweavers.com
Wed Dec 3 03:28:10 CST 2014
---
dlls/wined3d/shader.c | 47 ++++++++++++++++++++++++++++++++++++
dlls/wined3d/shader_sm4.c | 51 +++++++++++++++++++++++++++++++++++++++-
dlls/wined3d/wined3d_private.h | 5 ++++
3 files changed, 102 insertions(+), 1 deletion(-)
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 39ac45e..b0aabd9 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -663,6 +663,7 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, const st
break;
case WINED3DSPR_SAMPLER:
+ case WINED3DSPR_RESOURCE:
if (reg_idx >= ARRAY_SIZE(reg_maps->resource_type))
{
ERR("Invalid resource index %u.\n", reg_idx);
@@ -1017,6 +1018,52 @@ static void shader_dump_decl_usage(const struct wined3d_shader_semantic *semanti
break;
}
}
+ else if (semantic->reg.reg.type == WINED3DSPR_RESOURCE)
+ {
+ TRACE("_resource_");
+ switch (semantic->resource_type)
+ {
+ case WINED3D_SHADER_RESOURCE_BUFFER:
+ TRACE("buffer");
+ break;
+
+ case WINED3D_SHADER_RESOURCE_TEXTURE_1D:
+ TRACE("texture1d");
+ break;
+
+ case WINED3D_SHADER_RESOURCE_TEXTURE_2D:
+ TRACE("texture2d");
+ break;
+
+ case WINED3D_SHADER_RESOURCE_TEXTURE_2DMS:
+ TRACE("texture2dms");
+ break;
+
+ case WINED3D_SHADER_RESOURCE_TEXTURE_3D:
+ TRACE("texture3d");
+ break;
+
+ case WINED3D_SHADER_RESOURCE_TEXTURE_CUBE:
+ TRACE("texturecube");
+ break;
+
+ case WINED3D_SHADER_RESOURCE_TEXTURE_1DARRAY:
+ TRACE("texture1darray");
+ break;
+
+ case WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY:
+ TRACE("texture2darray");
+ break;
+
+ case WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY:
+ TRACE("texture2dmsarray");
+ break;
+
+ default:
+ TRACE("unknown");
+ break;
+ }
+ }
else
{
/* Pixel shaders 3.0 don't have usage semantics. */
diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c
index ac0fab5..b3bf156 100644
--- a/dlls/wined3d/shader_sm4.c
+++ b/dlls/wined3d/shader_sm4.c
@@ -29,6 +29,9 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d_bytecode);
#define WINED3D_SM4_INSTRUCTION_LENGTH_SHIFT 24
#define WINED3D_SM4_INSTRUCTION_LENGTH_MASK (0x1f << WINED3D_SM4_INSTRUCTION_LENGTH_SHIFT)
+#define WINED3D_SM4_RESOURCE_TYPE_SHIFT 11
+#define WINED3D_SM4_RESOURCE_TYPE_MASK (0xf << WINED3D_SM4_RESOURCE_TYPE_SHIFT)
+
#define WINED3D_SM4_PRIMITIVE_TYPE_SHIFT 11
#define WINED3D_SM4_PRIMITIVE_TYPE_MASK (0x7 << WINED3D_SM4_PRIMITIVE_TYPE_SHIFT)
@@ -121,6 +124,7 @@ enum wined3d_sm4_opcode
WINED3D_SM4_OP_USHR = 0x55,
WINED3D_SM4_OP_UTOF = 0x56,
WINED3D_SM4_OP_XOR = 0x57,
+ WINED3D_SM4_OP_DCL_RESOURCE = 0x58,
WINED3D_SM4_OP_DCL_CONSTANT_BUFFER = 0x59,
WINED3D_SM4_OP_DCL_OUTPUT_TOPOLOGY = 0x5c,
WINED3D_SM4_OP_DCL_INPUT_PRIMITIVE = 0x5d,
@@ -134,6 +138,7 @@ enum wined3d_sm4_register_type
WINED3D_SM4_RT_OUTPUT = 0x2,
WINED3D_SM4_RT_IMMCONST = 0x4,
WINED3D_SM4_RT_SAMPLER = 0x6,
+ WINED3D_SM4_RT_RESOURCE = 0x7,
WINED3D_SM4_RT_CONSTBUFFER = 0x8,
WINED3D_SM4_RT_PRIMID = 0xb,
WINED3D_SM4_RT_NULL = 0xd,
@@ -167,6 +172,19 @@ enum wined3d_sm4_immconst_type
WINED3D_SM4_IMMCONST_VEC4 = 0x2,
};
+enum wined3d_sm4_resource_type
+{
+ WINED3D_SM4_RESOURCE_BUFFER = 0x1,
+ WINED3D_SM4_RESOURCE_TEXTURE_1D = 0x2,
+ WINED3D_SM4_RESOURCE_TEXTURE_2D = 0x3,
+ WINED3D_SM4_RESOURCE_TEXTURE_2DMS = 0x4,
+ WINED3D_SM4_RESOURCE_TEXTURE_3D = 0x5,
+ WINED3D_SM4_RESOURCE_TEXTURE_CUBE = 0x6,
+ WINED3D_SM4_RESOURCE_TEXTURE_1DARRAY = 0x7,
+ WINED3D_SM4_RESOURCE_TEXTURE_2DARRAY = 0x8,
+ WINED3D_SM4_RESOURCE_TEXTURE_2DMSARRAY = 0x9,
+};
+
struct wined3d_shader_src_param_entry
{
struct list entry;
@@ -264,6 +282,7 @@ static const struct wined3d_sm4_opcode_info opcode_table[] =
{WINED3D_SM4_OP_USHR, WINED3DSIH_USHR, "U", "UU"},
{WINED3D_SM4_OP_UTOF, WINED3DSIH_UTOF, "F", "U"},
{WINED3D_SM4_OP_XOR, WINED3DSIH_XOR, "U", "UU"},
+ {WINED3D_SM4_OP_DCL_RESOURCE, WINED3DSIH_DCL, "R", ""},
{WINED3D_SM4_OP_DCL_CONSTANT_BUFFER, WINED3DSIH_DCL_CONSTANT_BUFFER, "", ""},
{WINED3D_SM4_OP_DCL_OUTPUT_TOPOLOGY, WINED3DSIH_DCL_OUTPUT_TOPOLOGY, "", ""},
{WINED3D_SM4_OP_DCL_INPUT_PRIMITIVE, WINED3DSIH_DCL_INPUT_PRIMITIVE, "", ""},
@@ -323,6 +342,20 @@ static const struct sysval_map sysval_map[] =
{WINED3D_SV_TARGET7, WINED3DSPR_COLOROUT, 7},
};
+static const enum wined3d_shader_resource_type resource_type_table[] =
+{
+ /* 0 */ WINED3D_SHADER_RESOURCE_NONE,
+ /* WINED3D_SM4_RESOURCE_BUFFER */ WINED3D_SHADER_RESOURCE_BUFFER,
+ /* WINED3D_SM4_RESOURCE_TEXTURE_1D */ WINED3D_SHADER_RESOURCE_TEXTURE_1D,
+ /* WINED3D_SM4_RESOURCE_TEXTURE_2D */ WINED3D_SHADER_RESOURCE_TEXTURE_2D,
+ /* WINED3D_SM4_RESOURCE_TEXTURE_2DMS */ WINED3D_SHADER_RESOURCE_TEXTURE_2DMS,
+ /* WINED3D_SM4_RESOURCE_TEXTURE_3D */ WINED3D_SHADER_RESOURCE_TEXTURE_3D,
+ /* WINED3D_SM4_RESOURCE_TEXTURE_CUBE */ WINED3D_SHADER_RESOURCE_TEXTURE_CUBE,
+ /* WINED3D_SM4_RESOURCE_TEXTURE_1DARRAY */ WINED3D_SHADER_RESOURCE_TEXTURE_1DARRAY,
+ /* WINED3D_SM4_RESOURCE_TEXTURE_2DARRAY */ WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY,
+ /* WINED3D_SM4_RESOURCE_TEXTURE_2DMSARRAY */ WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY,
+};
+
static BOOL shader_sm4_read_src_param(struct wined3d_sm4_data *priv, const DWORD **ptr,
enum wined3d_data_type data_type, struct wined3d_shader_src_param *src_param);
@@ -743,7 +776,23 @@ static void shader_sm4_read_instruction(void *data, const DWORD **ptr, struct wi
FIXME("Skipping modifier 0x%08x.\n", modifier);
}
- if (opcode == WINED3D_SM4_OP_DCL_CONSTANT_BUFFER)
+ if (opcode == WINED3D_SM4_OP_DCL_RESOURCE)
+ {
+ enum wined3d_sm4_resource_type resource_type;
+
+ resource_type = (opcode_token & WINED3D_SM4_RESOURCE_TYPE_MASK) >> WINED3D_SM4_RESOURCE_TYPE_SHIFT;
+ if (!resource_type || (resource_type >= ARRAY_SIZE(resource_type_table)))
+ {
+ FIXME("Unhandled resource type %#x.\n", resource_type);
+ ins->declaration.semantic.resource_type = WINED3D_SHADER_RESOURCE_NONE;
+ }
+ else
+ {
+ ins->declaration.semantic.resource_type = resource_type_table[resource_type];
+ }
+ shader_sm4_read_dst_param(priv, &p, WINED3D_DATA_RESOURCE, &ins->declaration.semantic.reg);
+ }
+ else if (opcode == WINED3D_SM4_OP_DCL_CONSTANT_BUFFER)
{
shader_sm4_read_src_param(priv, &p, WINED3D_DATA_FLOAT, &ins->declaration.src);
if (opcode_token & WINED3D_SM4_INDEX_TYPE_MASK)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 2020d78..a1e5dea 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -286,10 +286,15 @@ extern struct wined3d_settings wined3d_settings DECLSPEC_HIDDEN;
enum wined3d_shader_resource_type
{
WINED3D_SHADER_RESOURCE_NONE,
+ WINED3D_SHADER_RESOURCE_BUFFER,
WINED3D_SHADER_RESOURCE_TEXTURE_1D,
WINED3D_SHADER_RESOURCE_TEXTURE_2D,
+ WINED3D_SHADER_RESOURCE_TEXTURE_2DMS,
WINED3D_SHADER_RESOURCE_TEXTURE_3D,
WINED3D_SHADER_RESOURCE_TEXTURE_CUBE,
+ WINED3D_SHADER_RESOURCE_TEXTURE_1DARRAY,
+ WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY,
+ WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY,
};
#define WINED3D_SHADER_CONST_VS_F 0x00000001
--
1.7.10.4
More information about the wine-patches
mailing list