[Mesa-dev] [PATCH 1/2] mesa, gallium: add a cap for GPUs without unified color+generic varying slots

Ian Romanick idr at freedesktop.org
Wed Dec 14 09:30:18 PST 2011


On 12/13/2011 04:32 PM, Marek Olšák wrote:
> ---
>   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;

Why are you trying to make r300g behave differently the every other 
driver that has existed for that same hardware?  This doesn't make any 
sense.  This is not Apple's driver works for r300 hardware, and it's not 
how AMD's Windows driver works (worked, anyway) for r300 hardware.

This feels like an unnecessary hack.

>           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);
>   }
>
>


More information about the mesa-dev mailing list