This is only temporary until a better solution is available. --- I haven't given up yet because reporting incorrect driver limits may cause more troubles than this. I made it pretty small this time.
It doesn't change any driver besides Gallium. Please review, especially the part in st_extensions.c whether it's acceptable or whether some other conditions should be used instead. (e.g. strcmp(get_vendor(), "X.Org R300 Project") is possible too) I plan to implement a better solution, so that this code can go away. I see only two ways out of this. The first one is: - Let Gallium drivers report an error when they can't run a certain shader. The second one is: - Remove the Mesa IR. - Replace TGSI by the GLSL IR completely. - Move the dead-constant elimination pass from the R300 compiler to the GLSL IR. - Implement a GLSL optimization pass which breaks varying arrays into separate elements when possible. Thanks. src/glsl/linker.cpp | 9 ++++++--- src/mesa/main/mtypes.h | 9 +++++++++ src/mesa/state_tracker/st_extensions.c | 8 ++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 3527088..fe35ed3 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -1814,7 +1814,8 @@ assign_varying_locations(struct gl_context *ctx, } if (ctx->API == API_OPENGLES2 || prog->Version == 100) { - if (varying_vectors > ctx->Const.MaxVarying) { + if (varying_vectors > ctx->Const.MaxVarying && + !ctx->Const.GLSLSkipStrictMaxVaryingLimitCheck) { linker_error(prog, "shader uses too many varying vectors " "(%u > %u)\n", varying_vectors, ctx->Const.MaxVarying); @@ -1822,7 +1823,8 @@ assign_varying_locations(struct gl_context *ctx, } } else { const unsigned float_components = varying_vectors * 4; - if (float_components > ctx->Const.MaxVarying * 4) { + if (float_components > ctx->Const.MaxVarying * 4 && + !ctx->Const.GLSLSkipStrictMaxVaryingLimitCheck) { linker_error(prog, "shader uses too many varying components " "(%u > %u)\n", float_components, ctx->Const.MaxVarying * 4); @@ -1959,7 +1961,8 @@ check_resources(struct gl_context *ctx, struct gl_shader_program *prog) shader_names[i]); } - if (sh->num_uniform_components > max_uniform_components[i]) { + if (sh->num_uniform_components > max_uniform_components[i] && + !ctx->Const.GLSLSKipStrictMaxUniformLimitCheck) { linker_error(prog, "Too many %s shader uniform components", shader_names[i]); } diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index fc494f7..7e9f6ca 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2829,6 +2829,15 @@ struct gl_constants * Texture borders are deprecated in GL 3.0. **/ GLboolean StripTextureBorder; + + /** + * For drivers which can do a better job at eliminating unused varyings + * and uniforms than the GLSL compiler. + * + * XXX Remove these as soon as a better solution is available. + */ + GLboolean GLSLSkipStrictMaxVaryingLimitCheck; + GLboolean GLSLSKipStrictMaxUniformLimitCheck; }; diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 37fb3e7..fdaffa8 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -224,6 +224,14 @@ void st_init_limits(struct st_context *st) c->UniformBooleanTrue = ~0; c->StripTextureBorder = GL_TRUE; + + c->GLSLSKipStrictMaxUniformLimitCheck = + screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, + PIPE_SHADER_CAP_MAX_CONSTS) <= 256; + + c->GLSLSkipStrictMaxVaryingLimitCheck = + screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, + PIPE_SHADER_CAP_MAX_INPUTS) <= 10; } -- 1.7.5.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev