wined3d: Move lowest_disabled_stage to the context.

This commit is contained in:
Henri Verbeet 2013-10-06 17:33:06 +02:00 committed by Alexandre Julliard
parent 242a79a9d7
commit 8644b62726
8 changed files with 32 additions and 69 deletions

View File

@ -144,9 +144,9 @@ static const char *arb_get_helper_value(enum wined3d_shader_type shader, enum ar
}
}
static inline BOOL ffp_clip_emul(const struct wined3d_state *state)
static inline BOOL ffp_clip_emul(const struct wined3d_context *context)
{
return state->lowest_disabled_stage < 7;
return context->lowest_disabled_stage < 7;
}
/* ARB_program_shader private data */
@ -4596,9 +4596,7 @@ static void find_arb_vs_compile_args(const struct wined3d_state *state,
{
args->ps_signature = ~0;
if (!d3d_info->vs_clipping && adapter->fragment_pipe == &arbfp_fragment_pipeline)
{
args->clip.boolclip.clip_texcoord = ffp_clip_emul(state) ? d3d_info->limits.ffp_blend_stages : 0;
}
args->clip.boolclip.clip_texcoord = ffp_clip_emul(context) ? d3d_info->limits.ffp_blend_stages : 0;
/* Otherwise: Setting boolclip_compare set clip_texcoord to 0 */
}

View File

@ -2368,7 +2368,7 @@ static void context_invalidate_texture_stage(struct wined3d_context *context, DW
static void context_update_fixed_function_usage_map(struct wined3d_context *context,
const struct wined3d_state *state)
{
UINT i;
UINT i, start, end;
context->fixed_function_usage_map = 0;
for (i = 0; i < MAX_TEXTURES; ++i)
@ -2400,6 +2400,23 @@ static void context_update_fixed_function_usage_map(struct wined3d_context *cont
&& i < MAX_TEXTURES - 1)
context->fixed_function_usage_map |= (1 << (i + 1));
}
if (i < context->lowest_disabled_stage)
{
start = i;
end = context->lowest_disabled_stage;
}
else
{
start = context->lowest_disabled_stage;
end = i;
}
context->lowest_disabled_stage = i;
for (i = start + 1; i < end; ++i)
{
context_invalidate_state(context, STATE_TEXTURESTAGE(i, WINED3D_TSS_COLOR_OP));
}
}
static void context_map_fixed_function_samplers(struct wined3d_context *context,
@ -2413,7 +2430,7 @@ static void context_map_fixed_function_samplers(struct wined3d_context *context,
ffu_map = context->fixed_function_usage_map;
if (d3d_info->limits.ffp_textures == d3d_info->limits.ffp_blend_stages
|| state->lowest_disabled_stage <= d3d_info->limits.ffp_textures)
|| context->lowest_disabled_stage <= d3d_info->limits.ffp_textures)
{
for (i = 0; ffu_map; ffu_map >>= 1, ++i)
{

View File

@ -3074,56 +3074,6 @@ void CDECL wined3d_device_set_texture_stage_state(struct wined3d_device *device,
return;
}
if (stage > device->state.lowest_disabled_stage
&& device->StateTable[STATE_TEXTURESTAGE(0, state)].representative
== STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP))
{
/* Colorop change above lowest disabled stage? That won't change
* anything in the GL setup. Changes in other states are important on
* disabled stages too. */
return;
}
if (state == WINED3D_TSS_COLOR_OP)
{
unsigned int i;
if (value == WINED3D_TOP_DISABLE && old_value != WINED3D_TOP_DISABLE)
{
/* Previously enabled stage disabled now. Make sure to dirtify
* all enabled stages above stage, they have to be disabled.
*
* The current stage is dirtified below. */
for (i = stage + 1; i < device->state.lowest_disabled_stage; ++i)
{
TRACE("Additionally dirtifying stage %u.\n", i);
device_invalidate_state(device, STATE_TEXTURESTAGE(i, WINED3D_TSS_COLOR_OP));
}
device->state.lowest_disabled_stage = stage;
TRACE("New lowest disabled: %u.\n", stage);
}
else if (value != WINED3D_TOP_DISABLE && old_value == WINED3D_TOP_DISABLE)
{
/* Previously disabled stage enabled. Stages above it may need
* enabling. Stage must be lowest_disabled_stage here, if it's
* bigger success is returned above, and stages below the lowest
* disabled stage can't be enabled (because they are enabled
* already).
*
* Again stage stage doesn't need to be dirtified here, it is
* handled below. */
for (i = stage + 1; i < d3d_info->limits.ffp_blend_stages; ++i)
{
if (device->update_state->texture_states[i][WINED3D_TSS_COLOR_OP] == WINED3D_TOP_DISABLE)
break;
TRACE("Additionally dirtifying stage %u due to enable.\n", i);
device_invalidate_state(device, STATE_TEXTURESTAGE(i, WINED3D_TSS_COLOR_OP));
}
device->state.lowest_disabled_stage = i;
TRACE("New lowest disabled: %u.\n", i);
}
}
device_invalidate_state(device, STATE_TEXTURESTAGE(stage, state));
}

View File

@ -498,16 +498,16 @@ static void nvrc_colorop(struct wined3d_context *context, const struct wined3d_s
context_active_texture(context, gl_info, mapped_stage);
}
if (state->lowest_disabled_stage > 0)
if (context->lowest_disabled_stage > 0)
{
gl_info->gl_ops.gl.p_glEnable(GL_REGISTER_COMBINERS_NV);
GL_EXTCALL(glCombinerParameteriNV(GL_NUM_GENERAL_COMBINERS_NV, state->lowest_disabled_stage));
GL_EXTCALL(glCombinerParameteriNV(GL_NUM_GENERAL_COMBINERS_NV, context->lowest_disabled_stage));
}
else
{
gl_info->gl_ops.gl.p_glDisable(GL_REGISTER_COMBINERS_NV);
}
if (stage >= state->lowest_disabled_stage)
if (stage >= context->lowest_disabled_stage)
{
TRACE("Stage disabled\n");
if (mapped_stage != WINED3D_UNMAPPED_STAGE)
@ -590,7 +590,7 @@ static void nvts_texdim(struct wined3d_context *context, const struct wined3d_st
* will take care of this business. */
if (mapped_stage == WINED3D_UNMAPPED_STAGE || mapped_stage >= context->gl_info->limits.textures)
return;
if (sampler >= state->lowest_disabled_stage)
if (sampler >= context->lowest_disabled_stage)
return;
if (isStateDirty(context, STATE_TEXTURESTAGE(sampler, WINED3D_TSS_COLOR_OP)))
return;

View File

@ -3151,7 +3151,7 @@ static void tex_colorop(struct wined3d_context *context, const struct wined3d_st
context_active_texture(context, gl_info, mapped_stage);
}
if (stage >= state->lowest_disabled_stage)
if (stage >= context->lowest_disabled_stage)
{
TRACE("Stage disabled\n");
if (mapped_stage != WINED3D_UNMAPPED_STAGE)
@ -3655,7 +3655,7 @@ static void sampler(struct wined3d_context *context, const struct wined3d_state
checkGLcall("glTexEnvf(GL_TEXTURE_LOD_BIAS_EXT, ...)");
}
if (!use_ps(state) && sampler < state->lowest_disabled_stage)
if (!use_ps(state) && sampler < context->lowest_disabled_stage)
{
if (state->render_states[WINED3D_RS_COLORKEYENABLE] && !sampler)
{
@ -3671,7 +3671,7 @@ static void sampler(struct wined3d_context *context, const struct wined3d_state
}
else
{
if (sampler < state->lowest_disabled_stage)
if (sampler < context->lowest_disabled_stage)
{
/* TODO: What should I do with pixel shaders here ??? */
if (state->render_states[WINED3D_RS_COLORKEYENABLE] && !sampler)

View File

@ -1318,9 +1318,7 @@ static void state_init_default(struct wined3d_state *state, const struct wined3d
state->texture_states[i][WINED3D_TSS_ALPHA_ARG0] = WINED3DTA_CURRENT;
state->texture_states[i][WINED3D_TSS_RESULT_ARG] = WINED3DTA_CURRENT;
}
state->lowest_disabled_stage = 1;
/* Sampler states*/
for (i = 0 ; i < MAX_COMBINED_SAMPLERS; ++i)
{
TRACE("Setting up default samplers states for sampler %u.\n", i);

View File

@ -3569,7 +3569,7 @@ void sampler_texdim(struct wined3d_context *context, const struct wined3d_state
* shaders, or if tex_colorop will take care of this business. */
if (mapped_stage == WINED3D_UNMAPPED_STAGE || mapped_stage >= context->gl_info->limits.textures)
return;
if (sampler >= state->lowest_disabled_stage)
if (sampler >= context->lowest_disabled_stage)
return;
if (isStateDirty(context, STATE_TEXTURESTAGE(sampler, WINED3D_TSS_COLOR_OP)))
return;

View File

@ -1087,7 +1087,8 @@ struct wined3d_context
DWORD texShaderBumpMap : 8; /* MAX_TEXTURES, 8 */
DWORD lastWasPow2Texture : 8; /* MAX_TEXTURES, 8 */
DWORD fixed_function_usage_map : 8; /* MAX_TEXTURES, 8 */
DWORD padding : 24;
DWORD lowest_disabled_stage : 4; /* Max MAX_TEXTURES, 8 */
DWORD padding : 20;
DWORD shader_update_mask;
DWORD constant_update_mask;
DWORD numbered_array_mask;
@ -1842,7 +1843,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];