st/dri: Don't request a fake front if the server adds one automatically.
We use the presence of the getBuffersWithFormat extension function to detect whether the server automatically adds a front. Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
This commit is contained in:
parent
d773f28ff2
commit
5f2d60a715
|
@ -123,11 +123,12 @@ dri_get_buffers(__DRIdrawablePrivate * dPriv)
|
||||||
|
|
||||||
struct dri_drawable *drawable = dri_drawable(dPriv);
|
struct dri_drawable *drawable = dri_drawable(dPriv);
|
||||||
struct pipe_surface *surface = NULL;
|
struct pipe_surface *surface = NULL;
|
||||||
struct pipe_screen *screen = dri_screen(drawable->sPriv)->pipe_screen;
|
struct dri_screen *st_screen = dri_screen(drawable->sPriv);
|
||||||
|
struct pipe_screen *screen = st_screen->pipe_screen;
|
||||||
__DRIbuffer *buffers = NULL;
|
__DRIbuffer *buffers = NULL;
|
||||||
__DRIscreen *dri_screen = drawable->sPriv;
|
__DRIscreen *dri_screen = drawable->sPriv;
|
||||||
__DRIdrawable *dri_drawable = drawable->dPriv;
|
__DRIdrawable *dri_drawable = drawable->dPriv;
|
||||||
struct drm_api *api = ((struct dri_screen*)(dri_screen->private))->api;
|
struct drm_api *api = st_screen->api;
|
||||||
boolean have_depth = FALSE;
|
boolean have_depth = FALSE;
|
||||||
int i, count;
|
int i, count;
|
||||||
|
|
||||||
|
@ -180,7 +181,8 @@ dri_get_buffers(__DRIdrawablePrivate * dPriv)
|
||||||
|
|
||||||
switch (buffers[i].attachment) {
|
switch (buffers[i].attachment) {
|
||||||
case __DRI_BUFFER_FRONT_LEFT:
|
case __DRI_BUFFER_FRONT_LEFT:
|
||||||
continue;
|
if (!st_screen->auto_fake_front)
|
||||||
|
continue;
|
||||||
case __DRI_BUFFER_FAKE_FRONT_LEFT:
|
case __DRI_BUFFER_FAKE_FRONT_LEFT:
|
||||||
index = ST_SURFACE_FRONT_LEFT;
|
index = ST_SURFACE_FRONT_LEFT;
|
||||||
format = drawable->color_format;
|
format = drawable->color_format;
|
||||||
|
@ -365,8 +367,8 @@ dri_create_buffer(__DRIscreenPrivate * sPriv,
|
||||||
/* TODO incase of double buffer visual, delay fake creation */
|
/* TODO incase of double buffer visual, delay fake creation */
|
||||||
i = 0;
|
i = 0;
|
||||||
drawable->attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
|
drawable->attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
|
||||||
drawable->attachments[i++] = __DRI_BUFFER_FAKE_FRONT_LEFT;
|
if (!screen->auto_fake_front)
|
||||||
|
drawable->attachments[i++] = __DRI_BUFFER_FAKE_FRONT_LEFT;
|
||||||
if (visual->doubleBufferMode)
|
if (visual->doubleBufferMode)
|
||||||
drawable->attachments[i++] = __DRI_BUFFER_BACK_LEFT;
|
drawable->attachments[i++] = __DRI_BUFFER_BACK_LEFT;
|
||||||
if (visual->depthBits && visual->stencilBits)
|
if (visual->depthBits && visual->stencilBits)
|
||||||
|
|
|
@ -289,6 +289,8 @@ dri_init_screen2(__DRIscreenPrivate * sPriv)
|
||||||
{
|
{
|
||||||
struct dri_screen *screen;
|
struct dri_screen *screen;
|
||||||
struct drm_create_screen_arg arg;
|
struct drm_create_screen_arg arg;
|
||||||
|
const __DRIdri2LoaderExtension *dri2_ext =
|
||||||
|
sPriv->dri2.loader;
|
||||||
|
|
||||||
screen = CALLOC_STRUCT(dri_screen);
|
screen = CALLOC_STRUCT(dri_screen);
|
||||||
if (!screen)
|
if (!screen)
|
||||||
|
@ -313,6 +315,9 @@ dri_init_screen2(__DRIscreenPrivate * sPriv)
|
||||||
driParseOptionInfo(&screen->optionCache,
|
driParseOptionInfo(&screen->optionCache,
|
||||||
__driConfigOptions, __driNConfigOptions);
|
__driConfigOptions, __driNConfigOptions);
|
||||||
|
|
||||||
|
screen->auto_fake_front = dri2_ext->base.version >= 3 &&
|
||||||
|
dri2_ext->getBuffersWithFormat != NULL;
|
||||||
|
|
||||||
return dri_fill_in_modes(screen, 32);
|
return dri_fill_in_modes(screen, 32);
|
||||||
fail:
|
fail:
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -59,6 +59,7 @@ struct dri_screen
|
||||||
struct pipe_screen *pipe_screen;
|
struct pipe_screen *pipe_screen;
|
||||||
boolean d_depth_bits_last;
|
boolean d_depth_bits_last;
|
||||||
boolean sd_depth_bits_last;
|
boolean sd_depth_bits_last;
|
||||||
|
boolean auto_fake_front;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** cast wrapper */
|
/** cast wrapper */
|
||||||
|
|
Loading…
Reference in New Issue