Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package wlroots for openSUSE:Factory checked in at 2022-12-28 10:54:30 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/wlroots (Old) and /work/SRC/openSUSE:Factory/.wlroots.new.1563 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "wlroots" Wed Dec 28 10:54:30 2022 rev:24 rq:1045488 version:0.16.1 Changes: -------- --- /work/SRC/openSUSE:Factory/wlroots/wlroots.changes 2022-12-02 13:13:10.933866709 +0100 +++ /work/SRC/openSUSE:Factory/.wlroots.new.1563/wlroots.changes 2022-12-28 10:54:37.868140838 +0100 @@ -1,0 +2,24 @@ +Sun Dec 25 16:51:41 UTC 2022 - llyyr <llyyr.pub...@gmail.com> + +- Update to 0.16.1: + * backend: error out when missing DRM and libinput in wlr_backend_autocreate() + * backend/drm: only request page-flip if active + * backend/drm: log refresh rate in Hz + * backend/drm: log modesetting commits + * backend/drm: fix FPE when disabling output + * backend/drm: fix VRR test + * backend/wayland: ensure buffers are released on shutdown + * backend/x11: ensure buffers are released on shutdown + * render/egl: fix uninitialized pointers in init_dmabuf_formats + * scene/layer_shell_v1.c: set exclusive zone correctly + * scene/layer_shell_v1.c: remove redundant comment + * types/wlr_seat: finish keyboard_state during wlr_seat_destroy + * seat/pointer: Initialize low_res_value + * cursor: compare to scaled coords + * wlr_drm: Add missing wlr_buffer import + * wlr_seat: clear `drag->seat_client` when destroyed + * xwayland: fix wlr_xwayland_surface_from_wlr_surface() docs + * scene: fix output damage expansion condition + * build: exclude <wlr/types/wlr_drm_lease_v1.h> without DRM backend + +------------------------------------------------------------------- Old: ---- wlroots-0.16.0.tar.gz wlroots-0.16.0.tar.gz.sig New: ---- wlroots-0.16.1.tar.gz wlroots-0.16.1.tar.gz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ wlroots.spec ++++++ --- /var/tmp/diff_new_pack.nMFkOi/_old 2022-12-28 10:54:38.384143517 +0100 +++ /var/tmp/diff_new_pack.nMFkOi/_new 2022-12-28 10:54:38.392143559 +0100 @@ -24,7 +24,7 @@ %bcond_without xcb_errors Name: wlroots -Version: 0.16.0 +Version: 0.16.1 Release: 0 Summary: Modular Wayland compositor library License: MIT ++++++ wlroots-0.16.0.tar.gz -> wlroots-0.16.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/backend/backend.c new/wlroots-0.16.1/backend/backend.c --- old/wlroots-0.16.0/backend/backend.c 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/backend/backend.c 2022-12-25 16:50:12.000000000 +0100 @@ -346,6 +346,11 @@ } #endif +#if !(WLR_HAS_LIBINPUT_BACKEND || WLR_HAS_DRM_BACKEND) + wlr_log(WLR_ERROR, "Neither DRM nor libinput backend support is compiled in"); + goto error; +#endif + // Attempt DRM+libinput multi->session = session_create_and_wait(display); if (!multi->session) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/backend/drm/drm.c new/wlroots-0.16.1/backend/drm/drm.c --- old/wlroots-0.16.0/backend/drm/drm.c 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/backend/drm/drm.c 2022-12-25 16:50:12.000000000 +0100 @@ -459,12 +459,6 @@ } } - if ((state->committed & WLR_OUTPUT_ADAPTIVE_SYNC_ENABLED) && - state->adaptive_sync_enabled && - !drm_connector_supports_vrr(conn)) { - return false; - } - struct wlr_drm_connector_state pending = {0}; drm_connector_state_init(&pending, conn, state); @@ -484,6 +478,12 @@ } } + if ((state->committed & WLR_OUTPUT_ADAPTIVE_SYNC_ENABLED) && + state->adaptive_sync_enabled && + !drm_connector_supports_vrr(conn)) { + return false; + } + if (conn->backend->parent) { // If we're running as a secondary GPU, we can't perform an atomic // commit without blitting a buffer. @@ -577,10 +577,20 @@ return false; } } - if (pending.modeset) { + if (pending.modeset && pending.active) { flags |= DRM_MODE_PAGE_FLIP_EVENT; } + if (pending.modeset) { + if (pending.active) { + wlr_drm_conn_log(conn, WLR_INFO, "Modesetting with %dx%d @ %.3f Hz", + pending.mode.hdisplay, pending.mode.vdisplay, + (float)calculate_refresh_rate(&pending.mode) / 1000); + } else { + wlr_drm_conn_log(conn, WLR_INFO, "Turning off"); + } + } + if (!drm_crtc_commit(conn, &pending, flags, false)) { return false; } @@ -1302,9 +1312,9 @@ wlr_conn->crtc->mode_id = mode_id; } - wlr_log(WLR_INFO, " %"PRId32"x%"PRId32"@%"PRId32" %s", + wlr_log(WLR_INFO, " %"PRId32"x%"PRId32" @ %.3f Hz %s", mode->wlr_mode.width, mode->wlr_mode.height, - mode->wlr_mode.refresh, + (float)mode->wlr_mode.refresh / 1000, mode->wlr_mode.preferred ? "(preferred)" : ""); wl_list_insert(wlr_conn->output.modes.prev, &mode->wlr_mode.link); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/backend/wayland/output.c new/wlroots-0.16.1/backend/wayland/output.c --- old/wlroots-0.16.0/backend/wayland/output.c 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/backend/wayland/output.c 2022-12-25 16:50:12.000000000 +0100 @@ -116,6 +116,9 @@ wl_list_remove(&buffer->buffer_destroy.link); wl_list_remove(&buffer->link); wl_buffer_destroy(buffer->wl_buffer); + if (!buffer->released) { + wlr_buffer_unlock(buffer->buffer); + } free(buffer); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/backend/x11/output.c new/wlroots-0.16.1/backend/x11/output.c --- old/wlroots-0.16.0/backend/x11/output.c 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/backend/x11/output.c 2022-12-25 16:50:12.000000000 +0100 @@ -140,6 +140,9 @@ wl_list_remove(&buffer->buffer_destroy.link); wl_list_remove(&buffer->link); xcb_free_pixmap(buffer->x11->xcb, buffer->pixmap); + for (size_t i = 0; i < buffer->n_busy; i++) { + wlr_buffer_unlock(buffer->buffer); + } free(buffer); } @@ -263,6 +266,7 @@ wl_list_for_each(buffer, &output->buffers, link) { if (buffer->buffer == wlr_buffer) { wlr_buffer_lock(buffer->buffer); + buffer->n_busy++; return buffer; } } @@ -675,6 +679,8 @@ return; } + assert(buffer->n_busy > 0); + buffer->n_busy--; wlr_buffer_unlock(buffer->buffer); // may destroy buffer break; case XCB_PRESENT_COMPLETE_NOTIFY:; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/include/backend/x11.h new/wlroots-0.16.1/include/backend/x11.h --- old/wlroots-0.16.0/include/backend/x11.h 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/include/backend/x11.h 2022-12-25 16:50:12.000000000 +0100 @@ -113,6 +113,7 @@ xcb_pixmap_t pixmap; struct wl_list link; // wlr_x11_output::buffers struct wl_listener buffer_destroy; + size_t n_busy; }; struct wlr_x11_format { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/include/meson.build new/wlroots-0.16.1/include/meson.build --- old/wlroots-0.16.0/include/meson.build 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/include/meson.build 2022-12-25 16:50:12.000000000 +0100 @@ -3,6 +3,7 @@ exclude_files = ['meson.build', 'config.h.in', 'version.h.in'] if not features.get('drm-backend') exclude_files += 'backend/drm.h' + exclude_files += 'types/wlr_drm_lease_v1.h' endif if not features.get('libinput-backend') exclude_files += 'backend/libinput.h' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/include/wlr/types/wlr_drm.h new/wlroots-0.16.1/include/wlr/types/wlr_drm.h --- old/wlroots-0.16.0/include/wlr/types/wlr_drm.h 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/include/wlr/types/wlr_drm.h 2022-12-25 16:50:12.000000000 +0100 @@ -10,6 +10,7 @@ #define WLR_TYPES_WLR_DRM_H #include <wayland-server-protocol.h> +#include <wlr/types/wlr_buffer.h> struct wlr_renderer; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/include/wlr/xwayland/xwayland.h new/wlroots-0.16.1/include/wlr/xwayland/xwayland.h --- old/wlroots-0.16.0/include/wlr/xwayland/xwayland.h 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/include/wlr/xwayland/xwayland.h 2022-12-25 16:50:12.000000000 +0100 @@ -232,7 +232,7 @@ * Get a struct wlr_xwayland_surface from a struct wlr_surface. * Asserts that the surface has the xwayland surface role. * May return NULL even if the surface has the xwayland surface role if the - * corresponding xwayland surface has been destroyed. + * corresponding xwayland surface has been unmapped or destroyed. */ struct wlr_xwayland_surface *wlr_xwayland_surface_from_wlr_surface( struct wlr_surface *surface); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/meson.build new/wlroots-0.16.1/meson.build --- old/wlroots-0.16.0/meson.build 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/meson.build 2022-12-25 16:50:12.000000000 +0100 @@ -1,7 +1,7 @@ project( 'wlroots', 'c', - version: '0.16.0', + version: '0.16.1', license: 'MIT', meson_version: '>=0.59.0', default_options: [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/render/egl.c new/wlroots-0.16.1/render/egl.c --- old/wlroots-0.16.0/render/egl.c 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/render/egl.c 2022-12-25 16:50:12.000000000 +0100 @@ -124,8 +124,8 @@ for (int i = 0; i < formats_len; i++) { uint32_t fmt = formats[i]; - uint64_t *modifiers; - EGLBoolean *external_only; + uint64_t *modifiers = NULL; + EGLBoolean *external_only = NULL; int modifiers_len = 0; if (!no_modifiers) { modifiers_len = get_egl_dmabuf_modifiers(egl, fmt, &modifiers, &external_only); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/types/data_device/wlr_drag.c new/wlroots-0.16.1/types/data_device/wlr_drag.c --- old/wlroots-0.16.0/types/data_device/wlr_drag.c 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/types/data_device/wlr_drag.c 2022-12-25 16:50:12.000000000 +0100 @@ -55,14 +55,14 @@ goto out; } - if (!drag->source && + if (!drag->source && drag->seat_client && wl_resource_get_client(surface->resource) != drag->seat_client->client) { goto out; } struct wlr_seat_client *focus_client = wlr_seat_client_for_wl_client( - drag->seat_client->seat, wl_resource_get_client(surface->resource)); + drag->seat, wl_resource_get_client(surface->resource)); if (!focus_client) { goto out; } @@ -71,7 +71,7 @@ drag->source->accepted = false; uint32_t serial = - wl_display_next_serial(drag->seat_client->seat->display); + wl_display_next_serial(drag->seat->display); struct wl_resource *device_resource; wl_resource_for_each(device_resource, &focus_client->data_devices) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/types/output/cursor.c new/wlroots-0.16.1/types/output/cursor.c --- old/wlroots-0.16.0/types/output/cursor.c 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/types/output/cursor.c 2022-12-25 16:50:12.000000000 +0100 @@ -533,6 +533,10 @@ bool wlr_output_cursor_move(struct wlr_output_cursor *cursor, double x, double y) { + // Scale coordinates for the output + x *= cursor->output->scale; + y *= cursor->output->scale; + if (cursor->x == x && cursor->y == y) { return true; } @@ -541,11 +545,9 @@ output_cursor_damage_whole(cursor); } - bool was_visible = cursor->visible; - x *= cursor->output->scale; - y *= cursor->output->scale; cursor->x = x; cursor->y = y; + bool was_visible = cursor->visible; output_cursor_update_visible(cursor); if (!was_visible && !cursor->visible) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/types/scene/layer_shell_v1.c new/wlroots-0.16.1/types/scene/layer_shell_v1.c --- old/wlroots-0.16.0/types/scene/layer_shell_v1.c 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/types/scene/layer_shell_v1.c 2022-12-25 16:50:12.000000000 +0100 @@ -39,6 +39,7 @@ struct wlr_layer_surface_v1_state *state, struct wlr_box *usable_area) { switch (state->anchor) { + case ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP: case (ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT): @@ -46,12 +47,14 @@ usable_area->y += state->exclusive_zone + state->margin.top; usable_area->height -= state->exclusive_zone + state->margin.top; break; + case ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM: case (ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM | ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT): // Anchor bottom usable_area->height -= state->exclusive_zone + state->margin.bottom; break; + case ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT: case (ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM | ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT): @@ -59,9 +62,10 @@ usable_area->x += state->exclusive_zone + state->margin.left; usable_area->width -= state->exclusive_zone + state->margin.left; break; + case ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT: case (ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM | - ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT): // Anchor right + ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT): // Anchor right usable_area->width -= state->exclusive_zone + state->margin.right; break; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/types/scene/wlr_scene.c new/wlroots-0.16.1/types/scene/wlr_scene.c --- old/wlroots-0.16.0/types/scene/wlr_scene.c 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/types/scene/wlr_scene.c 2022-12-25 16:50:12.000000000 +0100 @@ -644,21 +644,29 @@ wlr_region_scale_xy(&output_damage, &trans_damage, output_scale_x, output_scale_y); - // One buffer pixel will match (output_scale_x)x(output_scale_y) output - // pixels. If max(output_scale_x, output_scale_y) is bigger than 1, - // the result will be blurry, and with linear filtering, will bleed into - // adjacent (output_scale_x / 2) pixels on X axis and (output_scale_y / 2) - // pixels on Y axis. To fix this, the damage region is expanded by largest - // distance of the two. - float bigger_scale = fmaxf(output_scale_x, output_scale_y); - if (bigger_scale > 1.0f) { - wlr_region_expand(&output_damage, &output_damage, - ceilf(bigger_scale / 2.0f)); - } + // One output pixel will match (buffer_scale_x)x(buffer_scale_y) buffer pixels. + // If the buffer is upscaled on the given axis (output_scale_* > 1.0, + // buffer_scale_* < 1.0), its contents will bleed into adjacent + // (ceil(output_scale_* / 2)) output pixels because of linear filtering. + // Additionally, if the buffer is downscaled (output_scale_* < 1.0, + // buffer_scale_* > 1.0), and one output pixel matches a non-integer number of + // buffer pixels, its contents will bleed into neighboring output pixels. + // Handle both cases by computing buffer_scale_{x,y} and checking if they are + // integer numbers; ceilf() is used to ensure that the distance is at least 1. + float buffer_scale_x = 1.0f / output_scale_x; + float buffer_scale_y = 1.0f / output_scale_y; + int dist_x = floor(buffer_scale_x) != buffer_scale_x ? + (int)ceilf(output_scale_x / 2.0f) : 0; + int dist_y = floor(buffer_scale_y) != buffer_scale_y ? + (int)ceilf(output_scale_y / 2.0f) : 0; + // TODO: expand with per-axis distances + wlr_region_expand(&output_damage, &output_damage, + dist_x >= dist_y ? dist_x : dist_y); pixman_region32_t cull_region; pixman_region32_init(&cull_region); - wlr_region_scale(&cull_region, &scene_buffer->node.visible, output_scale); + pixman_region32_copy(&cull_region, &scene_buffer->node.visible); + scale_output_damage(&cull_region, output_scale); pixman_region32_translate(&cull_region, -lx * output_scale, -ly * output_scale); pixman_region32_intersect(&output_damage, &output_damage, &cull_region); pixman_region32_fini(&cull_region); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/types/seat/wlr_seat.c new/wlroots-0.16.1/types/seat/wlr_seat.c --- old/wlroots-0.16.0/types/seat/wlr_seat.c 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/types/seat/wlr_seat.c 2022-12-25 16:50:12.000000000 +0100 @@ -75,6 +75,10 @@ client->seat->keyboard_state.focused_client = NULL; } + if (client->seat->drag && client == client->seat->drag->seat_client) { + client->seat->drag->seat_client = NULL; + } + struct wl_resource *resource, *tmp; wl_resource_for_each_safe(resource, tmp, &client->pointers) { wl_resource_destroy(resource); @@ -175,6 +179,8 @@ wlr_seat_pointer_clear_focus(seat); wlr_seat_keyboard_clear_focus(seat); + wlr_seat_set_keyboard(seat, NULL); + struct wlr_touch_point *point; wl_list_for_each(point, &seat->touch_state.touch_points, link) { wlr_seat_touch_point_clear_focus(seat, 0, point->touch_id); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/types/seat/wlr_seat_pointer.c new/wlroots-0.16.1/types/seat/wlr_seat_pointer.c --- old/wlroots-0.16.0/types/seat/wlr_seat_pointer.c 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/types/seat/wlr_seat_pointer.c 2022-12-25 16:50:12.000000000 +0100 @@ -326,7 +326,7 @@ send_source = true; } - double low_res_value; + double low_res_value = 0.0; int32_t low_res_value_discrete = 0; update_value120_accumulators(client, orientation, value, value_discrete, &low_res_value, &low_res_value_discrete); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.16.0/types/wlr_compositor.c new/wlroots-0.16.1/types/wlr_compositor.c --- old/wlroots-0.16.0/types/wlr_compositor.c 2022-11-11 18:22:17.000000000 +0100 +++ new/wlroots-0.16.1/types/wlr_compositor.c 2022-12-25 16:50:12.000000000 +0100 @@ -36,14 +36,6 @@ static void surface_handle_destroy(struct wl_client *client, struct wl_resource *resource) { - struct wlr_surface *surface = wlr_surface_from_resource(resource); - if (surface->role_data != NULL) { - // TODO: send WL_SURFACE_ERROR_DEFUNCT_ROLE_OBJECT - // https://gitlab.freedesktop.org/wayland/wayland/-/merge_requests/278 - wl_resource_post_error(resource, -1, - "surface was destroyed before its role object"); - return; - } wl_resource_destroy(resource); }