[Mesa-dev] [PATCH 02/17] mesa/st: Set _NumSamples in update_framebuffer_state()

Ilia Mirkin imirkin at alum.mit.edu
Sat Mar 19 15:50:29 UTC 2016


On Sat, Mar 19, 2016 at 2:41 AM, Edward O'Callaghan
<eocallaghan at alterapraxis.com> wrote:
> Signed-off-by: Edward O'Callaghan <eocallaghan at alterapraxis.com>
> ---
>  src/mesa/main/mtypes.h                       |  8 +++++++
>  src/mesa/state_tracker/st_atom_framebuffer.c | 35 ++++++++++++++++++++++++++++
>  src/mesa/state_tracker/st_extensions.c       |  4 ++++
>  3 files changed, 47 insertions(+)
>
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 5d8bfe4..d0eae36 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -3481,6 +3481,14 @@ struct gl_constants
>     GLuint MaxFramebufferLayers;
>     GLuint MaxFramebufferSamples;
>
> +   /**
> +    * In the case that the framebuffer has no attachment (i.e.
> +    * GL_ARB_framebuffer_no_attachments) the driver must choose
> +    * a valid value for hw for the NumSamples depending on the
> +    * supported MSAA modes the hw supports.
> +    */
> +   GLuint MSAAModes;

If you're going to keep this at the top level, should the quantization
be done in common code? Or at least live in common code and be shared
by the various drivers?

> +
>     /** Number of varying vectors between any two shader stages. */
>     GLuint MaxVarying;
>
> diff --git a/src/mesa/state_tracker/st_atom_framebuffer.c b/src/mesa/state_tracker/st_atom_framebuffer.c
> index ae883a2..111f64e 100644
> --- a/src/mesa/state_tracker/st_atom_framebuffer.c
> +++ b/src/mesa/state_tracker/st_atom_framebuffer.c
> @@ -64,6 +64,29 @@ update_framebuffer_size(struct pipe_framebuffer_state *framebuffer,
>     framebuffer->height = MIN2(framebuffer->height, surface->height);
>  }
>
> +/**
> + * Round up the requested multisample count to the next supported sample size.
> + */
> +static unsigned
> +framebuffer_quantize_num_samples(const int supported_msaa_modes, unsigned num_samples)
> +{
> +   int quantized_samples = 0;
> +
> +   if (!num_samples)
> +      return 0;
> +
> +   for (int i = 31; i >= 0; i--) {
> +      unsigned msaa_mode = (1U << i);
> +      if ((supported_msaa_modes & msaa_mode) == msaa_mode) {
> +         if (msaa_mode >= num_samples)
> +            quantized_samples = msaa_mode;
> +         else
> +            break;
> +      }
> +   }
> +
> +   return quantized_samples;
> +}
>
>  /**
>   * Update framebuffer state (color, depth, stencil, etc. buffers)
> @@ -74,6 +97,7 @@ update_framebuffer_state( struct st_context *st )
>     struct pipe_framebuffer_state *framebuffer = &st->state.framebuffer;
>     struct gl_framebuffer *fb = st->ctx->DrawBuffer;
>     struct st_renderbuffer *strb;
> +   const int supported_msaa_modes = st->ctx->Const.MSAAModes;
>     GLuint i;
>
>     st_flush_bitmap_cache(st);
> @@ -82,6 +106,17 @@ update_framebuffer_state( struct st_context *st )
>     framebuffer->width  = UINT_MAX;
>     framebuffer->height = UINT_MAX;
>
> +   /**
> +    * Quantize the derived default number of samples:
> +    *
> +    * A query to the driver of supported MSAA values the
> +    * hardware supports is done as to legalize the number
> +    * of application requested samples, NumSamples.
> +    * See commit eb9cf3c for more information.
> +    */
> +   fb->DefaultGeometry._NumSamples =
> +      framebuffer_quantize_num_samples(supported_msaa_modes, fb->DefaultGeometry.NumSamples);
> +
>     /*printf("------ fb size %d x %d\n", fb->Width, fb->Height);*/
>
>     /* Examine Mesa's ctx->DrawBuffer->_ColorDrawBuffers state
> diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
> index 275fe55..840ad40 100644
> --- a/src/mesa/state_tracker/st_extensions.c
> +++ b/src/mesa/state_tracker/st_extensions.c
> @@ -1042,6 +1042,10 @@ void st_init_extensions(struct pipe_screen *screen,
>           extensions->AMD_vertex_shader_viewport_index = GL_TRUE;
>     }
>
> +   /* Bitmask of MSAA modes supported by the hardware. */
> +   consts->MSAAModes
> +      = screen->get_param(screen, PIPE_CAP_MSAA_MODES);
> +
>     /* GL_ARB_ES3_compatibility.
>      *
>      * Assume that ES3 is supported if GLSL 3.30 is supported.
> --
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list