[Mesa-dev] [PATCH weston 2/2] compositor: add support for OES_EGL_image_external
Pekka Paalanen
ppaalanen at gmail.com
Tue Aug 14 00:07:04 PDT 2012
On Mon, 13 Aug 2012 18:59:33 -0500
Rob Clark <rob at ti.com> wrote:
> On Mon, Aug 13, 2012 at 5:39 PM, Rob Clark <rob.clark at linaro.org> wrote:
> > From: Rob Clark <rob at ti.com>
> >
> > In cases where the GPU can natively handle certain YUV formats,
> > eglQueryWaylandBufferWL() can return the value EGL_TEXTURE_EXTERNAL_OES
> > and the compositor will treat the buffer as a single egl-image-external.
> >
> > See:
> > http://www.khronos.org/registry/gles/extensions/OES/OES_EGL_image_external.txt
> >
> > Signed-off-by: Rob Clark <rob at ti.com>
> > ---
> > src/compositor.c | 42 ++++++++++++++++++++++++++++++++----------
> > src/compositor.h | 2 ++
> > src/weston-egl-ext.h | 1 +
> > 3 files changed, 35 insertions(+), 10 deletions(-)
> >
> > diff --git a/src/compositor.c b/src/compositor.c
> > index b2a3ae9..08e575a 100644
> > --- a/src/compositor.c
> > +++ b/src/compositor.c
> > @@ -719,14 +719,14 @@ ensure_textures(struct weston_surface *es, int num_textures)
> >
> > for (i = es->num_textures; i < num_textures; i++) {
> > glGenTextures(1, &es->textures[i]);
> > - glBindTexture(GL_TEXTURE_2D, es->textures[i]);
> > - glTexParameteri(GL_TEXTURE_2D,
> > + glBindTexture(es->target, es->textures[i]);
> > + glTexParameteri(es->target,
> > GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
> > - glTexParameteri(GL_TEXTURE_2D,
> > + glTexParameteri(es->target,
> > GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
> > }
> > es->num_textures = num_textures;
> > - glBindTexture(GL_TEXTURE_2D, 0);
> > + glBindTexture(es->target, 0);
> > }
> >
> > static void
> > @@ -771,6 +771,7 @@ weston_surface_attach(struct wl_surface *surface, struct wl_buffer *buffer)
> > if (wl_buffer_is_shm(buffer)) {
> > es->pitch = wl_shm_buffer_get_stride(buffer) / 4;
> > es->shader = &ec->texture_shader_rgba;
> > + es->target = GL_TEXTURE_2D;
> >
> > ensure_textures(es, 1);
> > glBindTexture(GL_TEXTURE_2D, es->textures[0]);
> > @@ -786,7 +787,7 @@ weston_surface_attach(struct wl_surface *surface, struct wl_buffer *buffer)
> > for (i = 0; i < es->num_images; i++)
> > ec->destroy_image(ec->egl_display, es->images[i]);
> > es->num_images = 0;
> > -
> > + es->target = GL_TEXTURE_2D;
> > switch (format) {
> > case EGL_TEXTURE_RGB:
> > case EGL_TEXTURE_RGBA:
> > @@ -794,6 +795,11 @@ weston_surface_attach(struct wl_surface *surface, struct wl_buffer *buffer)
> > num_planes = 1;
> > es->shader = &ec->texture_shader_rgba;
> > break;
> > + case EGL_TEXTURE_EXTERNAL_OES:
>
> Kristian pointed out to me on IRC that this should be called something
> like EGL_TEXTURE_EXTERNAL_WL (or EGL_TEXTURE_EXTERNAL_OES_WL?), so
> I'll resubmit these patches..
>
>
> > + num_planes = 1;
> > + es->target = GL_TEXTURE_EXTERNAL_OES;
> > + es->shader = &ec->texture_shader_egl_external;
> > + break;
> > case EGL_TEXTURE_Y_UV_WL:
> > num_planes = 2;
> > es->shader = &ec->texture_shader_y_uv;
> > @@ -824,8 +830,8 @@ weston_surface_attach(struct wl_surface *surface, struct wl_buffer *buffer)
> > es->num_images++;
> >
> > glActiveTexture(GL_TEXTURE0 + i);
> > - glBindTexture(GL_TEXTURE_2D, es->textures[i]);
> > - ec->image_target_texture_2d(GL_TEXTURE_2D,
> > + glBindTexture(es->target, es->textures[i]);
> > + ec->image_target_texture_2d(es->target,
> > es->images[i]);
> > }
> >
> > @@ -942,9 +948,9 @@ weston_surface_draw(struct weston_surface *es, struct weston_output *output,
> > for (i = 0; i < es->num_textures; i++) {
> > glUniform1i(es->shader->tex_uniforms[i], i);
> > glActiveTexture(GL_TEXTURE0 + i);
> > - glBindTexture(GL_TEXTURE_2D, es->textures[i]);
> > - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
> > - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
> > + glBindTexture(es->target, es->textures[i]);
> > + glTexParameteri(es->target, GL_TEXTURE_MIN_FILTER, filter);
> > + glTexParameteri(es->target, GL_TEXTURE_MAG_FILTER, filter);
> > }
> >
> > v = ec->vertices.data;
> > @@ -2842,6 +2848,19 @@ static const char texture_fragment_shader_rgba[] =
> > FRAGMENT_SHADER_EXIT
> > "}\n";
> >
> > +static const char texture_fragment_shader_egl_external[] =
> > + "#extension GL_OES_EGL_image_external : require\n"
> > + "precision mediump float;\n"
> > + "varying vec2 v_texcoord;\n"
> > + "uniform samplerExternalOES tex;\n"
> > + FRAGMENT_SHADER_UNIFORMS
> > + "void main()\n"
> > + "{\n"
> > + FRAGMENT_SHADER_INIT
> > + " gl_FragColor = texture2D(tex, v_texcoord)\n;"
> > + FRAGMENT_SHADER_EXIT
> > + "}\n";
> > +
> > static const char texture_fragment_shader_y_uv[] =
> > "precision mediump float;\n"
> > "uniform sampler2D tex;\n"
> > @@ -3251,6 +3270,9 @@ weston_compositor_init_gl(struct weston_compositor *ec)
> > if (weston_shader_init(&ec->texture_shader_rgba,
> > vertex_shader, texture_fragment_shader_rgba) < 0)
> > return -1;
> > + if (weston_shader_init(&ec->texture_shader_egl_external,
> > + vertex_shader, texture_fragment_shader_egl_external) < 0)
>
> I wonder if some GL implementations would refuse to compile a shader
> with '#extension GL_OES_EGL_image_external : require'.. so maybe this
> shouldn't be treated as a failure case?
Why wouldn't they fail? They probably do not know what a
samplerExternalOES is.
Personally I would prefer to properly query the existence of
the GL extension for image_external, and run this code only if
it is supported. The existing checks are in weston_compositor_init_gl().
Thanks,
pq
More information about the wayland-devel
mailing list