From 1edf0cc6ab340c98fde201328631ca61e9d871a1 Mon Sep 17 00:00:00 2001 From: Zhigang Gong Date: Sun, 22 May 2011 23:45:51 +0800 Subject: [PATCH] glamor: Don't write back read only pixmap to fbo. For those pixmap which has valid fbo and opened as GLAMOR_ACCESS_RO mode, we don't need to upload the texture back when calling the glamor_finish_access(). This will get about 10% performance gain. --- glamor/glamor_core.c | 5 +++++ glamor/glamor_priv.h | 1 + 2 files changed, 6 insertions(+) diff --git a/glamor/glamor_core.c b/glamor/glamor_core.c index 635b72641..f5fc1a3eb 100644 --- a/glamor/glamor_core.c +++ b/glamor/glamor_core.c @@ -332,6 +332,7 @@ glamor_prepare_access(DrawablePtr drawable, glamor_access_t access) return FALSE; } + pixmap_priv->access_mode = access; glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, pixmap_priv->fb); glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_PACK_ROW_LENGTH, row_length); @@ -468,6 +469,9 @@ glamor_finish_access(DrawablePtr drawable) if (pixmap->devPrivate.ptr == NULL) return; + if (pixmap_priv->access_mode == GLAMOR_ACCESS_RO) + goto read_only; + stride = pixmap->devKind; row_length = (stride * 8) / pixmap->drawable.bitsPerPixel; switch (drawable->depth) { @@ -526,6 +530,7 @@ glamor_finish_access(DrawablePtr drawable) glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDeleteTextures(1, &tex); +read_only: if (GLEW_MESA_pack_invert || glamor_priv->yInverted) { glBindBufferARB (GL_PIXEL_PACK_BUFFER_EXT, pixmap_priv->pbo); glUnmapBufferARB (GL_PIXEL_PACK_BUFFER_EXT); diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h index 93837e0b7..8ded91a5e 100644 --- a/glamor/glamor_priv.h +++ b/glamor/glamor_priv.h @@ -193,6 +193,7 @@ typedef struct glamor_pixmap_private { GLuint fb; GLuint pbo; enum glamor_pixmap_type type; + glamor_access_t access_mode; } glamor_pixmap_private; extern DevPrivateKey glamor_screen_private_key;