Some color formats are naturally opaque: RGB, XRGB, YUV formats without
A channel. For these, automatically set the opaque region to whole
surface.

Note:
If a client first sends a buffer with opaque color format, and then
sends another buffer of the same size but with non-opaque color format,
the opaque region in the server is no longer what the client expects
based on protocol: it has been changed from what the client earlier
specified into whole surface. Therefore this is a protocol change.

---

This patch has been only compile-tested, because I'm not sure we can do
it like this, and temporary opaque region setup would be more complex.

Kristian, do we really want to go there?
---
 src/compositor.c |   21 +++++++++++++++++++--
 1 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/compositor.c b/src/compositor.c
index 2b963f5..e7c2c88 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -798,10 +798,15 @@ weston_surface_attach(struct wl_surface *surface, struct 
wl_buffer *buffer)
                glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT,
                             es->pitch, es->buffer->height, 0,
                             GL_BGRA_EXT, GL_UNSIGNED_BYTE, NULL);
-               if (wl_shm_buffer_get_format(buffer) == WL_SHM_FORMAT_XRGB8888)
+               if (wl_shm_buffer_get_format(buffer) == WL_SHM_FORMAT_XRGB8888) 
{
                        es->shader = &ec->texture_shader_rgbx;
-               else
+                       pixman_region32_union_rect(&es->opaque, &es->opaque,
+                                                  0, 0,
+                                                  buffer->width,
+                                                  buffer->height);
+               } else {
                        es->shader = &ec->texture_shader_rgba;
+               }
        } else if (ec->query_buffer(ec->egl_display, buffer,
                                    EGL_TEXTURE_FORMAT, &format)) {
                for (i = 0; i < es->num_images; i++)
@@ -834,6 +839,18 @@ weston_surface_attach(struct wl_surface *surface, struct 
wl_buffer *buffer)
                        break;
                }
 
+               /* opaque color formats */
+               switch (format) {
+               case EGL_TEXTURE_RGB:
+               case EGL_TEXTURE_Y_UV_WL:
+               case EGL_TEXTURE_Y_U_V_WL:
+               case EGL_TEXTURE_Y_XUXV_WL:
+                       pixman_region32_union_rect(&es->opaque, &es->opaque,
+                                                  0, 0,
+                                                  buffer->width,
+                                                  buffer->height);
+               }
+
                ensure_textures(es, num_planes);
                for (i = 0; i < num_planes; i++) {
                        attribs[0] = EGL_WAYLAND_PLANE_WL;
-- 
1.7.8.6

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to