Don't reapply all the texture states if the texture we are replacing

is the same as the texture there already and the texture is not
'dirty'.
This commit is contained in:
Jason Edmeades 2003-04-21 23:20:51 +00:00 committed by Alexandre Julliard
parent 21ee3295fc
commit b830439bf5
1 changed files with 12 additions and 5 deletions

View File

@ -2966,6 +2966,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_GetTexture(LPDIRECT3DDEVICE8 iface, DWORD
HRESULT WINAPI IDirect3DDevice8Impl_SetTexture(LPDIRECT3DDEVICE8 iface, DWORD Stage,IDirect3DBaseTexture8* pTexture) {
IDirect3DBaseTexture8 *oldTxt;
BOOL reapplyStates = TRUE;
ICOM_THIS(IDirect3DDevice8Impl,iface);
D3DRESOURCETYPE textureType;
@ -2996,7 +2997,6 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetTexture(LPDIRECT3DDEVICE8 iface, DWORD
}
/* Decrement the count of the previous texture */
/* FIXME PERF: If old == new and not dirty then skip all this */
if (oldTxt != NULL) {
IDirect3DBaseTexture8Impl_Release(oldTxt);
}
@ -3008,8 +3008,13 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetTexture(LPDIRECT3DDEVICE8 iface, DWORD
textureType = IDirect3DBaseTexture8Impl_GetType(pTexture);
if (textureType == D3DRTYPE_TEXTURE) {
IDirect3DTexture8Impl *pTexture2 = (IDirect3DTexture8Impl *) pTexture;
int i;
IDirect3DTexture8Impl *pTexture2 = (IDirect3DTexture8Impl *) pTexture;
int i;
if (oldTxt == pTexture2 && pTexture2->Dirty == FALSE) {
TRACE("Skipping setting texture as old == new\n");
reapplyStates = FALSE;
} else {
/* Standard 2D texture */
TRACE("Standard 2d texture\n");
@ -3062,7 +3067,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetTexture(LPDIRECT3DDEVICE8 iface, DWORD
}
}
}
} else if (textureType == D3DRTYPE_VOLUMETEXTURE) {
IDirect3DVolumeTexture8Impl *pTexture2 = (IDirect3DVolumeTexture8Impl *) pTexture;
int i;
@ -3132,7 +3137,9 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetTexture(LPDIRECT3DDEVICE8 iface, DWORD
/* Even if the texture has been set to null, reapply the stages as a null texture to directx requires
a dummy texture in opengl, and we always need to ensure the current view of the TextureStates apply */
setupTextureStates (iface, Stage);
if (reapplyStates) {
setupTextureStates (iface, Stage);
}
return D3D_OK;
}