glamor: Take DrawablePtr instead of PixmapPtr in up/download_boxes

Will allow for better results if the window depth doesn't match the
backing pixmap depth.
This commit is contained in:
Michel Dänzer 2023-06-24 11:22:14 +02:00 committed by Michel Dänzer
parent 5893de5a22
commit a504f65d89
7 changed files with 28 additions and 26 deletions

View File

@ -107,7 +107,7 @@ glamor_copy_glyph(PixmapPtr glyph_pixmap,
glyph_draw->height,
0, 0, 0x1);
}
glamor_upload_boxes((PixmapPtr) atlas_draw,
glamor_upload_boxes(atlas_draw,
&box, 1,
0, 0,
x, y,

View File

@ -255,7 +255,7 @@ glamor_copy_cpu_fbo(DrawablePtr src,
fbCopy1toN(src, &tmp_pix->drawable, gc, box, nbox, dx, dy,
reverse, upsidedown, bitplane, closure);
glamor_upload_boxes(dst_pixmap, box, nbox, tmp_xoff, tmp_yoff,
glamor_upload_boxes(dst, box, nbox, tmp_xoff, tmp_yoff,
dst_xoff, dst_yoff, (uint8_t *) tmp_bits,
tmp_stride * sizeof(FbBits));
fbDestroyPixmap(tmp_pix);
@ -266,7 +266,7 @@ glamor_copy_cpu_fbo(DrawablePtr src,
int src_xoff, src_yoff;
fbGetDrawable(src, src_bits, src_stride, src_bpp, src_xoff, src_yoff);
glamor_upload_boxes(dst_pixmap, box, nbox, src_xoff + dx, src_yoff + dy,
glamor_upload_boxes(dst, box, nbox, src_xoff + dx, src_yoff + dy,
dst_xoff, dst_yoff,
(uint8_t *) src_bits, src_stride * sizeof (FbBits));
}
@ -319,7 +319,7 @@ glamor_copy_fbo_cpu(DrawablePtr src,
fbGetDrawable(dst, dst_bits, dst_stride, dst_bpp, dst_xoff, dst_yoff);
glamor_download_boxes(src_pixmap, box, nbox, src_xoff + dx, src_yoff + dy,
glamor_download_boxes(src, box, nbox, src_xoff + dx, src_yoff + dy,
dst_xoff, dst_yoff,
(uint8_t *) dst_bits, dst_stride * sizeof (FbBits));
glamor_finish_access(dst);

View File

@ -76,7 +76,7 @@ glamor_put_image_gl(DrawablePtr drawable, GCPtr gc, int depth, int x, int y,
glamor_make_current(glamor_priv);
glamor_upload_region(pixmap, &region, x, y, (uint8_t *) bits, byte_stride);
glamor_upload_region(drawable, &region, x, y, (uint8_t *) bits, byte_stride);
RegionUninit(&region);
return TRUE;
@ -124,7 +124,7 @@ glamor_get_image_gl(DrawablePtr drawable, int x, int y, int w, int h,
box.x2 = x + w;
box.y1 = y;
box.y2 = y + h;
glamor_download_boxes(pixmap, &box, 1,
glamor_download_boxes(drawable, &box, 1,
drawable->x + off_x, drawable->y + off_y,
-x, -y,
(uint8_t *) d, byte_stride);

View File

@ -119,7 +119,7 @@ glamor_prep_pixmap_box(PixmapPtr pixmap, glamor_access_t access, BoxPtr box)
priv->map_access = access;
}
glamor_download_boxes(pixmap, RegionRects(&region), RegionNumRects(&region),
glamor_download_boxes(&pixmap->drawable, RegionRects(&region), RegionNumRects(&region),
0, 0, 0, 0, pixmap->devPrivate.ptr, pixmap->devKind);
RegionUninit(&region);
@ -161,7 +161,7 @@ glamor_fini_pixmap(PixmapPtr pixmap)
}
if (priv->map_access == GLAMOR_ACCESS_RW) {
glamor_upload_boxes(pixmap,
glamor_upload_boxes(&pixmap->drawable,
RegionRects(&priv->prepare_region),
RegionNumRects(&priv->prepare_region),
0, 0, 0, 0, pixmap->devPrivate.ptr, pixmap->devKind);

View File

@ -24,19 +24,20 @@
#include "glamor_transfer.h"
/*
* Write a region of bits into a pixmap
* Write a region of bits into a drawable's backing pixmap
*/
void
glamor_upload_boxes(PixmapPtr pixmap, BoxPtr in_boxes, int in_nbox,
glamor_upload_boxes(DrawablePtr drawable, BoxPtr in_boxes, int in_nbox,
int dx_src, int dy_src,
int dx_dst, int dy_dst,
uint8_t *bits, uint32_t byte_stride)
{
ScreenPtr screen = pixmap->drawable.pScreen;
ScreenPtr screen = drawable->pScreen;
glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
glamor_pixmap_private *priv = glamor_get_pixmap_private(pixmap);
int box_index;
int bytes_per_pixel = pixmap->drawable.bitsPerPixel >> 3;
int bytes_per_pixel = drawable->bitsPerPixel >> 3;
const struct glamor_format *f = glamor_format_for_pixmap(pixmap);
glamor_make_current(glamor_priv);
@ -97,30 +98,31 @@ glamor_upload_boxes(PixmapPtr pixmap, BoxPtr in_boxes, int in_nbox,
*/
void
glamor_upload_region(PixmapPtr pixmap, RegionPtr region,
glamor_upload_region(DrawablePtr drawable, RegionPtr region,
int region_x, int region_y,
uint8_t *bits, uint32_t byte_stride)
{
glamor_upload_boxes(pixmap, RegionRects(region), RegionNumRects(region),
glamor_upload_boxes(drawable, RegionRects(region), RegionNumRects(region),
-region_x, -region_y,
0, 0,
bits, byte_stride);
}
/*
* Read stuff from the pixmap FBOs and write to memory
* Read stuff from the drawable's backing pixmap FBOs and write to memory
*/
void
glamor_download_boxes(PixmapPtr pixmap, BoxPtr in_boxes, int in_nbox,
glamor_download_boxes(DrawablePtr drawable, BoxPtr in_boxes, int in_nbox,
int dx_src, int dy_src,
int dx_dst, int dy_dst,
uint8_t *bits, uint32_t byte_stride)
{
ScreenPtr screen = pixmap->drawable.pScreen;
ScreenPtr screen = drawable->pScreen;
glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
glamor_pixmap_private *priv = glamor_get_pixmap_private(pixmap);
int box_index;
int bytes_per_pixel = pixmap->drawable.bitsPerPixel >> 3;
int bytes_per_pixel = drawable->bitsPerPixel >> 3;
const struct glamor_format *f = glamor_format_for_pixmap(pixmap);
glamor_make_current(glamor_priv);

View File

@ -24,18 +24,18 @@
#define _GLAMOR_TRANSFER_H_
void
glamor_upload_boxes(PixmapPtr pixmap, BoxPtr in_boxes, int in_nbox,
glamor_upload_boxes(DrawablePtr drawable, BoxPtr in_boxes, int in_nbox,
int dx_src, int dy_src,
int dx_dst, int dy_dst,
uint8_t *bits, uint32_t byte_stride);
void
glamor_upload_region(PixmapPtr pixmap, RegionPtr region,
glamor_upload_region(DrawablePtr drawable, RegionPtr region,
int region_x, int region_y,
uint8_t *bits, uint32_t byte_stride);
void
glamor_download_boxes(PixmapPtr pixmap, BoxPtr in_boxes, int in_nbox,
glamor_download_boxes(DrawablePtr drawable, BoxPtr in_boxes, int in_nbox,
int dx_src, int dy_src,
int dx_dst, int dy_dst,
uint8_t *bits, uint32_t byte_stride);

View File

@ -584,15 +584,15 @@ glamor_xv_put_image(glamor_port_private *port_priv,
half_box.x2 = width >> 1;
half_box.y2 = (nlines + 1) >> 1;
glamor_upload_boxes(port_priv->src_pix[0], &full_box, 1,
glamor_upload_boxes(&port_priv->src_pix[0]->drawable, &full_box, 1,
0, 0, 0, 0,
buf + (top * srcPitch), srcPitch);
glamor_upload_boxes(port_priv->src_pix[1], &half_box, 1,
glamor_upload_boxes(&port_priv->src_pix[1]->drawable, &half_box, 1,
0, 0, 0, 0,
buf + s2offset, srcPitch2);
glamor_upload_boxes(port_priv->src_pix[2], &half_box, 1,
glamor_upload_boxes(&port_priv->src_pix[2]->drawable, &half_box, 1,
0, 0, 0, 0,
buf + s3offset, srcPitch2);
break;
@ -611,11 +611,11 @@ glamor_xv_put_image(glamor_port_private *port_priv,
half_box.x2 = width;
half_box.y2 = (nlines + 1) >> 1;
glamor_upload_boxes(port_priv->src_pix[0], &full_box, 1,
glamor_upload_boxes(&port_priv->src_pix[0]->drawable, &full_box, 1,
0, 0, 0, 0,
buf + (top * srcPitch), srcPitch);
glamor_upload_boxes(port_priv->src_pix[1], &half_box, 1,
glamor_upload_boxes(&port_priv->src_pix[1]->drawable, &half_box, 1,
0, 0, 0, 0,
buf + s2offset, srcPitch);
break;