[PATCH] WineD3D: Set ffp caps in the ffp backend, not the =

Stefan Doesinger stefan at codeweavers.com
Thu Jul 3 14:36:18 CDT 2008


shader backend=0A=
=0A=
---=0A=
 dlls/wined3d/ati_fragment_shader.c |   96 =
++++++++++++++++++------------------=0A=
 dlls/wined3d/baseshader.c          |   68 -------------------------=0A=
 dlls/wined3d/directx.c             |   15 ++++--=0A=
 dlls/wined3d/glsl_shader.c         |    5 --=0A=
 dlls/wined3d/state.c               |   72 +++++++++++++++++++++++++++=0A=
 dlls/wined3d/wined3d_private.h     |   15 +++--=0A=
 6 files changed, 140 insertions(+), 131 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/ati_fragment_shader.c =
b/dlls/wined3d/ati_fragment_shader.c=0A=
index 10a56a3..e4420f1 100644=0A=
--- a/dlls/wined3d/ati_fragment_shader.c=0A=
+++ b/dlls/wined3d/ati_fragment_shader.c=0A=
@@ -972,8 +972,56 @@ static void atifs_enable(IWineD3DDevice *iface, =
BOOL enable) {=0A=
     }=0A=
 }=0A=
 =0A=
+static void atifs_get_caps(WINED3DDEVTYPE devtype, WineD3D_GL_Info =
*gl_info, struct fragment_caps *caps) {=0A=
+    caps->TextureOpCaps =3D  WINED3DTEXOPCAPS_DISABLE                   =
  |=0A=
+                           WINED3DTEXOPCAPS_SELECTARG1                  =
|=0A=
+                           WINED3DTEXOPCAPS_SELECTARG2                  =
|=0A=
+                           WINED3DTEXOPCAPS_MODULATE4X                  =
|=0A=
+                           WINED3DTEXOPCAPS_MODULATE2X                  =
|=0A=
+                           WINED3DTEXOPCAPS_MODULATE                    =
|=0A=
+                           WINED3DTEXOPCAPS_ADDSIGNED2X                 =
|=0A=
+                           WINED3DTEXOPCAPS_ADDSIGNED                   =
|=0A=
+                           WINED3DTEXOPCAPS_ADD                         =
|=0A=
+                           WINED3DTEXOPCAPS_SUBTRACT                    =
|=0A=
+                           WINED3DTEXOPCAPS_ADDSMOOTH                   =
|=0A=
+                           WINED3DTEXOPCAPS_BLENDCURRENTALPHA           =
|=0A=
+                           WINED3DTEXOPCAPS_BLENDFACTORALPHA            =
|=0A=
+                           WINED3DTEXOPCAPS_BLENDTEXTUREALPHA           =
|=0A=
+                           WINED3DTEXOPCAPS_BLENDDIFFUSEALPHA           =
|=0A=
+                           WINED3DTEXOPCAPS_BLENDTEXTUREALPHAPM         =
|=0A=
+                           WINED3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR      =
|=0A=
+                           WINED3DTEXOPCAPS_MODULATECOLOR_ADDALPHA      =
|=0A=
+                           WINED3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA   =
|=0A=
+                           WINED3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR   =
|=0A=
+                           WINED3DTEXOPCAPS_DOTPRODUCT3                 =
|=0A=
+                           WINED3DTEXOPCAPS_MULTIPLYADD                 =
|=0A=
+                           WINED3DTEXOPCAPS_LERP                        =
|=0A=
+                           WINED3DTEXOPCAPS_BUMPENVMAP;=0A=
+=0A=
+    /* TODO: Implement WINED3DTEXOPCAPS_BUMPENVMAPLUMINANCE=0A=
+    and WINED3DTEXOPCAPS_PREMODULATE */=0A=
+=0A=
+    /* GL_ATI_fragment_shader always supports 6 textures, which was the =
limit on r200 cards=0A=
+     * which this extension is exclusively focused on(later cards have =
GL_ARB_fragment_program).=0A=
+     * If the current card has more than 8 fixed function textures in =
OpenGL's regular fixed=0A=
+     * function pipeline then the ATI_fragment_shader backend imposes a =
stricter limit. This=0A=
+     * shouldn't be too hard since Nvidia cards have a limit of 4 =
textures with the default ffp=0A=
+     * pipeline, and almost all games are happy with that. We can =
however support up to 8=0A=
+     * texture stages because we have a 2nd pass limit of 8 =
instructions, and per stage we use=0A=
+     * only 1 instruction.=0A=
+     *=0A=
+     * The proper fix for this is not to use GL_ATI_fragment_shader on =
cards newer than the=0A=
+     * r200 series and use an ARB or GLSL shader instead=0A=
+     */=0A=
+    caps->MaxTextureBlendStages   =3D 8;=0A=
+    caps->MaxSimultaneousTextures =3D 6;=0A=
+=0A=
+    caps->PrimitiveMiscCaps |=3D WINED3DPMISCCAPS_TSSARGTEMP;=0A=
+}=0A=
+=0A=
 const struct fragment_pipeline atifs_fragment_pipeline =3D {=0A=
     atifs_enable,=0A=
+    atifs_get_caps,=0A=
     atifs_fragmentstate_template=0A=
 };=0A=
 =0A=
@@ -1055,54 +1103,6 @@ static BOOL =
shader_atifs_dirty_const(IWineD3DDevice *iface) {=0A=
 =0A=
 static void shader_atifs_get_caps(WINED3DDEVTYPE devtype, =
WineD3D_GL_Info *gl_info, struct shader_caps *caps) {=0A=
     arb_program_shader_backend.shader_get_caps(devtype, gl_info, caps);=0A=
-=0A=
-    caps->TextureOpCaps =3D  WINED3DTEXOPCAPS_DISABLE                   =
  |=0A=
-                           WINED3DTEXOPCAPS_SELECTARG1                  =
|=0A=
-                           WINED3DTEXOPCAPS_SELECTARG2                  =
|=0A=
-                           WINED3DTEXOPCAPS_MODULATE4X                  =
|=0A=
-                           WINED3DTEXOPCAPS_MODULATE2X                  =
|=0A=
-                           WINED3DTEXOPCAPS_MODULATE                    =
|=0A=
-                           WINED3DTEXOPCAPS_ADDSIGNED2X                 =
|=0A=
-                           WINED3DTEXOPCAPS_ADDSIGNED                   =
|=0A=
-                           WINED3DTEXOPCAPS_ADD                         =
|=0A=
-                           WINED3DTEXOPCAPS_SUBTRACT                    =
|=0A=
-                           WINED3DTEXOPCAPS_ADDSMOOTH                   =
|=0A=
-                           WINED3DTEXOPCAPS_BLENDCURRENTALPHA           =
|=0A=
-                           WINED3DTEXOPCAPS_BLENDFACTORALPHA            =
|=0A=
-                           WINED3DTEXOPCAPS_BLENDTEXTUREALPHA           =
|=0A=
-                           WINED3DTEXOPCAPS_BLENDDIFFUSEALPHA           =
|=0A=
-                           WINED3DTEXOPCAPS_BLENDTEXTUREALPHAPM         =
|=0A=
-                           WINED3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR      =
|=0A=
-                           WINED3DTEXOPCAPS_MODULATECOLOR_ADDALPHA      =
|=0A=
-                           WINED3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA   =
|=0A=
-                           WINED3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR   =
|=0A=
-                           WINED3DTEXOPCAPS_DOTPRODUCT3                 =
|=0A=
-                           WINED3DTEXOPCAPS_MULTIPLYADD                 =
|=0A=
-                           WINED3DTEXOPCAPS_LERP                        =
|=0A=
-                           WINED3DTEXOPCAPS_BUMPENVMAP;=0A=
-=0A=
-    /* TODO: Implement WINED3DTEXOPCAPS_BUMPENVMAPLUMINANCE=0A=
-    and WINED3DTEXOPCAPS_PREMODULATE */=0A=
-=0A=
-    /* GL_ATI_fragment_shader only supports up to 6 textures, which was =
the limit on r200 cards=0A=
-     * which this extension is exclusively focused on(later cards have =
GL_ARB_fragment_program).=0A=
-     * If the current card has more than 8 fixed function textures in =
OpenGL's regular fixed=0A=
-     * function pipeline then the ATI_fragment_shader backend imposes a =
stricter limit. This=0A=
-     * shouldn't be too hard since Nvidia cards have a limit of 4 =
textures with the default ffp=0A=
-     * pipeline, and almost all games are happy with that. We can =
however support up to 8=0A=
-     * texture stages because we have a 2nd pass limit of 8 =
instructions, and per stage we use=0A=
-     * only 1 instruction.=0A=
-     *=0A=
-     * The proper fix for this is not to use GL_ATI_fragment_shader on =
cards newer than the=0A=
-     * r200 series and use an ARB or GLSL shader instead=0A=
-     */=0A=
-    if(caps->MaxSimultaneousTextures > 6) {=0A=
-        WARN("OpenGL fixed function supports %d simultaneous =
textures,\n", caps->MaxSimultaneousTextures);=0A=
-        WARN("but GL_ATI_fragment_shader limits this to 6\n");=0A=
-        caps->MaxSimultaneousTextures =3D 6;=0A=
-    }=0A=
-=0A=
-    caps->PrimitiveMiscCaps |=3D WINED3DPMISCCAPS_TSSARGTEMP;=0A=
 }=0A=
 =0A=
 static void shader_atifs_generate_pshader(IWineD3DPixelShader *iface, =
SHADER_BUFFER *buffer) {=0A=
diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c=0A=
index a6231f2..57fbf62 100644=0A=
--- a/dlls/wined3d/baseshader.c=0A=
+++ b/dlls/wined3d/baseshader.c=0A=
@@ -1108,78 +1108,10 @@ static void =
shader_none_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUF=0A=
 =0A=
 #define GLINFO_LOCATION      (*gl_info)=0A=
 static void shader_none_get_caps(WINED3DDEVTYPE devtype, =
WineD3D_GL_Info *gl_info, struct shader_caps *pCaps) {=0A=
-    pCaps->TextureOpCaps =3D  WINED3DTEXOPCAPS_ADD         |=0A=
-                            WINED3DTEXOPCAPS_ADDSIGNED   |=0A=
-                            WINED3DTEXOPCAPS_ADDSIGNED2X |=0A=
-                            WINED3DTEXOPCAPS_MODULATE    |=0A=
-                            WINED3DTEXOPCAPS_MODULATE2X  |=0A=
-                            WINED3DTEXOPCAPS_MODULATE4X  |=0A=
-                            WINED3DTEXOPCAPS_SELECTARG1  |=0A=
-                            WINED3DTEXOPCAPS_SELECTARG2  |=0A=
-                            WINED3DTEXOPCAPS_DISABLE;=0A=
-=0A=
-    if (GL_SUPPORT(ARB_TEXTURE_ENV_COMBINE) ||=0A=
-        GL_SUPPORT(EXT_TEXTURE_ENV_COMBINE) ||=0A=
-        GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {=0A=
-        pCaps->TextureOpCaps |=3D WINED3DTEXOPCAPS_BLENDDIFFUSEALPHA  |=0A=
-                                WINED3DTEXOPCAPS_BLENDTEXTUREALPHA  |=0A=
-                                WINED3DTEXOPCAPS_BLENDFACTORALPHA   |=0A=
-                                WINED3DTEXOPCAPS_BLENDCURRENTALPHA  |=0A=
-                                WINED3DTEXOPCAPS_LERP               |=0A=
-                                WINED3DTEXOPCAPS_SUBTRACT;=0A=
-    }=0A=
-    if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3) ||=0A=
-        GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {=0A=
-        pCaps->TextureOpCaps |=3D WINED3DTEXOPCAPS_ADDSMOOTH            =
  |=0A=
-                                WINED3DTEXOPCAPS_MULTIPLYADD            =
|=0A=
-                                WINED3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR =
|=0A=
-                                WINED3DTEXOPCAPS_MODULATECOLOR_ADDALPHA =
|=0A=
-                                WINED3DTEXOPCAPS_BLENDTEXTUREALPHAPM;=0A=
-    }=0A=
-    if (GL_SUPPORT(ARB_TEXTURE_ENV_DOT3))=0A=
-        pCaps->TextureOpCaps |=3D WINED3DTEXOPCAPS_DOTPRODUCT3;=0A=
-=0A=
-    if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {=0A=
-        pCaps->TextureOpCaps |=3D =
WINED3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR |=0A=
-                WINED3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA;=0A=
-    }=0A=
-=0A=
-    if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) {=0A=
-        pCaps->TextureOpCaps |=3D WINED3DTEXOPCAPS_BUMPENVMAP;=0A=
-    } else if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
-        /* Bump mapping is supported already in NV_TEXTURE_SHADER, but =
that extension does=0A=
-         * not support 3D textures. This asks for trouble if an app =
uses both bump mapping=0A=
-         * and 3D textures. It also allows us to keep the code simpler =
by having texture=0A=
-         * shaders constantly enabled.=0A=
-         */=0A=
-        pCaps->TextureOpCaps |=3D WINED3DTEXOPCAPS_BUMPENVMAP;=0A=
-        /* TODO: Luminance bump map? */=0A=
-    }=0A=
-=0A=
-#if 0=0A=
-    /* FIXME: Add=0A=
-            pCaps->TextureOpCaps |=3D =
WINED3DTEXOPCAPS_BUMPENVMAPLUMINANCE=0A=
-            WINED3DTEXOPCAPS_PREMODULATE */=0A=
-#endif=0A=
-=0A=
-    pCaps->MaxTextureBlendStages   =3D GL_LIMITS(texture_stages);=0A=
-    pCaps->MaxSimultaneousTextures =3D GL_LIMITS(textures);=0A=
-=0A=
     /* Set the shader caps to 0 for the none shader backend */=0A=
     pCaps->VertexShaderVersion  =3D 0;=0A=
     pCaps->PixelShaderVersion    =3D 0;=0A=
     pCaps->PixelShader1xMaxValue =3D 0.0;=0A=
-=0A=
-    if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {=0A=
-        pCaps->PrimitiveMiscCaps |=3D  WINED3DPMISCCAPS_TSSARGTEMP;=0A=
-    }=0A=
-=0A=
-    /* The caps below can be supported but aren't handled yet in =
utils.c 'd3dta_to_combiner_input', disable them until support is fixed */=0A=
-#if 0=0A=
-    if (GL_SUPPORT(NV_REGISTER_COMBINERS2))=0A=
-    pCaps->PrimitiveMiscCaps |=3D  WINED3DPMISCCAPS_PERSTAGECONSTANT;=0A=
-#endif=0A=
-=0A=
 }=0A=
 =0A=
 #undef GLINFO_LOCATION=0A=
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c=0A=
index 1918a44..9992ee2 100644=0A=
--- a/dlls/wined3d/directx.c=0A=
+++ b/dlls/wined3d/directx.c=0A=
@@ -2913,7 +2913,9 @@ static HRESULT WINAPI =
IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,=0A=
     int vs_selected_mode;=0A=
     int ps_selected_mode;=0A=
     struct shader_caps shader_caps;=0A=
+    struct fragment_caps fragment_caps;=0A=
     const shader_backend_t *shader_backend;=0A=
+    const struct fragment_pipeline *frag_pipeline =3D NULL;=0A=
 =0A=
     TRACE_(d3d_caps)("(%p)->(Adptr:%d, DevType: %x, pCaps: %p)\n", =
This, Adapter, DeviceType, pCaps);=0A=
 =0A=
@@ -3272,8 +3274,12 @@ static HRESULT WINAPI =
IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,=0A=
     shader_backend =3D select_shader_backend(Adapter, DeviceType);=0A=
     shader_backend->shader_get_caps(DeviceType, &GLINFO_LOCATION, =
&shader_caps);=0A=
 =0A=
+    memset(&fragment_caps, 0, sizeof(fragment_caps));=0A=
+    frag_pipeline =3D select_fragment_implementation(Adapter, =
DeviceType);=0A=
+    frag_pipeline->get_caps(DeviceType, &GLINFO_LOCATION, =
&fragment_caps);=0A=
+=0A=
     /* Add shader misc caps. Only some of them belong to the shader =
parts of the pipeline */=0A=
-    pCaps->PrimitiveMiscCaps |=3D shader_caps.PrimitiveMiscCaps;=0A=
+    pCaps->PrimitiveMiscCaps |=3D fragment_caps.PrimitiveMiscCaps;=0A=
 =0A=
     /* This takes care for disabling vertex shader or pixel shader caps =
while leaving the other one enabled.=0A=
      * Ignore shader model capabilities if disabled in config=0A=
@@ -3296,9 +3302,10 @@ static HRESULT WINAPI =
IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,=0A=
         pCaps->PixelShader1xMaxValue        =3D =
shader_caps.PixelShader1xMaxValue;=0A=
     }=0A=
 =0A=
-    pCaps->TextureOpCaps                    =3D =
shader_caps.TextureOpCaps;=0A=
-    pCaps->MaxTextureBlendStages            =3D =
shader_caps.MaxTextureBlendStages;=0A=
-    pCaps->MaxSimultaneousTextures          =3D =
shader_caps.MaxSimultaneousTextures;=0A=
+    pCaps->TextureOpCaps                    =3D =
fragment_caps.TextureOpCaps;=0A=
+    pCaps->MaxTextureBlendStages            =3D =
fragment_caps.MaxTextureBlendStages;=0A=
+    pCaps->MaxSimultaneousTextures          =3D =
fragment_caps.MaxSimultaneousTextures;=0A=
+=0A=
     pCaps->VS20Caps                         =3D shader_caps.VS20Caps;=0A=
     pCaps->MaxVShaderInstructionsExecuted   =3D =
shader_caps.MaxVShaderInstructionsExecuted;=0A=
     pCaps->MaxVertexShader30InstructionSlots=3D =
shader_caps.MaxVertexShader30InstructionSlots;=0A=
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c=0A=
index 100f349..da13d1d 100644=0A=
--- a/dlls/wined3d/glsl_shader.c=0A=
+++ b/dlls/wined3d/glsl_shader.c=0A=
@@ -3649,11 +3649,6 @@ static void =
shader_glsl_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUF=0A=
 }=0A=
 =0A=
 static void shader_glsl_get_caps(WINED3DDEVTYPE devtype, =
WineD3D_GL_Info *gl_info, struct shader_caps *pCaps) {=0A=
-    /* We don't have a GLSL fixed function pipeline yet, so let the =
none backend set its caps,=0A=
-     * then overwrite the shader specific ones=0A=
-     */=0A=
-    none_shader_backend.shader_get_caps(devtype, gl_info, pCaps);=0A=
-=0A=
     /* Nvidia Geforce6/7 or Ati R4xx/R5xx cards with GLSL support, =
support VS 3.0 but older Nvidia/Ati=0A=
      * models with GLSL support only support 2.0. In case of nvidia we =
can detect VS 2.0 support using=0A=
      * vs_nv_version which is based on NV_vertex_program.=0A=
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c=0A=
index 627a88f..0ea627c 100644=0A=
--- a/dlls/wined3d/state.c=0A=
+++ b/dlls/wined3d/state.c=0A=
@@ -4463,10 +4463,82 @@ static void nvts_enable(IWineD3DDevice *iface, =
BOOL enable) {=0A=
         }=0A=
     }=0A=
 }=0A=
+=0A=
+static void ffp_fragment_get_caps(WINED3DDEVTYPE devtype, =
WineD3D_GL_Info *gl_info, struct fragment_caps *pCaps) {=0A=
+    pCaps->TextureOpCaps =3D  WINED3DTEXOPCAPS_ADD         |=0A=
+                            WINED3DTEXOPCAPS_ADDSIGNED   |=0A=
+                            WINED3DTEXOPCAPS_ADDSIGNED2X |=0A=
+                            WINED3DTEXOPCAPS_MODULATE    |=0A=
+                            WINED3DTEXOPCAPS_MODULATE2X  |=0A=
+                            WINED3DTEXOPCAPS_MODULATE4X  |=0A=
+                            WINED3DTEXOPCAPS_SELECTARG1  |=0A=
+                            WINED3DTEXOPCAPS_SELECTARG2  |=0A=
+                            WINED3DTEXOPCAPS_DISABLE;=0A=
+=0A=
+    if (GL_SUPPORT(ARB_TEXTURE_ENV_COMBINE) ||=0A=
+        GL_SUPPORT(EXT_TEXTURE_ENV_COMBINE) ||=0A=
+        GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {=0A=
+        pCaps->TextureOpCaps |=3D WINED3DTEXOPCAPS_BLENDDIFFUSEALPHA  |=0A=
+                                WINED3DTEXOPCAPS_BLENDTEXTUREALPHA  |=0A=
+                                WINED3DTEXOPCAPS_BLENDFACTORALPHA   |=0A=
+                                WINED3DTEXOPCAPS_BLENDCURRENTALPHA  |=0A=
+                                WINED3DTEXOPCAPS_LERP               |=0A=
+                                WINED3DTEXOPCAPS_SUBTRACT;=0A=
+    }=0A=
+    if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3) ||=0A=
+        GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {=0A=
+        pCaps->TextureOpCaps |=3D WINED3DTEXOPCAPS_ADDSMOOTH            =
  |=0A=
+                                WINED3DTEXOPCAPS_MULTIPLYADD            =
|=0A=
+                                WINED3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR =
|=0A=
+                                WINED3DTEXOPCAPS_MODULATECOLOR_ADDALPHA =
|=0A=
+                                WINED3DTEXOPCAPS_BLENDTEXTUREALPHAPM;=0A=
+    }=0A=
+    if (GL_SUPPORT(ARB_TEXTURE_ENV_DOT3))=0A=
+        pCaps->TextureOpCaps |=3D WINED3DTEXOPCAPS_DOTPRODUCT3;=0A=
+=0A=
+    if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {=0A=
+        pCaps->TextureOpCaps |=3D =
WINED3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR |=0A=
+                WINED3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA;=0A=
+    }=0A=
+=0A=
+    if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) {=0A=
+        pCaps->TextureOpCaps |=3D WINED3DTEXOPCAPS_BUMPENVMAP;=0A=
+    } else if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
+        /* Bump mapping is supported already in NV_TEXTURE_SHADER, but =
that extension does=0A=
+         * not support 3D textures. This asks for trouble if an app =
uses both bump mapping=0A=
+         * and 3D textures. It also allows us to keep the code simpler =
by having texture=0A=
+         * shaders constantly enabled.=0A=
+         */=0A=
+        pCaps->TextureOpCaps |=3D WINED3DTEXOPCAPS_BUMPENVMAP;=0A=
+        /* TODO: Luminance bump map? */=0A=
+    }=0A=
+=0A=
+#if 0=0A=
+    /* FIXME: Add=0A=
+            pCaps->TextureOpCaps |=3D =
WINED3DTEXOPCAPS_BUMPENVMAPLUMINANCE=0A=
+            WINED3DTEXOPCAPS_PREMODULATE */=0A=
+#endif=0A=
+=0A=
+    pCaps->MaxTextureBlendStages   =3D GL_LIMITS(texture_stages);=0A=
+    pCaps->MaxSimultaneousTextures =3D GL_LIMITS(textures);=0A=
+=0A=
+    if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {=0A=
+        pCaps->PrimitiveMiscCaps |=3D  WINED3DPMISCCAPS_TSSARGTEMP;=0A=
+    }=0A=
+=0A=
+    /* The caps below can be supported but aren't handled yet in =
utils.c 'd3dta_to_combiner_input', disable them until support is fixed */=0A=
+#if 0=0A=
+    if (GL_SUPPORT(NV_REGISTER_COMBINERS2))=0A=
+    pCaps->PrimitiveMiscCaps |=3D  WINED3DPMISCCAPS_PERSTAGECONSTANT;=0A=
+#endif=0A=
+=0A=
+}=0A=
+=0A=
 #undef GLINFO_LOCATION=0A=
 =0A=
 const struct fragment_pipeline ffp_fragment_pipeline =3D {=0A=
     nvts_enable,=0A=
+    ffp_fragment_get_caps,=0A=
     ffp_fragmentstate_template=0A=
 };=0A=
 =0A=
diff --git a/dlls/wined3d/wined3d_private.h =
b/dlls/wined3d/wined3d_private.h=0A=
index ec43fec..327a14f 100644=0A=
--- a/dlls/wined3d/wined3d_private.h=0A=
+++ b/dlls/wined3d/wined3d_private.h=0A=
@@ -218,12 +218,6 @@ typedef struct SHADER_BUFFER {=0A=
 } SHADER_BUFFER;=0A=
 =0A=
 struct shader_caps {=0A=
-    DWORD               PrimitiveMiscCaps;=0A=
-=0A=
-    DWORD               TextureOpCaps;=0A=
-    DWORD               MaxTextureBlendStages;=0A=
-    DWORD               MaxSimultaneousTextures;=0A=
-=0A=
     DWORD               VertexShaderVersion;=0A=
     DWORD               MaxVertexShaderConst;=0A=
 =0A=
@@ -546,8 +540,17 @@ struct StateEntryTemplate=0A=
     struct StateEntry   content;=0A=
 };=0A=
 =0A=
+struct fragment_caps {=0A=
+    DWORD               PrimitiveMiscCaps;=0A=
+=0A=
+    DWORD               TextureOpCaps;=0A=
+    DWORD               MaxTextureBlendStages;=0A=
+    DWORD               MaxSimultaneousTextures;=0A=
+};=0A=
+=0A=
 struct fragment_pipeline {=0A=
     void (*enable_extension)(IWineD3DDevice *iface, BOOL enable);=0A=
+    void (*get_caps)(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_info, =
struct fragment_caps *caps);=0A=
     const struct StateEntryTemplate *states;=0A=
 };=0A=
 =0A=
-- =0A=
1.5.4.5=0A=
=0A=

------=_NextPart_000_0017_01C8E2A2.9356D5A0--




More information about the wine-patches mailing list