On Thu, 16 Aug 2012 17:28:20 -0500 Rob Clark <rob.cl...@linaro.org> wrote:
> From: Rob Clark <r...@ti.com> > > In cases where the GPU can natively handle certain YUV formats, > eglQueryWaylandBufferWL() can return the value EGL_TEXTURE_EXTERNAL_WL > 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 > > v1: original > v2: rename EGL_TEXTURE_EXTERNAL_OES -> EGL_TEXTURE_EXTERNAL_WL and query > for the extension > > Signed-off-by: Rob Clark <r...@ti.com> Looks good to me now. The only thing I could still say is that maybe it would be nice to log a warning, if the extension is not detected, but querySurface still returns EGL_TEXTURE_EXTERNAL_WL. Hmm, that reminds me, I don't think we have any EGL or GL error reporting in Weston... but that's a whole different story. Thanks, pq > --- > src/compositor.c | 47 +++++++++++++++++++++++++++++++++++++---------- > src/compositor.h | 2 ++ > src/weston-egl-ext.h | 1 + > 3 files changed, 40 insertions(+), 10 deletions(-) > > diff --git a/src/compositor.c b/src/compositor.c > index b2a3ae9..5c6782e 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_WL: > + 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" > @@ -3193,6 +3212,7 @@ WL_EXPORT int > weston_compositor_init_gl(struct weston_compositor *ec) > { > const char *extensions; > + int has_egl_image_external = 0; > > log_egl_gl_info(ec->egl_display); > > @@ -3228,6 +3248,9 @@ weston_compositor_init_gl(struct weston_compositor *ec) > if (strstr(extensions, "GL_EXT_unpack_subimage")) > ec->has_unpack_subimage = 1; > > + if (strstr(extensions, "GL_OES_EGL_image_external")) > + has_egl_image_external = 1; > + > extensions = > (const char *) eglQueryString(ec->egl_display, EGL_EXTENSIONS); > if (!extensions) { > @@ -3251,6 +3274,10 @@ 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 (has_egl_image_external && > + weston_shader_init(&ec->texture_shader_egl_external, > + vertex_shader, > texture_fragment_shader_egl_external) < 0) > + return -1; > if (weston_shader_init(&ec->texture_shader_y_uv, > vertex_shader, texture_fragment_shader_y_uv) < 0) > return -1; > diff --git a/src/compositor.h b/src/compositor.h > index 22c0174..be1c2d2 100644 > --- a/src/compositor.h > +++ b/src/compositor.h > @@ -271,6 +271,7 @@ struct weston_compositor { > EGLConfig egl_config; > GLuint fbo; > struct weston_shader texture_shader_rgba; > + struct weston_shader texture_shader_egl_external; > struct weston_shader texture_shader_y_uv; > struct weston_shader texture_shader_y_u_v; > struct weston_shader texture_shader_y_xuxv; > @@ -452,6 +453,7 @@ struct weston_surface { > struct wl_list frame_callback_list; > > EGLImageKHR images[3]; > + GLenum target; > int num_images; > > struct wl_buffer *buffer; > diff --git a/src/weston-egl-ext.h b/src/weston-egl-ext.h > index 8e132c0..5369f02 100644 > --- a/src/weston-egl-ext.h > +++ b/src/weston-egl-ext.h > @@ -39,6 +39,7 @@ > #define EGL_TEXTURE_Y_U_V_WL 0x31D7 > #define EGL_TEXTURE_Y_UV_WL 0x31D8 > #define EGL_TEXTURE_Y_XUXV_WL 0x31D9 > +#define EGL_TEXTURE_EXTERNAL_WL 0x31DA > > struct wl_display; > struct wl_buffer; _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev