gallium: use put image shm2 path (v2)

This fixes the drisw paths to use the new shm2 interface, so that
we don't trigger the X server overflow checks when the x offset is non-zero.

This just hides the versioning in drisw, and either passes the src_x
or adds the offset fixup for the fallback path.

Cc: <mesa-stable@lists.freedesktop.org>
Reviewed-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
Dave Airlie
2018-12-27 14:26:49 +10:00
parent 00af91ca46
commit 1f6b92b476
3 changed files with 22 additions and 10 deletions

View File

@@ -20,7 +20,7 @@ struct drisw_loader_funcs
void (*put_image2) (struct dri_drawable *dri_drawable, void (*put_image2) (struct dri_drawable *dri_drawable,
void *data, int x, int y, unsigned width, unsigned height, unsigned stride); void *data, int x, int y, unsigned width, unsigned height, unsigned stride);
void (*put_image_shm) (struct dri_drawable *dri_drawable, void (*put_image_shm) (struct dri_drawable *dri_drawable,
int shmid, char *shmaddr, unsigned offset, int shmid, char *shmaddr, unsigned offset, unsigned offset_x,
int x, int y, unsigned width, unsigned height, unsigned stride); int x, int y, unsigned width, unsigned height, unsigned stride);
}; };

View File

@@ -79,15 +79,21 @@ put_image2(__DRIdrawable *dPriv, void *data, int x, int y,
static inline void static inline void
put_image_shm(__DRIdrawable *dPriv, int shmid, char *shmaddr, put_image_shm(__DRIdrawable *dPriv, int shmid, char *shmaddr,
unsigned offset, int x, int y, unsigned offset, unsigned offset_x, int x, int y,
unsigned width, unsigned height, unsigned stride) unsigned width, unsigned height, unsigned stride)
{ {
__DRIscreen *sPriv = dPriv->driScreenPriv; __DRIscreen *sPriv = dPriv->driScreenPriv;
const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader; const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader;
loader->putImageShm(dPriv, __DRI_SWRAST_IMAGE_OP_SWAP, /* if we have the newer interface, don't have to add the offset_x here. */
if (loader->base.version > 4 && loader->putImageShm2)
loader->putImageShm2(dPriv, __DRI_SWRAST_IMAGE_OP_SWAP,
x, y, width, height, stride, x, y, width, height, stride,
shmid, shmaddr, offset, dPriv->loaderPrivate); shmid, shmaddr, offset, dPriv->loaderPrivate);
else
loader->putImageShm(dPriv, __DRI_SWRAST_IMAGE_OP_SWAP,
x, y, width, height, stride,
shmid, shmaddr, offset + offset_x, dPriv->loaderPrivate);
} }
static inline void static inline void
@@ -179,12 +185,13 @@ drisw_put_image2(struct dri_drawable *drawable,
static inline void static inline void
drisw_put_image_shm(struct dri_drawable *drawable, drisw_put_image_shm(struct dri_drawable *drawable,
int shmid, char *shmaddr, unsigned offset, int shmid, char *shmaddr, unsigned offset,
unsigned offset_x,
int x, int y, unsigned width, unsigned height, int x, int y, unsigned width, unsigned height,
unsigned stride) unsigned stride)
{ {
__DRIdrawable *dPriv = drawable->dPriv; __DRIdrawable *dPriv = drawable->dPriv;
put_image_shm(dPriv, shmid, shmaddr, offset, x, y, width, height, stride); put_image_shm(dPriv, shmid, shmaddr, offset, offset_x, x, y, width, height, stride);
} }
static inline void static inline void

View File

@@ -244,15 +244,20 @@ dri_sw_displaytarget_display(struct sw_winsys *ws,
unsigned width, height, x = 0, y = 0; unsigned width, height, x = 0, y = 0;
unsigned blsize = util_format_get_blocksize(dri_sw_dt->format); unsigned blsize = util_format_get_blocksize(dri_sw_dt->format);
unsigned offset = 0; unsigned offset = 0;
unsigned offset_x = 0;
char *data = dri_sw_dt->data; char *data = dri_sw_dt->data;
bool is_shm = dri_sw_dt->shmid != -1;
/* Set the width to 'stride / cpp'. /* Set the width to 'stride / cpp'.
* *
* PutImage correctly clips to the width of the dst drawable. * PutImage correctly clips to the width of the dst drawable.
*/ */
if (box) { if (box) {
offset = (dri_sw_dt->stride * box->y) + box->x * blsize; offset = dri_sw_dt->stride * box->y;
offset_x = box->x * blsize;
data += offset; data += offset;
/* don't add x offset for shm, the put_image_shm will deal with it */
if (!is_shm)
data += offset_x;
x = box->x; x = box->x;
y = box->y; y = box->y;
width = box->width; width = box->width;
@@ -262,8 +267,8 @@ dri_sw_displaytarget_display(struct sw_winsys *ws,
height = dri_sw_dt->height; height = dri_sw_dt->height;
} }
if (dri_sw_dt->shmid != -1) { if (is_shm) {
dri_sw_ws->lf->put_image_shm(dri_drawable, dri_sw_dt->shmid, dri_sw_dt->data, offset, dri_sw_ws->lf->put_image_shm(dri_drawable, dri_sw_dt->shmid, dri_sw_dt->data, offset, offset_x,
x, y, width, height, dri_sw_dt->stride); x, y, width, height, dri_sw_dt->stride);
return; return;
} }