[Glamor] [PATCH 5/9] glamor_getimage: Add the optimization path of getImage.

zhigang.gong at linux.intel.com zhigang.gong at linux.intel.com
Sun Jan 8 21:36:07 PST 2012


From: Zhigang Gong <zhigang.gong at linux.intel.com>

This optimization will only call glReadPixels once. It should get
some performance gain. But it seems it even get worse performance
at SNB, disable it by default.

Signed-off-by: Zhigang Gong <zhigang.gong at linux.intel.com>
---
 src/glamor_getimage.c |   81 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 79 insertions(+), 2 deletions(-)

diff --git a/src/glamor_getimage.c b/src/glamor_getimage.c
index 7a9280b..9659f9e 100644
--- a/src/glamor_getimage.c
+++ b/src/glamor_getimage.c
@@ -34,11 +34,88 @@
 
 
 static Bool
-_glamor_get_image(DrawablePtr pDrawable, int x, int y, int w, int h,
+_glamor_get_image(DrawablePtr drawable, int x, int y, int w, int h,
 		  unsigned int format, unsigned long planeMask, char *d,
 		  Bool fallback)
 {
-	miGetImage(pDrawable, x, y, w, h, format, planeMask, d);
+	PixmapPtr pixmap;
+	struct glamor_pixmap_private *pixmap_priv;
+	struct glamor_screen_private *glamor_priv;
+	int x_off, y_off;
+	GLenum tex_format, tex_type;
+	int no_alpha, no_revert;
+	PixmapPtr temp_pixmap = NULL;
+	glamor_gl_dispatch * dispatch;
+
+	goto fall_back;
+	if (format != ZPixmap)
+		goto fall_back;
+
+	pixmap = glamor_get_drawable_pixmap(drawable);
+	if (!glamor_set_planemask(pixmap, planeMask)) {
+		glamor_fallback
+		    ("Failedto set planemask  in glamor_solid.\n");
+		goto fall_back;
+	}
+	glamor_priv = glamor_get_screen_private(drawable->pScreen);
+	pixmap_priv = glamor_get_pixmap_private(pixmap);
+	dispatch = &glamor_priv->dispatch;
+
+
+	if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
+		goto fall_back;
+	glamor_get_drawable_deltas(drawable, pixmap, &x_off, &y_off);
+
+	if (glamor_get_tex_format_type_from_pixmap(pixmap,
+						   &tex_format,
+						   &tex_type,
+						   &no_alpha,
+						   &no_revert)) {
+		glamor_fallback("unknown depth. %d \n", drawable->depth);
+		goto fall_back;
+	}
+
+	glamor_set_destination_pixmap_priv_nc(pixmap_priv);
+	glamor_validate_pixmap(pixmap);
+
+	if (glamor_priv->gl_flavor == GLAMOR_GL_ES2) {
+		/* XXX prepare whole pixmap is not efficient. */
+		temp_pixmap =
+		    glamor_es2_pixmap_read_prepare(pixmap, &tex_format,
+						   &tex_type, no_alpha,
+						   no_revert);
+		pixmap_priv = glamor_get_pixmap_private(temp_pixmap);
+		glamor_set_destination_pixmap_priv_nc(pixmap_priv);
+	}
+
+	int row_length = PixmapBytePad(w, drawable->depth);
+	row_length = (row_length * 8) / drawable->bitsPerPixel;
+	if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
+		dispatch->glPixelStorei(GL_PACK_ALIGNMENT, 1);
+		dispatch->glPixelStorei(GL_PACK_ROW_LENGTH, row_length);
+	} else {
+		dispatch->glPixelStorei(GL_PACK_ALIGNMENT, 4);
+	}
+
+	if (glamor_priv->yInverted)
+		dispatch->glReadPixels(x + x_off,
+				       y + y_off,
+				       w, h,
+				       tex_format,
+				       tex_type, d);
+	else
+		dispatch->glReadPixels(x + x_off,
+				       pixmap->drawable.height - 1 - (y + y_off),
+				       w,
+				       h,
+				       tex_format,
+				       tex_type, d);
+	if (temp_pixmap)
+		glamor_destroy_pixmap(temp_pixmap);
+	return TRUE;
+
+fall_back:
+	miGetImage(drawable, x, y, w, h, format, planeMask, d);
 	return TRUE;
 }
 
-- 
1.7.4.4



More information about the Glamor mailing list