--- src/gallium/drivers/r300/r300_screen.c | 3 ++- src/gallium/include/pipe/p_defines.h | 3 ++- src/glsl/linker.cpp | 6 ++++++ src/mesa/main/mtypes.h | 9 +++++++++ src/mesa/state_tracker/st_extensions.c | 3 +++ 5 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c index 0bae065..a761939 100644 --- a/src/gallium/drivers/r300/r300_screen.c +++ b/src/gallium/drivers/r300/r300_screen.c @@ -102,6 +102,7 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_TEXTURE_BARRIER: case PIPE_CAP_TGSI_CAN_COMPACT_VARYINGS: case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS: + case PIPE_CAP_SEPARATE_COLOR_VARYINGS: return 1; /* r300 cannot do swizzling of compressed textures. Supported otherwise. */ @@ -182,7 +183,7 @@ static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e * R500 has the ability to turn 3rd and 4th color into * additional texcoords but there is no two-sided color * selection then. However the facing bit can be used instead. */ - return 10; + return 8; case PIPE_SHADER_CAP_MAX_CONSTS: return is_r500 ? 256 : 32; case PIPE_SHADER_CAP_MAX_CONST_BUFFERS: diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 30f1d7f..5229c5f 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -467,7 +467,8 @@ enum pipe_cap { PIPE_CAP_CONDITIONAL_RENDER = 52, PIPE_CAP_TEXTURE_BARRIER = 53, PIPE_CAP_TGSI_CAN_COMPACT_VARYINGS = 54, /* temporary */ - PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS = 55 /* temporary */ + PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS = 55, /* temporary */ + PIPE_CAP_SEPARATE_COLOR_VARYINGS = 56 }; /** diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index b8a7126..e9298bb 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -1805,6 +1805,12 @@ assign_varying_locations(struct gl_context *ctx, */ var->mode = ir_var_auto; } else { + if (ctx->Const.GLSLSeparateColorVaryings && + (var->location == FRAG_ATTRIB_COL0 || + var->location == FRAG_ATTRIB_COL1)) { + continue; + } + /* The packing rules are used for vertex shader inputs are also * used for fragment shader inputs. */ diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 1934349..9e9ad83 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2839,6 +2839,15 @@ struct gl_constants */ GLboolean GLSLSkipStrictMaxVaryingLimitCheck; GLboolean GLSLSkipStrictMaxUniformLimitCheck; + + /** + * Whether the color varyings do not share varying slots with generic + * varyings. In such a case, the driver must not include the color + * varyings in the maximum number of varyings limit. In return, + * the GLSL linker will not count the color varyings to the number of + * used varying components. + */ + GLboolean GLSLSeparateColorVaryings; }; diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 457d5d6..7a7919f 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -228,6 +228,9 @@ void st_init_limits(struct st_context *st) c->GLSLSkipStrictMaxVaryingLimitCheck = screen->get_param(screen, PIPE_CAP_TGSI_CAN_COMPACT_VARYINGS); + + c->GLSLSeparateColorVaryings = + screen->get_param(screen, PIPE_CAP_SEPARATE_COLOR_VARYINGS); } -- 1.7.4.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev