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 | ||||
| glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w, | ||||
|                                     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; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * 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. */ | ||||
| /* XXX LARGE pixmap? */ | ||||
| Bool | ||||
|  |  | |||
|  | @ -788,21 +788,6 @@ glamor_get_vbo_space(ScreenPtr screen, unsigned size, char **vbo_offset); | |||
| void | ||||
| 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 | ||||
|  * glamor_download_pixmap_to_cpu to its original | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue