st/dri: Find out if the drawable is a pixmap

Part of this code is disabled since no performance gains
	where detected with it enabled.

	This code only detects if it is a pixmap that it is
	rendering to on the st/xorg DDX since it sets the fake
	front to the same handle as front.
This commit is contained in:
Jakob Bornecrantz 2009-08-22 02:12:21 +01:00
parent 6237ac2412
commit a3e59b9d06
2 changed files with 39 additions and 0 deletions

View File

@ -87,6 +87,35 @@ dri_surface_from_handle(struct drm_api *api,
return surface;
}
/**
* Pixmaps have will have the same name of fake front and front.
*/
static boolean
dri2_check_if_pixmap(__DRIbuffer *buffers, int count)
{
boolean found = FALSE;
boolean is_pixmap = FALSE;
unsigned name;
int i;
for (i = 0; i < count; i++) {
switch (buffers[i].attachment) {
case __DRI_BUFFER_FRONT_LEFT:
case __DRI_BUFFER_FAKE_FRONT_LEFT:
if (found) {
is_pixmap = buffers[i].name == name;
} else {
name = buffers[i].name;
found = TRUE;
}
default:
continue;
}
}
return is_pixmap;
}
/**
* This will be called a drawable is known to have been resized.
*/
@ -145,6 +174,8 @@ dri_get_buffers(__DRIdrawablePrivate * dPriv)
memcpy(drawable->old, buffers, sizeof(__DRIbuffer) * count);
}
drawable->is_pixmap = dri2_check_if_pixmap(buffers, count);
for (i = 0; i < count; i++) {
enum pipe_format format = 0;
int index = 0;
@ -234,6 +265,12 @@ dri_flush_frontbuffer(struct pipe_screen *screen,
return;
}
#if 0
/* TODO if rendering to pixmaps is slow enable this code. */
if (drawable->is_pixmap)
return;
#endif
(*dri_screen->dri2.loader->flushFrontBuffer)(dri_drawable,
dri_drawable->loaderPrivate);
}

View File

@ -46,6 +46,8 @@ struct dri_drawable
unsigned attachments[8];
unsigned num_attachments;
boolean is_pixmap;
__DRIbuffer old[8];
unsigned old_num;
unsigned old_w;