[3/8] wined3d: Create a separate function for sampling a texture

H. Verbeet hverbeet at gmail.com
Mon Nov 27 13:50:47 CST 2006


There are a couple of instructions that have to sample from a texture,
right now most of them duplicate that code, and hardcode the texture
type.

Changelog:
  - Create a separate function for sampling a texture
-------------- next part --------------
---

 dlls/wined3d/arb_program_shader.c |   72 +++++++++++++++------------
 dlls/wined3d/glsl_shader.c        |   98 +++++++++++++++++--------------------
 2 files changed, 85 insertions(+), 85 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index a0d0d53..9f2be9b 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -423,6 +423,44 @@ static void vshader_program_add_param(SH
   }
 }
 
+static void shader_hw_sample(SHADER_OPCODE_ARG* arg, DWORD sampler_idx, const char *dst_str, const char *coord_reg) {
+    IWineD3DPixelShaderImpl* This = (IWineD3DPixelShaderImpl*) arg->shader;
+    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+
+    SHADER_BUFFER* buffer = arg->buffer;
+    DWORD sampler_type = arg->reg_maps->samplers[sampler_idx] & WINED3DSP_TEXTURETYPE_MASK;
+    const char *tex_type;
+
+    switch(sampler_type) {
+        case WINED3DSTT_1D:
+            tex_type = "1D";
+            break;
+
+        case WINED3DSTT_2D:
+            tex_type = "2D";
+            break;
+
+        case WINED3DSTT_VOLUME:
+            tex_type = "3D";
+            break;
+
+        case WINED3DSTT_CUBE:
+            tex_type = "CUBE";
+            break;
+
+        default:
+            ERR("Unexpected texture type %d\n", sampler_type);
+            tex_type = "";
+    }
+
+    if (deviceImpl->stateBlock->textureState[sampler_idx][WINED3DTSS_TEXTURETRANSFORMFLAGS] & WINED3DTTFF_PROJECTED) {
+        shader_addline(buffer, "TXP %s, %s, texture[%u], %s;\n", dst_str, coord_reg, sampler_idx, tex_type);
+    } else {
+        shader_addline(buffer, "TEX %s, %s, texture[%u], %s;\n", dst_str, coord_reg, sampler_idx, tex_type);
+    }
+}
+
+
 static void pshader_gen_input_modifier_line (
     SHADER_BUFFER* buffer,
     const DWORD instr,
@@ -618,7 +656,6 @@ void pshader_hw_map2gl(SHADER_OPCODE_ARG
 void pshader_hw_tex(SHADER_OPCODE_ARG* arg) {
 
     IWineD3DPixelShaderImpl* This = (IWineD3DPixelShaderImpl*) arg->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
 
     DWORD dst = arg->dst;
     DWORD* src = arg->src;
@@ -627,10 +664,8 @@ void pshader_hw_tex(SHADER_OPCODE_ARG* a
 
     char reg_dest[40];
     char reg_coord[40];
-    const char *tex_type;
     DWORD reg_dest_code;
     DWORD reg_sampler_code;
-    DWORD sampler_type;
 
     /* All versions have a destination register */
     reg_dest_code = dst & WINED3DSP_REGNUM_MASK;
@@ -650,36 +685,7 @@ void pshader_hw_tex(SHADER_OPCODE_ARG* a
   else
      reg_sampler_code = src[1] & WINED3DSP_REGNUM_MASK;
 
-  sampler_type = arg->reg_maps->samplers[reg_sampler_code] & WINED3DSP_TEXTURETYPE_MASK;
-  switch(sampler_type) {
-     case WINED3DSTT_1D:
-         tex_type = "1D";
-         break;
-
-     case WINED3DSTT_2D:
-         tex_type = "2D";
-         break;
-
-     case WINED3DSTT_VOLUME:
-         tex_type = "3D";
-         break;
-
-     case WINED3DSTT_CUBE:
-         tex_type = "CUBE";
-         break;
-
-     default:
-         ERR("Unexpected texture type %d\n", sampler_type);
-         tex_type = "2D";
-  }
-
-  if (deviceImpl->stateBlock->textureState[reg_sampler_code][WINED3DTSS_TEXTURETRANSFORMFLAGS] & WINED3DTTFF_PROJECTED) {
-      shader_addline(buffer, "TXP %s, %s, texture[%u], %s;\n",
-          reg_dest, reg_coord, reg_sampler_code, tex_type);
-  } else {
-      shader_addline(buffer, "TEX %s, %s, texture[%u], %s;\n",
-                     reg_dest, reg_coord, reg_sampler_code, tex_type);
-  }
+  shader_hw_sample(arg, reg_sampler_code, reg_dest, reg_coord);
 }
 
 void pshader_hw_texcoord(SHADER_OPCODE_ARG* arg) {
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 01b3b75..6be71bb 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -855,6 +855,47 @@ static inline const char* shader_get_com
     }
 }
 
+static void shader_glsl_sample(SHADER_OPCODE_ARG* arg, DWORD sampler_idx, const char *dst_str, const char *coord_reg) {
+    IWineD3DPixelShaderImpl* This = (IWineD3DPixelShaderImpl*) arg->shader;
+    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+    DWORD sampler_type = arg->reg_maps->samplers[sampler_idx] & WINED3DSP_TEXTURETYPE_MASK;
+    const char sampler_prefix = shader_is_pshader_version(This->baseShader.hex_version) ? 'P' : 'V';
+    SHADER_BUFFER* buffer = arg->buffer;
+
+    if(deviceImpl->stateBlock->textureState[sampler_idx][WINED3DTSS_TEXTURETRANSFORMFLAGS] & WINED3DTTFF_PROJECTED) {
+        /* Note that there's no such thing as a projected cube texture. */
+        switch(sampler_type) {
+            case WINED3DSTT_2D:
+                shader_addline(buffer, "%s = texture2DProj(%cshader%u, %s);\n", dst_str, sampler_prefix, sampler_idx, coord_reg);
+                break;
+            case WINED3DSTT_VOLUME:
+                shader_addline(buffer, "%s = texture3DProj(%cshader%u, %s);\n", dst_str, sampler_prefix, sampler_idx, coord_reg);
+                break;
+            default:
+                shader_addline(buffer, "%s = unrecognized_stype(%cshader%u, %s);\n", dst_str, sampler_prefix, sampler_idx, coord_reg);
+                FIXME("Unrecognized sampler type: %#x;\n", sampler_type);
+                break;
+        }
+    } else {
+        switch(sampler_type) {
+            case WINED3DSTT_2D:
+                shader_addline(buffer, "%s = texture2D(%csampler%u, %s.xy);\n", dst_str, sampler_prefix, sampler_idx, coord_reg);
+                break;
+            case WINED3DSTT_CUBE:
+                shader_addline(buffer, "%s = textureCube(%csampler%u, %s.xyz);\n", dst_str, sampler_prefix, sampler_idx, coord_reg);
+                break;
+            case WINED3DSTT_VOLUME:
+                shader_addline(buffer, "%s = texture3D(%csampler%u, %s.xyz);\n", dst_str, sampler_prefix, sampler_idx, coord_reg);
+                break;
+            default:
+                shader_addline(buffer, "%s = unrecognized_stype(%csampler%u, %s);\n", dst_str, sampler_prefix, sampler_idx, coord_reg);
+                FIXME("Unrecognized sampler type: %#x;\n", sampler_type);
+                break;
+        }
+    }
+}
+
+
 /*****************************************************************************
  * 
  * Begin processing individual instruction opcodes
@@ -1356,20 +1397,12 @@ void shader_glsl_callnz(SHADER_OPCODE_AR
  * Pixel Shader Specific Code begins here
  ********************************************/
 void pshader_glsl_tex(SHADER_OPCODE_ARG* arg) {
-
-    /* FIXME: Make this work for more than just 2D textures */
-    
     IWineD3DPixelShaderImpl* This = (IWineD3DPixelShaderImpl*) arg->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
 
-    SHADER_BUFFER* buffer = arg->buffer;
     DWORD hex_version = This->baseShader.hex_version;
 
     char dst_str[100],   dst_reg[50],  dst_mask[6];
     char coord_str[100], coord_reg[50], coord_mask[6];
-    char sampler_str[100], sampler_reg[50], sampler_mask[6];
-    DWORD reg_dest_code = arg->dst & WINED3DSP_REGNUM_MASK;
-    DWORD sampler_code, sampler_type;
 
     /* All versions have a destination register */
     shader_glsl_add_param(arg, arg->dst, 0, FALSE, dst_reg, dst_mask, dst_str);
@@ -1381,53 +1414,14 @@ void pshader_glsl_tex(SHADER_OPCODE_ARG*
     else
        shader_glsl_add_param(arg, arg->src[0], arg->src_addr[0], TRUE, coord_reg, coord_mask, coord_str);
 
-    /* 1.0-1.4: Use destination register as coordinate source.
-     * 2.0+: Use provided coordinate source register. */
+    /* 1.0-1.4: Use destination register as sampler source.
+     * 2.0+: Use provided sampler source. */
     if (hex_version < WINED3DPS_VERSION(2,0)) {
-        sprintf(sampler_str, "Psampler%u", reg_dest_code); 
-        sampler_code = reg_dest_code;
-    }       
-    else {
-        shader_glsl_add_param(arg, arg->src[1], arg->src_addr[1], TRUE, sampler_reg, sampler_mask, sampler_str);
-        sampler_code = arg->src[1] & WINED3DSP_REGNUM_MASK;
-    }         
-
-    sampler_type = arg->reg_maps->samplers[sampler_code] & WINED3DSP_TEXTURETYPE_MASK;
-    if(deviceImpl->stateBlock->textureState[sampler_code][WINED3DTSS_TEXTURETRANSFORMFLAGS] & WINED3DTTFF_PROJECTED) {
-        switch(sampler_type) {
-
-            case WINED3DSTT_2D:
-                shader_addline(buffer, "%s = texture2DProj(%s, %s);\n", dst_str, sampler_str, coord_reg);
-                break;
-            case WINED3DSTT_CUBE:
-                shader_addline(buffer, "%s = textureCubeProj(%s, %s);\n", dst_str, sampler_str, coord_reg);
-                break;
-            case WINED3DSTT_VOLUME:
-                shader_addline(buffer, "%s = texture3DProj(%s, %s);\n", dst_str, sampler_str, coord_reg);
-                break;
-            default:
-                shader_addline(buffer, "%s = unrecognized_stype(%s, %s.stp);\n", dst_str, sampler_str, coord_reg);
-                FIXME("Unrecognized sampler type: %#x;\n", sampler_type);
-                break;
-        }
+        shader_glsl_sample(arg, arg->dst & WINED3DSP_REGNUM_MASK, dst_str, coord_reg);
     } else {
-        switch(sampler_type) {
-
-            case WINED3DSTT_2D:
-                shader_addline(buffer, "%s = texture2D(%s, %s.st);\n", dst_str, sampler_str, coord_reg);
-                break;
-            case WINED3DSTT_CUBE:
-                shader_addline(buffer, "%s = textureCube(%s, %s.stp);\n", dst_str, sampler_str, coord_reg);
-                break;
-            case WINED3DSTT_VOLUME:
-                shader_addline(buffer, "%s = texture3D(%s, %s.stp);\n", dst_str, sampler_str, coord_reg);
-                break;
-            default:
-                shader_addline(buffer, "%s = unrecognized_stype(%s, %s.stp);\n", dst_str, sampler_str, coord_reg);
-                FIXME("Unrecognized sampler type: %#x;\n", sampler_type);
-                break;
-        }
+        shader_glsl_sample(arg, arg->src[1] & WINED3DSP_REGNUM_MASK, dst_str, coord_reg);
     }
+
 }
 
 void pshader_glsl_texcoord(SHADER_OPCODE_ARG* arg) {


More information about the wine-patches mailing list