Henri Verbeet : wined3d: Don' t use the opcode_token field in the GLSL backend.

Alexandre Julliard julliard at winehq.org
Wed Apr 1 10:11:27 CDT 2009


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Wed Apr  1 12:23:00 2009 +0200

wined3d: Don't use the opcode_token field in the GLSL backend.

The idea is that we want to prevent backends from parsing the tokens
themselves, which is pretty much a requirement for adding SM4 support.

---

 dlls/wined3d/baseshader.c            |    3 +++
 dlls/wined3d/glsl_shader.c           |   20 +++++++++++---------
 dlls/wined3d/wined3d_private.h       |    2 ++
 dlls/wined3d/wined3d_private_types.h |    3 +++
 4 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index 34ab181..a547949 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -838,6 +838,9 @@ void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER* buffer,
 
         hw_arg.opcode = curOpcode;
 
+        hw_arg.flags = hw_arg.opcode_token & WINED3D_OPCODESPECIFICCONTROL_MASK;
+        hw_arg.coissue = hw_arg.opcode_token & WINED3DSI_COISSUE;
+
         /* Destination token */
         if (curOpcode->dst_token)
         {
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index c92f99b..9cdab01 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -1314,10 +1314,9 @@ void shader_glsl_add_instruction_modifiers(const SHADER_OPCODE_ARG* arg)
     }
 }
 
-static inline const char* shader_get_comp_op(
-    const DWORD opcode) {
-
-    DWORD op = (opcode & INST_CONTROLS_MASK) >> INST_CONTROLS_SHIFT;
+static inline const char *shader_get_comp_op(DWORD flags)
+{
+    DWORD op = (flags & INST_CONTROLS_MASK) >> INST_CONTROLS_SHIFT;
     switch (op) {
         case COMPARISON_GT: return ">";
         case COMPARISON_EQ: return "==";
@@ -1972,7 +1971,8 @@ static void shader_glsl_cnd(const SHADER_OPCODE_ARG *arg)
         shader_glsl_add_src_param(arg, arg->src[2], arg->src_addr[2], write_mask, &src2_param);
 
         /* Fun: The D3DSI_COISSUE flag changes the semantic of the cnd instruction for < 1.4 shaders */
-        if(arg->opcode_token & WINED3DSI_COISSUE) {
+        if (arg->coissue)
+        {
             shader_addline(arg->buffer, "%s /* COISSUE! */);\n", src1_param.param_str);
         } else {
             shader_addline(arg->buffer, "%s > 0.5 ? %s : %s);\n",
@@ -2304,7 +2304,7 @@ static void shader_glsl_ifc(const SHADER_OPCODE_ARG *arg)
     shader_glsl_add_src_param(arg, arg->src[1], arg->src_addr[1], WINED3DSP_WRITEMASK_0, &src1_param);
 
     shader_addline(arg->buffer, "if (%s %s %s) {\n",
-            src0_param.param_str, shader_get_comp_op(arg->opcode_token), src1_param.param_str);
+            src0_param.param_str, shader_get_comp_op(arg->flags), src1_param.param_str);
 }
 
 static void shader_glsl_else(const SHADER_OPCODE_ARG *arg)
@@ -2327,7 +2327,7 @@ static void shader_glsl_breakc(const SHADER_OPCODE_ARG *arg)
     shader_glsl_add_src_param(arg, arg->src[1], arg->src_addr[1], WINED3DSP_WRITEMASK_0, &src1_param);
 
     shader_addline(arg->buffer, "if (%s %s %s) break;\n",
-            src0_param.param_str, shader_get_comp_op(arg->opcode_token), src1_param.param_str);
+            src0_param.param_str, shader_get_comp_op(arg->flags), src1_param.param_str);
 }
 
 static void shader_glsl_label(const SHADER_OPCODE_ARG *arg)
@@ -2401,7 +2401,8 @@ static void pshader_glsl_tex(const SHADER_OPCODE_ARG *arg)
             mask = WINED3DSP_WRITEMASK_3;
         }
     } else {
-        if(arg->opcode_token & WINED3DSI_TEXLD_PROJECT) {
+        if (arg->flags & WINED3DSI_TEXLD_PROJECT)
+        {
             /* ps 2.0 texldp instruction always divides by the fourth component. */
             sample_flags |= WINED3D_GLSL_SAMPLE_PROJECTED;
             mask = WINED3DSP_WRITEMASK_3;
@@ -2430,7 +2431,8 @@ static void pshader_glsl_tex(const SHADER_OPCODE_ARG *arg)
     } else {
         glsl_src_param_t coord_param;
         shader_glsl_add_src_param(arg, arg->src[0], arg->src_addr[0], mask, &coord_param);
-        if(arg->opcode_token & WINED3DSI_TEXLD_BIAS) {
+        if (arg->flags & WINED3DSI_TEXLD_BIAS)
+        {
             glsl_src_param_t bias;
             shader_glsl_add_src_param(arg, arg->src[0], arg->src_addr[0], WINED3DSP_WRITEMASK_3, &bias);
             shader_glsl_gen_sample_code(arg, sampler_idx, &sample_function, swizzle, bias.param_str,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8907b0f..6323250 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2244,6 +2244,8 @@ typedef struct SHADER_OPCODE_ARG {
     const shader_reg_maps *reg_maps;
     CONST SHADER_OPCODE* opcode;
     DWORD opcode_token;
+    DWORD flags;
+    BOOL coissue;
     DWORD dst;
     DWORD dst_addr;
     DWORD predicate;
diff --git a/dlls/wined3d/wined3d_private_types.h b/dlls/wined3d/wined3d_private_types.h
index e5b4c3d..2d9ae03 100644
--- a/dlls/wined3d/wined3d_private_types.h
+++ b/dlls/wined3d/wined3d_private_types.h
@@ -279,6 +279,9 @@ typedef enum _WINED3DSHADER_INSTRUCTION_OPCODE_TYPE {
 
 /** opcode-related masks **/
 
+#define WINED3D_OPCODESPECIFICCONTROL_MASK  0x00ff0000
+#define WINED3D_OPCODESPECIFICCONTROL_SHIFT 16
+
 #define WINED3DSI_OPCODE_MASK       0x0000FFFF
 #define WINED3DSI_INSTLENGTH_MASK   0x0F000000
 #define WINED3DSI_INSTLENGTH_SHIFT  24




More information about the wine-cvs mailing list