feat(opengl): use only rgba format textures (#9304)

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Matt
2025-12-17 15:16:34 -05:00
committed by GitHub
parent 4d3e1fffd8
commit 2159fcb708
11 changed files with 78 additions and 28 deletions
@@ -181,7 +181,7 @@ used to add content to a texture and the driver will draw the texture in the win
#else
#error("Unsupported color format")
#endif
glTexImage2D(GL_TEXTURE_2D, 0, texture_format, img_cogwheel_argb.header.w, img_cogwheel_argb.header.h, 0, GL_BGRA, GL_UNSIGNED_BYTE, img_cogwheel_argb.data);
glTexImage2D(GL_TEXTURE_2D, 0, texture_format, img_cogwheel_argb.header.w, img_cogwheel_argb.header.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, img_cogwheel_argb.data);
glGenerateMipmap(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);
+2 -2
View File
@@ -635,7 +635,7 @@ static unsigned int create_texture(int32_t w, int32_t h, const void * data)
/* LV_COLOR_DEPTH 32, 16 are supported but the cached textures will always
* have full ARGB pixels since the alpha channel is required for blending.
*/
GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, data));
GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data));
#if 0
GL_CALL(glGenerateMipmap(GL_TEXTURE_2D));
GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 20));
@@ -677,7 +677,7 @@ static void lv_draw_opengles_3d(lv_draw_task_t * t, const lv_draw_3d_dsc_t * dsc
lv_area_move(&clip_area, -dest_layer->buf_area.x1, -dest_layer->buf_area.y1);
lv_opengles_render(dsc->tex_id, coords, dsc->opa, targ_tex_w, targ_tex_h, &clip_area, dsc->h_flip, !dsc->v_flip,
lv_color_black(), true);
lv_color_black(), true, false);
if(target_texture) {
GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, 0));
+1 -1
View File
@@ -242,7 +242,7 @@ static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_m
GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB565, disp_width, disp_height, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
ctx->texture.fb1));
#elif LV_COLOR_DEPTH == 32
GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, disp_width, disp_height, 0, GL_BGRA, GL_UNSIGNED_BYTE,
GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, disp_width, disp_height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
ctx->texture.fb1));
#else
#error("Unsupported color format")
@@ -85,6 +85,7 @@ static const char *src_fragment_shader_v100 = R"(
uniform float u_Opa;
uniform bool u_IsFill;
uniform vec3 u_FillColor;
uniform bool u_SwapRB;
#ifdef HSV_ADJUST
#include <hsv_adjust.glsl>
@@ -105,6 +106,9 @@ static const char *src_fragment_shader_v100 = R"(
float combinedAlpha = texColor.a * u_Opa;
gl_FragColor = vec4(texColor.rgb * combinedAlpha, combinedAlpha);
}
if (u_SwapRB) {
gl_FragColor.bgr = gl_FragColor.rgb;
}
#ifdef HSV_ADJUST
gl_FragColor.rgb = adjustHSV(gl_FragColor.rgb);
#endif
@@ -208,6 +212,7 @@ static const char *src_fragment_shader_v300es = R"(
uniform sampler2D u_Texture;
uniform lowp float u_Opa;
uniform bool u_SwapRB;
#ifdef HSV_ADJUST
#include <hsv_adjust.glsl>
@@ -232,6 +237,9 @@ static const char *src_fragment_shader_v300es = R"(
color.rgb *= color.a;
}
}
if (u_SwapRB) {
color.bgr = color.rgb;
}
#ifdef HSV_ADJUST
color.rgb = adjustHSV(color.rgb);
#endif
+19 -6
View File
@@ -86,8 +86,8 @@ static unsigned int index_buffer_count = 0;
static unsigned int shader_id;
static const char * shader_names[] = { "u_Texture", "u_ColorDepth", "u_VertexTransform", "u_Opa", "u_IsFill", "u_FillColor", "u_Hue", "u_Saturation", "u_Value" };
static int shader_location[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
static const char * shader_names[] = { "u_Texture", "u_ColorDepth", "u_VertexTransform", "u_Opa", "u_IsFill", "u_FillColor", "u_SwapRB", "u_Hue", "u_Saturation", "u_Value" };
static int shader_location[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
/**********************
* MACROS
@@ -146,17 +146,26 @@ void lv_opengles_render_texture(unsigned int texture, const lv_area_t * texture_
{
LV_PROFILER_DRAW_BEGIN;
lv_opengles_render(texture, texture_area, opa, disp_w, disp_h, texture_clip_area, h_flip, v_flip,
lv_color_black(), false);
lv_color_black(), false, false);
LV_PROFILER_DRAW_END;
}
void lv_opengles_render_texture_rbswap(unsigned int texture, const lv_area_t * texture_area, lv_opa_t opa,
int32_t disp_w,
int32_t disp_h, const lv_area_t * texture_clip_area, bool h_flip, bool v_flip)
{
LV_PROFILER_DRAW_BEGIN;
lv_opengles_render(texture, texture_area, opa, disp_w, disp_h, texture_clip_area, h_flip, v_flip,
lv_color_black(), false, true);
LV_PROFILER_DRAW_END;
}
void lv_opengles_render_fill(lv_color_t color, const lv_area_t * area, lv_opa_t opa, int32_t disp_w, int32_t disp_h)
{
LV_PROFILER_DRAW_BEGIN;
lv_opengles_render(0, area, opa, disp_w, disp_h, area, false, false, color, false);
lv_opengles_render(0, area, opa, disp_w, disp_h, area, false, false, color, false, true);
LV_PROFILER_DRAW_END;
}
void lv_opengles_render_display_texture(lv_display_t * display, bool h_flip, bool v_flip)
{
LV_PROFILER_DRAW_BEGIN;
@@ -190,6 +199,7 @@ void lv_opengles_render_display_texture(lv_display_t * display, bool h_flip, boo
lv_opengles_shader_set_uniform1f("u_Opa", 1);
lv_opengles_shader_set_uniform1i("u_IsFill", 0);
lv_opengles_shader_set_uniform3f("u_FillColor", 1.0f, 1.0f, 1.0f);
lv_opengles_shader_set_uniform1i("u_SwapRB", 1);
lv_opengles_render_draw();
LV_PROFILER_DRAW_END;
@@ -211,7 +221,7 @@ void lv_opengles_viewport(int32_t x, int32_t y, int32_t w, int32_t h)
void lv_opengles_render(unsigned int texture, const lv_area_t * texture_area, lv_opa_t opa,
int32_t disp_w, int32_t disp_h, const lv_area_t * texture_clip_area,
bool h_flip, bool v_flip, lv_color_t fill_color, bool blend_opt)
bool h_flip, bool v_flip, lv_color_t fill_color, bool blend_opt, bool swap_red_blue)
{
LV_PROFILER_DRAW_BEGIN;
lv_area_t intersection;
@@ -258,6 +268,7 @@ void lv_opengles_render(unsigned int texture, const lv_area_t * texture_area, lv
hor_translate, ver_translate, 1.0f
};
lv_opengles_shader_bind();
lv_opengles_enable_blending(blend_opt);
lv_opengles_shader_set_uniform1f("u_ColorDepth", LV_COLOR_DEPTH);
@@ -267,6 +278,8 @@ void lv_opengles_render(unsigned int texture, const lv_area_t * texture_area, lv
lv_opengles_shader_set_uniform1i("u_IsFill", texture == 0);
lv_opengles_shader_set_uniform3f("u_FillColor", (float)fill_color.red / 255.0f, (float)fill_color.green / 255.0f,
(float)fill_color.blue / 255.0f);
lv_opengles_shader_set_uniform1i("u_SwapRB", swap_red_blue ? 1 : 0);
lv_opengles_render_draw();
lv_opengles_disable_blending();
LV_PROFILER_DRAW_END;
+1 -1
View File
@@ -58,7 +58,7 @@ void lv_opengles_render_texture(unsigned int texture, const lv_area_t * texture_
int32_t disp_h, const lv_area_t * texture_clip_area, bool h_flip, bool v_flip);
/**
* Render a display texture - Supports rotation
* Render a display texture - Supports rotation - Switches red and blue channels
* @param display LVGL Texture display. Created with the `lv_opengles_texture` module
* @param h_flip horizontal flip
* @param v_flip vertical flip
+9 -8
View File
@@ -518,10 +518,10 @@ static void window_update_handler(lv_timer_t * t)
texture->fb));
#elif LV_COLOR_DEPTH == 24
GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, lv_area_get_width(&texture->area), lv_area_get_height(&texture->area), 0,
GL_BGR, GL_UNSIGNED_BYTE, texture->fb));
GL_RGB, GL_UNSIGNED_BYTE, texture->fb));
#elif LV_COLOR_DEPTH == 32
GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, lv_area_get_width(&texture->area), lv_area_get_height(&texture->area),
0, GL_BGRA, GL_UNSIGNED_BYTE, texture->fb));
0, GL_RGBA, GL_UNSIGNED_BYTE, texture->fb));
#else
#error("Unsupported color format")
#endif
@@ -530,8 +530,9 @@ static void window_update_handler(lv_timer_t * t)
GL_CALL(glBindTexture(GL_TEXTURE_2D, 0));
lv_opengles_render_texture(window_display_texture, &texture->area, texture->opa, window->hor_res, window->ver_res,
&texture->area, window->h_flip, window->v_flip);
lv_opengles_render_texture_rbswap(window_display_texture, &texture->area, texture->opa, window->hor_res,
window->ver_res,
&texture->area, window->h_flip, window->v_flip);
#endif
}
else {
@@ -548,11 +549,11 @@ static void window_update_handler(lv_timer_t * t)
}
#if LV_USE_DRAW_OPENGLES
lv_opengles_render_texture(texture->texture_id, &texture->area, texture->opa, window->hor_res, window->ver_res,
&texture->area, window->h_flip, texture->disp == NULL ? window->v_flip : !window->v_flip);
lv_opengles_render_texture_rbswap(texture->texture_id, &texture->area, texture->opa, window->hor_res, window->ver_res,
&texture->area, window->h_flip, texture->disp == NULL ? window->v_flip : !window->v_flip);
#else
lv_opengles_render_texture(texture->texture_id, &texture->area, texture->opa, window->hor_res, window->ver_res,
&texture->area, window->h_flip, window->v_flip);
lv_opengles_render_texture_rbswap(texture->texture_id, &texture->area, texture->opa, window->hor_res, window->ver_res,
&texture->area, window->h_flip, window->v_flip);
#endif
}
}
+26 -1
View File
@@ -105,7 +105,32 @@ extern "C" {
void lv_opengles_render(unsigned int texture, const lv_area_t * texture_area, lv_opa_t opa,
int32_t disp_w, int32_t disp_h, const lv_area_t * texture_clip_area,
bool h_flip, bool v_flip, lv_color_t fill_color, bool blend_opt);
bool h_flip, bool v_flip, lv_color_t fill_color, bool blend_opt, bool flipRB);
/**
* Render a texture using alternate blending mode, with red and blue channels flipped in the shader.
* @param texture OpenGL texture ID
* @param texture_area the area in the window to render the texture in
* @param opa opacity to blend the texture with existing contents
* @param disp_w width of the window/framebuffer being rendered to
* @param disp_h height of the window/framebuffer being rendered to
* @param h_flip horizontal flip
* @param v_flip vertical flip
*/
void lv_opengles_render_texture_rbswap(unsigned int texture, const lv_area_t * texture_area, lv_opa_t opa,
int32_t disp_w, int32_t disp_h, const lv_area_t * texture_clip_area,
bool h_flip, bool v_flip);
/**
* Set the OpenGL viewport, with vertical co-ordinate conversion
* @param x x position of the viewport
* @param y y position of the viewport
* @param w width of the viewport
* @param h height of the viewport
*/
void lv_opengles_regular_viewport(int32_t x, int32_t y, int32_t w, int32_t h);
/**********************
* MACROS
+2 -2
View File
@@ -208,7 +208,7 @@ static unsigned int create_texture(int32_t w, int32_t h)
GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB565, w, h, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
NULL));
#elif LV_COLOR_DEPTH == 32
GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL));
GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL));
#else
#error("Unsupported color format")
#endif
@@ -251,7 +251,7 @@ static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_m
GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB565, disp->hor_res, disp->ver_res, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
dsc->fb1));
#elif LV_COLOR_DEPTH == 32
GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, disp->hor_res, disp->ver_res, 0, GL_BGRA, GL_UNSIGNED_BYTE, dsc->fb1));
GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, disp->hor_res, disp->ver_res, 0, GL_RGBA, GL_UNSIGNED_BYTE, dsc->fb1));
#else
#error("Unsupported color format")
#endif
@@ -1098,7 +1098,7 @@ static const lv_opengl_shader_t src_includes[] = {
vec3 getTransmissionSample(vec2 fragCoord, float roughness, float ior)
{
float framebufferLod = log2(float(u_TransmissionFramebufferSize.x)) * applyIorToRoughness(roughness, ior);
vec3 transmittedLight = textureLod(u_TransmissionFramebufferSampler, fragCoord.xy, framebufferLod).rgb;
vec3 transmittedLight = textureLod(u_TransmissionFramebufferSampler, fragCoord.xy, framebufferLod).bgr; // r/b switched intentionally;
return transmittedLight;
}
@@ -2553,13 +2553,14 @@ static const lv_opengl_shader_t src_includes[] = {
baseColor.a = 1.0;
#endif
// The red and blue channels are switched after any tonemapping
// They will be switched back the correct way by the 2D shader
#ifdef LINEAR_OUTPUT
g_finalColor = vec4(color.rgb, baseColor.a);
g_finalColor = vec4(color.bgr, baseColor.a);
#else
g_finalColor = vec4(toneMap(color), baseColor.a);
g_finalColor = vec4(toneMap(color).bgr, baseColor.a);
#endif
/*
#else
// In case of missing data for a debug view, render a checkerboard.
@@ -1207,8 +1207,10 @@ static void setup_draw_environment_background(lv_opengl_shader_manager_t * manag
static void setup_draw_solid_background(lv_gltf_t * viewer, lv_color_t bg_color, lv_opa_t bg_opa)
{
GL_CALL(glClearDepthf(1.0f));
GL_CALL(glClearColor((float)bg_color.red / 255.0f, (float)bg_color.green / 255.0f,
(float)bg_color.blue / 255.0f, (float)bg_opa / 255.0f));
/* Red / blue color order reversed below so they'll end up in the correct order
* after the shader swaps the channels again, back to correct. */
GL_CALL(glClearColor((float)bg_color.blue / 255.0f, (float)bg_color.green / 255.0f,
(float)bg_color.red / 255.0f, (float)bg_opa / 255.0f));
GL_CALL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));