From patchwork Thu Aug 16 22:28:20 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rob Clark X-Patchwork-Id: 10779 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id ECE6723E41 for ; Thu, 16 Aug 2012 22:28:30 +0000 (UTC) Received: from mail-iy0-f180.google.com (mail-iy0-f180.google.com [209.85.210.180]) by fiordland.canonical.com (Postfix) with ESMTP id 90DD8A1800F for ; Thu, 16 Aug 2012 22:28:30 +0000 (UTC) Received: by mail-iy0-f180.google.com with SMTP id j38so574523iad.11 for ; Thu, 16 Aug 2012 15:28:30 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-forwarded-to:x-forwarded-for:delivered-to:received-spf :dkim-signature:sender:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references:x-gm-message-state; bh=dVs6vh0EDLQz5sCn7vjoBzRVy/e7zLoBtkfgiSxiMCM=; b=c56LqOWLD1mklQ6xKejwWorl3qPFpoor2hbIgR3Q0DKfop8tKgEYUdPa5Tzn0V4BbA FAiPYIS9vefDMsMrH5h8z6GWKuhQqSbBJWTqw/ir1N8JgYhI75kdUzmI8ohYTogBhXlI NTR+Wik78KlI/CVgOw/htyKd3k64wJ2ayYvoh95Hs2TsxJ2cQ5VqPFO/2lFYD6R1jPMj G99LBV+Mzdk+muc81xN/S6a16LxLLfD04GC3TR7wZmNAE0l2WxwteSLnUJZ34Lz6oFQ6 wvsfS9dEJvKb0YSkiOjbdCG44WAZ3XkysaeFEpINxJZN5plEa9HN7c5Q5k7aAKYV/yRf GO4g== Received: by 10.42.75.73 with SMTP id z9mr2662157icj.46.1345156110306; Thu, 16 Aug 2012 15:28:30 -0700 (PDT) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.50.184.200 with SMTP id ew8csp154816igc; Thu, 16 Aug 2012 15:28:29 -0700 (PDT) Received: by 10.60.27.6 with SMTP id p6mr2283974oeg.37.1345156109585; Thu, 16 Aug 2012 15:28:29 -0700 (PDT) Received: from mail-ob0-f178.google.com (mail-ob0-f178.google.com [209.85.214.178]) by mx.google.com with ESMTPS id im8si5565195obb.58.2012.08.16.15.28.29 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 16 Aug 2012 15:28:29 -0700 (PDT) Received-SPF: pass (google.com: domain of robdclark@gmail.com designates 209.85.214.178 as permitted sender) client-ip=209.85.214.178; Authentication-Results: mx.google.com; spf=pass (google.com: domain of robdclark@gmail.com designates 209.85.214.178 as permitted sender) smtp.mail=robdclark@gmail.com; dkim=pass header.i=@gmail.com Received: by mail-ob0-f178.google.com with SMTP id wd20so5448928obb.37 for ; Thu, 16 Aug 2012 15:28:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=dVs6vh0EDLQz5sCn7vjoBzRVy/e7zLoBtkfgiSxiMCM=; b=RJ4xd/NrfHXWkIACZezHsgoYyi+r1pRt7/2jk0/12sVRwRakCvojWa6I+tPutn/L8Q F4GnMqZq/ZEiGPHWd0yWpHjNAz1t7uzk8EHR4EIb9n7xsAnUUMLI5QscloxNKIRR6RwV sdBlQd30OGY6agGdSmlPXq6iULpmDWOBv+a87qNe2smTJggXQSBoarVu9Mw1eOTOdlM0 L6NHTG+KxbQ9THSohb9gfW3uxAczDTIUOaqiNonHHgvZ6kyI28uyaaYvCB5IPNhPeE8a xpjAqTkHLbcIqf8zIKLmfbiQb0yJBcY5x34CLVWgeZ9s8cX1TvuJrbfiCmY92npliP80 K+KQ== Received: by 10.182.134.71 with SMTP id pi7mr2215152obb.98.1345156109215; Thu, 16 Aug 2012 15:28:29 -0700 (PDT) Received: from localhost (dragon.ti.com. [192.94.94.33]) by mx.google.com with ESMTPS id aa6sm3810073oec.0.2012.08.16.15.28.27 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 16 Aug 2012 15:28:27 -0700 (PDT) Sender: Rob Clark From: Rob Clark To: wayland-devel@lists.freedesktop.org, mesa-dev@lists.freedesktop.org Cc: patches@linaro.org, Rob Clark Subject: [PATCH weston] compositor: add support for OES_EGL_image_external Date: Thu, 16 Aug 2012 17:28:20 -0500 Message-Id: <1345156101-28827-2-git-send-email-rob.clark@linaro.org> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1345156101-28827-1-git-send-email-rob.clark@linaro.org> References: <1345156101-28827-1-git-send-email-rob.clark@linaro.org> X-Gm-Message-State: ALoCoQnGYrbjFeEgx75ccgyUyqCru0iUmurvR225W9b7LHf/WS4BWrRH1ui9X/reulSUkMOw34uz From: Rob Clark 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 --- 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;