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

Ilia Mirkin imirkin at alum.mit.edu
Fri Mar 25 03:02:45 UTC 2016


On Thu, Mar 24, 2016 at 8:11 PM, Edward O'Callaghan
<eocallaghan at alterapraxis.com> wrote:
> Using PIPE_FORMAT_NONE to indicate what MSAA modes are supported
> with a framebuffer using no attachment.
>
> Signed-off-by: Edward O'Callaghan <eocallaghan at alterapraxis.com>
> ---
>  src/mesa/state_tracker/st_atom_framebuffer.c | 51 ++++++++++++++++++++++++++++
>  1 file changed, 51 insertions(+)
>
> diff --git a/src/mesa/state_tracker/st_atom_framebuffer.c b/src/mesa/state_tracker/st_atom_framebuffer.c
> index ae883a2..07854ca 100644
> --- a/src/mesa/state_tracker/st_atom_framebuffer.c
> +++ b/src/mesa/state_tracker/st_atom_framebuffer.c
> @@ -64,6 +64,44 @@ 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(struct pipe_screen *screen, unsigned num_samples)
> +{
> +   int quantized_samples = 0;
> +   bool msaa_mode_supported;
> +
> +   if (!num_samples)
> +      return 0;
> +
> +   assert(screen);
> +
> +   /* Assumes the highest supported MSAA is x32 on any hardware */
> +   for (unsigned msaa_mode = 32; msaa_mode >= 1; msaa_mode = msaa_mode/2) {

This should probably start at MaxFramebufferSamples right? Also
msaa_mode >= num_samples? [then you can get rid of the if below]

And lastly I don't know if it's a valid assumption that we can always
just divide by 2. That said, I don't know of any hw that actually
supports non-power-of-two MSAA levels, so perhaps it's OK.

> +      assert(!(msaa_mode > 32 || msaa_mode == 0)); /* be safe from int overflows */
> +      if (msaa_mode >= num_samples) {
> +         /**
> +          * For ARB_framebuffer_no_attachment, A format of
> +          * PIPE_FORMAT_NONE implies what number of samples is
> +          * supported for a framebuffer with no attachment. Thus the
> +          * drivers callback must be adjusted for this.
> +          */
> +         msaa_mode_supported = screen->is_format_supported(screen,
> +                                     PIPE_FORMAT_NONE, PIPE_TEXTURE_2D,
> +                                     msaa_mode, PIPE_BIND_RENDER_TARGET);
> +         /**
> +          * Check if the MSAA mode that is higher than the requested
> +          * num_samples is supported, and if so returning it.
> +          */
> +         if (msaa_mode_supported)
> +            quantized_samples = msaa_mode;
> +      }
> +   }
> +
> +   return quantized_samples;
> +}
>
>  /**
>   * Update framebuffer state (color, depth, stencil, etc. buffers)
> @@ -72,6 +110,8 @@ static void
>  update_framebuffer_state( struct st_context *st )
>  {
>     struct pipe_framebuffer_state *framebuffer = &st->state.framebuffer;
> +   struct pipe_context *pipe = st->pipe;
> +   struct pipe_screen *screen = pipe->screen;
>     struct gl_framebuffer *fb = st->ctx->DrawBuffer;
>     struct st_renderbuffer *strb;
>     GLuint i;
> @@ -82,6 +122,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(screen, fb->DefaultGeometry.NumSamples);
> +
>     /*printf("------ fb size %d x %d\n", fb->Width, fb->Height);*/
>
>     /* Examine Mesa's ctx->DrawBuffer->_ColorDrawBuffers state
> --
> 2.5.5
>
> _______________________________________________
> 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