summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Bornecrantz <jakob@vmware.com>2009-08-22 02:12:21 +0100
committerJakob Bornecrantz <jakob@vmware.com>2009-08-22 02:16:02 +0100
commita3e59b9d06bcad6b1ab741ee659a4db0d119d5ef (patch)
tree6a53bcf79c3e19d91b46aa9f09b0621d768d9d47
parent6237ac2412b08a3b6239203be69ce542335ae47e (diff)
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.
-rw-r--r--src/gallium/state_trackers/dri/dri_drawable.c37
-rw-r--r--src/gallium/state_trackers/dri/dri_drawable.h2
2 files changed, 39 insertions, 0 deletions
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
@@ -88,6 +88,35 @@ dri_surface_from_handle(struct drm_api *api,
}
/**
+ * 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.
*/
void
@@ -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;