From a3e59b9d06bcad6b1ab741ee659a4db0d119d5ef Mon Sep 17 00:00:00 2001 From: Jakob Bornecrantz Date: Sat, 22 Aug 2009 02:12:21 +0100 Subject: 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. --- src/gallium/state_trackers/dri/dri_drawable.c | 37 +++++++++++++++++++++++++++ src/gallium/state_trackers/dri/dri_drawable.h | 2 ++ 2 files changed, 39 insertions(+) diff --git a/src/gallium/state_trackers/dri/dri_drawable.c b/src/gallium/state_trackers/dri/dri_drawable.c index 16dab62ccb..2d5510a6fc 100644 --- a/src/gallium/state_trackers/dri/dri_drawable.c +++ b/src/gallium/state_trackers/dri/dri_drawable.c @@ -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); } diff --git a/src/gallium/state_trackers/dri/dri_drawable.h b/src/gallium/state_trackers/dri/dri_drawable.h index dfd0b8766d..eaf0b954bd 100644 --- a/src/gallium/state_trackers/dri/dri_drawable.h +++ b/src/gallium/state_trackers/dri/dri_drawable.h @@ -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; -- cgit v1.2.3