[PATCH 1/5] wined3d: Split context_apply_state() into separate functions for each usage.
Henri Verbeet
hverbeet at codeweavers.com
Mon May 3 15:03:27 CDT 2010
---
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;
}
--
1.6.4.4
More information about the wine-patches
mailing list