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