[Mesa-dev] [PATCH 1/2] st/mesa: only try to create 1x msaa surfaces for "fake" msaa drivers
Cherniak, Bruce
bruce.cherniak at intel.com
Tue Aug 29 15:49:13 UTC 2017
Gentle bump. This fixes mesa master for Kitware's VTK testing.
> On Aug 25, 2017, at 2:59 PM, Bruce Cherniak <bruce.cherniak at intel.com> wrote:
>
> From: Brian Paul <brianp at vmware.com>
>
> For software drivers where we want "fake" msaa support for GL 3.x, we
> treat 1 sample as being msaa.
>
> For drivers with real msaa support, start format probing at 2x msaa.
> For drivers with fake msaa support, start format probing at 1x msaa.
>
> This also tweaks the MaxSamples code in st_init_extensions() so that
> we use MaxSamples=1 for fake msaa. This allows the format proble loops
> to run at least one iteration.
>
> This fixes a llvmpipe/VTK regression from commit 6839d3369905eb02151.
> And for drivers with fake msaa support, calls such as
> glTexImage2DMultisample(samples=1) will now succeed.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102038
> ---
> src/mesa/state_tracker/st_cb_fbo.c | 13 ++++++++++---
> src/mesa/state_tracker/st_cb_texture.c | 11 ++++++++---
> src/mesa/state_tracker/st_extensions.c | 14 ++++++--------
> 3 files changed, 24 insertions(+), 14 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
> index afc7700306..a7c286bcc5 100644
> --- a/src/mesa/state_tracker/st_cb_fbo.c
> +++ b/src/mesa/state_tracker/st_cb_fbo.c
> @@ -155,12 +155,19 @@ st_renderbuffer_alloc_storage(struct gl_context * ctx,
> * to <samples> and no more than the next larger sample count supported
> * by the implementation.
> *
> - * So let's find the supported number of samples closest to NumSamples.
> + * Find the supported number of samples >= rb->NumSamples
> */
> if (rb->NumSamples > 0) {
> - unsigned i;
> + unsigned start, i;
>
> - for (i = MAX2(2, rb->NumSamples); i <= ctx->Const.MaxSamples; i++) {
> + if (ctx->Const.MaxSamples > 1 && rb->NumSamples == 1) {
> + /* don't try num_samples = 1 with drivers that support real msaa */
> + start = 2;
> + } else {
> + start = rb->NumSamples;
> + }
> +
> + for (i = start; i <= ctx->Const.MaxSamples; i++) {
> format = st_choose_renderbuffer_format(st, internalFormat, i);
>
> if (format != PIPE_FORMAT_NONE) {
> diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
> index af2052db24..b5006b05a7 100644
> --- a/src/mesa/state_tracker/st_cb_texture.c
> +++ b/src/mesa/state_tracker/st_cb_texture.c
> @@ -2739,13 +2739,18 @@ st_texture_storage(struct gl_context *ctx,
>
> bindings = default_bindings(st, fmt);
>
> - /* Raise the sample count if the requested one is unsupported. */
> if (num_samples > 0) {
> + /* Find msaa sample count which is actually supported. For example,
> + * if the user requests 1x but only 4x or 8x msaa is supported, we'll
> + * choose 4x here.
> + */
> enum pipe_texture_target ptarget = gl_target_to_pipe(texObj->Target);
> boolean found = FALSE;
>
> - /* start the query with at least two samples */
> - num_samples = MAX2(num_samples, 2);
> + if (ctx->Const.MaxSamples > 1 && num_samples == 1) {
> + /* don't try num_samples = 1 with drivers that support real msaa */
> + num_samples = 2;
> + }
>
> for (; num_samples <= ctx->Const.MaxSamples; num_samples++) {
> if (screen->is_format_supported(screen, fmt, ptarget,
> diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
> index 904d9cd834..2008e28250 100644
> --- a/src/mesa/state_tracker/st_extensions.c
> +++ b/src/mesa/state_tracker/st_extensions.c
> @@ -1046,17 +1046,15 @@ void st_init_extensions(struct pipe_screen *screen,
> void_formats, 32,
> PIPE_BIND_RENDER_TARGET);
> }
> - if (consts->MaxSamples == 1) {
> - /* one sample doesn't really make sense */
> - consts->MaxSamples = 0;
> - }
> - else if (consts->MaxSamples >= 2) {
> +
> + if (consts->MaxSamples >= 2) {
> + /* Real MSAA support */
> extensions->EXT_framebuffer_multisample = GL_TRUE;
> extensions->EXT_framebuffer_multisample_blit_scaled = GL_TRUE;
> }
> -
> - if (consts->MaxSamples == 0 &&
> - screen->get_param(screen, PIPE_CAP_FAKE_SW_MSAA)) {
> + else if (consts->MaxSamples > 0 &&
> + screen->get_param(screen, PIPE_CAP_FAKE_SW_MSAA)) {
> + /* fake MSAA support */
> consts->FakeSWMSAA = GL_TRUE;
> extensions->EXT_framebuffer_multisample = GL_TRUE;
> extensions->EXT_framebuffer_multisample_blit_scaled = GL_TRUE;
> --
> 2.11.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