mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-05-02 06:46:33 -04:00
Antonin Décimo (3):
Fix typos
Fix incorrect format parameters
xwayland: free server in error path
Daniel De Graaf (1):
wlr_virtual_keyboard: fix fd leak
Daniel Kondor (2):
foreign-toplevel-management: report parent toplevel
foreign toplevel: send parent event only to clients that support it
Devin J. Pohly (1):
drm: fix uninitialized read
Drew DeVault (1):
Remove xdg-shell v6
Guido Cella (1):
render: Don't crash on 0 dimensions
Ilia Bozhinov (9):
xwayland: do not allow apps to change focus after wlroots request
make sure to fail setting gamma on disabled outputs
backend/wayland: destroy relative pointer when output is disconnected
wayland: emit relative pointer events only for current pointer
xwayland: disconnect display destroy listener even if xwayland didn't initialize
xwayland: add set_geometry event
backend/wayland: add touch support to the wayland backend
xdg_shell: fix a typo
xdg_shell: handle inert popups
Isaac Freund (6):
xdg-shell: split last-acked and current state
layer-shell: add for_each_popup
layer-shell: error on 0 dimension without anchors
xdg_positioner: remove unused field
wlr_drag: remove unused point_destroy field
xwayland: remove unused listener
Kenny Levinsen (2):
session: Add libseat backend
session: Add missing init to direct-freebsd
Marten Ringwelski (1):
backend/drm: Check if output is enabled before sending frame event
Mykola Orliuk (5):
backend/wayland: manage cursor for current pointer
backend/wayland: factor out wlr_wl_seat
backend/wayland: add error flow in create_wl_seat
backend/wayland: fix input creation error handling
backend/wayland: fix some keyboard/touch leaks
Patrick Steinhardt (1):
session: Don't refuse unprivileged creation of "direct" backend
Roman Gilg (3):
output-management-v1: add head identifying events
output-management-v1: send head identifying information
output-management-v1: send complete head state on enable change
Ronan Pigott (1):
virtual_pointer: remember current axis for axis events
Rouven Czerwinski (2):
examples: remove unnecessary gles2.h imports
xwm: add loop detection for read_surface_parent
Ryan Walklin (4):
Implement logind session SetType method to change session type to wayland
Also set XDG_SESSION_TYPE
Don't set XDG_SESSION_TYPE unless logind SetType succeeds
Quieten failure to set login session type
Scott Moreau (2):
xwm: Set _NET_WM_STATE_FOCUSED property for the focused surface
foreign toplevel: Fix whitespace error
Simon Ser (31):
xwayland/xwm: don't insert surface in list on error
xwayland/xwm: add prop count assert in xsurface_set_net_wm_state
xwayland/xwm: use initializer for props in xsurface_set_wm_state
render/gles2: make wlr_gles2_texture_from_* private
render/gles2: keep ref to wlr_gles2_renderer in wlr_gles2_texture
render/gles2: make push/pop debug functions take a wlr_renderer
render/gles2: remove gles2_procs
gamma-control-v1: fix use-after-free in gamma_control_handle_set_gamma
examples/simple: use wlr_output_preferred_mode
examples/simple: use wlr_renderer instead of GL
Remove unnecessary wl_display_dispatch calls
output: introduce wlr_output_event_commit
output-power-management-v1: listen to output commit
examples/dmabuf-capture: add extra roundtrip for wl_output listener
backend/session/libseat: register log handler
backend: remove check for _WAYLAND_DISPLAY
backend/libinput: improve logger callback
render: define EGL_NO_PLATFORM_SPECIFIC_TYPES (#2452)
backend/drm: fix "a page-flip is already pending" errors on modeset
xwayland: minor code style fixes
xwayland: log unhandled NET_WM_STATE property changes
gamma-control-v1: apply gamma LUT when output gets enabled
screencopy: stop setting needs_frame flag
backend/drm: export pending FB in export_dmabuf, if any
output: update docs to reflect reality
output: add when field to wlr_output_event_commit
export-dmabuf: export DMA-BUF on output commit
screencopy: perform DMA-BUF copy on output commit
screencopy: send failed when copying a DMA-BUF with a region
input-method: send modifiers in set_keyboard
Update version to 0.12.0
Tobias Langendorf (1):
xwm: add support for xwayland minimize
Tudor Brindus (11):
examples: use `perror` instead of `fprintf` GNU %m `printf` extension
xwayland: using %m in `wlr_log` is broken, use `wlr_log_errno` instead
xwayland: fix use-after-free in selection handling
xwayland: introduce WLR_XWAYLAND for specifying which Xwayland to use
xwayland: remove stale transfers from the same requestor
xwayland: notify requestor when we fail to respond to their request
xwayland: fix minor typo in debug log
types/wlr_keyboard: use bitmasks for wlr_keyboard_led and wlr_keyboard_modifier enums
types/wlr_output_layout: use bitmask for wlr_direction
util/edges: use bitmask for wlr_edges
render/dmabuf: use bitmask for wlr_dmabuf_attributes_flags
Valentin (2):
Use fixed size integer type
Fix undefined behavior
nerdopolis (1):
Accommodate for CONFIG_VT=0, all TTYs are in seat0, but not all seat0s have TTYs
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEENP+VJs/vDpejQOLkD9574OiPXkgFAl+n+t4ACgkQD9574OiP
Xkg8TRAAopnm99XA7TE3w0UEDhXUBvlWB05fS6M4wiSNXjMp1ENW0O7PGtIbZt1Y
/mbJQ8yAXbT0i5X7aE6iKTW8GjHoWpwaYCL3BrDb8A8Hl2s04pxSiLL2JMbHyb02
KsCjZSbCBGldmgYOaJZl9SM5TDSyYo8xwGprkRiqK8Nz/SL75+sR4Jf/iMfaP1Rx
qu2o87z3B1DEX+dvf0UaStJSmAb5sBmEW0X8sj8jf6Iubwsxy0BjI00AoTa2TS7k
U1h3QuHqFy65pVg9Hwe5jPsoKVN5UqFzZNFja+91fXcjohm4gRkrnPZHCXijAl5E
+sNSkY0SjO1ci4KSRXRTzD9X7HfA2f4yGjDEjoKorop7kUVAHQeKfFbbrKEjoYao
aJLCFCNjT2ednZJhteYXKEodYfQov6AEirPJtw+UEDe8JgLSDZJZtXnBXKBXEeFa
BgEzkoQiKqA4J3ToEj2fWrNMLkjfnc99vGn3tso9wfVB93sfg8lX1L9BI9CklGuD
je6inBDRTa/RmALe1IGE4Y2PwrlmtQqHVjqDKv5MDpy65ffuYS3bH18fSLTW2cWY
zYQmFOuj1VHxqT1noKAqTeowR691KC7JmAG2RjOZK2huP1xkijdaOVCA4bWlEqS3
zld5pUUJ4k30UJmJIUK1Vp9eCStnPvxti1ngfuLHZ6WCe/jT8Os=
=2poj
-----END PGP SIGNATURE-----
Merge tag '0.12.0' into color-profiles
wlroots 0.12.0
Antonin Décimo (3):
Fix typos
Fix incorrect format parameters
xwayland: free server in error path
Daniel De Graaf (1):
wlr_virtual_keyboard: fix fd leak
Daniel Kondor (2):
foreign-toplevel-management: report parent toplevel
foreign toplevel: send parent event only to clients that support it
Devin J. Pohly (1):
drm: fix uninitialized read
Drew DeVault (1):
Remove xdg-shell v6
Guido Cella (1):
render: Don't crash on 0 dimensions
Ilia Bozhinov (9):
xwayland: do not allow apps to change focus after wlroots request
make sure to fail setting gamma on disabled outputs
backend/wayland: destroy relative pointer when output is disconnected
wayland: emit relative pointer events only for current pointer
xwayland: disconnect display destroy listener even if xwayland didn't initialize
xwayland: add set_geometry event
backend/wayland: add touch support to the wayland backend
xdg_shell: fix a typo
xdg_shell: handle inert popups
Isaac Freund (6):
xdg-shell: split last-acked and current state
layer-shell: add for_each_popup
layer-shell: error on 0 dimension without anchors
xdg_positioner: remove unused field
wlr_drag: remove unused point_destroy field
xwayland: remove unused listener
Kenny Levinsen (2):
session: Add libseat backend
session: Add missing init to direct-freebsd
Marten Ringwelski (1):
backend/drm: Check if output is enabled before sending frame event
Mykola Orliuk (5):
backend/wayland: manage cursor for current pointer
backend/wayland: factor out wlr_wl_seat
backend/wayland: add error flow in create_wl_seat
backend/wayland: fix input creation error handling
backend/wayland: fix some keyboard/touch leaks
Patrick Steinhardt (1):
session: Don't refuse unprivileged creation of "direct" backend
Roman Gilg (3):
output-management-v1: add head identifying events
output-management-v1: send head identifying information
output-management-v1: send complete head state on enable change
Ronan Pigott (1):
virtual_pointer: remember current axis for axis events
Rouven Czerwinski (2):
examples: remove unnecessary gles2.h imports
xwm: add loop detection for read_surface_parent
Ryan Walklin (4):
Implement logind session SetType method to change session type to wayland
Also set XDG_SESSION_TYPE
Don't set XDG_SESSION_TYPE unless logind SetType succeeds
Quieten failure to set login session type
Scott Moreau (2):
xwm: Set _NET_WM_STATE_FOCUSED property for the focused surface
foreign toplevel: Fix whitespace error
Simon Ser (31):
xwayland/xwm: don't insert surface in list on error
xwayland/xwm: add prop count assert in xsurface_set_net_wm_state
xwayland/xwm: use initializer for props in xsurface_set_wm_state
render/gles2: make wlr_gles2_texture_from_* private
render/gles2: keep ref to wlr_gles2_renderer in wlr_gles2_texture
render/gles2: make push/pop debug functions take a wlr_renderer
render/gles2: remove gles2_procs
gamma-control-v1: fix use-after-free in gamma_control_handle_set_gamma
examples/simple: use wlr_output_preferred_mode
examples/simple: use wlr_renderer instead of GL
Remove unnecessary wl_display_dispatch calls
output: introduce wlr_output_event_commit
output-power-management-v1: listen to output commit
examples/dmabuf-capture: add extra roundtrip for wl_output listener
backend/session/libseat: register log handler
backend: remove check for _WAYLAND_DISPLAY
backend/libinput: improve logger callback
render: define EGL_NO_PLATFORM_SPECIFIC_TYPES (#2452)
backend/drm: fix "a page-flip is already pending" errors on modeset
xwayland: minor code style fixes
xwayland: log unhandled NET_WM_STATE property changes
gamma-control-v1: apply gamma LUT when output gets enabled
screencopy: stop setting needs_frame flag
backend/drm: export pending FB in export_dmabuf, if any
output: update docs to reflect reality
output: add when field to wlr_output_event_commit
export-dmabuf: export DMA-BUF on output commit
screencopy: perform DMA-BUF copy on output commit
screencopy: send failed when copying a DMA-BUF with a region
input-method: send modifiers in set_keyboard
Update version to 0.12.0
Tobias Langendorf (1):
xwm: add support for xwayland minimize
Tudor Brindus (11):
examples: use `perror` instead of `fprintf` GNU %m `printf` extension
xwayland: using %m in `wlr_log` is broken, use `wlr_log_errno` instead
xwayland: fix use-after-free in selection handling
xwayland: introduce WLR_XWAYLAND for specifying which Xwayland to use
xwayland: remove stale transfers from the same requestor
xwayland: notify requestor when we fail to respond to their request
xwayland: fix minor typo in debug log
types/wlr_keyboard: use bitmasks for wlr_keyboard_led and wlr_keyboard_modifier enums
types/wlr_output_layout: use bitmask for wlr_direction
util/edges: use bitmask for wlr_edges
render/dmabuf: use bitmask for wlr_dmabuf_attributes_flags
Valentin (2):
Use fixed size integer type
Fix undefined behavior
nerdopolis (1):
Accommodate for CONFIG_VT=0, all TTYs are in seat0, but not all seat0s have TTYs
266 lines
7.2 KiB
C
266 lines
7.2 KiB
C
#include <assert.h>
|
|
#include <stdbool.h>
|
|
#include <stdlib.h>
|
|
#include <wlr/render/gles2.h>
|
|
#include <wlr/render/interface.h>
|
|
#include <wlr/render/wlr_renderer.h>
|
|
#include <wlr/types/wlr_matrix.h>
|
|
#include <wlr/util/log.h>
|
|
#include "util/signal.h"
|
|
|
|
void wlr_renderer_init(struct wlr_renderer *renderer,
|
|
const struct wlr_renderer_impl *impl) {
|
|
assert(impl->begin);
|
|
assert(impl->clear);
|
|
assert(impl->scissor);
|
|
assert(impl->render_subtexture_with_matrix);
|
|
assert(impl->render_quad_with_matrix);
|
|
assert(impl->render_ellipse_with_matrix);
|
|
assert(impl->formats);
|
|
assert(impl->format_supported);
|
|
assert(impl->texture_from_pixels);
|
|
renderer->impl = impl;
|
|
|
|
wl_signal_init(&renderer->events.destroy);
|
|
}
|
|
|
|
void wlr_renderer_destroy(struct wlr_renderer *r) {
|
|
if (!r) {
|
|
return;
|
|
}
|
|
wlr_signal_emit_safe(&r->events.destroy, r);
|
|
|
|
if (r->impl && r->impl->destroy) {
|
|
r->impl->destroy(r);
|
|
} else {
|
|
free(r);
|
|
}
|
|
}
|
|
|
|
void wlr_renderer_begin(struct wlr_renderer *r, int width, int height) {
|
|
assert(!r->rendering);
|
|
|
|
r->impl->begin(r, width, height);
|
|
|
|
r->rendering = true;
|
|
}
|
|
|
|
void wlr_renderer_end(struct wlr_renderer *r) {
|
|
assert(r->rendering);
|
|
|
|
if (r->impl->end) {
|
|
r->impl->end(r);
|
|
}
|
|
|
|
r->rendering = false;
|
|
}
|
|
|
|
void wlr_renderer_clear(struct wlr_renderer *r, const float color[static 4]) {
|
|
assert(r->rendering);
|
|
r->impl->clear(r, color);
|
|
}
|
|
|
|
void wlr_renderer_scissor(struct wlr_renderer *r, struct wlr_box *box) {
|
|
assert(r->rendering);
|
|
r->impl->scissor(r, box);
|
|
}
|
|
|
|
void wlr_renderer_color_config(struct wlr_renderer *r, struct wlr_color_config *color) {
|
|
assert(r->rendering);
|
|
r->impl->color_config(r, color);
|
|
}
|
|
|
|
bool wlr_render_texture(struct wlr_renderer *r, struct wlr_texture *texture,
|
|
const float projection[static 9], int x, int y, float alpha) {
|
|
struct wlr_box box = { .x = x, .y = y };
|
|
wlr_texture_get_size(texture, &box.width, &box.height);
|
|
|
|
float matrix[9];
|
|
wlr_matrix_project_box(matrix, &box, WL_OUTPUT_TRANSFORM_NORMAL, 0,
|
|
projection);
|
|
|
|
return wlr_render_texture_with_matrix(r, texture, matrix, alpha);
|
|
}
|
|
|
|
bool wlr_render_texture_with_matrix(struct wlr_renderer *r,
|
|
struct wlr_texture *texture, const float matrix[static 9],
|
|
float alpha) {
|
|
struct wlr_fbox box = {
|
|
.x = 0,
|
|
.y = 0,
|
|
.width = texture->width,
|
|
.height = texture->height,
|
|
};
|
|
return wlr_render_subtexture_with_matrix(r, texture, &box, matrix, alpha);
|
|
}
|
|
|
|
bool wlr_render_subtexture_with_matrix(struct wlr_renderer *r,
|
|
struct wlr_texture *texture, const struct wlr_fbox *box,
|
|
const float matrix[static 9], float alpha) {
|
|
assert(r->rendering);
|
|
return r->impl->render_subtexture_with_matrix(r, texture,
|
|
box, matrix, alpha);
|
|
}
|
|
|
|
void wlr_render_rect(struct wlr_renderer *r, const struct wlr_box *box,
|
|
const float color[static 4], const float projection[static 9]) {
|
|
if (box->width == 0 || box->height == 0) {
|
|
return;
|
|
}
|
|
assert(box->width > 0 && box->height > 0);
|
|
float matrix[9];
|
|
wlr_matrix_project_box(matrix, box, WL_OUTPUT_TRANSFORM_NORMAL, 0,
|
|
projection);
|
|
|
|
wlr_render_quad_with_matrix(r, color, matrix);
|
|
}
|
|
|
|
void wlr_render_quad_with_matrix(struct wlr_renderer *r,
|
|
const float color[static 4], const float matrix[static 9]) {
|
|
assert(r->rendering);
|
|
r->impl->render_quad_with_matrix(r, color, matrix);
|
|
}
|
|
|
|
void wlr_render_ellipse(struct wlr_renderer *r, const struct wlr_box *box,
|
|
const float color[static 4], const float projection[static 9]) {
|
|
if (box->width == 0 || box->height == 0) {
|
|
return;
|
|
}
|
|
assert(box->width > 0 && box->height > 0);
|
|
float matrix[9];
|
|
wlr_matrix_project_box(matrix, box, WL_OUTPUT_TRANSFORM_NORMAL, 0,
|
|
projection);
|
|
|
|
wlr_render_ellipse_with_matrix(r, color, matrix);
|
|
}
|
|
|
|
void wlr_render_ellipse_with_matrix(struct wlr_renderer *r,
|
|
const float color[static 4], const float matrix[static 9]) {
|
|
assert(r->rendering);
|
|
r->impl->render_ellipse_with_matrix(r, color, matrix);
|
|
}
|
|
|
|
const enum wl_shm_format *wlr_renderer_get_formats(
|
|
struct wlr_renderer *r, size_t *len) {
|
|
return r->impl->formats(r, len);
|
|
}
|
|
|
|
bool wlr_renderer_resource_is_wl_drm_buffer(struct wlr_renderer *r,
|
|
struct wl_resource *resource) {
|
|
if (!r->impl->resource_is_wl_drm_buffer) {
|
|
return false;
|
|
}
|
|
return r->impl->resource_is_wl_drm_buffer(r, resource);
|
|
}
|
|
|
|
void wlr_renderer_wl_drm_buffer_get_size(struct wlr_renderer *r,
|
|
struct wl_resource *buffer, int *width, int *height) {
|
|
if (!r->impl->wl_drm_buffer_get_size) {
|
|
return;
|
|
}
|
|
return r->impl->wl_drm_buffer_get_size(r, buffer, width, height);
|
|
}
|
|
|
|
const struct wlr_drm_format_set *wlr_renderer_get_dmabuf_formats(
|
|
struct wlr_renderer *r) {
|
|
if (!r->impl->get_dmabuf_formats) {
|
|
return NULL;
|
|
}
|
|
return r->impl->get_dmabuf_formats(r);
|
|
}
|
|
|
|
bool wlr_renderer_read_pixels(struct wlr_renderer *r, enum wl_shm_format fmt,
|
|
uint32_t *flags, uint32_t stride, uint32_t width, uint32_t height,
|
|
uint32_t src_x, uint32_t src_y, uint32_t dst_x, uint32_t dst_y,
|
|
void *data) {
|
|
if (!r->impl->read_pixels) {
|
|
return false;
|
|
}
|
|
return r->impl->read_pixels(r, fmt, flags, stride, width, height,
|
|
src_x, src_y, dst_x, dst_y, data);
|
|
}
|
|
|
|
bool wlr_renderer_blit_dmabuf(struct wlr_renderer *r,
|
|
struct wlr_dmabuf_attributes *dst,
|
|
struct wlr_dmabuf_attributes *src) {
|
|
assert(!r->rendering);
|
|
if (!r->impl->blit_dmabuf) {
|
|
return false;
|
|
}
|
|
return r->impl->blit_dmabuf(r, dst, src);
|
|
}
|
|
|
|
bool wlr_renderer_format_supported(struct wlr_renderer *r,
|
|
enum wl_shm_format fmt) {
|
|
return r->impl->format_supported(r, fmt);
|
|
}
|
|
|
|
bool wlr_renderer_init_wl_display(struct wlr_renderer *r,
|
|
struct wl_display *wl_display) {
|
|
if (wl_display_init_shm(wl_display)) {
|
|
wlr_log(WLR_ERROR, "Failed to initialize shm");
|
|
return false;
|
|
}
|
|
|
|
size_t len;
|
|
const enum wl_shm_format *formats = wlr_renderer_get_formats(r, &len);
|
|
if (formats == NULL) {
|
|
wlr_log(WLR_ERROR, "Failed to initialize shm: cannot get formats");
|
|
return false;
|
|
}
|
|
|
|
for (size_t i = 0; i < len; ++i) {
|
|
// These formats are already added by default
|
|
if (formats[i] != WL_SHM_FORMAT_ARGB8888 &&
|
|
formats[i] != WL_SHM_FORMAT_XRGB8888) {
|
|
wl_display_add_shm_format(wl_display, formats[i]);
|
|
}
|
|
}
|
|
|
|
if (r->impl->init_wl_display) {
|
|
if (!r->impl->init_wl_display(r, wl_display)) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
struct wlr_renderer *wlr_renderer_autocreate(struct wlr_egl *egl,
|
|
EGLenum platform, void *remote_display, EGLint *config_attribs,
|
|
EGLint visual_id) {
|
|
// Append GLES2-specific bits to the provided EGL config attributes
|
|
EGLint gles2_config_attribs[] = {
|
|
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
|
EGL_NONE,
|
|
};
|
|
|
|
size_t config_attribs_len = 0; // not including terminating EGL_NONE
|
|
while (config_attribs != NULL &&
|
|
config_attribs[config_attribs_len] != EGL_NONE) {
|
|
++config_attribs_len;
|
|
}
|
|
|
|
size_t all_config_attribs_len = config_attribs_len +
|
|
sizeof(gles2_config_attribs) / sizeof(gles2_config_attribs[0]);
|
|
EGLint all_config_attribs[all_config_attribs_len];
|
|
if (config_attribs_len > 0) {
|
|
memcpy(all_config_attribs, config_attribs,
|
|
config_attribs_len * sizeof(EGLint));
|
|
}
|
|
memcpy(&all_config_attribs[config_attribs_len], gles2_config_attribs,
|
|
sizeof(gles2_config_attribs));
|
|
|
|
if (!wlr_egl_init(egl, platform, remote_display, all_config_attribs,
|
|
visual_id)) {
|
|
wlr_log(WLR_ERROR, "Could not initialize EGL");
|
|
return NULL;
|
|
}
|
|
|
|
struct wlr_renderer *renderer = wlr_gles2_renderer_create(egl);
|
|
if (!renderer) {
|
|
wlr_egl_finish(egl);
|
|
}
|
|
|
|
return renderer;
|
|
}
|