From 1c0643d8006be1b38622c01e846679b903c80ef7 Mon Sep 17 00:00:00 2001 From: Devin Bayer Date: Mon, 3 Aug 2020 11:25:09 +0200 Subject: [PATCH] color mgmt: bug fixes --- include/render/gles2.h | 2 ++ include/wlr/render/interface.h | 1 + include/wlr/render/wlr_renderer.h | 5 ++++- include/wlr/types/wlr_output.h | 2 ++ render/gles2/color.c | 7 ++----- render/gles2/renderer.c | 16 +++++++++++++--- render/wlr_renderer.c | 7 +++++-- types/wlr_output.c | 1 + 8 files changed, 30 insertions(+), 11 deletions(-) diff --git a/include/render/gles2.h b/include/render/gles2.h index f58485e47..4ebaf6809 100644 --- a/include/render/gles2.h +++ b/include/render/gles2.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -81,6 +82,7 @@ struct wlr_gles2_renderer { } shaders; uint32_t viewport_width, viewport_height; + struct wlr_color_config *color; }; struct wlr_gles2_texture { diff --git a/include/wlr/render/interface.h b/include/wlr/render/interface.h index 93c987b7d..d53916c79 100644 --- a/include/wlr/render/interface.h +++ b/include/wlr/render/interface.h @@ -32,6 +32,7 @@ struct wlr_renderer_impl { void (*end)(struct wlr_renderer *renderer); void (*clear)(struct wlr_renderer *renderer, const float color[static 4]); void (*scissor)(struct wlr_renderer *renderer, struct wlr_box *box); + void (*color_config)(struct wlr_renderer *renderer, struct wlr_color_config *color); bool (*render_subtexture_with_matrix)(struct wlr_renderer *renderer, struct wlr_texture *texture, const struct wlr_fbox *box, const float matrix[static 9], float alpha); diff --git a/include/wlr/render/wlr_renderer.h b/include/wlr/render/wlr_renderer.h index d9e64c099..ea59922a2 100644 --- a/include/wlr/render/wlr_renderer.h +++ b/include/wlr/render/wlr_renderer.h @@ -24,7 +24,6 @@ struct wlr_drm_format_set; struct wlr_renderer { const struct wlr_renderer_impl *impl; - struct wlr_color_config *color; bool rendering; @@ -45,6 +44,10 @@ void wlr_renderer_clear(struct wlr_renderer *r, const float color[static 4]); * box. */ void wlr_renderer_scissor(struct wlr_renderer *r, struct wlr_box *box); +/** + * Define an output color config for future renderering functions. + */ +void wlr_renderer_color_config(struct wlr_renderer *r, struct wlr_color_config *color); /** * Renders the requested texture. */ diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index 075d09a1f..16b1cf98d 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -185,6 +185,8 @@ struct wlr_output { struct wl_listener display_destroy; + struct wlr_color_config *color; + void *data; }; diff --git a/render/gles2/color.c b/render/gles2/color.c index fe844d68d..cc4ed8d63 100644 --- a/render/gles2/color.c +++ b/render/gles2/color.c @@ -77,10 +77,6 @@ static const char *color_describe(struct wlr_color_config *color) { struct wlr_color_config *wlr_color_config_load(const char *icc_profile_path) { assert(icc_profile_path); - if(0 == strlen(icc_profile_path)) { - return NULL; - } - bool can_access = access(icc_profile_path, F_OK) != -1; if (!can_access) { wlr_log(WLR_ERROR, "Unable to access color profile '%s'", icc_profile_path); @@ -235,7 +231,8 @@ static void lcms_error_handler(cmsContext ctx, cmsUInt32Number code, const char } void color_engine_setup(void) { - wlr_list_init(&luts); + if(luts.capacity == 0) + wlr_list_init(&luts); cmsSetLogErrorHandler(lcms_error_handler); } diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c index 50bfa740e..eefa745b3 100644 --- a/render/gles2/renderer.c +++ b/render/gles2/renderer.c @@ -49,6 +49,8 @@ static void gles2_begin(struct wlr_renderer *wlr_renderer, uint32_t width, renderer->viewport_width = width; renderer->viewport_height = height; + renderer->color = NULL; + // enable transparency glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); @@ -93,6 +95,13 @@ static void gles2_scissor(struct wlr_renderer *wlr_renderer, POP_GLES2_DEBUG; } +static void gles2_color_config(struct wlr_renderer *wlr_renderer, struct wlr_color_config *color) { + struct wlr_gles2_renderer *renderer = + gles2_get_renderer_in_context(wlr_renderer); + + renderer->color = color; +} + static bool gles2_render_subtexture_with_matrix( struct wlr_renderer *wlr_renderer, struct wlr_texture *wlr_texture, const struct wlr_fbox *box, const float matrix[static 9], @@ -164,7 +173,7 @@ static bool gles2_render_subtexture_with_matrix( glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - GLuint color_table = color_build_lut(wlr_texture->color, wlr_renderer->color); + GLuint color_table = color_build_lut(wlr_texture->color, renderer->color); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_3D, color_table); glUniform1i(shader->color_table, 1); @@ -192,7 +201,7 @@ static void gles2_render_quad_with_matrix(struct wlr_renderer *wlr_renderer, wlr_matrix_transpose(transposition, matrix); float converted[4]; - color_convert(NULL, wlr_renderer->color, color, converted); + color_convert(NULL, renderer->color, color, converted); PUSH_GLES2_DEBUG; glUseProgram(renderer->shaders.quad.program); @@ -230,7 +239,7 @@ static void gles2_render_ellipse_with_matrix(struct wlr_renderer *wlr_renderer, }; float converted[4]; - color_convert(NULL, wlr_renderer->color, color, converted); + color_convert(NULL, renderer->color, color, converted); PUSH_GLES2_DEBUG; glUseProgram(renderer->shaders.ellipse.program); @@ -538,6 +547,7 @@ static const struct wlr_renderer_impl renderer_impl = { .end = gles2_end, .clear = gles2_clear, .scissor = gles2_scissor, + .color_config = gles2_color_config, .render_subtexture_with_matrix = gles2_render_subtexture_with_matrix, .render_quad_with_matrix = gles2_render_quad_with_matrix, .render_ellipse_with_matrix = gles2_render_ellipse_with_matrix, diff --git a/render/wlr_renderer.c b/render/wlr_renderer.c index ebf3c5348..328f0f786 100644 --- a/render/wlr_renderer.c +++ b/render/wlr_renderer.c @@ -30,8 +30,6 @@ void wlr_renderer_destroy(struct wlr_renderer *r) { } wlr_signal_emit_safe(&r->events.destroy, r); - wlr_color_config_free(r->color); - if (r->impl && r->impl->destroy) { r->impl->destroy(r); } else { @@ -67,6 +65,11 @@ void wlr_renderer_scissor(struct wlr_renderer *r, struct wlr_box *box) { 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 }; diff --git a/types/wlr_output.c b/types/wlr_output.c index ce05f97b9..ca6a99916 100644 --- a/types/wlr_output.c +++ b/types/wlr_output.c @@ -380,6 +380,7 @@ void wlr_output_destroy(struct wlr_output *output) { } free(output->description); + wlr_color_config_free(output->color); pixman_region32_fini(&output->pending.damage);