Henri Verbeet : wined3d: Handle projected cube textures.

Alexandre Julliard julliard at winehq.org
Wed Oct 29 09:39:16 CDT 2008


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

Author: Henri Verbeet <hverbeet at gmail.com>
Date:   Tue Oct 28 21:25:06 2008 +0100

wined3d: Handle projected cube textures.

---

 dlls/wined3d/glsl_shader.c |   18 ++++++++++--------
 1 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index c43cdc3..fc57329 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -2213,13 +2213,18 @@ static void pshader_glsl_tex(SHADER_OPCODE_ARG* arg) {
 
     /* 1.0-1.4: Use destination register as sampler source.
      * 2.0+: Use provided sampler source. */
-    if (hex_version < WINED3DPS_VERSION(1,4)) {
-        DWORD flags;
-
+    if (hex_version < WINED3DPS_VERSION(2,0)) {
         sampler_idx = arg->dst & WINED3DSP_REGNUM_MASK;
-        flags = deviceImpl->stateBlock->textureState[sampler_idx][WINED3DTSS_TEXTURETRANSFORMFLAGS];
+    } else {
+        sampler_idx = arg->src[1] & WINED3DSP_REGNUM_MASK;
+    }
+    sampler_type = arg->reg_maps->samplers[sampler_idx] & WINED3DSP_TEXTURETYPE_MASK;
+
+    if (hex_version < WINED3DPS_VERSION(1,4)) {
+        DWORD flags = deviceImpl->stateBlock->textureState[sampler_idx][WINED3DTSS_TEXTURETRANSFORMFLAGS];
 
-        if (flags & WINED3DTTFF_PROJECTED) {
+        /* Projected cube textures don't make a lot of sense, the resulting coordinates stay the same. */
+        if (flags & WINED3DTTFF_PROJECTED && sampler_type != WINED3DSTT_CUBE) {
             projected = TRUE;
             switch (flags & ~WINED3DTTFF_PROJECTED) {
                 case WINED3DTTFF_COUNT1: FIXME("WINED3DTTFF_PROJECTED with WINED3DTTFF_COUNT1?\n"); break;
@@ -2233,7 +2238,6 @@ static void pshader_glsl_tex(SHADER_OPCODE_ARG* arg) {
         }
     } else if (hex_version < WINED3DPS_VERSION(2,0)) {
         DWORD src_mod = arg->src[0] & WINED3DSP_SRCMOD_MASK;
-        sampler_idx = arg->dst & WINED3DSP_REGNUM_MASK;
 
         if (src_mod == WINED3DSPSM_DZ) {
             projected = TRUE;
@@ -2245,7 +2249,6 @@ static void pshader_glsl_tex(SHADER_OPCODE_ARG* arg) {
             projected = FALSE;
         }
     } else {
-        sampler_idx = arg->src[1] & WINED3DSP_REGNUM_MASK;
         if(arg->opcode_token & WINED3DSI_TEXLD_PROJECT) {
                 /* ps 2.0 texldp instruction always divides by the fourth component. */
                 projected = TRUE;
@@ -2260,7 +2263,6 @@ static void pshader_glsl_tex(SHADER_OPCODE_ARG* arg) {
         texrect = TRUE;
     }
 
-    sampler_type = arg->reg_maps->samplers[sampler_idx] & WINED3DSP_TEXTURETYPE_MASK;
     shader_glsl_get_sample_function(sampler_type, projected, texrect, &sample_function);
     mask |= sample_function.coord_mask;
 




More information about the wine-cvs mailing list