Module: wine Branch: master Commit: 9811d85141610f903d6c8de3b00be6c853ece182 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9811d85141610f903d6c8de3b0...
Author: Matteo Bruni mbruni@codeweavers.com Date: Wed Mar 18 21:07:38 2015 +0100
wined3d: Don't use the builtin FFP uniform for the modelview matrix.
---
dlls/wined3d/glsl_shader.c | 38 ++++++++++++++++++++++++++++++-------- dlls/wined3d/state.c | 2 +- dlls/wined3d/wined3d_private.h | 5 ++--- 3 files changed, 33 insertions(+), 12 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 6a4f233..3d48da1 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -116,6 +116,8 @@ struct glsl_vs_program GLint uniform_i_locations[MAX_CONST_I]; GLint uniform_b_locations[MAX_CONST_B]; GLint pos_fixup_location; + + GLint modelview_matrix_location; };
struct glsl_gs_program @@ -775,6 +777,15 @@ static void shader_glsl_load_constants(void *shader_priv, struct wined3d_context checkGLcall("glUniform4fv"); }
+ if (update_mask & WINED3D_SHADER_CONST_FFP_MODELVIEW) + { + struct wined3d_matrix mat; + + get_modelview_matrix(context, state, &mat); + GL_EXTCALL(glUniformMatrix4fv(prog->vs.modelview_matrix_location, 1, FALSE, (GLfloat *)&mat)); + checkGLcall("glUniformMatrix4fv"); + } + if (update_mask & WINED3D_SHADER_CONST_PS_F) shader_glsl_load_constantsF(pshader, gl_info, state->ps_consts_f, prog->ps.uniform_f_locations, &priv->pconst_heap, priv->stack, constant_version); @@ -4976,7 +4987,10 @@ static GLuint shader_glsl_generate_ffp_vertex_shader(struct wined3d_shader_buffe
shader_addline(buffer, "#version 120\n"); shader_addline(buffer, "\n"); - shader_addline(buffer, "void main()\n{\n"); + + shader_addline(buffer, "uniform mat4 ffp_modelview_matrix;\n"); + + shader_addline(buffer, "\nvoid main()\n{\n"); shader_addline(buffer, "float m;\n"); shader_addline(buffer, "vec3 r;\n");
@@ -4988,7 +5002,7 @@ static GLuint shader_glsl_generate_ffp_vertex_shader(struct wined3d_shader_buffe } else { - shader_addline(buffer, "vec4 ec_pos = gl_ModelViewMatrix * gl_Vertex;\n"); + shader_addline(buffer, "vec4 ec_pos = ffp_modelview_matrix * gl_Vertex;\n"); shader_addline(buffer, "gl_Position = gl_ProjectionMatrix * ec_pos;\n"); if (settings->clipping) shader_addline(buffer, "gl_ClipVertex = ec_pos;\n"); @@ -5755,6 +5769,8 @@ static void shader_glsl_init_vs_uniform_locations(const struct wined3d_gl_info * }
vs->pos_fixup_location = GL_EXTCALL(glGetUniformLocation(program_id, "posFixup")); + + vs->modelview_matrix_location = GL_EXTCALL(glGetUniformLocation(program_id, "ffp_modelview_matrix")); }
static void shader_glsl_init_ps_uniform_locations(const struct wined3d_gl_info *gl_info, @@ -6055,6 +6071,10 @@ static void set_glsl_shader_program(const struct wined3d_context *context, const shader_glsl_init_uniform_block_bindings(gl_info, program_id, &vshader->reg_maps, 0, gl_info->limits.vertex_uniform_blocks); } + else + { + entry->constant_update_mask |= WINED3D_SHADER_CONST_FFP_MODELVIEW; + }
if (gshader) shader_glsl_init_uniform_block_bindings(gl_info, program_id, &gshader->reg_maps, @@ -6971,9 +6991,6 @@ static void glsl_vertex_pipe_vdecl(struct wined3d_context *context,
if (transformed != wasrhw) { - if (!isStateDirty(context, STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(0))) - && !isStateDirty(context, STATE_TRANSFORM(WINED3D_TS_VIEW))) - transform_world(context, state, STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(0))); if (!isStateDirty(context, STATE_TRANSFORM(WINED3D_TS_PROJECTION)) && !isStateDirty(context, STATE_VIEWPORT)) transform_projection(context, state, STATE_TRANSFORM(WINED3D_TS_PROJECTION)); @@ -7026,14 +7043,19 @@ static void glsl_vertex_pipe_vs(struct wined3d_context *context, context_apply_state(context, state, STATE_VDECL); }
+static void glsl_vertex_pipe_world(struct wined3d_context *context, + const struct wined3d_state *state, DWORD state_id) +{ + context->constant_update_mask |= WINED3D_SHADER_CONST_FFP_MODELVIEW; +} + void glsl_vertex_pipe_view(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { const struct wined3d_gl_info *gl_info = context->gl_info; const struct wined3d_light_info *light = NULL; unsigned int k;
- if (!isStateDirty(context, STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(0)))) - transform_world(context, state, state_id); + context->constant_update_mask |= WINED3D_SHADER_CONST_FFP_MODELVIEW;
for (k = 0; k < gl_info->limits.lights; ++k) { @@ -7132,7 +7154,7 @@ static const struct StateEntryTemplate glsl_vertex_pipe_vp_states[] = {STATE_TRANSFORM(WINED3D_TS_TEXTURE5), {STATE_TEXTURESTAGE(5, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), NULL }, WINED3D_GL_EXT_NONE }, {STATE_TRANSFORM(WINED3D_TS_TEXTURE6), {STATE_TEXTURESTAGE(6, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), NULL }, WINED3D_GL_EXT_NONE }, {STATE_TRANSFORM(WINED3D_TS_TEXTURE7), {STATE_TEXTURESTAGE(7, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(0)), {STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(0)), transform_world }, WINED3D_GL_EXT_NONE }, + {STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(0)), {STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(0)), glsl_vertex_pipe_world }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(0, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(0, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), transform_texture }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(1, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(1, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), transform_texture }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(2, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(2, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), transform_texture }, WINED3D_GL_EXT_NONE }, diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 8bbe59d..65f43a2 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -3841,7 +3841,7 @@ static void shader_bumpenv(struct wined3d_context *context, const struct wined3d context->constant_update_mask |= WINED3D_SHADER_CONST_PS_BUMP_ENV; }
-void transform_world(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) +static void transform_world(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { const struct wined3d_gl_info *gl_info = context->gl_info; struct wined3d_matrix mat; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index a6c141c..f05e72f 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -306,7 +306,8 @@ enum wined3d_shader_resource_type #define WINED3D_SHADER_CONST_PS_BUMP_ENV 0x00000080 #define WINED3D_SHADER_CONST_PS_Y_CORR 0x00000100 #define WINED3D_SHADER_CONST_PS_NP2_FIXUP 0x00000200 -#define WINED3D_SHADER_CONST_FFP_PS 0x00000400 +#define WINED3D_SHADER_CONST_FFP_MODELVIEW 0x00000400 +#define WINED3D_SHADER_CONST_FFP_PS 0x00000800
enum wined3d_shader_register_type { @@ -2807,8 +2808,6 @@ void sampler_texmatrix(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN; void state_specularenable(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN; -void transform_world(struct wined3d_context *context, - const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN; void transform_projection(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN; void transform_texture(struct wined3d_context *context,