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

eocallaghan at alterapraxis.com eocallaghan at alterapraxis.com
Fri Mar 25 08:43:48 UTC 2016


On 2016-03-25 14:02, Ilia Mirkin wrote:
> 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]

I did it in this manner because I don't trust all C compilers to warn 
sufficiently
on `num_samples' overflows turning this into a infinite loop even though 
it is a
unsigned type. The micro-optimization serves no purpose because the 
optimizer will
trivially reduce the loop down, not that it has that many iterations any 
way. The
loop as-is is both well bounded and deterministic, nice qualities to 
have.

"Premature optimization is the root of all evil" ~ Donald Knuth's.

> 
> 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.

You are way over engineering here; it is a totally reasonable assumption 
and if such
hardware does exist which we would support (I can`t see any in the tree 
currently as
far as I am aware) then they can provide follow up fixes.

> 
>> +      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