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:
@@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user