[Mesa-dev] [PATCH] st/glx: Add awareness for multisample pixel formats to st/glx-xlib.
Cherniak, Bruce
bruce.cherniak at intel.com
Sat Apr 8 03:24:48 UTC 2017
Thanks for the review. You’re correct, even though FBOs work, there are still a number of apps that rely on msaa in the winsys buffers and we don’t want to artificially exclude them.
> On Apr 7, 2017, at 12:54 PM, Roland Scheidegger <sroland at vmware.com> wrote:
>
> 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