Module: wine Branch: master Commit: bdd97858bff48e1b22bd56545bbe4cb4923f646a URL: http://source.winehq.org/git/wine.git/?a=commit;h=bdd97858bff48e1b22bd56545b...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Wed May 29 09:45:37 2013 +0200
wined3d: Only write gl_ClipVertex if clipping is enabled in shader_glsl_generate_ffp_vertex_shader().
---
dlls/wined3d/glsl_shader.c | 3 +- dlls/wined3d/state.c | 44 ++++++++++++++++++--------------------- dlls/wined3d/utils.c | 4 +++ dlls/wined3d/wined3d_private.h | 3 +- 4 files changed, 28 insertions(+), 26 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 9e3afe7..b46df8a 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -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, "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");
if (!settings->normal) diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 666983a..c01f516 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -593,32 +593,28 @@ void state_clipping(struct wined3d_context *context, const struct wined3d_state DWORD enable = 0xffffffff; DWORD disable = 0x00000000;
- if (use_vs(state)) + if (use_vs(state) && !context->d3d_info->vs_clipping) { - if (!context->d3d_info->vs_clipping) - { - /* 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; - } + static BOOL warned;
- /* 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 */ - context->select_shader = 1; - context->load_constants = 1; + /* The OpenGL spec says that 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] && !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 * of already set values */ diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 16e8b2d..4f3ab2f 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -3532,6 +3532,8 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_state *state, const struct { 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; if (!state->render_states[WINED3D_RS_FOGENABLE]) 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; }
+ settings->clipping = state->render_states[WINED3D_RS_CLIPPING] + && state->render_states[WINED3D_RS_CLIPPLANEENABLE]; settings->normal = !!(si->use_map & (1 << WINED3D_FFP_NORMAL)); settings->normalize = settings->normal && state->render_states[WINED3D_RS_NORMALIZENORMALS]; settings->lighting = !!state->render_states[WINED3D_RS_LIGHTING]; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index e3b55ca..55cfa94 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1716,6 +1716,7 @@ struct wined3d_ffp_vs_settings DWORD ambient_source : 2; DWORD specular_source : 2;
+ DWORD clipping : 1; DWORD normal : 1; DWORD normalize : 1; DWORD lighting : 1; @@ -1723,7 +1724,7 @@ struct wined3d_ffp_vs_settings DWORD point_size : 1; DWORD fog_mode : 2; DWORD texcoords : 8; /* MAX_TEXTURES */ - DWORD padding : 17; + DWORD padding : 16;
BYTE texgen[MAX_TEXTURES]; };