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
Block a user