[PATCH 1/7] wined3d: Move view_ident from the device to wined3d_state

Stefan Dösinger stefan at codeweavers.com
Fri Apr 19 04:20:51 CDT 2013


---
 dlls/wined3d/device.c          |  6 +++---
 dlls/wined3d/state.c           |  4 ++--
 dlls/wined3d/stateblock.c      |  3 +++
 dlls/wined3d/wined3d_private.h | 10 ++++++----
 4 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 17c122d..32029c8 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1208,8 +1208,6 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device,
 
     create_dummy_textures(device, context);
 
-    /* Initialize the current view state */
-    device->view_ident = 1;
     device->contexts[0]->last_was_rhw = 0;
 
     switch (wined3d_settings.offscreen_rendering_mode)
@@ -1668,6 +1666,8 @@ void CDECL wined3d_device_set_transform(struct wined3d_device *device,
         TRACE("Recording... not performing anything.\n");
         device->updateStateBlock->changed.transform[d3dts >> 5] |= 1 << (d3dts & 0x1f);
         device->updateStateBlock->state.transforms[d3dts] = *matrix;
+        if (d3dts == WINED3D_TS_VIEW)
+            device->updateStateBlock->state.view_ident = !memcmp(matrix, &identity, sizeof(identity));
         return;
     }
 
@@ -1685,7 +1685,7 @@ void CDECL wined3d_device_set_transform(struct wined3d_device *device,
 
     device->stateBlock->state.transforms[d3dts] = *matrix;
     if (d3dts == WINED3D_TS_VIEW)
-        device->view_ident = !memcmp(matrix, &identity, sizeof(identity));
+        device->stateBlock->state.view_ident = !memcmp(matrix, &identity, sizeof(identity));
 
     if (d3dts < WINED3D_TS_WORLD_MATRIX(device->adapter->gl_info.limits.blends))
         device_invalidate_state(device, STATE_TRANSFORM(d3dts));
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index ef86a1d..88426a2 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -3802,7 +3802,7 @@ static void transform_world(struct wined3d_context *context, const struct wined3
     else
     {
         /* In the general case, the view matrix is the identity matrix */
-        if (context->swapchain->device->view_ident)
+        if (state->view_ident)
         {
             gl_info->gl_ops.gl.p_glLoadMatrixf(&state->transforms[WINED3D_TS_WORLD_MATRIX(0)].u.m[0][0]);
             checkGLcall("glLoadMatrixf");
@@ -3883,7 +3883,7 @@ static void transform_worldex(struct wined3d_context *context, const struct wine
     /* World matrix 0 is multiplied with the view matrix because d3d uses 3
      * matrices while gl uses only 2. To avoid weighting the view matrix
      * incorrectly it has to be multiplied into every GL modelview matrix. */
-    if (context->swapchain->device->view_ident)
+    if (state->view_ident)
     {
         gl_info->gl_ops.gl.p_glLoadMatrixf(&state->transforms[WINED3D_TS_WORLD_MATRIX(matrix)].u.m[0][0]);
         checkGLcall("glLoadMatrixf");
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index 8e17d23..3349376 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -799,6 +799,8 @@ void CDECL wined3d_stateblock_capture(struct wined3d_stateblock *stateblock)
         TRACE("Updating transform %#x.\n", transform);
 
         stateblock->state.transforms[transform] = src_state->transforms[transform];
+        if (transform == WINED3D_TS_VIEW)
+            stateblock->state.view_ident = src_state->view_ident;
     }
 
     if (stateblock->changed.primitive_type)
@@ -1170,6 +1172,7 @@ void stateblock_init_default_state(struct wined3d_stateblock *stateblock)
     /* Set some of the defaults for lights, transforms etc */
     state->transforms[WINED3D_TS_PROJECTION] = identity;
     state->transforms[WINED3D_TS_VIEW] = identity;
+    state->view_ident = 1;
     for (i = 0; i < 256; ++i)
     {
         state->transforms[WINED3D_TS_WORLD_MATRIX(i)] = identity;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 1ee9b9f..5c183ca 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1708,7 +1708,6 @@ struct wined3d_device
     DWORD vs_clipping;
     UINT instance_count;
 
-    WORD view_ident : 1;                /* true iff view matrix is identity */
     WORD vertexBlendUsed : 1;           /* To avoid needless setting of the blend matrices */
     WORD isRecordingState : 1;
     WORD isInDraw : 1;
@@ -1718,7 +1717,7 @@ struct wined3d_device
     WORD softwareVertexProcessing : 1;  /* process vertex shaders using software or hardware */
     WORD useDrawStridedSlow : 1;
     WORD filter_messages : 1;
-    WORD padding : 6;
+    WORD padding : 7;
 
     BYTE fixed_function_usage_map;      /* MAX_TEXTURES, 8 */
 
@@ -2274,7 +2273,6 @@ struct wined3d_state
     struct wined3d_buffer *index_buffer;
     enum wined3d_format_id index_format;
     INT base_vertex_index;
-    INT load_base_vertex_index; /* Non-indexed drawing needs 0 here, indexed needs base_vertex_index. */
     GLenum gl_primitive_type;
 
     struct wined3d_shader *vertex_shader;
@@ -2298,7 +2296,6 @@ struct wined3d_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];
-    DWORD lowest_disabled_stage;
 
     struct wined3d_matrix transforms[HIGHEST_TRANSFORMSTATE + 1];
     struct wined3d_vec4 clip_planes[MAX_CLIPPLANES];
@@ -2313,6 +2310,11 @@ struct wined3d_state
     const struct wined3d_light_info *lights[MAX_ACTIVE_LIGHTS]; /* Map of opengl lights to d3d lights */
 
     DWORD render_states[WINEHIGHEST_RENDER_STATE + 1];
+
+    /* Derived state */
+    INT load_base_vertex_index; /* Non-indexed drawing needs 0 here, indexed needs base_vertex_index. */
+    DWORD lowest_disabled_stage;
+    WORD view_ident : 1;        /* true iff view matrix is identity */
 };
 
 struct wined3d_stateblock
-- 
1.8.1.5




More information about the wine-patches mailing list