libweston: add weston_surface is_opaque property

Add an is_opaque property that is set to true if the attached buffer does not
have an alpha component, or if the solid color is non-transparent.

Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
This commit is contained in:
Philipp Zabel
2018-09-03 19:44:59 +02:00
parent f97d250847
commit 195dadeb2a
4 changed files with 34 additions and 0 deletions
+1
View File
@@ -532,6 +532,7 @@ weston_surface_set_color(struct weston_surface *surface,
float red, float green, float blue, float alpha) float red, float green, float blue, float alpha)
{ {
surface->compositor->renderer->surface_set_color(surface, red, green, blue, alpha); surface->compositor->renderer->surface_set_color(surface, red, green, blue, alpha);
surface->is_opaque = !(alpha < 1.0);
} }
WL_EXPORT void WL_EXPORT void
+1
View File
@@ -1481,6 +1481,7 @@ struct weston_surface {
struct weston_timeline_object timeline; struct weston_timeline_object timeline;
bool is_mapped; bool is_mapped;
bool is_opaque;
/* An list of per seat pointer constraints. */ /* An list of per seat pointer constraints. */
struct wl_list pointer_constraints; struct wl_list pointer_constraints;
+29
View File
@@ -54,6 +54,7 @@
#include "vertex-clipping.h" #include "vertex-clipping.h"
#include "linux-dmabuf.h" #include "linux-dmabuf.h"
#include "linux-dmabuf-unstable-v1-server-protocol.h" #include "linux-dmabuf-unstable-v1-server-protocol.h"
#include "pixel-formats.h"
#include "shared/helpers.h" #include "shared/helpers.h"
#include "shared/platform.h" #include "shared/platform.h"
@@ -1570,18 +1571,21 @@ gl_renderer_attach_shm(struct weston_surface *es, struct weston_buffer *buffer,
pitch = wl_shm_buffer_get_stride(shm_buffer) / 4; pitch = wl_shm_buffer_get_stride(shm_buffer) / 4;
gl_format[0] = GL_BGRA_EXT; gl_format[0] = GL_BGRA_EXT;
gl_pixel_type = GL_UNSIGNED_BYTE; gl_pixel_type = GL_UNSIGNED_BYTE;
es->is_opaque = true;
break; break;
case WL_SHM_FORMAT_ARGB8888: case WL_SHM_FORMAT_ARGB8888:
gs->shader = &gr->texture_shader_rgba; gs->shader = &gr->texture_shader_rgba;
pitch = wl_shm_buffer_get_stride(shm_buffer) / 4; pitch = wl_shm_buffer_get_stride(shm_buffer) / 4;
gl_format[0] = GL_BGRA_EXT; gl_format[0] = GL_BGRA_EXT;
gl_pixel_type = GL_UNSIGNED_BYTE; gl_pixel_type = GL_UNSIGNED_BYTE;
es->is_opaque = false;
break; break;
case WL_SHM_FORMAT_RGB565: case WL_SHM_FORMAT_RGB565:
gs->shader = &gr->texture_shader_rgbx; gs->shader = &gr->texture_shader_rgbx;
pitch = wl_shm_buffer_get_stride(shm_buffer) / 2; pitch = wl_shm_buffer_get_stride(shm_buffer) / 2;
gl_format[0] = GL_RGB; gl_format[0] = GL_RGB;
gl_pixel_type = GL_UNSIGNED_SHORT_5_6_5; gl_pixel_type = GL_UNSIGNED_SHORT_5_6_5;
es->is_opaque = true;
break; break;
case WL_SHM_FORMAT_YUV420: case WL_SHM_FORMAT_YUV420:
gs->shader = &gr->texture_shader_y_u_v; gs->shader = &gr->texture_shader_y_u_v;
@@ -1605,6 +1609,7 @@ gl_renderer_attach_shm(struct weston_surface *es, struct weston_buffer *buffer,
gl_format[1] = GL_LUMINANCE; gl_format[1] = GL_LUMINANCE;
gl_format[2] = GL_LUMINANCE; gl_format[2] = GL_LUMINANCE;
} }
es->is_opaque = true;
break; break;
case WL_SHM_FORMAT_NV12: case WL_SHM_FORMAT_NV12:
pitch = wl_shm_buffer_get_stride(shm_buffer); pitch = wl_shm_buffer_get_stride(shm_buffer);
@@ -1623,6 +1628,7 @@ gl_renderer_attach_shm(struct weston_surface *es, struct weston_buffer *buffer,
gl_format[0] = GL_LUMINANCE; gl_format[0] = GL_LUMINANCE;
gl_format[1] = GL_LUMINANCE_ALPHA; gl_format[1] = GL_LUMINANCE_ALPHA;
} }
es->is_opaque = true;
break; break;
case WL_SHM_FORMAT_YUYV: case WL_SHM_FORMAT_YUYV:
gs->shader = &gr->texture_shader_y_xuxv; gs->shader = &gr->texture_shader_y_xuxv;
@@ -1637,6 +1643,7 @@ gl_renderer_attach_shm(struct weston_surface *es, struct weston_buffer *buffer,
else else
gl_format[0] = GL_LUMINANCE_ALPHA; gl_format[0] = GL_LUMINANCE_ALPHA;
gl_format[1] = GL_BGRA_EXT; gl_format[1] = GL_BGRA_EXT;
es->is_opaque = true;
break; break;
default: default:
weston_log("warning: unknown shm buffer format: %08x\n", weston_log("warning: unknown shm buffer format: %08x\n",
@@ -1695,8 +1702,11 @@ gl_renderer_attach_egl(struct weston_surface *es, struct weston_buffer *buffer,
} }
gs->num_images = 0; gs->num_images = 0;
gs->target = GL_TEXTURE_2D; gs->target = GL_TEXTURE_2D;
es->is_opaque = false;
switch (format) { switch (format) {
case EGL_TEXTURE_RGB: case EGL_TEXTURE_RGB:
es->is_opaque = true;
/* fallthrough */
case EGL_TEXTURE_RGBA: case EGL_TEXTURE_RGBA:
default: default:
num_planes = 1; num_planes = 1;
@@ -1710,14 +1720,17 @@ gl_renderer_attach_egl(struct weston_surface *es, struct weston_buffer *buffer,
case EGL_TEXTURE_Y_UV_WL: case EGL_TEXTURE_Y_UV_WL:
num_planes = 2; num_planes = 2;
gs->shader = &gr->texture_shader_y_uv; gs->shader = &gr->texture_shader_y_uv;
es->is_opaque = true;
break; break;
case EGL_TEXTURE_Y_U_V_WL: case EGL_TEXTURE_Y_U_V_WL:
num_planes = 3; num_planes = 3;
gs->shader = &gr->texture_shader_y_u_v; gs->shader = &gr->texture_shader_y_u_v;
es->is_opaque = true;
break; break;
case EGL_TEXTURE_Y_XUXV_WL: case EGL_TEXTURE_Y_XUXV_WL:
num_planes = 2; num_planes = 2;
gs->shader = &gr->texture_shader_y_xuxv; gs->shader = &gr->texture_shader_y_xuxv;
es->is_opaque = true;
break; break;
} }
@@ -2233,6 +2246,19 @@ import_known_dmabuf(struct gl_renderer *gr,
return true; return true;
} }
static bool
dmabuf_is_opaque(struct linux_dmabuf_buffer *dmabuf)
{
const struct pixel_format_info *info;
info = pixel_format_get_info(dmabuf->attributes.format &
~DRM_FORMAT_BIG_ENDIAN);
if (!info)
return false;
return pixel_format_is_opaque(info);
}
static void static void
gl_renderer_attach_dmabuf(struct weston_surface *surface, gl_renderer_attach_dmabuf(struct weston_surface *surface,
struct weston_buffer *buffer, struct weston_buffer *buffer,
@@ -2305,6 +2331,7 @@ gl_renderer_attach_dmabuf(struct weston_surface *surface,
gs->height = buffer->height; gs->height = buffer->height;
gs->buffer_type = BUFFER_TYPE_EGL; gs->buffer_type = BUFFER_TYPE_EGL;
gs->y_inverted = buffer->y_inverted; gs->y_inverted = buffer->y_inverted;
surface->is_opaque = dmabuf_is_opaque(dmabuf);
} }
static void static void
@@ -2330,6 +2357,7 @@ gl_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer)
gs->num_textures = 0; gs->num_textures = 0;
gs->buffer_type = BUFFER_TYPE_NULL; gs->buffer_type = BUFFER_TYPE_NULL;
gs->y_inverted = 1; gs->y_inverted = 1;
es->is_opaque = false;
return; return;
} }
@@ -2348,6 +2376,7 @@ gl_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer)
weston_buffer_reference(&gs->buffer_ref, NULL); weston_buffer_reference(&gs->buffer_ref, NULL);
gs->buffer_type = BUFFER_TYPE_NULL; gs->buffer_type = BUFFER_TYPE_NULL;
gs->y_inverted = 1; gs->y_inverted = 1;
es->is_opaque = false;
} }
} }
+3
View File
@@ -650,12 +650,15 @@ pixman_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer)
switch (wl_shm_buffer_get_format(shm_buffer)) { switch (wl_shm_buffer_get_format(shm_buffer)) {
case WL_SHM_FORMAT_XRGB8888: case WL_SHM_FORMAT_XRGB8888:
pixman_format = PIXMAN_x8r8g8b8; pixman_format = PIXMAN_x8r8g8b8;
es->is_opaque = true;
break; break;
case WL_SHM_FORMAT_ARGB8888: case WL_SHM_FORMAT_ARGB8888:
pixman_format = PIXMAN_a8r8g8b8; pixman_format = PIXMAN_a8r8g8b8;
es->is_opaque = false;
break; break;
case WL_SHM_FORMAT_RGB565: case WL_SHM_FORMAT_RGB565:
pixman_format = PIXMAN_r5g6b5; pixman_format = PIXMAN_r5g6b5;
es->is_opaque = true;
break; break;
default: default:
weston_log("Unsupported SHM buffer format\n"); weston_log("Unsupported SHM buffer format\n");