From cda627eb48a4e740bbfd687caee9037d6bdb09af Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 12 Feb 2024 14:01:30 -0500 Subject: [PATCH] drisw/winsys: loop over all the boxes in display() Acked-by: Daniel Stone Part-of: --- src/gallium/winsys/sw/dri/dri_sw_winsys.c | 50 +++++++++++------------ 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/src/gallium/winsys/sw/dri/dri_sw_winsys.c b/src/gallium/winsys/sw/dri/dri_sw_winsys.c index f65e2663f11..f176d177e3b 100644 --- a/src/gallium/winsys/sw/dri/dri_sw_winsys.c +++ b/src/gallium/winsys/sw/dri/dri_sw_winsys.c @@ -250,41 +250,39 @@ dri_sw_displaytarget_display(struct sw_winsys *ws, struct dri_drawable *dri_drawable = (struct dri_drawable *)context_private; 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 (nboxes == 1) { - 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; - height = box->height; - } else { + if (!nboxes) { width = dri_sw_dt->stride / blsize; height = dri_sw_dt->height; - } - - 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); + if (is_shm) + dri_sw_ws->lf->put_image_shm(dri_drawable, dri_sw_dt->shmid, dri_sw_dt->data, 0, 0, + 0, 0, width, height, dri_sw_dt->stride); + else + dri_sw_ws->lf->put_image(dri_drawable, dri_sw_dt->data, width, height); return; } - - if (nboxes == 1) - dri_sw_ws->lf->put_image2(dri_drawable, data, - x, y, width, height, dri_sw_dt->stride); - else - dri_sw_ws->lf->put_image(dri_drawable, data, width, height); + for (unsigned i = 0; i < nboxes; i++) { + unsigned offset = dri_sw_dt->stride * box[i].y; + unsigned offset_x = box[i].x * blsize; + char *data = dri_sw_dt->data + offset; + x = box[i].x; + y = box[i].y; + width = box[i].width; + height = box[i].height; + if (is_shm) { + /* don't add x offset for shm, the put_image_shm will deal with it */ + 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); + } else { + data += offset_x; + dri_sw_ws->lf->put_image2(dri_drawable, data, + x, y, width, height, dri_sw_dt->stride); + } + } } static void