Zebediah Figura : wined3d: Store transforms in the wined3d_stateblock_state structure.

Alexandre Julliard julliard at winehq.org
Wed Feb 6 15:32:29 CST 2019


Module: wine
Branch: master
Commit: b041cecfa11bb309bb2843b1027aff0db1f42108
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=b041cecfa11bb309bb2843b1027aff0db1f42108

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Tue Feb  5 23:01:04 2019 -0600

wined3d: Store transforms in the wined3d_stateblock_state structure.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/device.c          |  2 +-
 dlls/wined3d/stateblock.c      | 19 ++++++++++++++++---
 dlls/wined3d/wined3d_private.h |  2 ++
 3 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 59d0848..46de003 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1495,11 +1495,11 @@ void CDECL wined3d_device_set_transform(struct wined3d_device *device,
     TRACE("%.8e %.8e %.8e %.8e\n", matrix->_41, matrix->_42, matrix->_43, matrix->_44);
 
     /* Handle recording of state blocks. */
+    device->update_stateblock_state->transforms[d3dts] = *matrix;
     if (device->recording)
     {
         TRACE("Recording... not performing anything.\n");
         device->recording->changed.transform[d3dts >> 5] |= 1u << (d3dts & 0x1f);
-        device->update_state->transforms[d3dts] = *matrix;
         return;
     }
 
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index 4c43bec..01b6dca 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -787,7 +787,7 @@ void CDECL wined3d_stateblock_capture(struct wined3d_stateblock *stateblock)
 
         TRACE("Updating transform %#x.\n", transform);
 
-        stateblock->state.transforms[transform] = src_state->transforms[transform];
+        stateblock->stateblock_state.transforms[transform] = state->transforms[transform];
     }
 
     if (stateblock->changed.indices
@@ -1110,8 +1110,10 @@ void CDECL wined3d_stateblock_apply(const struct wined3d_stateblock *stateblock)
     /* Transform states. */
     for (i = 0; i < stateblock->num_contained_transform_states; ++i)
     {
-        wined3d_device_set_transform(device, stateblock->contained_transform_states[i],
-                &stateblock->state.transforms[stateblock->contained_transform_states[i]]);
+        enum wined3d_transform_state transform = stateblock->contained_transform_states[i];
+
+        state->transforms[transform] = stateblock->stateblock_state.transforms[transform];
+        wined3d_device_set_transform(device, transform, &stateblock->stateblock_state.transforms[transform]);
     }
 
     if (stateblock->changed.indices)
@@ -1424,12 +1426,23 @@ void state_init(struct wined3d_state *state, struct wined3d_fb_state *fb,
 static void stateblock_state_init_default(struct wined3d_stateblock_state *state,
         const struct wined3d_d3d_info *d3d_info)
 {
+    struct wined3d_matrix identity;
     unsigned int i;
 
+    get_identity_matrix(&identity);
+
+    state->transforms[WINED3D_TS_PROJECTION] = identity;
+    state->transforms[WINED3D_TS_VIEW] = identity;
+    for (i = 0; i < 256; ++i)
+    {
+        state->transforms[WINED3D_TS_WORLD_MATRIX(i)] = identity;
+    }
+
     init_default_render_states(state->rs, d3d_info);
 
     for (i = 0; i < MAX_TEXTURES; ++i)
     {
+        state->transforms[WINED3D_TS_TEXTURE0 + i] = identity;
         init_default_texture_state(i, state->texture_states[i]);
     }
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index e0bc4d8..a3c9ef8 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2985,6 +2985,8 @@ struct wined3d_stateblock_state
     struct wined3d_texture *textures[MAX_COMBINED_SAMPLERS];
     DWORD sampler_states[MAX_COMBINED_SAMPLERS][WINED3D_HIGHEST_SAMPLER_STATE + 1];
     DWORD texture_states[MAX_TEXTURES][WINED3D_HIGHEST_TEXTURE_STATE + 1];
+
+    struct wined3d_matrix transforms[HIGHEST_TRANSFORMSTATE + 1];
 };
 
 struct wined3d_device




More information about the wine-cvs mailing list