[WINED3D 2/3] Declare a 1D sampler for TEXDP3TEX (GLSL)

Jason Green jave27 at gmail.com
Fri Jul 28 14:34:39 CDT 2006


Also, update more D3D* defines to WINED3D*
-------------- next part --------------
From nobody Mon Sep 17 00:00:00 2001
From: Jason <jason at jave02.(none)>
Date: Fri, 28 Jul 2006 15:24:22 -0400
Subject: [PATCH 2/3] Declare 1 1D sampler for TEXDP3TEX

Also, update more D3D* defines to WINED3D*

---

 dlls/wined3d/baseshader.c    |   18 ++++++++++-----
 dlls/wined3d/glsl_shader.c   |   49 ++++++++++++++++++++++--------------------
 include/d3d9types.h          |    1 +
 include/wine/wined3d_types.h |   13 +++++++++++
 4 files changed, 52 insertions(+), 29 deletions(-)

27506cee7fc9f1a94b686ed4e4fdfe821822ec36
diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index 120123d..ce1f1a3 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -299,7 +299,7 @@ HRESULT shader_get_registers_used(
 
                 /* Fake sampler usage, only set reserved bit and ttype */
                 DWORD sampler_code = *pToken & D3DSP_REGNUM_MASK;
-                reg_maps->samplers[sampler_code] = (0x1 << 31) | D3DSTT_2D;
+                reg_maps->samplers[sampler_code] = (0x1 << 31) | WINED3DSTT_2D;
                 
             } else if (D3DSHADER_VERSION_MAJOR(This->baseShader.hex_version) == 1 &&
                 (D3DSIO_TEXM3x3SPEC == curOpcode->opcode ||
@@ -310,7 +310,13 @@ HRESULT shader_get_registers_used(
                  * we waited to generate the shader until the textures were all bound.
                  * For now, use Cube textures because they are more common. */
                 DWORD sampler_code = *pToken & D3DSP_REGNUM_MASK;
-                reg_maps->samplers[sampler_code] = (0x1 << 31) | D3DSTT_CUBE;
+                reg_maps->samplers[sampler_code] = (0x1 << 31) | WINED3DSTT_CUBE;
+            } else if (D3DSHADER_VERSION_MAJOR(This->baseShader.hex_version) == 1 &&
+                (D3DSIO_TEXDP3TEX == curOpcode->opcode)) {
+                
+                /* 1D Sampler usage */
+                DWORD sampler_code = *pToken & D3DSP_REGNUM_MASK;
+                reg_maps->samplers[sampler_code] = (0x1 << 31) | WINED3DSTT_1D;
             }
 
             /* This will loop over all the registers and try to
@@ -364,12 +370,12 @@ static void shader_dump_decl_usage(
     TRACE("dcl");
 
     if (regtype == D3DSPR_SAMPLER) {
-        DWORD ttype = decl & D3DSP_TEXTURETYPE_MASK;
+        DWORD ttype = decl & WINED3DSP_TEXTURETYPE_MASK;
 
         switch (ttype) {
-            case D3DSTT_2D: TRACE("_2d"); break;
-            case D3DSTT_CUBE: TRACE("_cube"); break;
-            case D3DSTT_VOLUME: TRACE("_volume"); break;
+            case WINED3DSTT_2D: TRACE("_2d"); break;
+            case WINED3DSTT_CUBE: TRACE("_cube"); break;
+            case WINED3DSTT_VOLUME: TRACE("_volume"); break;
             default: TRACE("_unknown_ttype(%08lx)", ttype); 
        }
 
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 63af4f7..62f27e3 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -355,16 +355,19 @@ void shader_generate_glsl_declarations(
     for (i = 0; i < This->baseShader.limits.sampler; i++) {
         if (reg_maps->samplers[i]) {
 
-            DWORD stype = reg_maps->samplers[i] & D3DSP_TEXTURETYPE_MASK;
+            DWORD stype = reg_maps->samplers[i] & WINED3DSP_TEXTURETYPE_MASK;
             switch (stype) {
 
-                case D3DSTT_2D:
+                case WINED3DSTT_1D:
+                    shader_addline(buffer, "uniform sampler1D %csampler%lu;\n", prefix, i);
+                    break;
+                case WINED3DSTT_2D:
                     shader_addline(buffer, "uniform sampler2D %csampler%lu;\n", prefix, i);
                     break;
-                case D3DSTT_CUBE:
+                case WINED3DSTT_CUBE:
                     shader_addline(buffer, "uniform samplerCube %csampler%lu;\n", prefix, i);
                     break;
-                case D3DSTT_VOLUME:
+                case WINED3DSTT_VOLUME:
                     shader_addline(buffer, "uniform sampler3D %csampler%lu;\n", prefix, i);
                     break;
                 default:
@@ -1341,16 +1344,16 @@ void pshader_glsl_tex(SHADER_OPCODE_ARG*
         sampler_code = arg->src[1] & D3DSP_REGNUM_MASK;
     }         
 
-    sampler_type = arg->reg_maps->samplers[sampler_code] & D3DSP_TEXTURETYPE_MASK;
+    sampler_type = arg->reg_maps->samplers[sampler_code] & WINED3DSP_TEXTURETYPE_MASK;
     switch(sampler_type) {
 
-        case D3DSTT_2D:
+        case WINED3DSTT_2D:
             shader_addline(buffer, "%s = texture2D(%s, %s.st);\n", dst_str, sampler_str, coord_reg);
             break;
-        case D3DSTT_CUBE:
+        case WINED3DSTT_CUBE:
             shader_addline(buffer, "%s = textureCube(%s, %s.stp);\n", dst_str, sampler_str, coord_reg);
             break;
-        case D3DSTT_VOLUME:
+        case WINED3DSTT_VOLUME:
             shader_addline(buffer, "%s = texture3D(%s, %s.stp);\n", dst_str, sampler_str, coord_reg);
             break;
         default:
@@ -1505,14 +1508,14 @@ void pshader_glsl_texm3x3tex(SHADER_OPCO
     char dimensions[5];
     DWORD reg = arg->dst & D3DSP_REGNUM_MASK;
     DWORD src0_regnum = arg->src[0] & D3DSP_REGNUM_MASK;
-    DWORD stype = arg->reg_maps->samplers[src0_regnum] & D3DSP_TEXTURETYPE_MASK;
+    DWORD stype = arg->reg_maps->samplers[src0_regnum] & WINED3DSP_TEXTURETYPE_MASK;
     IWineD3DPixelShaderImpl* This = (IWineD3DPixelShaderImpl*) arg->shader;
     SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
     
     switch (stype) {
-        case D3DSTT_2D:     strcpy(dimensions, "2D");   break;
-        case D3DSTT_CUBE:   strcpy(dimensions, "Cube"); break;
-        case D3DSTT_VOLUME: strcpy(dimensions, "3D");   break;
+        case WINED3DSTT_2D:     strcpy(dimensions, "2D");   break;
+        case WINED3DSTT_CUBE:   strcpy(dimensions, "Cube"); break;
+        case WINED3DSTT_VOLUME: strcpy(dimensions, "3D");   break;
         default:
             strcpy(dimensions, "");
             FIXME("Unrecognized sampler type: %#lx\n", stype);
@@ -1522,7 +1525,7 @@ void pshader_glsl_texm3x3tex(SHADER_OPCO
     shader_glsl_add_param(arg, arg->src[0], arg->src_addr[0], TRUE, src0_name, src0_mask, src0_str);
     shader_addline(arg->buffer, "tmp0.z = dot(vec3(T%lu), vec3(%s));\n", reg, src0_str);
     shader_addline(arg->buffer, "T%lu = texture%s(Psampler%lu, tmp0.%s);\n", 
-            reg, dimensions, reg, (stype == D3DSTT_2D) ? "xy" : "xyz");
+            reg, dimensions, reg, (stype == WINED3DSTT_2D) ? "xy" : "xyz");
     current_state->current_row = 0;
 }
 
@@ -1555,12 +1558,12 @@ void pshader_glsl_texm3x3spec(SHADER_OPC
     char src1_str[100], src1_name[50], src1_mask[6];
     SHADER_BUFFER* buffer = arg->buffer;
     SHADER_PARSE_STATE* current_state = &shader->baseShader.parse_state;
-    DWORD stype = arg->reg_maps->samplers[reg] & D3DSP_TEXTURETYPE_MASK;
+    DWORD stype = arg->reg_maps->samplers[reg] & WINED3DSP_TEXTURETYPE_MASK;
 
     switch (stype) {
-        case D3DSTT_2D:     strcpy(dimensions, "2D");   break;
-        case D3DSTT_CUBE:   strcpy(dimensions, "Cube"); break;
-        case D3DSTT_VOLUME: strcpy(dimensions, "3D");   break;
+        case WINED3DSTT_2D:     strcpy(dimensions, "2D");   break;
+        case WINED3DSTT_CUBE:   strcpy(dimensions, "Cube"); break;
+        case WINED3DSTT_VOLUME: strcpy(dimensions, "3D");   break;
         default:
             strcpy(dimensions, "");
             FIXME("Unrecognized sampler type: %#lx\n", stype);
@@ -1578,7 +1581,7 @@ void pshader_glsl_texm3x3spec(SHADER_OPC
 
     /* Sample the texture */
     shader_addline(buffer, "T%lu = texture%s(Psampler%lu, tmp0.%s);\n", 
-            reg, dimensions, reg, (stype == D3DSTT_2D) ? "xy" : "xyz");
+            reg, dimensions, reg, (stype == WINED3DSTT_2D) ? "xy" : "xyz");
     current_state->current_row = 0;
 }
 
@@ -1677,11 +1680,11 @@ void pshader_glsl_texreg2rgb(SHADER_OPCO
     char dst_mask[6], src0_mask[6];
     char dimensions[5];
     DWORD src0_regnum = arg->src[0] & D3DSP_REGNUM_MASK;
-    DWORD stype = arg->reg_maps->samplers[src0_regnum] & D3DSP_TEXTURETYPE_MASK;
+    DWORD stype = arg->reg_maps->samplers[src0_regnum] & WINED3DSP_TEXTURETYPE_MASK;
     switch (stype) {
-        case D3DSTT_2D:     strcpy(dimensions, "2D");   break;
-        case D3DSTT_CUBE:   strcpy(dimensions, "Cube"); break;
-        case D3DSTT_VOLUME: strcpy(dimensions, "3D");   break;
+        case WINED3DSTT_2D:     strcpy(dimensions, "2D");   break;
+        case WINED3DSTT_CUBE:   strcpy(dimensions, "Cube"); break;
+        case WINED3DSTT_VOLUME: strcpy(dimensions, "3D");   break;
         default:
             strcpy(dimensions, "");
             FIXME("Unrecognized sampler type: %#lx\n", stype);
@@ -1693,7 +1696,7 @@ void pshader_glsl_texreg2rgb(SHADER_OPCO
 
     shader_glsl_add_dst(arg->dst, dst_reg, dst_mask, tmpLine);
     shader_addline(arg->buffer, "%stexture%s(Psampler%lu, %s.%s))%s;\n",
-            tmpLine, dimensions, src0_regnum, dst_reg, (stype == D3DSTT_2D) ? "xy" : "xyz", dst_mask);
+            tmpLine, dimensions, src0_regnum, dst_reg, (stype == WINED3DSTT_2D) ? "xy" : "xyz", dst_mask);
 }
 
 /** Process the D3DSIO_TEXKILL instruction in GLSL.
diff --git a/include/d3d9types.h b/include/d3d9types.h
index cae4739..c986169 100644
--- a/include/d3d9types.h
+++ b/include/d3d9types.h
@@ -471,6 +471,7 @@ #define D3DSP_TEXTURETYPE_MASK  0x780000
 
 typedef enum _D3DSAMPLER_TEXTURE_TYPE {
   D3DSTT_UNKNOWN      = 0 << D3DSP_TEXTURETYPE_SHIFT,
+  D3DSTT_1D           = 1 << D3DSP_TEXTURETYPE_SHIFT,
   D3DSTT_2D           = 2 << D3DSP_TEXTURETYPE_SHIFT,
   D3DSTT_CUBE         = 3 << D3DSP_TEXTURETYPE_SHIFT,
   D3DSTT_VOLUME       = 4 << D3DSP_TEXTURETYPE_SHIFT,
diff --git a/include/wine/wined3d_types.h b/include/wine/wined3d_types.h
index 73ed292..5538563 100644
--- a/include/wine/wined3d_types.h
+++ b/include/wine/wined3d_types.h
@@ -994,6 +994,19 @@ typedef enum _WINED3DDECLUSAGE {
       WINED3DSHADERDECLUSAGE_MAX_USAGE
 } WINED3DSHADERDECLUSAGE;
 
+#define WINED3DSP_TEXTURETYPE_SHIFT 27
+#define WINED3DSP_TEXTURETYPE_MASK  0x78000000
+
+typedef enum _WINED3DSAMPLER_TEXTURE_TYPE {
+  WINED3DSTT_UNKNOWN      = 0 << WINED3DSP_TEXTURETYPE_SHIFT,
+  WINED3DSTT_1D           = 1 << WINED3DSP_TEXTURETYPE_SHIFT,
+  WINED3DSTT_2D           = 2 << WINED3DSP_TEXTURETYPE_SHIFT, 
+  WINED3DSTT_CUBE         = 3 << WINED3DSP_TEXTURETYPE_SHIFT,
+  WINED3DSTT_VOLUME       = 4 << WINED3DSP_TEXTURETYPE_SHIFT,
+
+  WINED3DSTT_FORCE_DWORD  = 0x7FFFFFFF
+} WINED3DSAMPLER_TEXTURE_TYPE;
+
 #define WINED3DUSAGE_RENDERTARGET                     0x00000001L
 #define WINED3DUSAGE_DEPTHSTENCIL                     0x00000002L
 #define WINED3DUSAGE_WRITEONLY                        0x00000008L
-- 
1.3.3


More information about the wine-patches mailing list