[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