[PATCH] WineD3D: Handle projected textures properly in arbfp =

Stefan Doesinger stefan at codeweavers.com
Sat Aug 23 15:41:51 CDT 2008


and atifs=0A=
=0A=
GL_ARB_fragment_program and GL_ATI_fragment_shader can disable=0A=
projected textures properly, and they can also handle=0A=
D3DTTFF_PROJECTED | D3DTTFF_COUNT3 properly.=0A=
---=0A=
 dlls/wined3d/arb_program_shader.c    |   24 ++++++++++---=0A=
 dlls/wined3d/ati_fragment_shader.c   |   32 ++++++++++++------=0A=
 dlls/wined3d/glsl_shader.c           |    5 ++-=0A=
 dlls/wined3d/nvidia_texture_shader.c |    6 ++-=0A=
 dlls/wined3d/state.c                 |    7 +++-=0A=
 dlls/wined3d/utils.c                 |   59 =
++++++++++++++++++---------------=0A=
 dlls/wined3d/wined3d_private.h       |    3 +-=0A=
 7 files changed, 86 insertions(+), 50 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/arb_program_shader.c =
b/dlls/wined3d/arb_program_shader.c=0A=
index 616c12e..2f18ddc 100644=0A=
--- a/dlls/wined3d/arb_program_shader.c=0A=
+++ b/dlls/wined3d/arb_program_shader.c=0A=
@@ -2066,7 +2066,8 @@ static void =
shader_arb_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFF=0A=
     IWineD3DVertexShaderImpl *This =3D (IWineD3DVertexShaderImpl =
*)iface;=0A=
     shader_reg_maps* reg_maps =3D &This->baseShader.reg_maps;=0A=
     CONST DWORD *function =3D This->baseShader.function;=0A=
-    WineD3D_GL_Info *gl_info =3D &((IWineD3DDeviceImpl =
*)This->baseShader.device)->adapter->gl_info;=0A=
+    IWineD3DDeviceImpl *device =3D (IWineD3DDeviceImpl =
*)This->baseShader.device;=0A=
+    WineD3D_GL_Info *gl_info =3D &device->adapter->gl_info;=0A=
     local_constant* lconst;=0A=
 =0A=
     /*  Create the hw ARB shader */=0A=
@@ -2100,7 +2101,7 @@ static void =
shader_arb_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFF=0A=
     if(!GL_SUPPORT(NV_VERTEX_PROGRAM)) {=0A=
         shader_addline(buffer, "MOV result.color.secondary, =
-helper_const.wwwy;\n");=0A=
 =0A=
-        if((GLINFO_LOCATION).set_texcoord_w) {=0A=
+        if((GLINFO_LOCATION).set_texcoord_w && =
!device->frag_pipe->ffp_proj_control) {=0A=
             int i;=0A=
             for(i =3D 0; i < min(8, MAX_REG_TEXCRD); i++) {=0A=
                 if(This->baseShader.reg_maps.texcoord_mask[i] !=3D 0 &&=0A=
@@ -2746,11 +2747,12 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=0A=
 =0A=
         if(settings->op[stage].projected =3D=3D proj_none) {=0A=
             instr =3D "TEX";=0A=
-        } else if(settings->op[stage].projected =3D=3D proj_count4) {=0A=
+        } else if(settings->op[stage].projected =3D=3D proj_count4 ||=0A=
+                  settings->op[stage].projected =3D=3D proj_count3) {=0A=
             instr =3D "TXP";=0A=
         } else {=0A=
+            FIXME("Unexpected projection mode %d\n", =
settings->op[stage].projected);=0A=
             instr =3D "TXP";=0A=
-            ERR("Implement proj_count3\n");=0A=
         }=0A=
 =0A=
         if(stage > 0 &&=0A=
@@ -2768,7 +2770,11 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=0A=
                 /* Note: Currently always divide by .a because the =
vertex pipeline moves the correct value=0A=
                  * into the 4th component=0A=
                  */=0A=
-                shader_addline(&buffer, "RCP arg1.a, =
fragment.texcoord[%u].a;\n", stage);=0A=
+                if(settings->op[stage].projected =3D=3D proj_count4) {=0A=
+                    shader_addline(&buffer, "RCP arg1.a, =
fragment.texcoord[%u].a;\n", stage);=0A=
+                } else {=0A=
+                    shader_addline(&buffer, "RCP arg1.a, =
fragment.texcoord[%u].b;\n", stage);=0A=
+                }=0A=
                 shader_addline(&buffer, "MUL arg1.rg, =
fragment.texcoord[%u], arg1.a;\n", stage);=0A=
                 shader_addline(&buffer, "ADD ret, ret, arg1;\n");=0A=
             } else {=0A=
@@ -2782,6 +2788,11 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=0A=
                                stage - 1, stage - 1, stage - 1);=0A=
                 shader_addline(&buffer, "MUL tex%u, tex%u, ret.r;\n", =
stage, stage);=0A=
             }=0A=
+        } else if(settings->op[stage].projected =3D=3D proj_count3) {=0A=
+            shader_addline(&buffer, "MOV ret, =
fragment.texcoord[%u];\n", stage);=0A=
+            shader_addline(&buffer, "MOV ret.a, ret.b;\n");=0A=
+            shader_addline(&buffer, "%s%s tex%u, ret, texture[%u], =
%s;\n",=0A=
+                            instr, sat, stage, stage, textype);=0A=
         } else {=0A=
             shader_addline(&buffer, "%s%s tex%u, fragment.texcoord[%u], =
texture[%u], %s;\n",=0A=
                             instr, sat, stage, stage, stage, textype);=0A=
@@ -3122,7 +3133,8 @@ const struct fragment_pipeline =
arbfp_fragment_pipeline =3D {=0A=
     arbfp_alloc,=0A=
     arbfp_free,=0A=
     shader_arb_conv_supported,=0A=
-    arbfp_fragmentstate_template=0A=
+    arbfp_fragmentstate_template,=0A=
+    TRUE /* We can disable projected textures */=0A=
 };=0A=
 =0A=
 #define GLINFO_LOCATION device->adapter->gl_info=0A=
diff --git a/dlls/wined3d/ati_fragment_shader.c =
b/dlls/wined3d/ati_fragment_shader.c=0A=
index 7707a2a..97875c7 100644=0A=
--- a/dlls/wined3d/ati_fragment_shader.c=0A=
+++ b/dlls/wined3d/ati_fragment_shader.c=0A=
@@ -314,8 +314,10 @@ static GLuint gen_ati_shader(struct =
texture_stage_op op[MAX_TEXTURES], WineD3D_G=0A=
                    GL_SWIZZLE_STR_ATI));=0A=
         if(op[stage + 1].projected =3D=3D proj_none) {=0A=
             swizzle =3D GL_SWIZZLE_STR_ATI;=0A=
-        } else {=0A=
+        } else if(op[stage + 1].projected =3D=3D proj_count4) {=0A=
             swizzle =3D GL_SWIZZLE_STQ_DQ_ATI;=0A=
+        } else {=0A=
+            swizzle =3D GL_SWIZZLE_STR_DR_ATI;=0A=
         }=0A=
         TRACE("glPassTexCoordATI(GL_REG_%d_ATI, GL_TEXTURE_%d_ARB, =
%s)\n",=0A=
               stage + 1, stage + 1, debug_swizzle(swizzle));=0A=
@@ -382,15 +384,7 @@ static GLuint gen_ati_shader(struct =
texture_stage_op op[MAX_TEXTURES], WineD3D_G=0A=
         if(op[stage].projected =3D=3D proj_none) {=0A=
             swizzle =3D GL_SWIZZLE_STR_ATI;=0A=
         } else if(op[stage].projected =3D=3D proj_count3) {=0A=
-            /* TODO: D3DTTFF_COUNT3 | D3DTTFF_PROJECTED would be =
GL_SWIZZLE_STR_DR_ATI.=0A=
-             * However, the FFP vertex processing texture transform =
matrix handler does=0A=
-             * some transformations in the texture matrix which makes =
the 3rd coordinate=0A=
-             * arrive in Q, not R in that case. This is needed for =
opengl fixed function=0A=
-             * fragment processing which always divides by Q. In this =
backend we can=0A=
-             * handle that properly and be compatible with vertex =
shader output and avoid=0A=
-             * side effects of the texture matrix games=0A=
-             */=0A=
-            swizzle =3D GL_SWIZZLE_STQ_DQ_ATI;=0A=
+            swizzle =3D GL_SWIZZLE_STR_DR_ATI;=0A=
         } else {=0A=
             swizzle =3D GL_SWIZZLE_STQ_DQ_ATI;=0A=
         }=0A=
@@ -875,6 +869,13 @@ static void set_bumpmat(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3D=0A=
     =
GL_EXTCALL(glSetFragmentShaderConstantATI(ATI_FFP_CONST_BUMPMAT(stage), =
(float *) mat));=0A=
     =
checkGLcall("glSetFragmentShaderConstantATI(ATI_FFP_CONST_BUMPMAT(stage),=
 mat)");=0A=
 }=0A=
+=0A=
+static void textransform(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
+    if(!isStateDirty(context, STATE_PIXELSHADER)) {=0A=
+        set_tex_op_atifs(state, stateblock, context);=0A=
+    }=0A=
+}=0A=
+=0A=
 #undef GLINFO_LOCATION=0A=
 =0A=
 static const struct StateEntryTemplate atifs_fragmentstate_template[] =
=3D {=0A=
@@ -991,6 +992,14 @@ static const struct StateEntryTemplate =
atifs_fragmentstate_template[] =3D {=0A=
     { STATE_SAMPLER(5),                                   { =
STATE_SAMPLER(5),                                   sampler_texdim       =
   }, 0                               },=0A=
     { STATE_SAMPLER(6),                                   { =
STATE_SAMPLER(6),                                   sampler_texdim       =
   }, 0                               },=0A=
     { STATE_SAMPLER(7),                                   { =
STATE_SAMPLER(7),                                   sampler_texdim       =
   }, 0                               },=0A=
+    =
{STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTA=
GE(0, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform      }, 0          =
                     },=0A=
+    =
{STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTA=
GE(1, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform      }, 0          =
                     },=0A=
+    =
{STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTA=
GE(2, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform      }, 0          =
                     },=0A=
+    =
{STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTA=
GE(3, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform      }, 0          =
                     },=0A=
+    =
{STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTA=
GE(4, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform      }, 0          =
                     },=0A=
+    =
{STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTA=
GE(5, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform      }, 0          =
                     },=0A=
+    =
{STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTA=
GE(6, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform      }, 0          =
                     },=0A=
+    =
{STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTA=
GE(7, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform      }, 0          =
                     },=0A=
     {0 /* Terminate */,                                   { 0,          =
                                        0                       }, 0     =
                          },=0A=
 };=0A=
 =0A=
@@ -1107,5 +1116,6 @@ const struct fragment_pipeline =
atifs_fragment_pipeline =3D {=0A=
     atifs_alloc,=0A=
     atifs_free,=0A=
     atifs_conv_supported,=0A=
-    atifs_fragmentstate_template=0A=
+    atifs_fragmentstate_template,=0A=
+    TRUE /* We can disable projected textures */=0A=
 };=0A=
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c=0A=
index ee38ffc..e89dbf3 100644=0A=
--- a/dlls/wined3d/glsl_shader.c=0A=
+++ b/dlls/wined3d/glsl_shader.c=0A=
@@ -3008,6 +3008,7 @@ static GLhandleARB =
generate_param_reorder_function(IWineD3DVertexShader *vertexs=0A=
     GLhandleARB ret =3D 0;=0A=
     IWineD3DVertexShaderImpl *vs =3D (IWineD3DVertexShaderImpl *) =
vertexshader;=0A=
     IWineD3DPixelShaderImpl *ps =3D (IWineD3DPixelShaderImpl *) =
pixelshader;=0A=
+    IWineD3DDeviceImpl *device;=0A=
     DWORD vs_major =3D vs ? =
WINED3DSHADER_VERSION_MAJOR(vs->baseShader.hex_version) : 0;=0A=
     DWORD ps_major =3D ps ? =
WINED3DSHADER_VERSION_MAJOR(ps->baseShader.hex_version) : 0;=0A=
     unsigned int i;=0A=
@@ -3029,7 +3030,9 @@ static GLhandleARB =
generate_param_reorder_function(IWineD3DVertexShader *vertexs=0A=
         /* That one is easy: The vertex shader writes to the builtin =
varyings, the pixel shader reads from them.=0A=
          * Take care about the texcoord .w fixup though if we're using =
the fixed function fragment pipeline=0A=
          */=0A=
-        if((GLINFO_LOCATION).set_texcoord_w && ps_major =3D=3D 0 && =
vs_major > 0) {=0A=
+        device =3D (IWineD3DDeviceImpl *) vs->baseShader.device;=0A=
+        if((GLINFO_LOCATION).set_texcoord_w && ps_major =3D=3D 0 && =
vs_major > 0 &&=0A=
+            !device->frag_pipe->ffp_proj_control) {=0A=
             shader_addline(&buffer, "void order_ps_input() {\n");=0A=
             for(i =3D 0; i < min(8, MAX_REG_TEXCRD); i++) {=0A=
                 if(vs->baseShader.reg_maps.texcoord_mask[i] !=3D 0 &&=0A=
diff --git a/dlls/wined3d/nvidia_texture_shader.c =
b/dlls/wined3d/nvidia_texture_shader.c=0A=
index 5f36668..ca21ba0 100644=0A=
--- a/dlls/wined3d/nvidia_texture_shader.c=0A=
+++ b/dlls/wined3d/nvidia_texture_shader.c=0A=
@@ -810,7 +810,8 @@ const struct fragment_pipeline =
nvts_fragment_pipeline =3D {=0A=
     nvrc_fragment_alloc,=0A=
     nvrc_fragment_free,=0A=
     nvts_conv_supported,=0A=
-    nvrc_fragmentstate_template=0A=
+    nvrc_fragmentstate_template,=0A=
+    FALSE /* we cannot disable projected textures. The vertex pipe has =
to do it */=0A=
 };=0A=
 =0A=
 const struct fragment_pipeline nvrc_fragment_pipeline =3D {=0A=
@@ -819,5 +820,6 @@ const struct fragment_pipeline =
nvrc_fragment_pipeline =3D {=0A=
     nvrc_fragment_alloc,=0A=
     nvrc_fragment_free,=0A=
     nvts_conv_supported,=0A=
-    nvrc_fragmentstate_template=0A=
+    nvrc_fragmentstate_template,=0A=
+    FALSE /* we cannot disable projected textures. The vertex pipe has =
to do it */=0A=
 };=0A=
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c=0A=
index c53f398..d97df5a 100644=0A=
--- a/dlls/wined3d/state.c=0A=
+++ b/dlls/wined3d/state.c=0A=
@@ -1,3 +1,4 @@=0A=
+=0A=
 /*=0A=
  * Direct3D state management=0A=
  *=0A=
@@ -3139,7 +3140,8 @@ static void transform_texture(DWORD state, =
IWineD3DStateBlockImpl *stateblock, W=0A=
                         context->last_was_rhw,=0A=
                         =
stateblock->wineD3DDevice->strided_streams.u.s.texCoords[coordIdx].dwStri=
de ?=0A=
                             =
stateblock->wineD3DDevice->strided_streams.u.s.texCoords[coordIdx].dwType=
:=0A=
-                            WINED3DDECLTYPE_UNUSED);=0A=
+                            WINED3DDECLTYPE_UNUSED,=0A=
+                        =
stateblock->wineD3DDevice->frag_pipe->ffp_proj_control);=0A=
 =0A=
     /* The sampler applying function calls us if this changes */=0A=
     if(context->lastWasPow2Texture[texUnit] && =
stateblock->textures[texUnit]) {=0A=
@@ -5565,7 +5567,8 @@ const struct fragment_pipeline =
ffp_fragment_pipeline =3D {=0A=
     ffp_fragment_alloc,=0A=
     ffp_fragment_free,=0A=
     ffp_conv_supported,=0A=
-    ffp_fragmentstate_template=0A=
+    ffp_fragmentstate_template,=0A=
+    FALSE /* we cannot disable projected textures. The vertex pipe has =
to do it */=0A=
 };=0A=
 =0A=
 static int num_handlers(APPLYSTATEFUNC *funcs) {=0A=
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c=0A=
index c0e1ccf..a577e28 100644=0A=
--- a/dlls/wined3d/utils.c=0A=
+++ b/dlls/wined3d/utils.c=0A=
@@ -1166,7 +1166,8 @@ BOOL is_invalid_op(IWineD3DDeviceImpl *This, int =
stage, WINED3DTEXTUREOP op, DWO=0A=
 }=0A=
 =0A=
 /* Setup this textures matrix according to the texture flags*/=0A=
-void set_texture_matrix(const float *smat, DWORD flags, BOOL =
calculatedCoords, BOOL transformed, DWORD coordtype)=0A=
+void set_texture_matrix(const float *smat, DWORD flags, BOOL =
calculatedCoords, BOOL transformed, DWORD coordtype,=0A=
+                        BOOL ffp_proj_control)=0A=
 {=0A=
     float mat[16];=0A=
 =0A=
@@ -1187,15 +1188,17 @@ void set_texture_matrix(const float *smat, DWORD =
flags, BOOL calculatedCoords, B=0A=
     memcpy(mat, smat, 16 * sizeof(float));=0A=
 =0A=
     if (flags & WINED3DTTFF_PROJECTED) {=0A=
-        switch (flags & ~WINED3DTTFF_PROJECTED) {=0A=
-        case WINED3DTTFF_COUNT2:=0A=
-            mat[3] =3D mat[1], mat[7] =3D mat[5], mat[11] =3D mat[9], =
mat[15] =3D mat[13];=0A=
-            mat[1] =3D mat[5] =3D mat[9] =3D mat[13] =3D 0;=0A=
-            break;=0A=
-        case WINED3DTTFF_COUNT3:=0A=
-            mat[3] =3D mat[2], mat[7] =3D mat[6], mat[11] =3D mat[10], =
mat[15] =3D mat[14];=0A=
-            mat[2] =3D mat[6] =3D mat[10] =3D mat[14] =3D 0;=0A=
-            break;=0A=
+        if(!ffp_proj_control) {=0A=
+            switch (flags & ~WINED3DTTFF_PROJECTED) {=0A=
+            case WINED3DTTFF_COUNT2:=0A=
+                mat[3] =3D mat[1], mat[7] =3D mat[5], mat[11] =3D =
mat[9], mat[15] =3D mat[13];=0A=
+                mat[1] =3D mat[5] =3D mat[9] =3D mat[13] =3D 0;=0A=
+                break;=0A=
+            case WINED3DTTFF_COUNT3:=0A=
+                mat[3] =3D mat[2], mat[7] =3D mat[6], mat[11] =3D =
mat[10], mat[15] =3D mat[14];=0A=
+                mat[2] =3D mat[6] =3D mat[10] =3D mat[14] =3D 0;=0A=
+                break;=0A=
+            }=0A=
         }=0A=
     } else { /* under directx the R/Z coord can be used for =
translation, under opengl we use the Q coord instead */=0A=
         if(!calculatedCoords) {=0A=
@@ -1231,23 +1234,25 @@ void set_texture_matrix(const float *smat, DWORD =
flags, BOOL calculatedCoords, B=0A=
                     FIXME("Unexpected fixed function texture coord =
input\n");=0A=
             }=0A=
         }=0A=
-        switch (flags & ~WINED3DTTFF_PROJECTED) {=0A=
-            /* case WINED3DTTFF_COUNT1: Won't ever get here */=0A=
-            case WINED3DTTFF_COUNT2: mat[2] =3D mat[6] =3D mat[10] =3D =
mat[14] =3D 0;=0A=
-            /* OpenGL divides the first 3 vertex coord by the 4th by =
default,=0A=
-             * which is essentially the same as D3DTTFF_PROJECTED. Make =
sure that=0A=
-             * the 4th coord evaluates to 1.0 to eliminate that.=0A=
-             *=0A=
-             * If the fixed function pipeline is used, the 4th value =
remains unused,=0A=
-             * so there is no danger in doing this. With vertex shaders =
we have a=0A=
-             * problem. Should an app hit that problem, the code here =
would have to=0A=
-             * check for pixel shaders, and the shader has to undo the =
default gl divide.=0A=
-             *=0A=
-             * A more serious problem occurs if the app passes 4 =
coordinates in, and the=0A=
-             * 4th is !=3D 1.0(opengl default). This would have to be =
fixed in drawStridedSlow=0A=
-             * or a replacement shader=0A=
-             */=0A=
-            default: mat[3] =3D mat[7] =3D mat[11] =3D 0; mat[15] =3D 1;=0A=
+        if(!ffp_proj_control) {=0A=
+            switch (flags & ~WINED3DTTFF_PROJECTED) {=0A=
+                /* case WINED3DTTFF_COUNT1: Won't ever get here */=0A=
+                case WINED3DTTFF_COUNT2: mat[2] =3D mat[6] =3D mat[10] =
=3D mat[14] =3D 0;=0A=
+                /* OpenGL divides the first 3 vertex coord by the 4th =
by default,=0A=
+                * which is essentially the same as D3DTTFF_PROJECTED. =
Make sure that=0A=
+                * the 4th coord evaluates to 1.0 to eliminate that.=0A=
+                *=0A=
+                * If the fixed function pipeline is used, the 4th value =
remains unused,=0A=
+                * so there is no danger in doing this. With vertex =
shaders we have a=0A=
+                * problem. Should an app hit that problem, the code =
here would have to=0A=
+                * check for pixel shaders, and the shader has to undo =
the default gl divide.=0A=
+                *=0A=
+                * A more serious problem occurs if the app passes 4 =
coordinates in, and the=0A=
+                * 4th is !=3D 1.0(opengl default). This would have to =
be fixed in drawStridedSlow=0A=
+                * or a replacement shader=0A=
+                */=0A=
+                default: mat[3] =3D mat[7] =3D mat[11] =3D 0; mat[15] =
=3D 1;=0A=
+            }=0A=
         }=0A=
     }=0A=
 =0A=
diff --git a/dlls/wined3d/wined3d_private.h =
b/dlls/wined3d/wined3d_private.h=0A=
index 72e9aee..897e654 100644=0A=
--- a/dlls/wined3d/wined3d_private.h=0A=
+++ b/dlls/wined3d/wined3d_private.h=0A=
@@ -559,6 +559,7 @@ struct fragment_pipeline {=0A=
     void (*free_private)(IWineD3DDevice *iface);=0A=
     BOOL (*conv_supported)(WINED3DFORMAT conv);=0A=
     const struct StateEntryTemplate *states;=0A=
+    BOOL ffp_proj_control;=0A=
 };=0A=
 =0A=
 extern const struct StateEntryTemplate misc_state_template[];=0A=
@@ -1816,7 +1817,7 @@ GLenum StencilOp(DWORD op);=0A=
 GLenum CompareFunc(DWORD func);=0A=
 BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, =
WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3);=0A=
 void   set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, =
WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT =
texture_idx, DWORD dst);=0A=
-void   set_texture_matrix(const float *smat, DWORD flags, BOOL =
calculatedCoords, BOOL transformed, DWORD coordtype);=0A=
+void   set_texture_matrix(const float *smat, DWORD flags, BOOL =
calculatedCoords, BOOL transformed, DWORD coordtype, BOOL =
ffp_can_disable_proj);=0A=
 void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context);=0A=
 void sampler_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, =
WineD3DContext *context);=0A=
 void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, =
WineD3DContext *context);=0A=
-- =0A=
1.5.6.4=0A=
=0A=

------=_NextPart_000_0017_01C90844.788BB570--




More information about the wine-patches mailing list