mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2026-05-04 10:38:23 +02:00
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:
parent
e8160e059d
commit
e18e3b6c4a
4 changed files with 29 additions and 39 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue