wayland-buffer: Create EGLStream texture at buffer_realize time

When dealing with synchronized subsurfaces, we defer buffer attachments
until the parent surface state is applied.

That causes interaction issues with EGLStream backed buffers, as the
client expects the compositor-side stream to be functional after it
requests a wl_surface::attach.

By allowing the compositor to realize buffers without attaching them, we
could resolve the issue above if we define a realized EGLStream buffer
as a functional EGLStream (EGLStream + attached consumer).

This change moves the texture consumer creation part from the attach
function to the realize one.

https://bugzilla.gnome.org/show_bug.cgi?id=782575

(cherry picked from commit edd3634bb5)
This commit is contained in:
Miguel A. Vico 2017-05-06 01:23:57 +00:00 committed by Ray Strode
parent 0f93452488
commit f459cd37ff

View File

@ -129,8 +129,18 @@ meta_wayland_buffer_realize (MetaWaylandBuffer *buffer)
stream = meta_wayland_egl_stream_new (buffer, NULL); stream = meta_wayland_egl_stream_new (buffer, NULL);
if (stream) if (stream)
{ {
CoglTexture2D *texture;
buffer->egl_stream.stream = stream; buffer->egl_stream.stream = stream;
buffer->type = META_WAYLAND_BUFFER_TYPE_EGL_STREAM; buffer->type = META_WAYLAND_BUFFER_TYPE_EGL_STREAM;
texture = meta_wayland_egl_stream_create_texture (stream, NULL);
if (!texture)
return FALSE;
buffer->texture = COGL_TEXTURE (texture);
buffer->is_y_inverted = meta_wayland_egl_stream_is_y_inverted (stream);
return TRUE; return TRUE;
} }
@ -320,18 +330,6 @@ egl_stream_buffer_attach (MetaWaylandBuffer *buffer,
g_assert (stream); g_assert (stream);
if (!buffer->texture)
{
CoglTexture2D *texture;
texture = meta_wayland_egl_stream_create_texture (stream, error);
if (!texture)
return FALSE;
buffer->texture = COGL_TEXTURE (texture);
buffer->is_y_inverted = meta_wayland_egl_stream_is_y_inverted (stream);
}
if (!meta_wayland_egl_stream_attach (stream, error)) if (!meta_wayland_egl_stream_attach (stream, error))
return FALSE; return FALSE;