Mesa (master): st/dri: Find out if the drawable is a pixmap
Jakob Bornecrantz
wallbraker at kemper.freedesktop.org
Sat Aug 22 00:09:07 UTC 2009
Module: Mesa
Branch: master
Commit: a3e59b9d06bcad6b1ab741ee659a4db0d119d5ef
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a3e59b9d06bcad6b1ab741ee659a4db0d119d5ef
Author: Jakob Bornecrantz <jakob at vmware.com>
Date: Sat Aug 22 02:12:21 2009 +0100
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(+), 0 deletions(-)
diff --git a/src/gallium/state_trackers/dri/dri_drawable.c b/src/gallium/state_trackers/dri/dri_drawable.c
index 16dab62..2d5510a 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 dfd0b87..eaf0b95 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;
More information about the mesa-commit
mailing list