Using PIPE_FORMAT_NONE to indicate what MSAA modes are supported with a framebuffer using no attachment.
V.2: Rewrite MSAA mode loop to be more general. V.3: Move comment to right place after loop was rewritten. Signed-off-by: Edward O'Callaghan <eocallag...@alterapraxis.com> --- src/mesa/state_tracker/st_atom_framebuffer.c | 52 ++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/mesa/state_tracker/st_atom_framebuffer.c b/src/mesa/state_tracker/st_atom_framebuffer.c index ae883a2..c7c4ab2 100644 --- a/src/mesa/state_tracker/st_atom_framebuffer.c +++ b/src/mesa/state_tracker/st_atom_framebuffer.c @@ -64,6 +64,47 @@ 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 st_context *st, unsigned num_samples) +{ + struct pipe_context *pipe = st->pipe; + struct pipe_screen *screen = pipe->screen; + int quantized_samples = 0; + bool msaa_mode_supported; + unsigned msaa_mode; + + if (!num_samples) + return 0; + + assert(screen); + + /* Assumes the highest supported MSAA is a power of 2 */ + msaa_mode = util_next_power_of_two(st->ctx->Const.MaxFramebufferSamples); + assert(!(num_samples > msaa_mode)); /* be safe from infinite loops */ + + /** + * Check if the MSAA mode that is higher than the requested + * num_samples is supported, and if so returning it. + */ + for (; msaa_mode >= num_samples; msaa_mode = msaa_mode/2) { + /** + * 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); + if (msaa_mode_supported) + quantized_samples = msaa_mode; + } + + return quantized_samples; +} /** * Update framebuffer state (color, depth, stencil, etc. buffers) @@ -82,6 +123,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(st, 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@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev