gl-renderer: Replace RGBX shader variant with texture swizzles

Simplify fragment shader logic by getting rid of the RGBX variant
which can be implemented using texture swizzles instead.

Signed-off-by: Loïc Molinari <loic.molinari@collabora.com>
This commit is contained in:
Loïc Molinari 2024-11-11 13:50:45 +01:00 committed by Daniel Stone
parent e8160e059d
commit e18e3b6c4a
4 changed files with 29 additions and 39 deletions

View file

@ -34,14 +34,13 @@
/*
* Enumeration of shader variants, must match enum gl_shader_texture_variant.
*/
#define SHADER_VARIANT_RGBX 1
#define SHADER_VARIANT_RGBA 2
#define SHADER_VARIANT_Y_U_V 3
#define SHADER_VARIANT_Y_UV 4
#define SHADER_VARIANT_Y_XUXV 5
#define SHADER_VARIANT_XYUV 6
#define SHADER_VARIANT_SOLID 7
#define SHADER_VARIANT_EXTERNAL 8
#define SHADER_VARIANT_RGBA 1
#define SHADER_VARIANT_Y_U_V 2
#define SHADER_VARIANT_Y_UV 3
#define SHADER_VARIANT_Y_XUXV 4
#define SHADER_VARIANT_XYUV 5
#define SHADER_VARIANT_SOLID 6
#define SHADER_VARIANT_EXTERNAL 7
/* enum gl_shader_color_curve */
#define SHADER_COLOR_CURVE_IDENTITY 0
@ -197,19 +196,10 @@ sample_input_texture()
if (c_variant == SHADER_VARIANT_SOLID)
return unicolor;
if (c_variant == SHADER_VARIANT_EXTERNAL)
if (c_variant == SHADER_VARIANT_EXTERNAL ||
c_variant == SHADER_VARIANT_RGBA)
return texture2D_swizzle(tex, 0, v_texcoord);
if (c_variant == SHADER_VARIANT_RGBA ||
c_variant == SHADER_VARIANT_RGBX) {
vec4 color = texture2D_swizzle(tex, 0, v_texcoord);
if (c_variant == SHADER_VARIANT_RGBX)
color.a = 1.0;
return color;
}
/* Requires conversion to RGBA */
if (c_variant == SHADER_VARIANT_Y_U_V) {

View file

@ -209,7 +209,6 @@ enum gl_shader_texcoord_input {
enum gl_shader_texture_variant {
SHADER_VARIANT_NONE = 0,
/* Keep the following in sync with fragment.glsl. */
SHADER_VARIANT_RGBX,
SHADER_VARIANT_RGBA,
SHADER_VARIANT_Y_U_V,
SHADER_VARIANT_Y_UV,

View file

@ -1646,8 +1646,22 @@ draw_mesh(struct gl_renderer *gr,
int nidx,
bool opaque)
{
struct gl_surface_state *gs = get_surface_state(pnode->surface);
struct gl_buffer_state *gb = gs->buffer;
GLint swizzle_a;
assert(nidx > 0);
/* Prevent translucent surfaces from punching holes through the
* renderbuffer. */
if (gb->shader_variant == SHADER_VARIANT_RGBA) {
swizzle_a = opaque ? GL_ONE : gb->texture_format[0].swizzles.a;
if (gb->parameters[0].swizzles.a != swizzle_a) {
gb->parameters[0].swizzles.a = swizzle_a;
gb->parameters[0].flags |= TEXTURE_SWIZZLES_DIRTY;
}
}
if (gr->debug_mode)
set_debug_mode(gr, sconf, barycentrics, opaque);
@ -1809,25 +1823,14 @@ draw_paint_node(struct weston_paint_node *pnode,
prepare_placeholder(&sconf, pnode);
if (pixman_region32_not_empty(&surface_opaque)) {
struct gl_shader_config alt = sconf;
if (alt.req.variant == SHADER_VARIANT_RGBA) {
/* Special case for RGBA textures with possibly
* bad data in alpha channel: use the shader
* that forces texture alpha = 1.0.
* Xwayland surfaces need this.
*/
alt.req.variant = SHADER_VARIANT_RGBX;
}
if (pnode->view->alpha < 1.0)
glEnable(GL_BLEND);
else
glDisable(GL_BLEND);
transform_damage(pnode, &repaint, &quads, &nquads);
repaint_region(gr, pnode, quads, nquads, &surface_opaque, &alt,
true);
repaint_region(gr, pnode, quads, nquads, &surface_opaque,
&sconf, true);
gs->used_in_output_repaint = true;
}
@ -2833,10 +2836,7 @@ gl_renderer_attach_shm(struct weston_surface *es, struct weston_buffer *buffer)
assert(pixel_format_get_plane_count(buffer->pixel_format) == 1);
num_planes = 1;
if (pixel_format_is_opaque(buffer->pixel_format))
shader_variant = SHADER_VARIANT_RGBX;
else
shader_variant = SHADER_VARIANT_RGBA;
shader_variant = SHADER_VARIANT_RGBA;
assert(bpp > 0 && !(bpp & 7));
pitch = buffer->stride / (bpp / 8);
@ -2938,11 +2938,13 @@ gl_renderer_fill_buffer_info(struct weston_compositor *ec,
fourcc = DRM_FORMAT_XRGB8888;
gb->num_images = 1;
gb->shader_variant = SHADER_VARIANT_RGBA;
gb->texture_format[0].swizzles.a = GL_ONE;
break;
case EGL_TEXTURE_RGBA:
fourcc = DRM_FORMAT_ARGB8888;
gb->num_images = 1;
gb->shader_variant = SHADER_VARIANT_RGBA;
gb->texture_format[0].swizzles.a = GL_ALPHA;
break;
case EGL_TEXTURE_EXTERNAL_WL:
fourcc = DRM_FORMAT_ARGB8888;
@ -3334,6 +3336,7 @@ import_dmabuf(struct gl_renderer *gr,
switch (target) {
case GL_TEXTURE_2D:
gb->shader_variant = SHADER_VARIANT_RGBA;
gb->texture_format[0].swizzles.a = GL_ALPHA;
break;
default:
gb->shader_variant = SHADER_VARIANT_EXTERNAL;

View file

@ -115,7 +115,6 @@ gl_shader_texture_variant_to_string(enum gl_shader_texture_variant v)
switch (v) {
#define CASERET(x) case x: return #x;
CASERET(SHADER_VARIANT_NONE)
CASERET(SHADER_VARIANT_RGBX)
CASERET(SHADER_VARIANT_RGBA)
CASERET(SHADER_VARIANT_Y_U_V)
CASERET(SHADER_VARIANT_Y_UV)
@ -635,7 +634,6 @@ gl_shader_texture_variant_can_be_premult(enum gl_shader_texture_variant v)
case SHADER_VARIANT_EXTERNAL:
return true;
case SHADER_VARIANT_NONE:
case SHADER_VARIANT_RGBX:
case SHADER_VARIANT_Y_U_V:
case SHADER_VARIANT_Y_UV:
case SHADER_VARIANT_Y_XUXV: