mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 15:30:14 +01:00
egl/x11: split large put image requests to avoid server destroy
wezterm in fullscreen 4k was exceeding the xcb max request size on the put image with llvmpipe. This fixes it to send sub-images, the Xlib put image used in glx does this internally, but not the xcb one, so just do it in sections here. Cc: mesa-stable Reviewed-by: Adam Jackson <ajax@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17155>
This commit is contained in:
parent
e8fc5cca90
commit
e6082ac62e
1 changed files with 21 additions and 3 deletions
|
|
@ -153,6 +153,10 @@ swrastPutImage(__DRIdrawable * draw, int op,
|
||||||
{
|
{
|
||||||
struct dri2_egl_surface *dri2_surf = loaderPrivate;
|
struct dri2_egl_surface *dri2_surf = loaderPrivate;
|
||||||
struct dri2_egl_display *dri2_dpy = dri2_egl_display(dri2_surf->base.Resource.Display);
|
struct dri2_egl_display *dri2_dpy = dri2_egl_display(dri2_surf->base.Resource.Display);
|
||||||
|
size_t hdr_len = sizeof(xcb_put_image_request_t);
|
||||||
|
int stride_b = dri2_surf->bytes_per_pixel * w;
|
||||||
|
size_t size = (hdr_len + stride_b * h) >> 2;
|
||||||
|
uint64_t max_req_len = xcb_get_maximum_request_length(dri2_dpy->conn);
|
||||||
|
|
||||||
xcb_gcontext_t gc;
|
xcb_gcontext_t gc;
|
||||||
|
|
||||||
|
|
@ -167,9 +171,23 @@ swrastPutImage(__DRIdrawable * draw, int op,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
xcb_put_image(dri2_dpy->conn, XCB_IMAGE_FORMAT_Z_PIXMAP, dri2_surf->drawable,
|
if (size < max_req_len) {
|
||||||
gc, w, h, x, y, 0, dri2_surf->depth,
|
xcb_put_image(dri2_dpy->conn, XCB_IMAGE_FORMAT_Z_PIXMAP, dri2_surf->drawable,
|
||||||
w*h*dri2_surf->bytes_per_pixel, (const uint8_t *)data);
|
gc, w, h, x, y, 0, dri2_surf->depth,
|
||||||
|
h * stride_b, (const uint8_t *)data);
|
||||||
|
} else {
|
||||||
|
int num_lines = ((max_req_len << 2) - hdr_len) / stride_b;
|
||||||
|
int y_start = 0;
|
||||||
|
int y_todo = h;
|
||||||
|
while (y_todo) {
|
||||||
|
int this_lines = MIN2(num_lines, y_todo);
|
||||||
|
xcb_put_image(dri2_dpy->conn, XCB_IMAGE_FORMAT_Z_PIXMAP, dri2_surf->drawable,
|
||||||
|
gc, w, this_lines, x, y_start, 0, dri2_surf->depth,
|
||||||
|
this_lines * stride_b, ((const uint8_t *)data + y_start * stride_b));
|
||||||
|
y_start += this_lines;
|
||||||
|
y_todo -= this_lines;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue