Henri Verbeet : wined3d: Split context_apply_state() into separate functions for each usage.

Alexandre Julliard julliard at winehq.org
Tue May 4 13:06:35 CDT 2010


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon May  3 22:03:27 2010 +0200

wined3d: Split context_apply_state() into separate functions for each usage.

---

 dlls/wined3d/context.c |  221 +++++++++++++++++++++++++++---------------------
 1 files changed, 124 insertions(+), 97 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index ccb3174..71030ba 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1977,117 +1977,124 @@ static void context_validate_onscreen_formats(IWineD3DDeviceImpl *device, struct
 }
 
 /* Context activation is done by the caller. */
-static void context_apply_state(struct wined3d_context *context, IWineD3DDeviceImpl *device, enum ContextUsage usage)
+static void context_apply_blit_state(struct wined3d_context *context, IWineD3DDeviceImpl *device)
 {
-    const struct StateEntry *state_table = device->StateTable;
-    unsigned int i;
+    if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+    {
+        if (context->render_offscreen)
+        {
+            FIXME("Applying blit state for an offscreen target with ORM_FBO. This should be avoided.\n");
+            surface_internal_preload(context->current_rt, SRGB_RGB);
 
-    switch (usage) {
-        case CTXUSAGE_CLEAR:
-        case CTXUSAGE_DRAWPRIM:
-            if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
-                if (!context->render_offscreen) context_validate_onscreen_formats(device, context);
-                ENTER_GL();
-                context_apply_fbo_state(context);
-                LEAVE_GL();
-            }
-            if (context->draw_buffer_dirty) {
-                context_apply_draw_buffer(context, FALSE);
-                context->draw_buffer_dirty = FALSE;
-            }
-            break;
+            ENTER_GL();
+            context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo);
+            context_attach_surface_fbo(context, GL_FRAMEBUFFER, 0, context->current_rt);
+            context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, NULL, FALSE);
+            LEAVE_GL();
+        }
+        else
+        {
+            context_validate_onscreen_formats(device, context);
 
-        case CTXUSAGE_BLIT:
-            if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
-                if (!context->render_offscreen) context_validate_onscreen_formats(device, context);
-                if (context->render_offscreen)
-                {
-                    FIXME("Activating for CTXUSAGE_BLIT for an offscreen target with ORM_FBO. This should be avoided.\n");
-                    surface_internal_preload(context->current_rt, SRGB_RGB);
-
-                    ENTER_GL();
-                    context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo);
-                    context_attach_surface_fbo(context, GL_FRAMEBUFFER, 0, context->current_rt);
-                    context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, NULL, FALSE);
-                    LEAVE_GL();
-                } else {
-                    ENTER_GL();
-                    context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
-                    LEAVE_GL();
-                }
-                context->draw_buffer_dirty = TRUE;
-            }
-            if (context->draw_buffer_dirty) {
-                context_apply_draw_buffer(context, TRUE);
-                if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) {
-                    context->draw_buffer_dirty = FALSE;
-                }
-            }
-            break;
+            ENTER_GL();
+            context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
+            LEAVE_GL();
+        }
 
-        default:
-            break;
+        context->draw_buffer_dirty = TRUE;
     }
 
-    switch(usage) {
-        case CTXUSAGE_RESOURCELOAD:
-            /* This does not require any special states to be set up */
-            break;
+    if (context->draw_buffer_dirty)
+    {
+        context_apply_draw_buffer(context, TRUE);
+        if (wined3d_settings.offscreen_rendering_mode != ORM_FBO)
+            context->draw_buffer_dirty = FALSE;
+    }
 
-        case CTXUSAGE_CLEAR:
-            if(context->last_was_blit) {
-                device->frag_pipe->enable_extension((IWineD3DDevice *)device, TRUE);
-            }
+    SetupForBlit(device, context);
+}
 
-            /* Blending and clearing should be orthogonal, but tests on the nvidia driver show that disabling
-             * blending when clearing improves the clearing performance incredibly.
-             */
-            ENTER_GL();
-            glDisable(GL_BLEND);
-            LEAVE_GL();
-            Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_table);
+/* Context activation is done by the caller. */
+static void context_apply_clear_state(struct wined3d_context *context, IWineD3DDeviceImpl *device)
+{
+    const struct StateEntry *state_table = device->StateTable;
 
-            ENTER_GL();
-            glEnable(GL_SCISSOR_TEST);
-            checkGLcall("glEnable GL_SCISSOR_TEST");
-            LEAVE_GL();
-            context->last_was_blit = FALSE;
-            Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), state_table);
-            Context_MarkStateDirty(context, STATE_SCISSORRECT, state_table);
-            break;
+    if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+    {
+        if (!context->render_offscreen) context_validate_onscreen_formats(device, context);
+        ENTER_GL();
+        context_apply_fbo_state(context);
+        LEAVE_GL();
+    }
 
-        case CTXUSAGE_DRAWPRIM:
-            /* This needs all dirty states applied */
-            if(context->last_was_blit) {
-                device->frag_pipe->enable_extension((IWineD3DDevice *)device, TRUE);
-            }
+    if (context->draw_buffer_dirty)
+    {
+        context_apply_draw_buffer(context, FALSE);
+        context->draw_buffer_dirty = FALSE;
+    }
 
-            IWineD3DDeviceImpl_FindTexUnitMap(device);
-            device_preload_textures(device);
-            if (isStateDirty(context, STATE_VDECL))
-                device_update_stream_info(device, context->gl_info);
+    if (context->last_was_blit)
+    {
+        device->frag_pipe->enable_extension((IWineD3DDevice *)device, TRUE);
+    }
 
-            ENTER_GL();
-            for (i = 0; i < context->numDirtyEntries; ++i)
-            {
-                DWORD rep = context->dirtyArray[i];
-                DWORD idx = rep / (sizeof(*context->isStateDirty) * CHAR_BIT);
-                BYTE shift = rep & ((sizeof(*context->isStateDirty) * CHAR_BIT) - 1);
-                context->isStateDirty[idx] &= ~(1 << shift);
-                state_table[rep].apply(rep, device->stateBlock, context);
-            }
-            LEAVE_GL();
-            context->numDirtyEntries = 0; /* This makes the whole list clean */
-            context->last_was_blit = FALSE;
-            break;
+    /* Blending and clearing should be orthogonal, but tests on the nvidia
+     * driver show that disabling blending when clearing improves the clearing
+     * performance incredibly. */
+    ENTER_GL();
+    glDisable(GL_BLEND);
+    glEnable(GL_SCISSOR_TEST);
+    checkGLcall("glEnable GL_SCISSOR_TEST");
+    LEAVE_GL();
 
-        case CTXUSAGE_BLIT:
-            SetupForBlit(device, context);
-            break;
+    context->last_was_blit = FALSE;
+    Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_table);
+    Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), state_table);
+    Context_MarkStateDirty(context, STATE_SCISSORRECT, state_table);
+}
 
-        default:
-            FIXME("Unexpected context usage requested\n");
+/* Context activation is done by the caller. */
+static void context_apply_draw_state(struct wined3d_context *context, IWineD3DDeviceImpl *device)
+{
+    const struct StateEntry *state_table = device->StateTable;
+    unsigned int i;
+
+    if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+    {
+        if (!context->render_offscreen) context_validate_onscreen_formats(device, context);
+        ENTER_GL();
+        context_apply_fbo_state(context);
+        LEAVE_GL();
+    }
+
+    if (context->draw_buffer_dirty)
+    {
+        context_apply_draw_buffer(context, FALSE);
+        context->draw_buffer_dirty = FALSE;
     }
+
+    if (context->last_was_blit)
+    {
+        device->frag_pipe->enable_extension((IWineD3DDevice *)device, TRUE);
+    }
+
+    IWineD3DDeviceImpl_FindTexUnitMap(device);
+    device_preload_textures(device);
+    if (isStateDirty(context, STATE_VDECL))
+        device_update_stream_info(device, context->gl_info);
+
+    ENTER_GL();
+    for (i = 0; i < context->numDirtyEntries; ++i)
+    {
+        DWORD rep = context->dirtyArray[i];
+        DWORD idx = rep / (sizeof(*context->isStateDirty) * CHAR_BIT);
+        BYTE shift = rep & ((sizeof(*context->isStateDirty) * CHAR_BIT) - 1);
+        context->isStateDirty[idx] &= ~(1 << shift);
+        state_table[rep].apply(rep, device->stateBlock, context);
+    }
+    LEAVE_GL();
+    context->numDirtyEntries = 0; /* This makes the whole list clean */
+    context->last_was_blit = FALSE;
 }
 
 static void context_setup_target(IWineD3DDeviceImpl *device,
@@ -2220,7 +2227,27 @@ struct wined3d_context *context_acquire(IWineD3DDeviceImpl *device,
         }
     }
 
-    context_apply_state(context, device, usage);
+    switch (usage)
+    {
+        case CTXUSAGE_BLIT:
+            context_apply_blit_state(context, device);
+            break;
+
+        case CTXUSAGE_CLEAR:
+            context_apply_clear_state(context, device);
+            break;
+
+        case CTXUSAGE_DRAWPRIM:
+            context_apply_draw_state(context, device);
+            break;
+
+        case CTXUSAGE_RESOURCELOAD:
+            break;
+
+        default:
+            FIXME("Unexpected context usage requested.\n");
+            break;
+    }
 
     return context;
 }




More information about the wine-cvs mailing list