mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-05-03 06:46:47 -04:00
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
-----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
This commit is contained in:
commit
9d76bca931
105 changed files with 1680 additions and 3182 deletions
|
|
@ -21,11 +21,9 @@ static const GLfloat verts[] = {
|
|||
0, 1, // bottom left
|
||||
};
|
||||
|
||||
struct wlr_gles2_procs gles2_procs = {0};
|
||||
|
||||
static const struct wlr_renderer_impl renderer_impl;
|
||||
|
||||
static struct wlr_gles2_renderer *gles2_get_renderer(
|
||||
struct wlr_gles2_renderer *gles2_get_renderer(
|
||||
struct wlr_renderer *wlr_renderer) {
|
||||
assert(wlr_renderer->impl == &renderer_impl);
|
||||
return (struct wlr_gles2_renderer *)wlr_renderer;
|
||||
|
|
@ -43,7 +41,7 @@ static void gles2_begin(struct wlr_renderer *wlr_renderer, uint32_t width,
|
|||
struct wlr_gles2_renderer *renderer =
|
||||
gles2_get_renderer_in_context(wlr_renderer);
|
||||
|
||||
PUSH_GLES2_DEBUG;
|
||||
push_gles2_debug(renderer);
|
||||
|
||||
glViewport(0, 0, width, height);
|
||||
renderer->viewport_width = width;
|
||||
|
|
@ -58,7 +56,7 @@ static void gles2_begin(struct wlr_renderer *wlr_renderer, uint32_t width,
|
|||
// XXX: maybe we should save output projection and remove some of the need
|
||||
// for users to sling matricies themselves
|
||||
|
||||
POP_GLES2_DEBUG;
|
||||
pop_gles2_debug(renderer);
|
||||
}
|
||||
|
||||
static void gles2_end(struct wlr_renderer *wlr_renderer) {
|
||||
|
|
@ -68,12 +66,13 @@ static void gles2_end(struct wlr_renderer *wlr_renderer) {
|
|||
|
||||
static void gles2_clear(struct wlr_renderer *wlr_renderer,
|
||||
const float color[static 4]) {
|
||||
gles2_get_renderer_in_context(wlr_renderer);
|
||||
struct wlr_gles2_renderer *renderer =
|
||||
gles2_get_renderer_in_context(wlr_renderer);
|
||||
|
||||
PUSH_GLES2_DEBUG;
|
||||
push_gles2_debug(renderer);
|
||||
glClearColor(color[0], color[1], color[2], color[3]);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
POP_GLES2_DEBUG;
|
||||
pop_gles2_debug(renderer);
|
||||
}
|
||||
|
||||
static void gles2_scissor(struct wlr_renderer *wlr_renderer,
|
||||
|
|
@ -81,7 +80,7 @@ static void gles2_scissor(struct wlr_renderer *wlr_renderer,
|
|||
struct wlr_gles2_renderer *renderer =
|
||||
gles2_get_renderer_in_context(wlr_renderer);
|
||||
|
||||
PUSH_GLES2_DEBUG;
|
||||
push_gles2_debug(renderer);
|
||||
if (box != NULL) {
|
||||
struct wlr_box gl_box;
|
||||
wlr_box_transform(&gl_box, box, WL_OUTPUT_TRANSFORM_FLIPPED_180,
|
||||
|
|
@ -92,7 +91,7 @@ static void gles2_scissor(struct wlr_renderer *wlr_renderer,
|
|||
} else {
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
}
|
||||
POP_GLES2_DEBUG;
|
||||
pop_gles2_debug(renderer);
|
||||
}
|
||||
|
||||
static void gles2_color_config(struct wlr_renderer *wlr_renderer, struct wlr_color_config *color) {
|
||||
|
|
@ -139,7 +138,7 @@ static bool gles2_render_subtexture_with_matrix(
|
|||
float transposition[9];
|
||||
wlr_matrix_transpose(transposition, matrix);
|
||||
|
||||
PUSH_GLES2_DEBUG;
|
||||
push_gles2_debug(renderer);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(texture->target, texture->tex);
|
||||
|
|
@ -186,7 +185,7 @@ static bool gles2_render_subtexture_with_matrix(
|
|||
|
||||
glBindTexture(texture->target, 0);
|
||||
|
||||
POP_GLES2_DEBUG;
|
||||
pop_gles2_debug(renderer);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -203,7 +202,7 @@ static void gles2_render_quad_with_matrix(struct wlr_renderer *wlr_renderer,
|
|||
float converted[4];
|
||||
color_convert(NULL, renderer->color, color, converted);
|
||||
|
||||
PUSH_GLES2_DEBUG;
|
||||
push_gles2_debug(renderer);
|
||||
glUseProgram(renderer->shaders.quad.program);
|
||||
|
||||
glUniformMatrix3fv(renderer->shaders.quad.proj, 1, GL_FALSE, transposition);
|
||||
|
|
@ -218,7 +217,7 @@ static void gles2_render_quad_with_matrix(struct wlr_renderer *wlr_renderer,
|
|||
|
||||
glDisableVertexAttribArray(renderer->shaders.quad.pos_attrib);
|
||||
|
||||
POP_GLES2_DEBUG;
|
||||
pop_gles2_debug(renderer);
|
||||
}
|
||||
|
||||
static void gles2_render_ellipse_with_matrix(struct wlr_renderer *wlr_renderer,
|
||||
|
|
@ -241,7 +240,7 @@ static void gles2_render_ellipse_with_matrix(struct wlr_renderer *wlr_renderer,
|
|||
float converted[4];
|
||||
color_convert(NULL, renderer->color, color, converted);
|
||||
|
||||
PUSH_GLES2_DEBUG;
|
||||
push_gles2_debug(renderer);
|
||||
glUseProgram(renderer->shaders.ellipse.program);
|
||||
|
||||
glUniformMatrix3fv(renderer->shaders.ellipse.proj, 1, GL_FALSE, transposition);
|
||||
|
|
@ -259,7 +258,7 @@ static void gles2_render_ellipse_with_matrix(struct wlr_renderer *wlr_renderer,
|
|||
|
||||
glDisableVertexAttribArray(renderer->shaders.ellipse.pos_attrib);
|
||||
glDisableVertexAttribArray(renderer->shaders.ellipse.tex_attrib);
|
||||
POP_GLES2_DEBUG;
|
||||
pop_gles2_debug(renderer);
|
||||
}
|
||||
|
||||
static const enum wl_shm_format *gles2_renderer_formats(
|
||||
|
|
@ -312,10 +311,10 @@ static enum wl_shm_format gles2_preferred_read_format(
|
|||
gles2_get_renderer_in_context(wlr_renderer);
|
||||
|
||||
GLint gl_format = -1, gl_type = -1;
|
||||
PUSH_GLES2_DEBUG;
|
||||
push_gles2_debug(renderer);
|
||||
glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &gl_format);
|
||||
glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &gl_type);
|
||||
POP_GLES2_DEBUG;
|
||||
pop_gles2_debug(renderer);
|
||||
|
||||
EGLint alpha_size = -1;
|
||||
eglGetConfigAttrib(renderer->egl->display, renderer->egl->config,
|
||||
|
|
@ -352,7 +351,7 @@ static bool gles2_read_pixels(struct wlr_renderer *wlr_renderer,
|
|||
return false;
|
||||
}
|
||||
|
||||
PUSH_GLES2_DEBUG;
|
||||
push_gles2_debug(renderer);
|
||||
|
||||
// Make sure any pending drawing is finished before we try to read it
|
||||
glFinish();
|
||||
|
|
@ -379,7 +378,7 @@ static bool gles2_read_pixels(struct wlr_renderer *wlr_renderer,
|
|||
}
|
||||
}
|
||||
|
||||
POP_GLES2_DEBUG;
|
||||
pop_gles2_debug(renderer);
|
||||
|
||||
return glGetError() == GL_NO_ERROR;
|
||||
}
|
||||
|
|
@ -387,7 +386,8 @@ static bool gles2_read_pixels(struct wlr_renderer *wlr_renderer,
|
|||
static bool gles2_blit_dmabuf(struct wlr_renderer *wlr_renderer,
|
||||
struct wlr_dmabuf_attributes *dst_attr,
|
||||
struct wlr_dmabuf_attributes *src_attr) {
|
||||
if (!gles2_procs.glEGLImageTargetRenderbufferStorageOES) {
|
||||
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
|
||||
if (!renderer->procs.glEGLImageTargetRenderbufferStorageOES) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -412,15 +412,14 @@ static bool gles2_blit_dmabuf(struct wlr_renderer *wlr_renderer,
|
|||
// texture.
|
||||
gles2_src_tex->inverted_y = !(src_inverted_y ^ dst_inverted_y);
|
||||
|
||||
struct wlr_egl *egl = wlr_gles2_renderer_get_egl(wlr_renderer);
|
||||
if (!wlr_egl_make_current(egl, EGL_NO_SURFACE, NULL)) {
|
||||
if (!wlr_egl_make_current(renderer->egl, EGL_NO_SURFACE, NULL)) {
|
||||
goto texture_destroy_out;
|
||||
}
|
||||
|
||||
// TODO: The imported buffer should be checked with
|
||||
// eglQueryDmaBufModifiersEXT to see if it may be modified.
|
||||
bool external_only = false;
|
||||
EGLImageKHR image = wlr_egl_create_image_from_dmabuf(egl, dst_attr,
|
||||
EGLImageKHR image = wlr_egl_create_image_from_dmabuf(renderer->egl, dst_attr,
|
||||
&external_only);
|
||||
if (image == EGL_NO_IMAGE_KHR) {
|
||||
goto texture_destroy_out;
|
||||
|
|
@ -429,7 +428,7 @@ static bool gles2_blit_dmabuf(struct wlr_renderer *wlr_renderer,
|
|||
GLuint rbo = 0;
|
||||
glGenRenderbuffers(1, &rbo);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
|
||||
gles2_procs.glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER,
|
||||
renderer->procs.glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER,
|
||||
image);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
||||
|
||||
|
|
@ -458,7 +457,7 @@ out:
|
|||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
glDeleteFramebuffers(1, &fbo);
|
||||
glDeleteRenderbuffers(1, &rbo);
|
||||
wlr_egl_destroy_image(egl, image);
|
||||
wlr_egl_destroy_image(renderer->egl, image);
|
||||
texture_destroy_out:
|
||||
wlr_texture_destroy(src_tex);
|
||||
restore_context_out:
|
||||
|
|
@ -466,27 +465,6 @@ restore_context_out:
|
|||
return r;
|
||||
}
|
||||
|
||||
static struct wlr_texture *gles2_texture_from_pixels(
|
||||
struct wlr_renderer *wlr_renderer, enum wl_shm_format wl_fmt,
|
||||
uint32_t stride, uint32_t width, uint32_t height, const void *data) {
|
||||
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
|
||||
return wlr_gles2_texture_from_pixels(renderer->egl, wl_fmt, stride, width,
|
||||
height, data);
|
||||
}
|
||||
|
||||
static struct wlr_texture *gles2_texture_from_wl_drm(
|
||||
struct wlr_renderer *wlr_renderer, struct wl_resource *data) {
|
||||
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
|
||||
return wlr_gles2_texture_from_wl_drm(renderer->egl, data);
|
||||
}
|
||||
|
||||
static struct wlr_texture *gles2_texture_from_dmabuf(
|
||||
struct wlr_renderer *wlr_renderer,
|
||||
struct wlr_dmabuf_attributes *attribs) {
|
||||
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
|
||||
return wlr_gles2_texture_from_dmabuf(renderer->egl, attribs);
|
||||
}
|
||||
|
||||
static bool gles2_init_wl_display(struct wlr_renderer *wlr_renderer,
|
||||
struct wl_display *wl_display) {
|
||||
struct wlr_gles2_renderer *renderer =
|
||||
|
|
@ -523,17 +501,17 @@ static void gles2_destroy(struct wlr_renderer *wlr_renderer) {
|
|||
|
||||
wlr_egl_make_current(renderer->egl, EGL_NO_SURFACE, NULL);
|
||||
|
||||
PUSH_GLES2_DEBUG;
|
||||
push_gles2_debug(renderer);
|
||||
glDeleteProgram(renderer->shaders.quad.program);
|
||||
glDeleteProgram(renderer->shaders.ellipse.program);
|
||||
glDeleteProgram(renderer->shaders.tex_rgba.program);
|
||||
glDeleteProgram(renderer->shaders.tex_rgbx.program);
|
||||
glDeleteProgram(renderer->shaders.tex_ext.program);
|
||||
POP_GLES2_DEBUG;
|
||||
pop_gles2_debug(renderer);
|
||||
|
||||
if (renderer->exts.debug_khr) {
|
||||
glDisable(GL_DEBUG_OUTPUT_KHR);
|
||||
gles2_procs.glDebugMessageCallbackKHR(NULL, NULL);
|
||||
renderer->procs.glDebugMessageCallbackKHR(NULL, NULL);
|
||||
}
|
||||
|
||||
wlr_egl_unset_current(renderer->egl);
|
||||
|
|
@ -565,20 +543,21 @@ static const struct wlr_renderer_impl renderer_impl = {
|
|||
.blit_dmabuf = gles2_blit_dmabuf,
|
||||
};
|
||||
|
||||
void push_gles2_marker(const char *file, const char *func) {
|
||||
if (!gles2_procs.glPushDebugGroupKHR) {
|
||||
void push_gles2_debug_(struct wlr_gles2_renderer *renderer,
|
||||
const char *file, const char *func) {
|
||||
if (!renderer->procs.glPushDebugGroupKHR) {
|
||||
return;
|
||||
}
|
||||
|
||||
int len = snprintf(NULL, 0, "%s:%s", file, func) + 1;
|
||||
char str[len];
|
||||
snprintf(str, len, "%s:%s", file, func);
|
||||
gles2_procs.glPushDebugGroupKHR(GL_DEBUG_SOURCE_APPLICATION_KHR, 1, -1, str);
|
||||
renderer->procs.glPushDebugGroupKHR(GL_DEBUG_SOURCE_APPLICATION_KHR, 1, -1, str);
|
||||
}
|
||||
|
||||
void pop_gles2_marker(void) {
|
||||
if (gles2_procs.glPopDebugGroupKHR) {
|
||||
gles2_procs.glPopDebugGroupKHR();
|
||||
void pop_gles2_debug(struct wlr_gles2_renderer *renderer) {
|
||||
if (renderer->procs.glPopDebugGroupKHR) {
|
||||
renderer->procs.glPopDebugGroupKHR();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -602,8 +581,9 @@ static void gles2_log(GLenum src, GLenum type, GLuint id, GLenum severity,
|
|||
_wlr_log(gles2_log_importance_to_wlr(type), "[GLES2] %s", msg);
|
||||
}
|
||||
|
||||
static GLuint compile_shader(GLuint type, const GLchar *src) {
|
||||
PUSH_GLES2_DEBUG;
|
||||
static GLuint compile_shader(struct wlr_gles2_renderer *renderer,
|
||||
GLuint type, const GLchar *src) {
|
||||
push_gles2_debug(renderer);
|
||||
|
||||
GLuint shader = glCreateShader(type);
|
||||
glShaderSource(shader, 1, &src, NULL);
|
||||
|
|
@ -616,19 +596,20 @@ static GLuint compile_shader(GLuint type, const GLchar *src) {
|
|||
shader = 0;
|
||||
}
|
||||
|
||||
POP_GLES2_DEBUG;
|
||||
pop_gles2_debug(renderer);
|
||||
return shader;
|
||||
}
|
||||
|
||||
static GLuint link_program(const GLchar *vert_src, const GLchar *frag_src) {
|
||||
PUSH_GLES2_DEBUG;
|
||||
static GLuint link_program(struct wlr_gles2_renderer *renderer,
|
||||
const GLchar *vert_src, const GLchar *frag_src) {
|
||||
push_gles2_debug(renderer);
|
||||
|
||||
GLuint vert = compile_shader(GL_VERTEX_SHADER, vert_src);
|
||||
GLuint vert = compile_shader(renderer, GL_VERTEX_SHADER, vert_src);
|
||||
if (!vert) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
GLuint frag = compile_shader(GL_FRAGMENT_SHADER, frag_src);
|
||||
GLuint frag = compile_shader(renderer, GL_FRAGMENT_SHADER, frag_src);
|
||||
if (!frag) {
|
||||
glDeleteShader(vert);
|
||||
goto error;
|
||||
|
|
@ -651,11 +632,11 @@ static GLuint link_program(const GLchar *vert_src, const GLchar *frag_src) {
|
|||
goto error;
|
||||
}
|
||||
|
||||
POP_GLES2_DEBUG;
|
||||
pop_gles2_debug(renderer);
|
||||
return prog;
|
||||
|
||||
error:
|
||||
POP_GLES2_DEBUG;
|
||||
pop_gles2_debug(renderer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -696,7 +677,7 @@ extern struct wlr_gles2_tex_shader
|
|||
tex_fragment_src_external;
|
||||
|
||||
// return true on success
|
||||
static bool build_tex_shader(struct wlr_gles2_tex_shader *shader)
|
||||
static bool build_tex_shader(struct wlr_gles2_renderer *renderer, struct wlr_gles2_tex_shader *shader)
|
||||
{
|
||||
GLuint prog;
|
||||
|
||||
|
|
@ -708,7 +689,7 @@ static bool build_tex_shader(struct wlr_gles2_tex_shader *shader)
|
|||
|
||||
assert(n < (int)sizeof(fragsrc));
|
||||
|
||||
shader->program = prog = link_program(tex_vertex_src, fragsrc);
|
||||
shader->program = prog = link_program(renderer, tex_vertex_src, fragsrc);
|
||||
if (!prog) {
|
||||
return false;
|
||||
}
|
||||
|
|
@ -765,41 +746,41 @@ struct wlr_renderer *wlr_gles2_renderer_create(struct wlr_egl *egl) {
|
|||
|
||||
if (check_gl_ext(exts_str, "GL_KHR_debug")) {
|
||||
renderer->exts.debug_khr = true;
|
||||
load_gl_proc(&gles2_procs.glDebugMessageCallbackKHR,
|
||||
load_gl_proc(&renderer->procs.glDebugMessageCallbackKHR,
|
||||
"glDebugMessageCallbackKHR");
|
||||
load_gl_proc(&gles2_procs.glDebugMessageControlKHR,
|
||||
load_gl_proc(&renderer->procs.glDebugMessageControlKHR,
|
||||
"glDebugMessageControlKHR");
|
||||
}
|
||||
|
||||
if (check_gl_ext(exts_str, "GL_OES_EGL_image_external")) {
|
||||
renderer->exts.egl_image_external_oes = true;
|
||||
load_gl_proc(&gles2_procs.glEGLImageTargetTexture2DOES,
|
||||
load_gl_proc(&renderer->procs.glEGLImageTargetTexture2DOES,
|
||||
"glEGLImageTargetTexture2DOES");
|
||||
}
|
||||
|
||||
if (check_gl_ext(exts_str, "GL_OES_EGL_image")) {
|
||||
renderer->exts.egl_image_oes = true;
|
||||
load_gl_proc(&gles2_procs.glEGLImageTargetRenderbufferStorageOES,
|
||||
load_gl_proc(&renderer->procs.glEGLImageTargetRenderbufferStorageOES,
|
||||
"glEGLImageTargetRenderbufferStorageOES");
|
||||
}
|
||||
|
||||
if (renderer->exts.debug_khr) {
|
||||
glEnable(GL_DEBUG_OUTPUT_KHR);
|
||||
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR);
|
||||
gles2_procs.glDebugMessageCallbackKHR(gles2_log, NULL);
|
||||
renderer->procs.glDebugMessageCallbackKHR(gles2_log, NULL);
|
||||
|
||||
// Silence unwanted message types
|
||||
gles2_procs.glDebugMessageControlKHR(GL_DONT_CARE,
|
||||
GL_DEBUG_TYPE_POP_GROUP_KHR, GL_DONT_CARE, 0, NULL, GL_FALSE);
|
||||
gles2_procs.glDebugMessageControlKHR(GL_DONT_CARE,
|
||||
GL_DEBUG_TYPE_PUSH_GROUP_KHR, GL_DONT_CARE, 0, NULL, GL_FALSE);
|
||||
renderer->procs.glDebugMessageControlKHR(GL_DONT_CARE,
|
||||
GL_DEBUG_TYPE_POP_GROUP_KHR, GL_DONT_CARE, 0, NULL, GL_FALSE);
|
||||
renderer->procs.glDebugMessageControlKHR(GL_DONT_CARE,
|
||||
GL_DEBUG_TYPE_PUSH_GROUP_KHR, GL_DONT_CARE, 0, NULL, GL_FALSE);
|
||||
}
|
||||
|
||||
PUSH_GLES2_DEBUG;
|
||||
push_gles2_debug(renderer);
|
||||
|
||||
GLuint prog;
|
||||
renderer->shaders.quad.program = prog =
|
||||
link_program(quad_vertex_src, quad_fragment_src);
|
||||
link_program(renderer, quad_vertex_src, quad_fragment_src);
|
||||
if (!renderer->shaders.quad.program) {
|
||||
goto error;
|
||||
}
|
||||
|
|
@ -808,7 +789,7 @@ struct wlr_renderer *wlr_gles2_renderer_create(struct wlr_egl *egl) {
|
|||
renderer->shaders.quad.pos_attrib = glGetAttribLocation(prog, "pos");
|
||||
|
||||
renderer->shaders.ellipse.program = prog =
|
||||
link_program(quad_vertex_src, ellipse_fragment_src);
|
||||
link_program(renderer, quad_vertex_src, ellipse_fragment_src);
|
||||
if (!renderer->shaders.ellipse.program) {
|
||||
goto error;
|
||||
}
|
||||
|
|
@ -818,23 +799,23 @@ struct wlr_renderer *wlr_gles2_renderer_create(struct wlr_egl *egl) {
|
|||
renderer->shaders.ellipse.tex_attrib = glGetAttribLocation(prog, "texcoord");
|
||||
|
||||
renderer->shaders.tex_rgba = tex_fragment_src_rgba;
|
||||
if(! build_tex_shader(&renderer->shaders.tex_rgba)) {
|
||||
if(! build_tex_shader(renderer, &renderer->shaders.tex_rgba)) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
renderer->shaders.tex_rgbx = tex_fragment_src_rgbx;
|
||||
if(! build_tex_shader(&renderer->shaders.tex_rgbx)) {
|
||||
if(! build_tex_shader(renderer, &renderer->shaders.tex_rgbx)) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (renderer->exts.egl_image_external_oes) {
|
||||
renderer->shaders.tex_ext = tex_fragment_src_external;
|
||||
if(! build_tex_shader(&renderer->shaders.tex_ext)) {
|
||||
if(! build_tex_shader(renderer, &renderer->shaders.tex_ext)) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
POP_GLES2_DEBUG;
|
||||
pop_gles2_debug(renderer);
|
||||
|
||||
wlr_egl_unset_current(renderer->egl);
|
||||
|
||||
|
|
@ -847,11 +828,11 @@ error:
|
|||
glDeleteProgram(renderer->shaders.tex_rgbx.program);
|
||||
glDeleteProgram(renderer->shaders.tex_ext.program);
|
||||
|
||||
POP_GLES2_DEBUG;
|
||||
pop_gles2_debug(renderer);
|
||||
|
||||
if (renderer->exts.debug_khr) {
|
||||
glDisable(GL_DEBUG_OUTPUT_KHR);
|
||||
gles2_procs.glDebugMessageCallbackKHR(NULL, NULL);
|
||||
renderer->procs.glDebugMessageCallbackKHR(NULL, NULL);
|
||||
}
|
||||
|
||||
wlr_egl_unset_current(renderer->egl);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue