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>tags/19.0-branchpoint
@@ -20,7 +20,7 @@ struct drisw_loader_funcs | |||
void (*put_image2) (struct dri_drawable *dri_drawable, | |||
void *data, int x, int y, unsigned width, unsigned height, unsigned stride); | |||
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); | |||
}; | |||
@@ -79,15 +79,21 @@ put_image2(__DRIdrawable *dPriv, void *data, int x, int y, | |||
static inline void | |||
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) | |||
{ | |||
__DRIscreen *sPriv = dPriv->driScreenPriv; | |||
const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader; | |||
loader->putImageShm(dPriv, __DRI_SWRAST_IMAGE_OP_SWAP, | |||
x, y, width, height, stride, | |||
shmid, shmaddr, offset, dPriv->loaderPrivate); | |||
/* 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, | |||
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 | |||
@@ -179,12 +185,13 @@ drisw_put_image2(struct dri_drawable *drawable, | |||
static inline void | |||
drisw_put_image_shm(struct dri_drawable *drawable, | |||
int shmid, char *shmaddr, unsigned offset, | |||
unsigned offset_x, | |||
int x, int y, unsigned width, unsigned height, | |||
unsigned stride) | |||
{ | |||
__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 |
@@ -244,15 +244,20 @@ dri_sw_displaytarget_display(struct sw_winsys *ws, | |||
unsigned width, height, x = 0, y = 0; | |||
unsigned blsize = util_format_get_blocksize(dri_sw_dt->format); | |||
unsigned offset = 0; | |||
unsigned offset_x = 0; | |||
char *data = dri_sw_dt->data; | |||
bool is_shm = dri_sw_dt->shmid != -1; | |||
/* Set the width to 'stride / cpp'. | |||
* | |||
* PutImage correctly clips to the width of the dst drawable. | |||
*/ | |||
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; | |||
/* don't add x offset for shm, the put_image_shm will deal with it */ | |||
if (!is_shm) | |||
data += offset_x; | |||
x = box->x; | |||
y = box->y; | |||
width = box->width; | |||
@@ -262,8 +267,8 @@ dri_sw_displaytarget_display(struct sw_winsys *ws, | |||
height = dri_sw_dt->height; | |||
} | |||
if (dri_sw_dt->shmid != -1) { | |||
dri_sw_ws->lf->put_image_shm(dri_drawable, dri_sw_dt->shmid, dri_sw_dt->data, offset, | |||
if (is_shm) { | |||
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); | |||
return; | |||
} |