gallium: use put image shm2 path (v2)
authorDave Airlie <airlied@redhat.com>
Thu, 27 Dec 2018 04:26:49 +0000 (14:26 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 24 Jan 2019 18:27:45 +0000 (04:27 +1000)
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>
src/gallium/include/state_tracker/drisw_api.h
src/gallium/state_trackers/dri/drisw.c
src/gallium/winsys/sw/dri/dri_sw_winsys.c

index e365ab81f185f2290969795d8a3d5a5df31d3d27..4b5d36c1797e7e65c1fe03765e200da842b2ff49 100644 (file)
@@ -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);
 };
 
index 5a0d2e1354ddc05114c1f74f210edb10366678e9..927ac39ce65dbcbee24f690b7e58478d4bd233a1 100644 (file)
@@ -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
index cd44b036c6fe3eff305c7be6b930cfb63a320572..c0200f939b6bc2b99c8e0c89e476a43a1c2c1a39 100644 (file)
@@ -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;
    }