[2/16] WineD3D: Remove IWineD3DDevice_ApplyStateChanges

Stefan Dösinger stefan at codeweavers.com
Mon Jan 1 17:07:55 CST 2007


After the removal of ApplyTextureUnitState ApplyStateChanges does not  
do anything useful any more, all the things are now in the state table.
-------------- next part --------------
From baa6ce1c7793b5627e88c71d58fb3adad26a6a74 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Stefan_D=C3=B6singer?= <stefan at imac.local>
Date: Tue, 26 Dec 2006 23:00:56 +0100
Subject: [PATCH] WineD3D: Remove IWineD3DDevice::ApplyStateChanges

---
 dlls/wined3d/device.c            |   82 --------------------------------------
 dlls/wined3d/state.c             |   27 ++++++++-----
 dlls/wined3d/stateblock.c        |    4 --
 include/wine/wined3d_interface.h |    3 -
 4 files changed, 18 insertions(+), 98 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index b68c4a2..38afc4f 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -315,84 +315,6 @@ static void delete_glsl_shader_list(IWin
     }
 }
 
-
-/* Apply the current values to the specified texture stage */
-static void WINAPI IWineD3DDeviceImpl_SetupTextureStates(IWineD3DDevice *iface, DWORD Sampler, DWORD texture_idx, DWORD Flags) {
-    IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
-    float col[4];
-
-    union {
-        float f;
-        DWORD d;
-    } tmpvalue;
-
-    /* In addition, IDirect3DDevice9::SetSamplerState will now be used for filtering, tiling,
-    clamping, MIPLOD, etc. This will work for up to 16 samplers.
-    */
-   
-    if (Sampler >= GL_LIMITS(sampler_stages)) {
-        FIXME("Trying to set the state of more samplers %d than are supported %d by this openGL implementation\n", Sampler, GL_LIMITS(sampler_stages));
-        return;
-    }
-    VTRACE(("Activating appropriate texture state %d\n", Sampler));
-    if (GL_SUPPORT(ARB_MULTITEXTURE)) {
-        ENTER_GL();
-        GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + texture_idx));
-        checkGLcall("glActiveTextureARB");
-        LEAVE_GL();
-        /* Could we use bindTexture and then apply the states instead of GLACTIVETEXTURE */
-    } else if (Sampler > 0) {
-        FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
-        return;
-    }
-
-    /* TODO: change this to a lookup table
-        LOOKUP_TEXTURE_STATES lists all texture states that should be applied.
-        LOOKUP_CONTEXT_SATES list all context applicable states that can be applied
-        etc.... it's a lot cleaner, quicker and possibly easier to maintain than running a switch and setting a skip flag...
-        especially when there are a number of groups of states. */
-
-    TRACE("-----------------------> Updating the texture at Sampler %d to have new texture state information\n", Sampler);
-
-    /* apply any sampler states that always need applying */
-    if (GL_SUPPORT(EXT_TEXTURE_LOD_BIAS)) {
-        tmpvalue.d = This->stateBlock->samplerState[Sampler][WINED3DSAMP_MIPMAPLODBIAS];
-        glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT,
-                GL_TEXTURE_LOD_BIAS_EXT,
-                tmpvalue.f);
-        checkGLcall("glTexEnvi GL_TEXTURE_LOD_BIAS_EXT ...");
-    }
-
-    D3DCOLORTOGLFLOAT4(This->stateBlock->renderState[WINED3DRS_TEXTUREFACTOR], col);
-    glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &col[0]);
-    checkGLcall("glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);");
-
-    /* TODO: NV_POINT_SPRITE */
-    if (GL_SUPPORT(ARB_POINT_SPRITE)) {
-        if (This->stateBlock->renderState[WINED3DRS_POINTSPRITEENABLE]) {
-           /* Doesn't work with GL_POINT_SMOOTH on on my ATI 9600, but then ATI drivers are buggered! */
-           glDisable(GL_POINT_SMOOTH);
-
-           /* Centre the texture on the vertex */
-           VTRACE(("glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE)\n"));
-           glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
-
-           VTRACE(("glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE)\n"));
-           glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
-           checkGLcall("glTexEnvf(...)");
-           VTRACE(("glEnable( GL_POINT_SPRITE_ARB )\n"));
-           glEnable( GL_POINT_SPRITE_ARB );
-           checkGLcall("glEnable(...)");
-        } else {
-           VTRACE(("glDisable( GL_POINT_SPRITE_ARB )\n"));
-           glDisable( GL_POINT_SPRITE_ARB );
-           checkGLcall("glEnable(...)");
-        }
-    }
-
-    TRACE("-----------------------> Updated the texture at Sampler %d to have new texture state information\n", Sampler);
-}
-
 /**********************************************************
  * IUnknown parts follows
  **********************************************************/
@@ -3249,7 +3171,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl
     * GL_MAX_TEXTURE_COORDS_ARB.
     * Ok GForce say it's ok to use glTexParameter/glGetTexParameter(...).
      ******************/
-    /** NOTE: States are appled in IWineD3DBaseTextre ApplyStateChanges and IWineD3DDevice SetupTextureStates**/
+    /** NOTE: States are applied in IWineD3DBaseTextre ApplyStateChanges the sampler state handler**/
     if(Sampler >  GL_LIMITS(sampler_stages) || Sampler < 0 || Type > WINED3D_HIGHEST_SAMPLER_STATE || Type < 0) {
          FIXME("sampler %d type %s(%u) is out of range [max_samplers=%d, highest_state=%d]\n",
             Sampler, debug_d3dsamplerstate(Type), Type, GL_LIMITS(sampler_stages), WINED3D_HIGHEST_SAMPLER_STATE);
@@ -6864,8 +6786,6 @@ const IWineD3DDeviceVtbl IWineD3DDevice_
     IWineD3DDeviceImpl_StretchRect,
     IWineD3DDeviceImpl_GetRenderTargetData,
     IWineD3DDeviceImpl_GetFrontBufferData,
-    /*** Internal use IWineD3DDevice methods ***/
-    IWineD3DDeviceImpl_SetupTextureStates,
     /*** object tracking ***/
     IWineD3DDeviceImpl_ResourceReleased
 };
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 5402fbf..5a79d22 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -1044,18 +1044,14 @@ static void state_pointsprite(DWORD stat
         return;
     }
 
-    /*
-     * Point sprites are always enabled. Value controls texture coordinate
-     * replacement mode. Must be set true for point sprites to use
-     * textures.
-     */
-    glEnable(GL_POINT_SPRITE_ARB);
-    checkGLcall("glEnable(GL_POINT_SPRITE_ARB)");
-
     if (stateblock->renderState[WINED3DRS_POINTSPRITEENABLE]) {
+        glEnable(GL_POINT_SPRITE_ARB);
+        checkGLcall("glEnable(GL_POINT_SPRITE_ARB)");
         glTexEnvf(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, TRUE);
         checkGLcall("glTexEnvf(GL_POINT_SPRITE, GL_COORD_REPLACE, TRUE)");
     } else {
+        glDisable(GL_POINT_SPRITE_ARB);
+        checkGLcall("glDisable(GL_POINT_SPRITE_ARB)");
         glTexEnvf(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, FALSE);
         checkGLcall("glTexEnvf(GL_POINT_SPRITE, GL_COORD_REPLACE, FALSE)");
     }
@@ -1679,6 +1675,10 @@ static void tex_resultarg(DWORD state, I
 
 static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock) {
     DWORD sampler = state - STATE_SAMPLER(0);
+    union {
+        float f;
+        DWORD d;
+    } tmpvalue;
 
     TRACE("Sampler: %d\n", sampler);
     /* Enabling and disabling texture dimensions is done by texture stage state / pixel shader setup, this function
@@ -1700,7 +1700,7 @@ static void sampler(DWORD state, IWineD3
     if(stateblock->textures[sampler]) {
 
         /* NP2 textures need the texture matrix set properly for the stage */
-        if(wined3d_settings.nonpower2_mode == NP2_NATIVE &&
+        if(wined3d_settings.nonpower2_mode == NP2_NATIVE && sampler < MAX_TEXTURES - 1 &&
            stateblock->textureDimensions[sampler] == GL_TEXTURE_2D &&
            (((IWineD3DTextureImpl *) stateblock->textures[sampler])->pow2scalingFactorX != 1.0 ||
             ((IWineD3DTextureImpl *) stateblock->textures[sampler])->pow2scalingFactorY != 1.0 ) ) {
@@ -1708,9 +1708,16 @@ static void sampler(DWORD state, IWineD3
         }
 
         IWineD3DBaseTexture_PreLoad((IWineD3DBaseTexture *) stateblock->textures[sampler]);
-        IWineD3DDevice_SetupTextureStates((IWineD3DDevice *)stateblock->wineD3DDevice, sampler, stateblock->wineD3DDevice->texUnitMap[sampler], REAPPLY_ALPHAOP);
         IWineD3DBaseTexture_ApplyStateChanges(stateblock->textures[sampler], stateblock->textureState[sampler], stateblock->samplerState[sampler]);
 
+        if (GL_SUPPORT(EXT_TEXTURE_LOD_BIAS)) {
+            tmpvalue.d = stateblock->samplerState[sampler][WINED3DSAMP_MIPMAPLODBIAS];
+            glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT,
+                      GL_TEXTURE_LOD_BIAS_EXT,
+                      tmpvalue.f);
+            checkGLcall("glTexEnvi GL_TEXTURE_LOD_BIAS_EXT ...");
+        }
+
         if (stateblock->wineD3DDevice->ps_selected_mode != SHADER_NONE && stateblock->pixelShader &&
             ((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.function) {
             /* Using a pixel shader? Verify the sampler types */
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index afc582d..33d42ad 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -1069,10 +1069,6 @@ static HRESULT  WINAPI IWineD3DStateBloc
 
         glTexImage1D(GL_TEXTURE_1D, 0, GL_LUMINANCE, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, &white);
         checkGLcall("glTexImage1D");
-#if 1   /* TODO: move the setting texture states off to basetexture */
-        /* Reapply all the texture state information to this texture */
-        IWineD3DDevice_SetupTextureStates(device, i, i, REAPPLY_ALL);
-#endif
     }
 
     LEAVE_GL();
diff --git a/include/wine/wined3d_interface.h b/include/wine/wined3d_interface.h
index 56d93f4..4a5a051 100644
--- a/include/wine/wined3d_interface.h
+++ b/include/wine/wined3d_interface.h
@@ -471,8 +471,6 @@ DECLARE_INTERFACE_(IWineD3DDevice,IWineD
     STDMETHOD(StretchRect)(THIS_ struct IWineD3DSurface* pSourceSurface, CONST RECT* pSourceRect, struct IWineD3DSurface* pDestinationSurface, CONST RECT* pDestRect, WINED3DTEXTUREFILTERTYPE Filter) PURE;
     STDMETHOD(GetRenderTargetData)(THIS_ struct IWineD3DSurface* pRenderTarget, struct IWineD3DSurface* pSurface) PURE;
     STDMETHOD(GetFrontBufferData)(THIS_ UINT iSwapChain,struct IWineD3DSurface* pSurface) PURE;
-    /*** Internal use IWineD3Device methods ***/
-    STDMETHOD_(void, SetupTextureStates)(THIS_ DWORD Stage, DWORD texture_idx, DWORD Flags);
     /*** object tracking ***/
     STDMETHOD_(void, ResourceReleased)(THIS_ struct IWineD3DResource *resource);
 };
@@ -611,7 +609,6 @@ #define IWineD3DDevice_UpdateSurface(p,a
 #define IWineD3DDevice_StretchRect(p,a,b,c,d,e)                 (p)->lpVtbl->StretchRect(p,a,b,c,d,e)
 #define IWineD3DDevice_GetRenderTargetData(p,a,b)               (p)->lpVtbl->GetRenderTargetData(p,a,b)
 #define IWineD3DDevice_GetFrontBufferData(p,a,b)                (p)->lpVtbl->GetFrontBufferData(p,a,b)
-#define IWineD3DDevice_SetupTextureStates(p,a,b,c)              (p)->lpVtbl->SetupTextureStates(p,a,b,c)
 #define IWineD3DDevice_ResourceReleased(p,a)                    (p)->lpVtbl->ResourceReleased(p,a)
 #endif
 
-- 
1.4.2.4



More information about the wine-patches mailing list