WineD3D: Sample from the correct source when using older pixel shaders

Stefan Dösinger stefan at codeweavers.com
Sat Aug 26 17:07:01 CDT 2006


Am Samstag 26 August 2006 23:31 schrieb Stefan Dösinger:
> Pre 2.0 pixel shaders do not contain a tag for the texture type to sample
> from. Wine had 2D textures hardcoded, this patch checks the bound texture
> type to decide from which texture to sample from. For >= 2.0 shaders the
> shader tag is still used.
Use this patch instead, it also adds the block for sampling 1D textures to 
glsl, as it does for ARB
-------------- next part --------------
From nobody Mon Sep 17 00:00:00 2001
From: Stefan Doesinger <stefan at codeweavers.com>
Date: Sun Aug 27 00:03:34 2006 +0200
Subject: [PATCH] Coalescing 94b525de74dd4b8d2b5f1ffdcf4abf2f6be6ab2d and 470be1ba4e646f299e3d134c4b11dfcead3c9b9a
First commit:

Coalescing 26c12e9b8954b15aca2223e3528e969a83e70bc6 and 91d1a95895c54aba6260a22d3fbfe34658311d7c
First commit:

WineD3D: Sample from the right texture type

Second commit:

add 1D textures to glsl

Second commit:

forgot an 1D line

---

 dlls/wined3d/arb_program_shader.c |   36 +++++++++++++++++--
 dlls/wined3d/glsl_shader.c        |   71 +++++++++++++++++++++++++++++++++++--
 2 files changed, 99 insertions(+), 8 deletions(-)

7aef1a179888fb610aca367ac8ca94d5266e5648
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index e3c21e3..ccf7ca3 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -621,6 +621,7 @@ 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;
 
@@ -642,12 +643,39 @@ void pshader_hw_tex(SHADER_OPCODE_ARG* a
   else
      reg_sampler_code = src[1] & D3DSP_REGNUM_MASK;
 
+  if(!This->wineD3DDevice->stateBlock->textures[reg_sampler_code]) {
+      FIXME("No texture bound to stage used by the shader\n");
+      tex_type = "2D";
+  } else {
+      switch(IWineD3DBaseTexture_GetTextureDimensions(This->wineD3DDevice->stateBlock->textures[reg_sampler_code])) {
+          case GL_TEXTURE_1D:
+              tex_type = "1D";
+              break;
+
+          case GL_TEXTURE_2D:
+              tex_type = "2D";
+              break;
+
+          case GL_TEXTURE_3D:
+              tex_type = "3D";
+              break;
+
+          case GLTEXTURECUBEMAP:
+              tex_type = "CUBE";
+              break;
+
+          default:
+              ERR("Unexpected texture type %d\n", IWineD3DBaseTexture_GetTextureDimensions(This->wineD3DDevice->stateBlock->textures[reg_sampler_code]));
+              tex_type = "2D";
+      }
+  }
+
   if(This->wineD3DDevice->stateBlock->textureState[reg_sampler_code][D3DTSS_TEXTURETRANSFORMFLAGS] & D3DTTFF_PROJECTED) {
-      shader_addline(buffer, "TXP %s, %s, texture[%lu], 2D;\n",
-          reg_dest, reg_coord, reg_sampler_code);
+      shader_addline(buffer, "TXP %s, %s, texture[%lu], %s;\n",
+          reg_dest, reg_coord, reg_sampler_code, tex_type);
   } else {
-      shader_addline(buffer, "TEX %s, %s, texture[%lu], 2D;\n",
-                     reg_dest, reg_coord, reg_sampler_code);
+      shader_addline(buffer, "TEX %s, %s, texture[%lu], %s;\n",
+                     reg_dest, reg_coord, reg_sampler_code, tex_type);
   }
 }
 
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 257b9e5..50b58f3 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -379,7 +379,38 @@ 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] & WINED3DSP_TEXTURETYPE_MASK;
+            DWORD stype;
+            if (pshader && This->baseShader.hex_version < D3DPS_VERSION(2,0)) {
+                IWineD3DPixelShaderImpl *pshaderImpl = (IWineD3DPixelShaderImpl *) This;
+                if(!pshaderImpl->wineD3DDevice->stateBlock->textures[i]) {
+                    FIXME("No texture bound to stage %d used for shader\n", i);
+                    stype = WINED3DSTT_2D;
+                } else {
+                    switch(IWineD3DBaseTexture_GetTextureDimensions(pshaderImpl->wineD3DDevice->stateBlock->textures[i])) {
+                        case GL_TEXTURE_1D:
+                            stype = WINED3DSTT_1D;
+                            break;
+
+                        case GL_TEXTURE_2D:
+                            stype = WINED3DSTT_2D;
+                            break;
+
+                        case GL_TEXTURE_3D:
+                            stype = WINED3DSTT_VOLUME;
+                            break;
+
+                        case GLTEXTURECUBEMAP:
+                            stype = WINED3DSTT_CUBE;
+                            break;
+
+                        default:
+                            stype = WINED3DSTT_2D;
+                            ERR("Unexpected texture type %d\n", IWineD3DBaseTexture_GetTextureDimensions(pshaderImpl->wineD3DDevice->stateBlock->textures[i]));
+                    }
+                }
+            } else {
+                stype = reg_maps->samplers[i] & WINED3DSP_TEXTURETYPE_MASK;
+            }
             switch (stype) {
 
                 case WINED3DSTT_1D:
@@ -1370,16 +1401,45 @@ void pshader_glsl_tex(SHADER_OPCODE_ARG*
     if (hex_version < D3DPS_VERSION(2,0)) {
         sprintf(sampler_str, "Psampler%lu", reg_dest_code); 
         sampler_code = reg_dest_code;
-    }       
+        if(!This->wineD3DDevice->stateBlock->textures[sampler_code]) {
+            FIXME("No texture bound to stage used by the shader\n");
+            sampler_type = WINED3DSTT_2D;
+        } else {
+            switch(IWineD3DBaseTexture_GetTextureDimensions(This->wineD3DDevice->stateBlock->textures[sampler_code])) {
+                case GL_TEXTURE_1D:
+                    sampler_type = WINED3DSTT_1D;
+                    break;
+
+                case GL_TEXTURE_2D:
+                    sampler_type = WINED3DSTT_2D;
+                    break;
+
+                case GL_TEXTURE_3D:
+                    sampler_type = WINED3DSTT_VOLUME;
+                    break;
+
+                case GLTEXTURECUBEMAP:
+                    sampler_type = WINED3DSTT_CUBE;
+                    break;
+
+                default:
+                    sampler_type = WINED3DSTT_2D;
+                    ERR("Unexpected texture type %d\n", IWineD3DBaseTexture_GetTextureDimensions(This->wineD3DDevice->stateBlock->textures[sampler_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] & D3DSP_REGNUM_MASK;
-    }         
+        sampler_type = arg->reg_maps->samplers[sampler_code] & WINED3DSP_TEXTURETYPE_MASK;
+    }
 
-    sampler_type = arg->reg_maps->samplers[sampler_code] & WINED3DSP_TEXTURETYPE_MASK;
     if(This->wineD3DDevice->stateBlock->textureState[sampler_code][D3DTSS_TEXTURETRANSFORMFLAGS] & D3DTTFF_PROJECTED) {
         switch(sampler_type) {
 
+            case WINED3DSTT_1D:
+                shader_addline(buffer, "%s = texture1DProj(%s, %s);\n", dst_str, sampler_str, coord_reg);
+                break;
             case WINED3DSTT_2D:
                 shader_addline(buffer, "%s = texture2DProj(%s, %s);\n", dst_str, sampler_str, coord_reg);
                 break;
@@ -1397,6 +1457,9 @@ void pshader_glsl_tex(SHADER_OPCODE_ARG*
     } else {
         switch(sampler_type) {
 
+            case WINED3DSTT_1D:
+                shader_addline(buffer, "%s = texture1D(%s, %s.s);\n", dst_str, sampler_str, coord_reg);
+                break;
             case WINED3DSTT_2D:
                 shader_addline(buffer, "%s = texture2D(%s, %s.st);\n", dst_str, sampler_str, coord_reg);
                 break;
-- 
1.2.4



More information about the wine-patches mailing list