On Sat, Mar 19, 2016 at 2:41 AM, Edward O'Callaghan <eocallag...@alterapraxis.com> wrote: > Signed-off-by: Edward O'Callaghan <eocallag...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev