[Mesa-dev] [PATCH] st/dri: add a way to force MSAA on with an environment variable

Brian Paul brianp at vmware.com
Mon Dec 10 14:14:57 PST 2012


On 12/10/2012 01:58 PM, Marek Olšák wrote:
> There are 2 ways. I prefer the former:
>    GALLIUM_MSAA=n
>    __GL_FSAA_MODE=n
>
> Tested with ETQW, which doesn't support MSAA on Linux. This is
> the only way to get MSAA there.
> ---
>   src/gallium/state_trackers/dri/common/dri_screen.c |   43 ++++++++++++++++++--
>   1 file changed, 39 insertions(+), 4 deletions(-)
>
> diff --git a/src/gallium/state_trackers/dri/common/dri_screen.c b/src/gallium/state_trackers/dri/common/dri_screen.c
> index 6d220f2..a908e28 100644
> --- a/src/gallium/state_trackers/dri/common/dri_screen.c
> +++ b/src/gallium/state_trackers/dri/common/dri_screen.c
> @@ -194,6 +194,37 @@ dri_fill_in_modes(struct dri_screen *screen)
>      return (const __DRIconfig **)configs;
>   }
>
> +/* The Gallium way to force MSAA. */
> +DEBUG_GET_ONCE_NUM_OPTION(msaa, "GALLIUM_MSAA", 0);
> +
> +/* The NVIDIA way to force MSAA. The same variable is used by the NVIDIA
> + * driver. */
> +DEBUG_GET_ONCE_NUM_OPTION(msaa_nv, "__GL_FSAA_MODE", 0);
> +
> +static void
> +dri_force_msaa_visual(struct st_visual *stvis,
> +                      struct pipe_screen *screen)
> +{
> +   int i;
> +   int samples = debug_get_option_msaa();
> +
> +   if (!samples)
> +      samples = debug_get_option_msaa_nv();
> +
> +   if (samples<= 1)
> +      return; /* nothing to do */
> +
> +   /* Choose a supported sample count greater than or equal to samples. */
> +   for (i = samples; i<= MSAA_VISUAL_MAX_SAMPLES; i++) {
> +      if (screen->is_format_supported(screen, stvis->color_format,
> +                                      PIPE_TEXTURE_2D, i,
> +                                      PIPE_BIND_RENDER_TARGET)) {
> +         stvis->samples = i;
> +         break;
> +      }
> +   }
> +}
> +
>   /**
>    * Roughly the converse of dri_fill_in_modes.
>    */
> @@ -206,10 +237,6 @@ dri_fill_st_visual(struct st_visual *stvis, struct dri_screen *screen,
>      if (!mode)
>         return;
>
> -   if (mode->sampleBuffers) {
> -      stvis->samples = mode->samples;
> -   }
> -
>      if (mode->redBits == 8) {
>         if (mode->alphaBits == 8)
>            stvis->color_format = PIPE_FORMAT_B8G8R8A8_UNORM;
> @@ -219,6 +246,14 @@ dri_fill_st_visual(struct st_visual *stvis, struct dri_screen *screen,
>         stvis->color_format = PIPE_FORMAT_B5G6R5_UNORM;
>      }
>
> +   if (mode->sampleBuffers) {
> +      stvis->samples = mode->samples;
> +   }
> +   else {
> +      /* This must be done after stvis->color_format is set. */
> +      dri_force_msaa_visual(stvis, screen->base.screen);
> +   }
> +
>      switch (mode->depthBits) {
>      default:
>      case 0:


Thanks for cleaning this up.

Reviewed-by: Brian Paul <brianp at vmware.com>

-Brian


More information about the mesa-dev mailing list