From 48159366300b4f8fad9c442288b505424f49e5f2 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Thu, 20 Jan 2022 18:49:05 +0000 Subject: [PATCH] gl-renderer: Allocate textures per-buffer, not per-surface Now that the gl_buffer_state owns everything related to buffers, move the textures from there rather than living on the surface, to join the EGLImage and/or SHM params. Signed-off-by: Daniel Stone --- libweston/renderer-gl/gl-renderer.c | 62 ++++++++++++++--------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index 1c71c6d8..4cfe431e 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -161,6 +161,9 @@ struct gl_buffer_state { int hsub[3]; /* horizontal subsampling per plane */ int vsub[3]; /* vertical subsampling per plane */ + GLuint textures[3]; + int num_textures; + struct wl_listener destroy_listener; }; @@ -178,9 +181,6 @@ struct gl_surface_state { Used only in the context of a gl_renderer_repaint_output call. */ bool used_in_output_repaint; - GLuint textures[3]; - int num_textures; - struct wl_listener surface_destroy_listener; struct wl_listener renderer_destroy_listener; }; @@ -900,9 +900,9 @@ gl_shader_config_set_input_textures(struct gl_shader_config *sconf, for (i = 0; i < 4; i++) sconf->unicolor[i] = gb->color[i]; - assert(gs->num_textures <= GL_SHADER_INPUT_TEX_MAX); - for (i = 0; i < gs->num_textures; i++) - sconf->input_tex[i] = gs->textures[i]; + assert(gb->num_textures <= GL_SHADER_INPUT_TEX_MAX); + for (i = 0; i < gb->num_textures; i++) + sconf->input_tex[i] = gb->textures[i]; for (; i < GL_SHADER_INPUT_TEX_MAX; i++) sconf->input_tex[i] = 0; } @@ -1791,8 +1791,8 @@ gl_renderer_flush_damage(struct weston_surface *surface, glPixelStorei(GL_UNPACK_SKIP_PIXELS_EXT, 0); glPixelStorei(GL_UNPACK_SKIP_ROWS_EXT, 0); wl_shm_buffer_begin_access(buffer->shm_buffer); - for (j = 0; j < gs->num_textures; j++) { - glBindTexture(GL_TEXTURE_2D, gs->textures[j]); + for (j = 0; j < gb->num_textures; j++) { + glBindTexture(GL_TEXTURE_2D, gb->textures[j]); glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, gb->pitch / gb->hsub[j]); glTexImage2D(GL_TEXTURE_2D, 0, @@ -1815,8 +1815,8 @@ gl_renderer_flush_damage(struct weston_surface *surface, r = weston_surface_to_buffer_rect(surface, rectangles[i]); - for (j = 0; j < gs->num_textures; j++) { - glBindTexture(GL_TEXTURE_2D, gs->textures[j]); + for (j = 0; j < gb->num_textures; j++) { + glBindTexture(GL_TEXTURE_2D, gb->textures[j]); glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, gb->pitch / gb->hsub[j]); glPixelStorei(GL_UNPACK_SKIP_PIXELS_EXT, @@ -1850,6 +1850,8 @@ destroy_buffer_state(struct gl_buffer_state *gb) { int i; + glDeleteTextures(gb->num_textures, gb->textures); + for (i = 0; i < gb->num_images; i++) gb->gr->destroy_image(gb->gr->egl_display, gb->images[i]); @@ -1873,26 +1875,21 @@ handle_buffer_destroy(struct wl_listener *listener, void *data) } static void -ensure_textures(struct gl_surface_state *gs, GLenum target, int num_textures) +ensure_textures(struct gl_buffer_state *gb, GLenum target, int num_textures) { int i; - if (num_textures <= gs->num_textures) { - glDeleteTextures(gs->num_textures - num_textures, - &gs->textures[num_textures]); - gs->num_textures = num_textures; - return; - } + assert(gb->num_textures == 0); glActiveTexture(GL_TEXTURE0); - for (i = gs->num_textures; i < num_textures; i++) { - glGenTextures(1, &gs->textures[i]); - glBindTexture(target, gs->textures[i]); + for (i = 0; i < num_textures; i++) { + glGenTextures(1, &gb->textures[i]); + glBindTexture(target, gb->textures[i]); glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } - gs->num_textures = num_textures; + gb->num_textures = num_textures; glBindTexture(target, 0); } @@ -2110,7 +2107,7 @@ unsupported: gs->buffer = gb; gs->surface = es; - ensure_textures(gs, GL_TEXTURE_2D, num_planes); + ensure_textures(gb, GL_TEXTURE_2D, num_planes); return true; } @@ -2123,6 +2120,7 @@ gl_renderer_fill_buffer_info(struct weston_compositor *ec, struct gl_buffer_state *gb = zalloc(sizeof(*gb)); EGLint format; uint32_t fourcc; + GLenum target; EGLint y_inverted; bool ret = true; int i; @@ -2216,6 +2214,9 @@ gl_renderer_fill_buffer_info(struct weston_compositor *ec, } } + target = gl_shader_texture_variant_get_target(gb->shader_variant); + ensure_textures(gb, target, gb->num_images); + buffer->renderer_private = gb; gb->destroy_listener.notify = handle_buffer_destroy; wl_signal_add(&buffer->destroy_signal, &gb->destroy_listener); @@ -2244,10 +2245,9 @@ gl_renderer_attach_egl(struct weston_surface *es, struct weston_buffer *buffer) gs->buffer = gb; target = gl_shader_texture_variant_get_target(gb->shader_variant); - ensure_textures(gs, target, gb->num_images); for (i = 0; i < gb->num_images; i++) { glActiveTexture(GL_TEXTURE0 + i); - glBindTexture(target, gs->textures[i]); + glBindTexture(target, gb->textures[i]); gr->image_target_texture_2d(target, gb->images[i]); } @@ -2488,6 +2488,7 @@ import_yuv_dmabuf(struct gl_renderer *gr, struct gl_buffer_state *gb, unsigned i; int j; struct yuv_format_descriptor *format = NULL; + GLenum target; char fmt[4]; for (i = 0; i < ARRAY_LENGTH(yuv_formats); ++i) { @@ -2545,6 +2546,9 @@ import_yuv_dmabuf(struct gl_renderer *gr, struct gl_buffer_state *gb, assert(false); } + target = gl_shader_texture_variant_get_target(gb->shader_variant); + ensure_textures(gb, target, gb->num_images); + return true; } @@ -2666,6 +2670,8 @@ import_dmabuf(struct gl_renderer *gr, gb->shader_variant = SHADER_VARIANT_EXTERNAL; } + ensure_textures(gb, target, gb->num_images); + return gb; } @@ -2848,10 +2854,9 @@ gl_renderer_attach_dmabuf(struct weston_surface *surface, gs->buffer = gb; target = gl_shader_texture_variant_get_target(gb->shader_variant); - ensure_textures(gs, target, gb->num_images); for (i = 0; i < gb->num_images; ++i) { glActiveTexture(GL_TEXTURE0 + i); - glBindTexture(target, gs->textures[i]); + glBindTexture(target, gb->textures[i]); gr->image_target_texture_2d(target, gb->images[i]); } @@ -3015,9 +3020,6 @@ out: weston_buffer_reference(&gs->buffer_ref, NULL, BUFFER_WILL_NOT_BE_ACCESSED); weston_buffer_release_reference(&gs->buffer_release_ref, NULL); - - glDeleteTextures(gs->num_textures, gs->textures); - gs->num_textures = 0; } static uint32_t @@ -3160,8 +3162,6 @@ surface_state_destroy(struct gl_surface_state *gs, struct gl_renderer *gr) gs->surface->renderer_state = NULL; - glDeleteTextures(gs->num_textures, gs->textures); - if (gs->buffer && gs->buffer_ref.buffer->type == WESTON_BUFFER_SHM) destroy_buffer_state(gs->buffer); gs->buffer = NULL;