[PATCH 5/5] wined3d: Store a pointer to the state table in the context.

Henri Verbeet hverbeet at codeweavers.com
Sun Jul 24 14:48:11 CDT 2011


---
 dlls/wined3d/arb_program_shader.c  |    5 +++--
 dlls/wined3d/ati_fragment_shader.c |    2 +-
 dlls/wined3d/context.c             |   29 +++++++++++++++--------------
 dlls/wined3d/state.c               |    4 ++--
 dlls/wined3d/wined3d_private.h     |    7 ++++---
 5 files changed, 25 insertions(+), 22 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index e45ffe2..8f2281a 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -6250,7 +6250,7 @@ static void fragment_prog_arbfp(struct wined3d_context *context, const struct wi
             state_texfactor_arbfp(context, state, STATE_RENDER(WINED3DRS_TEXTUREFACTOR));
             state_arb_specularenable(context, state, STATE_RENDER(WINED3DRS_SPECULARENABLE));
         }
-        else if(use_pshader && !isStateDirty(context, device->StateTable[STATE_VSHADER].representative))
+        else if (use_pshader && !isStateDirty(context, context->state_table[STATE_VSHADER].representative))
         {
             device->shader_backend->shader_select(context, use_pshader, use_vshader);
         }
@@ -6317,7 +6317,8 @@ static void fragment_prog_arbfp(struct wined3d_context *context, const struct wi
      * Don't call shader_select if the vertex shader is dirty, because it will be called later on by the vertex
      * shader handler
      */
-    if(!isStateDirty(context, device->StateTable[STATE_VSHADER].representative)) {
+    if (!isStateDirty(context, context->state_table[STATE_VSHADER].representative))
+    {
         device->shader_backend->shader_select(context, use_pshader, use_vshader);
 
         if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && (use_vshader || use_pshader))
diff --git a/dlls/wined3d/ati_fragment_shader.c b/dlls/wined3d/ati_fragment_shader.c
index 880fae9..e4f36bc 100644
--- a/dlls/wined3d/ati_fragment_shader.c
+++ b/dlls/wined3d/ati_fragment_shader.c
@@ -906,7 +906,7 @@ static void atifs_apply_pixelshader(struct wined3d_context *context, const struc
      * startup, and blitting disables all shaders and dirtifies all shader
      * states. If atifs can deal with this it keeps the rest of the code
      * simpler. */
-    if (!isStateDirty(context, device->StateTable[STATE_VSHADER].representative))
+    if (!isStateDirty(context, context->state_table[STATE_VSHADER].representative))
     {
         device->shader_backend->shader_select(context, FALSE, use_vshader);
 
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index d7a58a9..37e6e63 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1348,13 +1348,14 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
     }
 
     ret->gl_info = gl_info;
+    ret->state_table = device->StateTable;
 
     /* Mark all states dirty to force a proper initialization of the states
      * on the first use of the context. */
     for (state = 0; state <= STATE_HIGHEST; ++state)
     {
-        if (device->StateTable[state].representative)
-            context_invalidate_state(ret, state, device->StateTable);
+        if (ret->state_table[state].representative)
+            context_invalidate_state(ret, state, ret->state_table);
     }
 
     ret->swapchain = swapchain;
@@ -1620,7 +1621,7 @@ static inline void set_blit_dimension(UINT width, UINT height) {
 static void SetupForBlit(struct wined3d_device *device, struct wined3d_context *context)
 {
     int i;
-    const struct StateEntry *StateTable = device->StateTable;
+    const struct StateEntry *StateTable = context->state_table;
     const struct wined3d_gl_info *gl_info = context->gl_info;
     UINT width = context->current_rt->resource.width;
     UINT height = context->current_rt->resource.height;
@@ -1966,8 +1967,8 @@ static BOOL match_depth_stencil_format(const struct wined3d_format *existing,
 }
 
 /* The caller provides a context */
-static void context_validate_onscreen_formats(struct wined3d_device *device,
-        struct wined3d_context *context, const struct wined3d_surface *depth_stencil)
+static void context_validate_onscreen_formats(struct wined3d_context *context,
+        const struct wined3d_surface *depth_stencil)
 {
     /* Onscreen surfaces are always in a swapchain */
     struct wined3d_swapchain *swapchain = context->current_rt->container.u.swapchain;
@@ -1983,7 +1984,7 @@ static void context_validate_onscreen_formats(struct wined3d_device *device,
     /* The currently active context is the necessary context to access the swapchain's onscreen buffers */
     surface_load_location(context->current_rt, SFLAG_INTEXTURE, NULL);
     swapchain->render_to_fbo = TRUE;
-    context_set_render_offscreen(context, device->StateTable, TRUE);
+    context_set_render_offscreen(context, context->state_table, TRUE);
 }
 
 static DWORD context_generate_rt_mask_no_fbo(const struct wined3d_device *device, const struct wined3d_surface *rt)
@@ -2003,7 +2004,7 @@ void context_apply_blit_state(struct wined3d_context *context, struct wined3d_de
 
     if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
     {
-        context_validate_onscreen_formats(device, context, NULL);
+        context_validate_onscreen_formats(context, NULL);
 
         if (context->render_offscreen)
         {
@@ -2044,7 +2045,7 @@ void context_apply_blit_state(struct wined3d_context *context, struct wined3d_de
     LEAVE_GL();
 
     SetupForBlit(device, context);
-    context_invalidate_state(context, STATE_FRAMEBUFFER, device->StateTable);
+    context_invalidate_state(context, STATE_FRAMEBUFFER, context->state_table);
 }
 
 static BOOL context_validate_rt_config(UINT rt_count,
@@ -2068,7 +2069,7 @@ static BOOL context_validate_rt_config(UINT rt_count,
 BOOL context_apply_clear_state(struct wined3d_context *context, struct wined3d_device *device,
         UINT rt_count, const struct wined3d_fb_state *fb)
 {
-    const struct StateEntry *state_table = device->StateTable;
+    const struct StateEntry *state_table = context->state_table;
     DWORD rt_mask = 0;
     UINT i;
     struct wined3d_surface **rts = fb->render_targets;
@@ -2081,7 +2082,7 @@ BOOL context_apply_clear_state(struct wined3d_context *context, struct wined3d_d
 
         if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
         {
-            context_validate_onscreen_formats(device, context, fb->depth_stencil);
+            context_validate_onscreen_formats(context, fb->depth_stencil);
 
             ENTER_GL();
 
@@ -2113,7 +2114,7 @@ BOOL context_apply_clear_state(struct wined3d_context *context, struct wined3d_d
             /* If the framebuffer is not the device's fb the device's fb has to be reapplied
              * next draw. Otherwise we could mark the framebuffer state clean here, once the
              * state management allows this */
-            context_invalidate_state(context, STATE_FRAMEBUFFER, device->StateTable);
+            context_invalidate_state(context, STATE_FRAMEBUFFER, state_table);
         }
         else
         {
@@ -2138,7 +2139,7 @@ BOOL context_apply_clear_state(struct wined3d_context *context, struct wined3d_d
     {
         context_apply_draw_buffers(context, rt_mask);
         context->draw_buffers_mask = rt_mask;
-        context_invalidate_state(context, STATE_FRAMEBUFFER, device->StateTable);
+        context_invalidate_state(context, STATE_FRAMEBUFFER, state_table);
     }
 
     if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
@@ -2242,7 +2243,7 @@ void context_state_drawbuf(struct wined3d_context *context, const struct wined3d
 BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_device *device)
 {
     const struct wined3d_state *state = &device->stateBlock->state;
-    const struct StateEntry *state_table = device->StateTable;
+    const struct StateEntry *state_table = context->state_table;
     const struct wined3d_fb_state *fb = state->fb;
     unsigned int i;
 
@@ -2289,7 +2290,7 @@ static void context_setup_target(struct wined3d_device *device,
         struct wined3d_context *context, struct wined3d_surface *target)
 {
     BOOL old_render_offscreen = context->render_offscreen, render_offscreen;
-    const struct StateEntry *StateTable = device->StateTable;
+    const struct StateEntry *StateTable = context->state_table;
 
     if (!target) return;
     render_offscreen = surface_is_offscreen(target);
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index e2b7928..0735357 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -579,7 +579,7 @@ static void state_clipping(struct wined3d_context *context, const struct wined3d
 
         /* glEnable(GL_CLIP_PLANEx) doesn't apply to vertex shaders. The enabled / disabled planes are
          * hardcoded into the shader. Update the shader to update the enabled clipplanes */
-        if (!isStateDirty(context, device->StateTable[STATE_VSHADER].representative))
+        if (!isStateDirty(context, context->state_table[STATE_VSHADER].representative))
         {
             device->shader_backend->shader_select(context, use_ps(state), TRUE);
             if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT))
@@ -3642,7 +3642,7 @@ void apply_pixelshader(struct wined3d_context *context, const struct wined3d_sta
         context->last_was_pshader = FALSE;
     }
 
-    if (!isStateDirty(context, device->StateTable[STATE_VSHADER].representative))
+    if (!isStateDirty(context, context->state_table[STATE_VSHADER].representative))
     {
         device->shader_backend->shader_select(context, use_pshader, use_vshader);
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 0de11a4..cfa565f 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1049,6 +1049,7 @@ BOOL wined3d_event_query_supported(const struct wined3d_gl_info *gl_info) DECLSP
 struct wined3d_context
 {
     const struct wined3d_gl_info *gl_info;
+    const struct StateEntry *state_table;
     /* State dirtification
      * dirtyArray is an array that contains markers for dirty states. numDirtyEntries states are dirty, their numbers are in indices
      * 0...numDirtyEntries - 1. isStateDirty is a redundant copy of the dirtyArray. Technically only one of them would be needed,
@@ -2828,9 +2829,9 @@ static inline BOOL use_ps(const struct wined3d_state *state)
 static inline void context_apply_state(struct wined3d_context *context,
         const struct wined3d_state *state, DWORD state_id)
 {
-    const struct StateEntry *statetable = context->swapchain->device->StateTable;
-    DWORD rep = statetable[state_id].representative;
-    statetable[rep].apply(context, state, rep);
+    const struct StateEntry *state_table = context->state_table;
+    DWORD rep = state_table[state_id].representative;
+    state_table[rep].apply(context, state, rep);
 }
 
 /* The WNDCLASS-Name for the fake window which we use to retrieve the GL capabilities */
-- 
1.7.3.4




More information about the wine-patches mailing list