Stefan Dösinger : wined3d: Optimize transform state in stateblocks.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Aug 14 07:12:53 CDT 2007
Module: wine
Branch: master
Commit: 92ce028a0b3aba513f8fb62d7021533896cd99f6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=92ce028a0b3aba513f8fb62d7021533896cd99f6
Author: Stefan Dösinger <stefan at 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(
More information about the wine-cvs
mailing list