[PATCH] WineD3D: Sort out some limit confusion=0A=

Stefan Doesinger stefan at codeweavers.com
Wed Aug 20 10:17:31 CDT 2008


=0A=
---=0A=
 dlls/wined3d/arb_program_shader.c |    2 +-=0A=
 dlls/wined3d/directx.c            |    5 +++++=0A=
 dlls/wined3d/drawprim.c           |    6 +++---=0A=
 dlls/wined3d/state.c              |   12 +++---------=0A=
 dlls/wined3d/utils.c              |    2 +-=0A=
 include/wine/wined3d_gl.h         |    1 +=0A=
 6 files changed, 14 insertions(+), 14 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/arb_program_shader.c =
b/dlls/wined3d/arb_program_shader.c=0A=
index a701f36..fc13d0b 100644=0A=
--- a/dlls/wined3d/arb_program_shader.c=0A=
+++ b/dlls/wined3d/arb_program_shader.c=0A=
@@ -2819,7 +2819,7 @@ static void fragment_prog_arbfp(DWORD state, =
IWineD3DStateBlockImpl *stateblock,=0A=
                 return;=0A=
             }=0A=
             desc->num_textures_used =3D 0;=0A=
-            for(i =3D 0; i < GL_LIMITS(texture_stages); i++) {=0A=
+            for(i =3D 0; i < min(MAX_TEXTURES, =
GL_LIMITS(fragment_samplers)); i++) {=0A=
                 if(settings.op[i].cop =3D=3D WINED3DTOP_DISABLE) break;=0A=
                 desc->num_textures_used =3D i;=0A=
             }=0A=
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c=0A=
index 9741a7c..1b7de9e 100644=0A=
--- a/dlls/wined3d/directx.c=0A=
+++ b/dlls/wined3d/directx.c=0A=
@@ -704,6 +704,7 @@ BOOL IWineD3DImpl_FillGLCaps(WineD3D_GL_Info =
*gl_info) {=0A=
     gl_info->max_buffers        =3D 1;=0A=
     gl_info->max_textures       =3D 1;=0A=
     gl_info->max_texture_stages =3D 1;=0A=
+    gl_info->max_texture_coords =3D 1;=0A=
     gl_info->max_fragment_samplers =3D 1;=0A=
     gl_info->max_vertex_samplers =3D 0;=0A=
     gl_info->max_combined_samplers =3D 0;=0A=
@@ -866,6 +867,10 @@ BOOL IWineD3DImpl_FillGLCaps(WineD3D_GL_Info =
*gl_info) {=0A=
             }=0A=
             TRACE_(d3d_caps)("Max texture stages: %d\n", =
gl_info->max_texture_stages);=0A=
 =0A=
+            glGetIntegerv(GL_MAX_TEXTURE_COORDS, &gl_max);=0A=
+            gl_info->max_texture_coords =3D min(MAX_TEXTURES, gl_max);=0A=
+            TRACE_(d3d_caps)("Max texture coords: %d\n", =
gl_info->max_texture_coords);=0A=
+=0A=
             if (gl_info->supported[ARB_FRAGMENT_PROGRAM]) {=0A=
                 GLint tmp;=0A=
                 glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &tmp);=0A=
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c=0A=
index b0f6a53..7e2bc40 100644=0A=
--- a/dlls/wined3d/drawprim.c=0A=
+++ b/dlls/wined3d/drawprim.c=0A=
@@ -329,7 +329,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, =
WineDirect3DVertexStridedData=0A=
     /* Adding the stream offset once is cheaper than doing it every =
iteration. Do not modify the strided data, it is a pointer=0A=
      * to the strided Data in the device and might be needed intact on =
the next draw=0A=
      */=0A=
-    for (textureNo =3D 0; textureNo < GL_LIMITS(texture_stages); =
++textureNo) {=0A=
+    for (textureNo =3D 0; textureNo < GL_LIMITS(texture_coords); =
++textureNo) {=0A=
         if(sd->u.s.texCoords[textureNo].lpData) {=0A=
             texCoords[textureNo] =3D =
sd->u.s.texCoords[textureNo].lpData + =
streamOffset[sd->u.s.texCoords[textureNo].streamNo];=0A=
         } else {=0A=
@@ -353,7 +353,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, =
WineDirect3DVertexStridedData=0A=
      * not using the vector functions here=0A=
      */=0A=
     if(FIXME_ON(d3d_draw)) {=0A=
-        for (textureNo =3D 0; textureNo < GL_LIMITS(textures); =
++textureNo) {=0A=
+        for (textureNo =3D 0; textureNo < GL_LIMITS(texture_coords); =
++textureNo) {=0A=
             DWORD type =3D sd->u.s.texCoords[textureNo].dwType;=0A=
             if (sd->u.s.texCoords[textureNo].lpData &&=0A=
                 type !=3D WINED3DDECLTYPE_FLOAT1 &&=0A=
@@ -420,7 +420,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, =
WineDirect3DVertexStridedData=0A=
         }=0A=
 =0A=
         /* Texture coords --------------------------- */=0A=
-        for (textureNo =3D 0; textureNo < GL_LIMITS(texture_stages); =
++textureNo) {=0A=
+        for (textureNo =3D 0; textureNo < GL_LIMITS(texture_coords); =
++textureNo) {=0A=
 =0A=
             if (!GL_SUPPORT(ARB_MULTITEXTURE) && textureNo > 0) {=0A=
                 FIXME("Program using multiple concurrent textures which =
this opengl implementation doesn't support\n");=0A=
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c=0A=
index 5b92420..8c987d6 100644=0A=
--- a/dlls/wined3d/state.c=0A=
+++ b/dlls/wined3d/state.c=0A=
@@ -3120,7 +3120,7 @@ static void transform_texture(DWORD state, =
IWineD3DStateBlockImpl *stateblock, W=0A=
     if (mapped_stage =3D=3D -1) return;=0A=
 =0A=
     if (GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
-        if(mapped_stage >=3D GL_LIMITS(textures)) {=0A=
+        if(mapped_stage >=3D GL_LIMITS(texture_coords)) {=0A=
             return;=0A=
         }=0A=
         GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));=0A=
@@ -3154,7 +3154,7 @@ static void transform_texture(DWORD state, =
IWineD3DStateBlockImpl *stateblock, W=0A=
 static void unloadTexCoords(IWineD3DStateBlockImpl *stateblock) {=0A=
     int texture_idx;=0A=
 =0A=
-    for (texture_idx =3D 0; texture_idx < GL_LIMITS(texture_stages); =
++texture_idx) {=0A=
+    for (texture_idx =3D 0; texture_idx < GL_LIMITS(texture_coords); =
++texture_idx) {=0A=
         GL_EXTCALL(glClientActiveTextureARB(GL_TEXTURE0_ARB + =
texture_idx));=0A=
         glDisableClientState(GL_TEXTURE_COORD_ARRAY);=0A=
     }=0A=
@@ -3172,7 +3172,7 @@ static void loadTexCoords(IWineD3DStateBlockImpl =
*stateblock, WineDirect3DVertex=0A=
         return;=0A=
     }=0A=
 =0A=
-    for (textureNo =3D 0; textureNo < GL_LIMITS(texture_stages); =
++textureNo) {=0A=
+    for (textureNo =3D 0; textureNo < GL_LIMITS(texture_coords); =
++textureNo) {=0A=
         int coordIdx =3D =
stateblock->textureState[textureNo][WINED3DTSS_TEXCOORDINDEX];=0A=
 =0A=
         mapped_stage =3D =
stateblock->wineD3DDevice->texUnitMap[textureNo];=0A=
@@ -3202,12 +3202,6 @@ static void loadTexCoords(IWineD3DStateBlockImpl =
*stateblock, WineDirect3DVertex=0A=
             GL_EXTCALL(glMultiTexCoord4fARB(GL_TEXTURE0_ARB + =
mapped_stage, 0, 0, 0, 1));=0A=
         }=0A=
     }=0A=
-    if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {=0A=
-        /* The number of the mapped stages increases monotonically, so =
it's fine to use the last used one */=0A=
-        for (textureNo =3D mapped_stage + 1; textureNo < =
GL_LIMITS(textures); ++textureNo) {=0A=
-            GL_EXTCALL(glMultiTexCoord4fARB(GL_TEXTURE0_ARB + =
textureNo, 0, 0, 0, 1));=0A=
-        }=0A=
-    }=0A=
 }=0A=
 =0A=
 static void tex_coordindex(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c=0A=
index 340c984..2f3e0b0 100644=0A=
--- a/dlls/wined3d/utils.c=0A=
+++ b/dlls/wined3d/utils.c=0A=
@@ -1811,7 +1811,7 @@ void gen_ffp_op(IWineD3DStateBlockImpl =
*stateblock, struct ffp_settings *setting=0A=
     DWORD ttff;=0A=
     DWORD cop, aop, carg0, carg1, carg2, aarg0, aarg1, aarg2;=0A=
 =0A=
-    for(i =3D 0; i < GL_LIMITS(texture_stages); i++) {=0A=
+    for(i =3D 0; i < MAX_TEXTURES; i++) {=0A=
         IWineD3DBaseTextureImpl *texture;=0A=
         settings->op[i].padding =3D 0;=0A=
         if(stateblock->textureState[i][WINED3DTSS_COLOROP] =3D=3D =
WINED3DTOP_DISABLE) {=0A=
diff --git a/include/wine/wined3d_gl.h b/include/wine/wined3d_gl.h=0A=
index 4c26c9b..b269678 100644=0A=
--- a/include/wine/wined3d_gl.h=0A=
+++ b/include/wine/wined3d_gl.h=0A=
@@ -3842,6 +3842,7 @@ typedef struct _WineD3D_GL_Info {=0A=
   UINT   max_lights;=0A=
   UINT   max_textures;=0A=
   UINT   max_texture_stages;=0A=
+  UINT   max_texture_coords;=0A=
   UINT   max_fragment_samplers;=0A=
   UINT   max_vertex_samplers;=0A=
   UINT   max_combined_samplers;=0A=
-- =0A=
1.5.6.4=0A=
=0A=

------=_NextPart_000_0004_01C9046F.75901E70--




More information about the wine-patches mailing list