glamor: Drop dead glamor_download_pixmap_to_cpu()
Signed-off-by: Eric Anholt <eric@anholt.net> Reviewed-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
		
							parent
							
								
									b6181007de
								
							
						
					
					
						commit
						98155bd9d9
					
				|  | @ -923,26 +923,6 @@ glamor_put_bits(char *dst_bits, int dst_stride, char *src_bits, | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 |  | ||||||
|  * download sub region from a large region. |  | ||||||
|  */ |  | ||||||
| static void |  | ||||||
| glamor_get_bits(char *dst_bits, int dst_stride, char *src_bits, |  | ||||||
|                 int src_stride, int bpp, int x, int y, int w, int h) |  | ||||||
| { |  | ||||||
|     int j; |  | ||||||
|     int byte_per_pixel; |  | ||||||
| 
 |  | ||||||
|     byte_per_pixel = bpp / 8; |  | ||||||
|     dst_bits += y * dst_stride + x * byte_per_pixel; |  | ||||||
| 
 |  | ||||||
|     for (j = y; j < y + h; j++) { |  | ||||||
|         memcpy(dst_bits, src_bits, w * byte_per_pixel); |  | ||||||
|         src_bits += src_stride; |  | ||||||
|         dst_bits += dst_stride; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Bool | Bool | ||||||
| glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w, | glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w, | ||||||
|                                     int h, int stride, void *bits, int pbo) |                                     int h, int stride, void *bits, int pbo) | ||||||
|  | @ -1160,300 +1140,6 @@ glamor_es2_pixmap_read_prepare(PixmapPtr source, int x, int y, int w, int h, | ||||||
|     return temp_fbo; |     return temp_fbo; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 |  | ||||||
|  * Download a sub region of pixmap to a specified memory region. |  | ||||||
|  * The pixmap must have a valid FBO, otherwise return a NULL. |  | ||||||
|  * */ |  | ||||||
| 
 |  | ||||||
| static void * |  | ||||||
| _glamor_download_sub_pixmap_to_cpu(PixmapPtr pixmap, GLenum format, |  | ||||||
|                                    GLenum type, int no_alpha, |  | ||||||
|                                    int revert, int swap_rb, |  | ||||||
|                                    int x, int y, int w, int h, |  | ||||||
|                                    int stride, void *bits, int pbo, |  | ||||||
|                                    glamor_access_t access) |  | ||||||
| { |  | ||||||
|     glamor_pixmap_private *pixmap_priv; |  | ||||||
|     GLenum gl_access = 0, gl_usage = 0; |  | ||||||
|     void *data; |  | ||||||
|     glamor_screen_private *glamor_priv = |  | ||||||
|         glamor_get_screen_private(pixmap->drawable.pScreen); |  | ||||||
|     glamor_pixmap_fbo *temp_fbo = NULL; |  | ||||||
|     int need_post_conversion = 0; |  | ||||||
|     int need_free_data = 0; |  | ||||||
|     int fbo_x_off, fbo_y_off; |  | ||||||
| 
 |  | ||||||
|     data = bits; |  | ||||||
|     pixmap_priv = glamor_get_pixmap_private(pixmap); |  | ||||||
|     if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) |  | ||||||
|         return NULL; |  | ||||||
| 
 |  | ||||||
|     switch (access) { |  | ||||||
|     case GLAMOR_ACCESS_RO: |  | ||||||
|         gl_access = GL_READ_ONLY; |  | ||||||
|         gl_usage = GL_STREAM_READ; |  | ||||||
|         break; |  | ||||||
|     case GLAMOR_ACCESS_RW: |  | ||||||
|         gl_access = GL_READ_WRITE; |  | ||||||
|         gl_usage = GL_DYNAMIC_DRAW; |  | ||||||
|         break; |  | ||||||
|     default: |  | ||||||
|         ErrorF("Glamor: Invalid access code. %d\n", access); |  | ||||||
|         assert(0); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     glamor_make_current(glamor_priv); |  | ||||||
|     glamor_set_destination_pixmap_priv_nc(pixmap_priv); |  | ||||||
| 
 |  | ||||||
|     need_post_conversion = (revert > REVERT_NORMAL); |  | ||||||
|     if (need_post_conversion) { |  | ||||||
|         if (pixmap->drawable.depth == 1) { |  | ||||||
|             int temp_stride; |  | ||||||
| 
 |  | ||||||
|             temp_stride = (((w * 8 + 7) / 8) + 3) & ~3; |  | ||||||
|             data = malloc(temp_stride * h); |  | ||||||
|             if (data == NULL) |  | ||||||
|                 return NULL; |  | ||||||
|             need_free_data = 1; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     pixmap_priv_get_fbo_off(pixmap_priv, &fbo_x_off, &fbo_y_off); |  | ||||||
| 
 |  | ||||||
|     if (glamor_priv->gl_flavor == GLAMOR_GL_ES2 |  | ||||||
|         && !need_post_conversion |  | ||||||
|         && (swap_rb != SWAP_NONE_DOWNLOADING || revert != REVERT_NONE)) { |  | ||||||
|         if (!(temp_fbo = glamor_es2_pixmap_read_prepare(pixmap, x, y, w, h, |  | ||||||
|                                                         format, type, no_alpha, |  | ||||||
|                                                         revert, swap_rb))) { |  | ||||||
|             free(data); |  | ||||||
|             return NULL; |  | ||||||
|         } |  | ||||||
|         x = 0; |  | ||||||
|         y = 0; |  | ||||||
|         fbo_x_off = 0; |  | ||||||
|         fbo_y_off = 0; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     glPixelStorei(GL_PACK_ALIGNMENT, 4); |  | ||||||
| 
 |  | ||||||
|     if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP && data == NULL) { |  | ||||||
|         assert(pbo > 0); |  | ||||||
|         glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo); |  | ||||||
|         glBufferData(GL_PIXEL_PACK_BUFFER, stride * h, NULL, gl_usage); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     glReadPixels(x + fbo_x_off, y + fbo_y_off, w, h, format, type, data); |  | ||||||
| 
 |  | ||||||
|     if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP && bits == NULL) { |  | ||||||
|         bits = glMapBuffer(GL_PIXEL_PACK_BUFFER, gl_access); |  | ||||||
|         glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     glBindFramebuffer(GL_FRAMEBUFFER, 0); |  | ||||||
| 
 |  | ||||||
|     if (need_post_conversion) { |  | ||||||
|         /* As OpenGL desktop version never enters here.
 |  | ||||||
|          * Don't need to consider if the pbo is valid.*/ |  | ||||||
|         bits = glamor_color_convert_to_bits(data, bits, |  | ||||||
|                                             w, h, |  | ||||||
|                                             stride, no_alpha, revert, swap_rb); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (temp_fbo != NULL) |  | ||||||
|         glamor_destroy_fbo(temp_fbo); |  | ||||||
|     if (need_free_data) |  | ||||||
|         free(data); |  | ||||||
| 
 |  | ||||||
|     return bits; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void * |  | ||||||
| glamor_download_sub_pixmap_to_cpu(PixmapPtr pixmap, int x, int y, int w, int h, |  | ||||||
|                                   int stride, void *bits, int pbo, |  | ||||||
|                                   glamor_access_t access) |  | ||||||
| { |  | ||||||
|     GLenum format, type; |  | ||||||
|     int no_alpha, revert, swap_rb; |  | ||||||
|     glamor_pixmap_private *pixmap_priv; |  | ||||||
|     Bool force_clip; |  | ||||||
| 
 |  | ||||||
|     if (glamor_get_tex_format_type_from_pixmap(pixmap, |  | ||||||
|                                                &format, |  | ||||||
|                                                &type, |  | ||||||
|                                                &no_alpha, |  | ||||||
|                                                &revert, &swap_rb, 0)) { |  | ||||||
|         glamor_fallback("Unknown pixmap depth %d.\n", pixmap->drawable.depth); |  | ||||||
|         return NULL; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     pixmap_priv = glamor_get_pixmap_private(pixmap); |  | ||||||
|     if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) |  | ||||||
|         return NULL; |  | ||||||
| 
 |  | ||||||
|     force_clip = pixmap_priv->base.glamor_priv->gl_flavor != GLAMOR_GL_DESKTOP |  | ||||||
|         && !glamor_check_fbo_size(pixmap_priv->base.glamor_priv, w, h); |  | ||||||
| 
 |  | ||||||
|     if (pixmap_priv->type == GLAMOR_TEXTURE_LARGE || force_clip) { |  | ||||||
| 
 |  | ||||||
|         RegionRec region; |  | ||||||
|         BoxRec box; |  | ||||||
|         int n_region; |  | ||||||
|         glamor_pixmap_clipped_regions *clipped_regions; |  | ||||||
|         void *sub_bits; |  | ||||||
|         int i, j; |  | ||||||
| 
 |  | ||||||
|         sub_bits = malloc(h * stride); |  | ||||||
|         if (sub_bits == NULL) |  | ||||||
|             return FALSE; |  | ||||||
|         box.x1 = x; |  | ||||||
|         box.y1 = y; |  | ||||||
|         box.x2 = x + w; |  | ||||||
|         box.y2 = y + h; |  | ||||||
|         RegionInitBoxes(®ion, &box, 1); |  | ||||||
| 
 |  | ||||||
|         if (!force_clip) |  | ||||||
|             clipped_regions = |  | ||||||
|                 glamor_compute_clipped_regions(pixmap_priv, ®ion, &n_region, |  | ||||||
|                                                0, 0, 0); |  | ||||||
|         else |  | ||||||
|             clipped_regions = |  | ||||||
|                 glamor_compute_clipped_regions_ext(pixmap_priv, ®ion, |  | ||||||
|                                                    &n_region, |  | ||||||
|                                                    pixmap_priv->large.block_w, |  | ||||||
|                                                    pixmap_priv->large.block_h, |  | ||||||
|                                                    0, |  | ||||||
|                                                    0); |  | ||||||
| 
 |  | ||||||
|         DEBUGF("start download large pixmap %p %dx%d \n", pixmap, w, h); |  | ||||||
|         for (i = 0; i < n_region; i++) { |  | ||||||
|             BoxPtr boxes; |  | ||||||
|             int nbox; |  | ||||||
|             int temp_stride; |  | ||||||
|             void *temp_bits; |  | ||||||
| 
 |  | ||||||
|             assert(pbo == 0); |  | ||||||
|             SET_PIXMAP_FBO_CURRENT(pixmap_priv, clipped_regions[i].block_idx); |  | ||||||
| 
 |  | ||||||
|             boxes = RegionRects(clipped_regions[i].region); |  | ||||||
|             nbox = RegionNumRects(clipped_regions[i].region); |  | ||||||
|             for (j = 0; j < nbox; j++) { |  | ||||||
|                 temp_stride = PixmapBytePad(boxes[j].x2 - boxes[j].x1, |  | ||||||
|                                             pixmap->drawable.depth); |  | ||||||
| 
 |  | ||||||
|                 if (boxes[j].x1 == x && temp_stride == stride) { |  | ||||||
|                     temp_bits = (char *) bits + (boxes[j].y1 - y) * stride; |  | ||||||
|                 } |  | ||||||
|                 else { |  | ||||||
|                     temp_bits = sub_bits; |  | ||||||
|                 } |  | ||||||
|                 DEBUGF("download x %d y %d w %d h %d temp stride %d \n", |  | ||||||
|                        boxes[j].x1, boxes[j].y1, |  | ||||||
|                        boxes[j].x2 - boxes[j].x1, |  | ||||||
|                        boxes[j].y2 - boxes[j].y1, temp_stride); |  | ||||||
| 
 |  | ||||||
|                 /* For large pixmap, we don't support pbo currently. */ |  | ||||||
|                 assert(pbo == 0); |  | ||||||
|                 if (_glamor_download_sub_pixmap_to_cpu |  | ||||||
|                     (pixmap, format, type, no_alpha, revert, swap_rb, |  | ||||||
|                      boxes[j].x1, boxes[j].y1, boxes[j].x2 - boxes[j].x1, |  | ||||||
|                      boxes[j].y2 - boxes[j].y1, temp_stride, temp_bits, pbo, |  | ||||||
|                      access) == FALSE) { |  | ||||||
|                     RegionUninit(®ion); |  | ||||||
|                     free(sub_bits); |  | ||||||
|                     assert(0); |  | ||||||
|                     return NULL; |  | ||||||
|                 } |  | ||||||
|                 if (boxes[j].x1 != x || temp_stride != stride) |  | ||||||
|                     glamor_get_bits(bits, stride, temp_bits, temp_stride, |  | ||||||
|                                     pixmap->drawable.bitsPerPixel, |  | ||||||
|                                     boxes[j].x1 - x, boxes[j].y1 - y, |  | ||||||
|                                     boxes[j].x2 - boxes[j].x1, |  | ||||||
|                                     boxes[j].y2 - boxes[j].y1); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             RegionDestroy(clipped_regions[i].region); |  | ||||||
|         } |  | ||||||
|         free(sub_bits); |  | ||||||
|         free(clipped_regions); |  | ||||||
|         RegionUninit(®ion); |  | ||||||
|         return bits; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|         return _glamor_download_sub_pixmap_to_cpu(pixmap, format, type, |  | ||||||
|                                                   no_alpha, revert, swap_rb, x, |  | ||||||
|                                                   y, w, h, stride, bits, pbo, |  | ||||||
|                                                   access); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * Move a pixmap to CPU memory. |  | ||||||
|  * The input data is the pixmap's fbo. |  | ||||||
|  * The output data is at pixmap->devPrivate.ptr. We always use pbo |  | ||||||
|  * to read the fbo and then map it to va. If possible, we will use |  | ||||||
|  * it directly as devPrivate.ptr. |  | ||||||
|  * If successfully download a fbo to cpu then return TRUE. |  | ||||||
|  * Otherwise return FALSE. |  | ||||||
|  **/ |  | ||||||
| Bool |  | ||||||
| glamor_download_pixmap_to_cpu(PixmapPtr pixmap, glamor_access_t access) |  | ||||||
| { |  | ||||||
|     glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap); |  | ||||||
|     unsigned int stride; |  | ||||||
|     void *data = NULL, *dst; |  | ||||||
|     glamor_screen_private *glamor_priv = |  | ||||||
|         glamor_get_screen_private(pixmap->drawable.pScreen); |  | ||||||
|     int pbo = 0; |  | ||||||
| 
 |  | ||||||
|     if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) |  | ||||||
|         return TRUE; |  | ||||||
| 
 |  | ||||||
|     glamor_debug_output(GLAMOR_DEBUG_TEXTURE_DOWNLOAD, |  | ||||||
|                         "Downloading pixmap %p  %dx%d depth%d\n", |  | ||||||
|                         pixmap, |  | ||||||
|                         pixmap->drawable.width, |  | ||||||
|                         pixmap->drawable.height, pixmap->drawable.depth); |  | ||||||
| 
 |  | ||||||
|     stride = pixmap->devKind; |  | ||||||
| 
 |  | ||||||
|     if (glamor_priv->gl_flavor == GLAMOR_GL_ES2 |  | ||||||
|         || pixmap_priv->type == GLAMOR_TEXTURE_LARGE) { |  | ||||||
|         data = malloc(stride * pixmap->drawable.height); |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         glamor_make_current(glamor_priv); |  | ||||||
|         if (pixmap_priv->base.fbo->pbo == 0) |  | ||||||
|             glGenBuffers(1, &pixmap_priv->base.fbo->pbo); |  | ||||||
|         pbo = pixmap_priv->base.fbo->pbo; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (pixmap_priv->type == GLAMOR_TEXTURE_DRM) { |  | ||||||
|         stride = PixmapBytePad(pixmap->drawable.width, pixmap->drawable.depth); |  | ||||||
|         pixmap_priv->base.drm_stride = pixmap->devKind; |  | ||||||
|         pixmap->devKind = stride; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     dst = glamor_download_sub_pixmap_to_cpu(pixmap, 0, 0, |  | ||||||
|                                             pixmap->drawable.width, |  | ||||||
|                                             pixmap->drawable.height, |  | ||||||
|                                             pixmap->devKind, data, pbo, access); |  | ||||||
| 
 |  | ||||||
|     if (!dst) { |  | ||||||
|         if (data) |  | ||||||
|             free(data); |  | ||||||
|         return FALSE; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (pbo != 0) |  | ||||||
|         pixmap_priv->base.fbo->pbo_valid = 1; |  | ||||||
| 
 |  | ||||||
|     pixmap_priv->base.gl_fbo = GLAMOR_FBO_DOWNLOADED; |  | ||||||
| 
 |  | ||||||
|     pixmap->devPrivate.ptr = dst; |  | ||||||
| 
 |  | ||||||
|     return TRUE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* fixup a fbo to the exact size as the pixmap. */ | /* fixup a fbo to the exact size as the pixmap. */ | ||||||
| /* XXX LARGE pixmap? */ | /* XXX LARGE pixmap? */ | ||||||
| Bool | Bool | ||||||
|  |  | ||||||
|  | @ -788,21 +788,6 @@ glamor_get_vbo_space(ScreenPtr screen, unsigned size, char **vbo_offset); | ||||||
| void | void | ||||||
| glamor_put_vbo_space(ScreenPtr screen); | glamor_put_vbo_space(ScreenPtr screen); | ||||||
| 
 | 
 | ||||||
| /**
 |  | ||||||
|  * Download a pixmap's texture to cpu memory. If success, |  | ||||||
|  * One copy of current pixmap's texture will be put into |  | ||||||
|  * the pixmap->devPrivate.ptr. Will use pbo to map to |  | ||||||
|  * the pointer if possible. |  | ||||||
|  * The pixmap must be a gl texture pixmap. gl_fbo must be GLAMOR_FBO_NORMAL and |  | ||||||
|  * gl_tex must be 1. Used by glamor_prepare_access. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| Bool glamor_download_pixmap_to_cpu(PixmapPtr pixmap, glamor_access_t access); |  | ||||||
| 
 |  | ||||||
| void *glamor_download_sub_pixmap_to_cpu(PixmapPtr pixmap, int x, int y, int w, |  | ||||||
|                                         int h, int stride, void *bits, int pbo, |  | ||||||
|                                         glamor_access_t access); |  | ||||||
| 
 |  | ||||||
| /**
 | /**
 | ||||||
|  * Restore a pixmap's data which is downloaded by |  * Restore a pixmap's data which is downloaded by | ||||||
|  * glamor_download_pixmap_to_cpu to its original |  * glamor_download_pixmap_to_cpu to its original | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue