Module: wine Branch: master Commit: c1af40505402ea4e5e4233a4ac739117a00429c7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c1af40505402ea4e5e4233a4ac...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Fri Aug 16 09:12:29 2013 +0200
wined3d: Only set fragment pipe uniforms if they're needed by the shader.
In principle the GL driver also checks the location, but it turns out to be slightly faster to do it ourselves.
---
dlls/wined3d/glsl_shader.c | 24 +++++++++++++++++------- 1 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index cbf2c60..e61b479 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -908,16 +908,26 @@ static void shader_glsl_load_constants(void *shader_priv, const struct wined3d_c
for (i = 0; i < MAX_TEXTURES; ++i) { + if (prog->ps.bumpenv_mat_location[i] == -1) + continue; + GL_EXTCALL(glUniformMatrix2fvARB(prog->ps.bumpenv_mat_location[i], 1, 0, - (const float *)&state->texture_states[i][WINED3D_TSS_BUMPENV_MAT00])); - GL_EXTCALL(glUniform1fARB(prog->ps.bumpenv_lum_scale_location[i], - *(const float *)&state->texture_states[i][WINED3D_TSS_BUMPENV_LSCALE])); - GL_EXTCALL(glUniform1fARB(prog->ps.bumpenv_lum_offset_location[i], - *(const float *)&state->texture_states[i][WINED3D_TSS_BUMPENV_LOFFSET])); + (const float *)&state->texture_states[i][WINED3D_TSS_BUMPENV_MAT00])); + + if (prog->ps.bumpenv_lum_scale_location[i] != -1) + { + GL_EXTCALL(glUniform1fvARB(prog->ps.bumpenv_lum_scale_location[i], 1, + (const float *)&state->texture_states[i][WINED3D_TSS_BUMPENV_LSCALE])); + GL_EXTCALL(glUniform1fvARB(prog->ps.bumpenv_lum_offset_location[i], 1, + (const float *)&state->texture_states[i][WINED3D_TSS_BUMPENV_LOFFSET])); + } }
- D3DCOLORTOGLFLOAT4(state->render_states[WINED3D_RS_TEXTUREFACTOR], col); - GL_EXTCALL(glUniform4fARB(prog->ps.tex_factor_location, col[0], col[1], col[2], col[3])); + if (prog->ps.tex_factor_location != -1) + { + D3DCOLORTOGLFLOAT4(state->render_states[WINED3D_RS_TEXTUREFACTOR], col); + GL_EXTCALL(glUniform4fvARB(prog->ps.tex_factor_location, 1, col)); + }
if (state->render_states[WINED3D_RS_SPECULARENABLE]) GL_EXTCALL(glUniform4fARB(prog->ps.specular_enable_location, 1.0f, 1.0f, 1.0f, 0.0f));