[Mesa-dev] [PATCH] st/glx: Add awareness for multisample pixel formats to st/glx-xlib.

Roland Scheidegger sroland at vmware.com
Fri Apr 7 17:54:27 UTC 2017


I'm not an expert on glx, but looks alright to me.
Albeit strictly speaking, you don't really need this for MSAA with
software renderers, since you can still you use fbos with msaa.
But of course you probably want to support it with winsys buffers.

Reviewed-by: Roland Scheidegger <sroland at vmware.com>

Am 07.04.2017 um 18:27 schrieb Bruce Cherniak:
> In preparation for enabling MSAA in OpenSWR, the state trackers need to
> be aware of multisample pixel formats for software renderers.  This patch
> allows glx-xlib to query the renderer for support of pixel
> formats with multisample, and create multisample resources.
> 
> This change is benign to softpipe and llvmpipe, as is_format_supported
> returns FALSE for any sample_count > 1.  OpenSWR does the same at the
> moment, but that will change soon.
> ---
>  src/gallium/state_trackers/glx/xlib/glx_api.c | 25 +++++++++++++++----------
>  src/gallium/state_trackers/glx/xlib/xm_api.c  | 19 ++++++++++++++-----
>  src/gallium/state_trackers/glx/xlib/xm_st.c   |  1 +
>  3 files changed, 30 insertions(+), 15 deletions(-)
> 
> diff --git a/src/gallium/state_trackers/glx/xlib/glx_api.c b/src/gallium/state_trackers/glx/xlib/glx_api.c
> index 642ece7..c473a0f 100644
> --- a/src/gallium/state_trackers/glx/xlib/glx_api.c
> +++ b/src/gallium/state_trackers/glx/xlib/glx_api.c
> @@ -181,7 +181,7 @@ save_glx_visual( Display *dpy, XVisualInfo *vinfo,
>                   GLint depth_size, GLint stencil_size,
>                   GLint accumRedSize, GLint accumGreenSize,
>                   GLint accumBlueSize, GLint accumAlphaSize,
> -                 GLint level, GLint numAuxBuffers )
> +                 GLint level, GLint numAuxBuffers, GLint num_samples )
>  {
>     GLboolean ximageFlag = GL_TRUE;
>     XMesaVisual xmvis;
> @@ -229,6 +229,7 @@ save_glx_visual( Display *dpy, XVisualInfo *vinfo,
>        if (v->display == dpy
>            && v->mesa_visual.level == level
>            && v->mesa_visual.numAuxBuffers == numAuxBuffers
> +          && v->mesa_visual.samples == num_samples
>            && v->ximage_flag == ximageFlag
>            && v->mesa_visual.rgbMode == rgbFlag
>            && v->mesa_visual.doubleBufferMode == dbFlag
> @@ -254,7 +255,7 @@ save_glx_visual( Display *dpy, XVisualInfo *vinfo,
>                                stereoFlag, ximageFlag,
>                                depth_size, stencil_size,
>                                accumRedSize, accumBlueSize,
> -                              accumBlueSize, accumAlphaSize, 0, level,
> +                              accumBlueSize, accumAlphaSize, num_samples, level,
>                                GLX_NONE_EXT );
>     if (xmvis) {
>        /* Save a copy of the pointer now so we can find this visual again
> @@ -344,7 +345,8 @@ create_glx_visual( Display *dpy, XVisualInfo *visinfo )
>                                accBits, /* b */
>                                accBits, /* a */
>                                0,         /* level */
> -                              0          /* numAux */
> +                              0,         /* numAux */
> +                              0          /* numSamples */
>           );
>     }
>     else {
> @@ -739,6 +741,7 @@ choose_visual( Display *dpy, int screen, const int *list, GLboolean fbConfig )
>     XMesaVisual xmvis = NULL;
>     int desiredVisualID = -1;
>     int numAux = 0;
> +   GLint num_samples = 0;
>  
>     xmesa_init( dpy );
>  
> @@ -905,12 +908,13 @@ choose_visual( Display *dpy, int screen, const int *list, GLboolean fbConfig )
>            * GLX_ARB_multisample
>            */
>           case GLX_SAMPLE_BUFFERS_ARB:
> +            /* ignore */
> +            parselist++;
> +            parselist++;
> +            break;
>           case GLX_SAMPLES_ARB:
>              parselist++;
> -            if (*parselist++ != 0) {
> -               /* ms not supported */
> -               return NULL;
> -            }
> +            num_samples = *parselist++;
>              break;
>  
>           /*
> @@ -1067,7 +1071,8 @@ choose_visual( Display *dpy, int screen, const int *list, GLboolean fbConfig )
>        xmvis = save_glx_visual( dpy, vis, rgb_flag, alpha_flag, double_flag,
>                                 stereo_flag, depth_size, stencil_size,
>                                 accumRedSize, accumGreenSize,
> -                               accumBlueSize, accumAlphaSize, level, numAux );
> +                               accumBlueSize, accumAlphaSize, level, numAux,
> +                               num_samples );
>     }
>  
>     return xmvis;
> @@ -1602,10 +1607,10 @@ get_config( XMesaVisual xmvis, int attrib, int *value, GLboolean fbconfig )
>         * GLX_ARB_multisample
>         */
>        case GLX_SAMPLE_BUFFERS_ARB:
> -         *value = 0;
> +         *value = xmvis->mesa_visual.sampleBuffers;
>           return 0;
>        case GLX_SAMPLES_ARB:
> -         *value = 0;
> +         *value = xmvis->mesa_visual.samples;
>           return 0;
>  
>        /*
> diff --git a/src/gallium/state_trackers/glx/xlib/xm_api.c b/src/gallium/state_trackers/glx/xlib/xm_api.c
> index 398152e..881dd44 100644
> --- a/src/gallium/state_trackers/glx/xlib/xm_api.c
> +++ b/src/gallium/state_trackers/glx/xlib/xm_api.c
> @@ -453,11 +453,11 @@ choose_pixel_format(XMesaVisual v)
>   * stencil sizes.
>   */
>  static enum pipe_format
> -choose_depth_stencil_format(XMesaDisplay xmdpy, int depth, int stencil)
> +choose_depth_stencil_format(XMesaDisplay xmdpy, int depth, int stencil,
> +                            int sample_count)
>  {
>     const enum pipe_texture_target target = PIPE_TEXTURE_2D;
>     const unsigned tex_usage = PIPE_BIND_DEPTH_STENCIL;
> -   const unsigned sample_count = 0;
>     enum pipe_format formats[8], fmt;
>     int count, i;
>  
> @@ -861,8 +861,8 @@ XMesaVisual XMesaCreateVisual( Display *display,
>  
>        vis->numAuxBuffers = 0;
>        vis->level = 0;
> -      vis->sampleBuffers = 0;
> -      vis->samples = 0;
> +      vis->sampleBuffers = num_samples > 1;
> +      vis->samples = num_samples;
>     }
>  
>     v->stvis.buffer_mask = ST_ATTACHMENT_FRONT_LEFT_MASK;
> @@ -875,6 +875,14 @@ XMesaVisual XMesaCreateVisual( Display *display,
>     }
>  
>     v->stvis.color_format = choose_pixel_format(v);
> +
> +   /* Check format support at requested num_samples (for multisample) */
> +   if (!xmdpy->screen->is_format_supported(xmdpy->screen,
> +                                           v->stvis.color_format,
> +                                           PIPE_TEXTURE_2D, num_samples,
> +                                           PIPE_BIND_RENDER_TARGET))
> +      v->stvis.color_format = PIPE_FORMAT_NONE;
> +
>     if (v->stvis.color_format == PIPE_FORMAT_NONE) {
>        free(v->visinfo);
>        free(v);
> @@ -882,7 +890,8 @@ XMesaVisual XMesaCreateVisual( Display *display,
>     }
>  
>     v->stvis.depth_stencil_format =
> -      choose_depth_stencil_format(xmdpy, depth_size, stencil_size);
> +      choose_depth_stencil_format(xmdpy, depth_size, stencil_size,
> +                                  num_samples);
>  
>     v->stvis.accum_format = (accum_red_size +
>           accum_green_size + accum_blue_size + accum_alpha_size) ?
> diff --git a/src/gallium/state_trackers/glx/xlib/xm_st.c b/src/gallium/state_trackers/glx/xlib/xm_st.c
> index f598430..9e30efa 100644
> --- a/src/gallium/state_trackers/glx/xlib/xm_st.c
> +++ b/src/gallium/state_trackers/glx/xlib/xm_st.c
> @@ -134,6 +134,7 @@ xmesa_st_framebuffer_validate_textures(struct st_framebuffer_iface *stfbi,
>     templ.depth0 = 1;
>     templ.array_size = 1;
>     templ.last_level = 0;
> +   templ.nr_samples = xstfb->stvis.samples;
>  
>     for (i = 0; i < ST_ATTACHMENT_COUNT; i++) {
>        enum pipe_format format;
> 



More information about the mesa-dev mailing list