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:
Devin Bayer 2021-01-21 17:39:54 +01:00
commit 9d76bca931
105 changed files with 1680 additions and 3182 deletions

View file

@ -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);