wined3d: Store a pointer to the state table in the context.

This commit is contained in:
Henri Verbeet 2011-07-24 21:48:11 +02:00 committed by Alexandre Julliard
parent 68b9071329
commit b09b7e323c
5 changed files with 25 additions and 22 deletions

View File

@ -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_texfactor_arbfp(context, state, STATE_RENDER(WINED3DRS_TEXTUREFACTOR));
state_arb_specularenable(context, state, STATE_RENDER(WINED3DRS_SPECULARENABLE)); 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); 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 * Don't call shader_select if the vertex shader is dirty, because it will be called later on by the vertex
* shader handler * 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); device->shader_backend->shader_select(context, use_pshader, use_vshader);
if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && (use_vshader || use_pshader)) if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && (use_vshader || use_pshader))

View File

@ -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 * startup, and blitting disables all shaders and dirtifies all shader
* states. If atifs can deal with this it keeps the rest of the code * states. If atifs can deal with this it keeps the rest of the code
* simpler. */ * 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); device->shader_backend->shader_select(context, FALSE, use_vshader);

View File

@ -1348,13 +1348,14 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
} }
ret->gl_info = gl_info; ret->gl_info = gl_info;
ret->state_table = device->StateTable;
/* Mark all states dirty to force a proper initialization of the states /* Mark all states dirty to force a proper initialization of the states
* on the first use of the context. */ * on the first use of the context. */
for (state = 0; state <= STATE_HIGHEST; ++state) for (state = 0; state <= STATE_HIGHEST; ++state)
{ {
if (device->StateTable[state].representative) if (ret->state_table[state].representative)
context_invalidate_state(ret, state, device->StateTable); context_invalidate_state(ret, state, ret->state_table);
} }
ret->swapchain = swapchain; 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) static void SetupForBlit(struct wined3d_device *device, struct wined3d_context *context)
{ {
int i; 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; const struct wined3d_gl_info *gl_info = context->gl_info;
UINT width = context->current_rt->resource.width; UINT width = context->current_rt->resource.width;
UINT height = context->current_rt->resource.height; 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 */ /* The caller provides a context */
static void context_validate_onscreen_formats(struct wined3d_device *device, static void context_validate_onscreen_formats(struct wined3d_context *context,
struct wined3d_context *context, const struct wined3d_surface *depth_stencil) const struct wined3d_surface *depth_stencil)
{ {
/* Onscreen surfaces are always in a swapchain */ /* Onscreen surfaces are always in a swapchain */
struct wined3d_swapchain *swapchain = context->current_rt->container.u.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 */ /* The currently active context is the necessary context to access the swapchain's onscreen buffers */
surface_load_location(context->current_rt, SFLAG_INTEXTURE, NULL); surface_load_location(context->current_rt, SFLAG_INTEXTURE, NULL);
swapchain->render_to_fbo = TRUE; 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) 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) 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) if (context->render_offscreen)
{ {
@ -2044,7 +2045,7 @@ void context_apply_blit_state(struct wined3d_context *context, struct wined3d_de
LEAVE_GL(); LEAVE_GL();
SetupForBlit(device, context); 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, 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, BOOL context_apply_clear_state(struct wined3d_context *context, struct wined3d_device *device,
UINT rt_count, const struct wined3d_fb_state *fb) 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; DWORD rt_mask = 0;
UINT i; UINT i;
struct wined3d_surface **rts = fb->render_targets; 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) 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(); 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 /* 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 * next draw. Otherwise we could mark the framebuffer state clean here, once the
* state management allows this */ * state management allows this */
context_invalidate_state(context, STATE_FRAMEBUFFER, device->StateTable); context_invalidate_state(context, STATE_FRAMEBUFFER, state_table);
} }
else 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_apply_draw_buffers(context, rt_mask);
context->draw_buffers_mask = 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) 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) BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_device *device)
{ {
const struct wined3d_state *state = &device->stateBlock->state; 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; const struct wined3d_fb_state *fb = state->fb;
unsigned int i; unsigned int i;
@ -2289,7 +2290,7 @@ static void context_setup_target(struct wined3d_device *device,
struct wined3d_context *context, struct wined3d_surface *target) struct wined3d_context *context, struct wined3d_surface *target)
{ {
BOOL old_render_offscreen = context->render_offscreen, render_offscreen; 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; if (!target) return;
render_offscreen = surface_is_offscreen(target); render_offscreen = surface_is_offscreen(target);

View File

@ -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 /* 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 */ * 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); device->shader_backend->shader_select(context, use_ps(state), TRUE);
if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT)) 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; 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); device->shader_backend->shader_select(context, use_pshader, use_vshader);

View File

@ -1049,6 +1049,7 @@ BOOL wined3d_event_query_supported(const struct wined3d_gl_info *gl_info) DECLSP
struct wined3d_context struct wined3d_context
{ {
const struct wined3d_gl_info *gl_info; const struct wined3d_gl_info *gl_info;
const struct StateEntry *state_table;
/* State dirtification /* State dirtification
* dirtyArray is an array that contains markers for dirty states. numDirtyEntries states are dirty, their numbers are in indices * 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, * 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, static inline void context_apply_state(struct wined3d_context *context,
const struct wined3d_state *state, DWORD state_id) const struct wined3d_state *state, DWORD state_id)
{ {
const struct StateEntry *statetable = context->swapchain->device->StateTable; const struct StateEntry *state_table = context->state_table;
DWORD rep = statetable[state_id].representative; DWORD rep = state_table[state_id].representative;
statetable[rep].apply(context, state, rep); state_table[rep].apply(context, state, rep);
} }
/* The WNDCLASS-Name for the fake window which we use to retrieve the GL capabilities */ /* The WNDCLASS-Name for the fake window which we use to retrieve the GL capabilities */