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:
Thomas Hellstrom 2010-01-18 13:33:08 +01:00
parent d773f28ff2
commit 5f2d60a715
3 changed files with 13 additions and 5 deletions

View File

@ -123,11 +123,12 @@ dri_get_buffers(__DRIdrawablePrivate * dPriv)
struct dri_drawable *drawable = dri_drawable(dPriv);
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;
__DRIscreen *dri_screen = drawable->sPriv;
__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;
int i, count;
@ -180,7 +181,8 @@ dri_get_buffers(__DRIdrawablePrivate * dPriv)
switch (buffers[i].attachment) {
case __DRI_BUFFER_FRONT_LEFT:
continue;
if (!st_screen->auto_fake_front)
continue;
case __DRI_BUFFER_FAKE_FRONT_LEFT:
index = ST_SURFACE_FRONT_LEFT;
format = drawable->color_format;
@ -365,8 +367,8 @@ dri_create_buffer(__DRIscreenPrivate * sPriv,
/* TODO incase of double buffer visual, delay fake creation */
i = 0;
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)
drawable->attachments[i++] = __DRI_BUFFER_BACK_LEFT;
if (visual->depthBits && visual->stencilBits)

View File

@ -289,6 +289,8 @@ dri_init_screen2(__DRIscreenPrivate * sPriv)
{
struct dri_screen *screen;
struct drm_create_screen_arg arg;
const __DRIdri2LoaderExtension *dri2_ext =
sPriv->dri2.loader;
screen = CALLOC_STRUCT(dri_screen);
if (!screen)
@ -313,6 +315,9 @@ dri_init_screen2(__DRIscreenPrivate * sPriv)
driParseOptionInfo(&screen->optionCache,
__driConfigOptions, __driNConfigOptions);
screen->auto_fake_front = dri2_ext->base.version >= 3 &&
dri2_ext->getBuffersWithFormat != NULL;
return dri_fill_in_modes(screen, 32);
fail:
return NULL;

View File

@ -59,6 +59,7 @@ struct dri_screen
struct pipe_screen *pipe_screen;
boolean d_depth_bits_last;
boolean sd_depth_bits_last;
boolean auto_fake_front;
};
/** cast wrapper */