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.
This commit is contained in:
parent
1495ba9e64
commit
1edf0cc6ab
|
@ -332,6 +332,7 @@ glamor_prepare_access(DrawablePtr drawable, glamor_access_t access)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pixmap_priv->access_mode = access;
|
||||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, pixmap_priv->fb);
|
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, pixmap_priv->fb);
|
||||||
glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
||||||
glPixelStorei(GL_PACK_ROW_LENGTH, row_length);
|
glPixelStorei(GL_PACK_ROW_LENGTH, row_length);
|
||||||
|
@ -468,6 +469,9 @@ glamor_finish_access(DrawablePtr drawable)
|
||||||
if (pixmap->devPrivate.ptr == NULL)
|
if (pixmap->devPrivate.ptr == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (pixmap_priv->access_mode == GLAMOR_ACCESS_RO)
|
||||||
|
goto read_only;
|
||||||
|
|
||||||
stride = pixmap->devKind;
|
stride = pixmap->devKind;
|
||||||
row_length = (stride * 8) / pixmap->drawable.bitsPerPixel;
|
row_length = (stride * 8) / pixmap->drawable.bitsPerPixel;
|
||||||
switch (drawable->depth) {
|
switch (drawable->depth) {
|
||||||
|
@ -526,6 +530,7 @@ glamor_finish_access(DrawablePtr drawable)
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
glDeleteTextures(1, &tex);
|
glDeleteTextures(1, &tex);
|
||||||
|
|
||||||
|
read_only:
|
||||||
if (GLEW_MESA_pack_invert || glamor_priv->yInverted) {
|
if (GLEW_MESA_pack_invert || glamor_priv->yInverted) {
|
||||||
glBindBufferARB (GL_PIXEL_PACK_BUFFER_EXT, pixmap_priv->pbo);
|
glBindBufferARB (GL_PIXEL_PACK_BUFFER_EXT, pixmap_priv->pbo);
|
||||||
glUnmapBufferARB (GL_PIXEL_PACK_BUFFER_EXT);
|
glUnmapBufferARB (GL_PIXEL_PACK_BUFFER_EXT);
|
||||||
|
|
|
@ -193,6 +193,7 @@ typedef struct glamor_pixmap_private {
|
||||||
GLuint fb;
|
GLuint fb;
|
||||||
GLuint pbo;
|
GLuint pbo;
|
||||||
enum glamor_pixmap_type type;
|
enum glamor_pixmap_type type;
|
||||||
|
glamor_access_t access_mode;
|
||||||
} glamor_pixmap_private;
|
} glamor_pixmap_private;
|
||||||
|
|
||||||
extern DevPrivateKey glamor_screen_private_key;
|
extern DevPrivateKey glamor_screen_private_key;
|
||||||
|
|
Loading…
Reference in New Issue