Module: wine Branch: master Commit: 92ce028a0b3aba513f8fb62d7021533896cd99f6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=92ce028a0b3aba513f8fb62d70...
Author: Stefan Dösinger stefan@codeweavers.com Date: Tue Jul 31 15:44:13 2007 +0200
wined3d: Optimize transform state in stateblocks.
---
dlls/wined3d/device.c | 12 +++++++++++- dlls/wined3d/stateblock.c | 18 ++++++++---------- dlls/wined3d/wined3d_private.h | 2 ++ 3 files changed, 21 insertions(+), 11 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index bc936b6..8522dac 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -469,7 +469,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateStateBlock(IWineD3DDevice* iface, for(j = 1; j <= WINEHIGHEST_RENDER_STATE; j++) { object->contained_render_states[j - 1] = j; } - object->num_contained_render_states = WINEHIGHEST_RENDER_STATE; + /* TODO: Filter unused transforms between TEXTURE8 and WORLD0? */ + for(j = 1; j <= HIGHEST_TRANSFORMSTATE; j++) { + object->contained_transform_states[j - 1] = j; + } + object->num_contained_transform_states = HIGHEST_TRANSFORMSTATE;
} else if (Type == WINED3DSBT_PIXELSTATE) {
@@ -4324,6 +4328,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_EndStateBlock(IWineD3DDevice *iface, IW object->num_contained_render_states++; } } + for(i = 1; i <= HIGHEST_TRANSFORMSTATE; i++) { + if(object->changed.transform[i]) { + object->contained_transform_states[object->num_contained_transform_states] = i; + object->num_contained_transform_states++; + } + }
*ppStateBlock = (IWineD3DStateBlock*) object; This->isRecordingState = FALSE; diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 79bfe56..0c0965b 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -485,13 +485,11 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface) }
/* Others + Render & Texture */ - for (i = 1; i <= HIGHEST_TRANSFORMSTATE; i++) { - if (This->changed.transform[i] && memcmp(&targetStateBlock->transforms[i], - &This->transforms[i], - sizeof(WINED3DMATRIX)) != 0) { - TRACE("Updating transform %d\n", i); - memcpy(&This->transforms[i], &targetStateBlock->transforms[i], sizeof(WINED3DMATRIX)); - } + for (i = 0; i < This->num_contained_transform_states; i++) { + TRACE("Updating transform %d\n", i); + memcpy(&This->transforms[This->contained_transform_states[i]], + &targetStateBlock->transforms[This->contained_transform_states[i]], + sizeof(WINED3DMATRIX)); }
if (This->changed.indices && ((This->pIndexData != targetStateBlock->pIndexData) @@ -695,9 +693,9 @@ should really perform a delta so that only the changes get updated*/
/* Others + Render & Texture */ if (/*TODO: 'magic' statetype, replace with BOOL This->blockType == D3DSBT_RECORDED || */ This->blockType == WINED3DSBT_ALL || This->blockType == WINED3DSBT_INIT) { - for (i = 1; i <= HIGHEST_TRANSFORMSTATE; i++) { - if (This->changed.transform[i]) - IWineD3DDevice_SetTransform(pDevice, i, &This->transforms[i]); + for (i = 0; i < This->num_contained_transform_states; i++) { + IWineD3DDevice_SetTransform(pDevice, This->contained_transform_states[i], + &This->transforms[This->contained_transform_states[i]]); }
if (This->changed.indices) { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 159844e..f31e7dc 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1369,6 +1369,8 @@ struct IWineD3DStateBlockImpl /* Contained state management */ DWORD contained_render_states[WINEHIGHEST_RENDER_STATE + 1]; unsigned int num_contained_render_states; + DWORD contained_transform_states[WINEHIGHEST_RENDER_STATE + 1]; + unsigned int num_contained_transform_states; };
extern void stateblock_savedstates_set(