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