Stefan Dösinger : wined3d: Fix np2 textures.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jan 8 14:44:27 CST 2007
Module: wine
Branch: master
Commit: 577f8db7cfe967a7400e75f7e23cd3244a2d735a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=577f8db7cfe967a7400e75f7e23cd3244a2d735a
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Sat Jan 6 18:43:08 2007 +0100
wined3d: Fix np2 textures.
---
dlls/wined3d/state.c | 27 +++++++++++++++++++++------
dlls/wined3d/wined3d_private.h | 1 +
2 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index e2ed6ce..af899e5 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -1752,13 +1752,28 @@ static void sampler(DWORD state, IWineD3
}
if(stateblock->textures[sampler]) {
+ BOOL texIsPow2 = FALSE;
- /* NP2 textures need the texture matrix set properly for the stage */
- 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 ) ) {
- transform_texture(STATE_TRANSFORM(WINED3DTS_TEXTURE0 + stateblock->wineD3DDevice->texUnitMap[sampler]), stateblock);
+ /* The fixed function np2 texture emulation uses the texture matrix to fix up the coordinates
+ * IWineD3DBaseTexture::ApplyStateChanges multiplies the set matrix with a fixup matrix. Before the
+ * scaling is reapplied or removed, the texture matrix has to be reapplied
+ */
+ if(wined3d_settings.nonpower2_mode != NP2_NATIVE && sampler < MAX_TEXTURES) {
+ if(stateblock->textureDimensions[sampler] == GL_TEXTURE_2D) {
+ if(((IWineD3DTextureImpl *) stateblock->textures[sampler])->pow2scalingFactorX != 1.0 ||
+ ((IWineD3DTextureImpl *) stateblock->textures[sampler])->pow2scalingFactorY != 1.0 ) {
+ texIsPow2 = TRUE;
+ }
+ } else if(stateblock->textureDimensions[sampler] == GL_TEXTURE_CUBE_MAP_ARB) {
+ if(((IWineD3DCubeTextureImpl *) stateblock->textures[sampler])->pow2scalingFactor != 1.0) {
+ texIsPow2 = TRUE;
+ }
+ }
+
+ if(texIsPow2 || stateblock->wineD3DDevice->lastWasPow2Texture[sampler]) {
+ transform_texture(STATE_TRANSFORM(WINED3DTS_TEXTURE0 + stateblock->wineD3DDevice->texUnitMap[sampler]), stateblock);
+ stateblock->wineD3DDevice->lastWasPow2Texture[sampler] = texIsPow2;
+ }
}
IWineD3DBaseTexture_PreLoad((IWineD3DBaseTexture *) stateblock->textures[sampler]);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index f50182a..c018c27 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -583,6 +583,7 @@ typedef struct IWineD3DDeviceImpl
BOOL last_was_vshader;
BOOL last_was_foggy_shader;
BOOL namedArraysLoaded, numberedArraysLoaded;
+ BOOL lastWasPow2Texture[MAX_TEXTURES];
/* State block related */
BOOL isRecordingState;
More information about the wine-cvs
mailing list