wined3d: Only write gl_ClipVertex if clipping is enabled in shader_glsl_generate_ffp_vertex_shader().

This commit is contained in:
Henri Verbeet 2013-05-29 09:45:37 +02:00 committed by Alexandre Julliard
parent 1c2392ddb0
commit bdd97858bf
4 changed files with 26 additions and 24 deletions

View File

@ -4937,7 +4937,8 @@ static GLhandleARB shader_glsl_generate_ffp_vertex_shader(struct wined3d_shader_
shader_addline(buffer, "vec4 ec_pos = gl_ModelViewMatrix * gl_Vertex;\n"); shader_addline(buffer, "vec4 ec_pos = gl_ModelViewMatrix * gl_Vertex;\n");
shader_addline(buffer, "gl_Position = gl_ProjectionMatrix * ec_pos;\n"); shader_addline(buffer, "gl_Position = gl_ProjectionMatrix * ec_pos;\n");
shader_addline(buffer, "gl_ClipVertex = ec_pos;\n"); if (settings->clipping)
shader_addline(buffer, "gl_ClipVertex = ec_pos;\n");
shader_addline(buffer, "ec_pos /= ec_pos.w;\n"); shader_addline(buffer, "ec_pos /= ec_pos.w;\n");
if (!settings->normal) if (!settings->normal)

View File

@ -593,32 +593,28 @@ void state_clipping(struct wined3d_context *context, const struct wined3d_state
DWORD enable = 0xffffffff; DWORD enable = 0xffffffff;
DWORD disable = 0x00000000; DWORD disable = 0x00000000;
if (use_vs(state)) if (use_vs(state) && !context->d3d_info->vs_clipping)
{ {
if (!context->d3d_info->vs_clipping) static BOOL warned;
{
/* The spec says that opengl clipping planes are disabled when using shaders. Direct3D planes aren't,
* so that is an issue. The MacOS ATI driver keeps clipping planes activated with shaders in some
* conditions I got sick of tracking down. The shader state handler disables all clip planes because
* of that - don't do anything here and keep them disabled
*/
if (state->render_states[WINED3D_RS_CLIPPLANEENABLE])
{
static BOOL warned = FALSE;
if(!warned) {
FIXME("Clipping not supported with vertex shaders\n");
warned = TRUE;
}
}
return;
}
/* glEnable(GL_CLIP_PLANEx) doesn't apply to vertex shaders. The enabled / disabled planes are /* The OpenGL spec says that clipping planes are disabled when using
* hardcoded into the shader. Update the shader to update the enabled clipplanes */ * shaders. Direct3D planes aren't, so that is an issue. The MacOS ATI
context->select_shader = 1; * driver keeps clipping planes activated with shaders in some
context->load_constants = 1; * conditions I got sick of tracking down. The shader state handler
* disables all clip planes because of that - don't do anything here
* and keep them disabled. */
if (state->render_states[WINED3D_RS_CLIPPLANEENABLE] && !warned++)
FIXME("Clipping not supported with vertex shaders\n");
return;
} }
/* glEnable(GL_CLIP_PLANEx) doesn't apply to (ARB backend) vertex shaders.
* The enabled / disabled planes are hardcoded into the shader. Update the
* shader to update the enabled clipplanes. In case of fixed function, we
* need to update the clipping field from ffp_vertex_settings. */
context->select_shader = 1;
context->load_constants = 1;
/* TODO: Keep track of previously enabled clipplanes to avoid unnecessary resetting /* TODO: Keep track of previously enabled clipplanes to avoid unnecessary resetting
* of already set values * of already set values
*/ */

View File

@ -3532,6 +3532,8 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_state *state, const struct
{ {
memset(settings, 0, sizeof(*settings)); memset(settings, 0, sizeof(*settings));
settings->clipping = state->render_states[WINED3D_RS_CLIPPING]
&& state->render_states[WINED3D_RS_CLIPPLANEENABLE];
settings->point_size = state->gl_primitive_type == GL_POINTS; settings->point_size = state->gl_primitive_type == GL_POINTS;
if (!state->render_states[WINED3D_RS_FOGENABLE]) if (!state->render_states[WINED3D_RS_FOGENABLE])
settings->fog_mode = WINED3D_FFP_VS_FOG_OFF; settings->fog_mode = WINED3D_FFP_VS_FOG_OFF;
@ -3551,6 +3553,8 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_state *state, const struct
return; return;
} }
settings->clipping = state->render_states[WINED3D_RS_CLIPPING]
&& state->render_states[WINED3D_RS_CLIPPLANEENABLE];
settings->normal = !!(si->use_map & (1 << WINED3D_FFP_NORMAL)); settings->normal = !!(si->use_map & (1 << WINED3D_FFP_NORMAL));
settings->normalize = settings->normal && state->render_states[WINED3D_RS_NORMALIZENORMALS]; settings->normalize = settings->normal && state->render_states[WINED3D_RS_NORMALIZENORMALS];
settings->lighting = !!state->render_states[WINED3D_RS_LIGHTING]; settings->lighting = !!state->render_states[WINED3D_RS_LIGHTING];

View File

@ -1716,6 +1716,7 @@ struct wined3d_ffp_vs_settings
DWORD ambient_source : 2; DWORD ambient_source : 2;
DWORD specular_source : 2; DWORD specular_source : 2;
DWORD clipping : 1;
DWORD normal : 1; DWORD normal : 1;
DWORD normalize : 1; DWORD normalize : 1;
DWORD lighting : 1; DWORD lighting : 1;
@ -1723,7 +1724,7 @@ struct wined3d_ffp_vs_settings
DWORD point_size : 1; DWORD point_size : 1;
DWORD fog_mode : 2; DWORD fog_mode : 2;
DWORD texcoords : 8; /* MAX_TEXTURES */ DWORD texcoords : 8; /* MAX_TEXTURES */
DWORD padding : 17; DWORD padding : 16;
BYTE texgen[MAX_TEXTURES]; BYTE texgen[MAX_TEXTURES];
}; };