1a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu/* 2a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * Mesa 3-D graphics library 3a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * Version: 7.9 4a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * 5a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * Copyright (C) 2010 LunarG Inc. 6a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * 7a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a 8a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * copy of this software and associated documentation files (the "Software"), 9a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * to deal in the Software without restriction, including without limitation 10a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * and/or sell copies of the Software, and to permit persons to whom the 12a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * Software is furnished to do so, subject to the following conditions: 13a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * 14a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * The above copyright notice and this permission notice shall be included 15a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * in all copies or substantial portions of the Software. 16a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * 17ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * DEALINGS IN THE SOFTWARE. 24a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * 25a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * Authors: 26a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * Chia-I Wu <olv@lunarg.com> 27a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu */ 28a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 29edc09358f72cd48cb2315daf23c82e7646aeaea3Vinson Lee#include "main/mfeatures.h" 30a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "main/texobj.h" 31a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "main/teximage.h" 32a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "util/u_inlines.h" 33a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "util/u_format.h" 34a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "st_cb_eglimage.h" 35a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "st_cb_fbo.h" 360a7cbe845fe029411ae25c4bfe60763485a760f4Vinson Lee#include "st_context.h" 37a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "st_texture.h" 38a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "st_format.h" 39a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "st_manager.h" 40a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 41a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#if FEATURE_OES_EGL_image 42a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 43a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu/** 44a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * Return the base format just like _mesa_base_fbo_format does. 45a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu */ 46a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wustatic GLenum 47a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wust_pipe_format_to_base_format(enum pipe_format format) 48a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu{ 49a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu GLenum base_format; 50a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 51a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (util_format_is_depth_or_stencil(format)) { 52a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (util_format_is_depth_and_stencil(format)) { 53a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu base_format = GL_DEPTH_STENCIL; 54a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 55a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu else { 56866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie if (format == PIPE_FORMAT_S8_UINT) 57a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu base_format = GL_STENCIL_INDEX; 58a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu else 59a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu base_format = GL_DEPTH_COMPONENT; 60a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 61a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 62a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu else { 63a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu /* is this enough? */ 64a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (util_format_has_alpha(format)) 65a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu base_format = GL_RGBA; 66a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu else 67a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu base_format = GL_RGB; 68a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 69a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 70a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu return base_format; 71a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu} 72a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 73a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wustatic void 74f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_egl_image_target_renderbuffer_storage(struct gl_context *ctx, 75a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct gl_renderbuffer *rb, 76a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu GLeglImageOES image_handle) 77a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu{ 7876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 79a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct st_renderbuffer *strb = st_renderbuffer(rb); 80a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct pipe_surface *ps; 81a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu unsigned usage; 82a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 83127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger usage = PIPE_BIND_RENDER_TARGET; 84a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu ps = st_manager_get_egl_image_surface(st, (void *) image_handle, usage); 85a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (ps) { 86a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu strb->Base.Width = ps->width; 87a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu strb->Base.Height = ps->height; 88a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu strb->Base.Format = st_pipe_format_to_mesa_format(ps->format); 89a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu strb->Base._BaseFormat = st_pipe_format_to_base_format(ps->format); 90a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu strb->Base.InternalFormat = strb->Base._BaseFormat; 91a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 92a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu pipe_surface_reference(&strb->surface, ps); 93287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&strb->texture, ps->texture); 94a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 95a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu pipe_surface_reference(&ps, NULL); 96a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 97a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu} 98a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 99a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wustatic void 100f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_bind_surface(struct gl_context *ctx, GLenum target, 101a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct gl_texture_object *texObj, 102a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct gl_texture_image *texImage, 103a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct pipe_surface *ps) 104a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu{ 105a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct st_texture_object *stObj; 106a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct st_texture_image *stImage; 107a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu GLenum internalFormat; 10883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul gl_format texFormat; 109a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 110a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu /* map pipe format to base format */ 111a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (util_format_get_component_bits(ps->format, UTIL_FORMAT_COLORSPACE_RGB, 3) > 0) 112a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu internalFormat = GL_RGBA; 113a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu else 114a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu internalFormat = GL_RGB; 115a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 116a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu stObj = st_texture_object(texObj); 117a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu stImage = st_texture_image(texImage); 118a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 119a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu /* switch to surface based */ 120a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (!stObj->surface_based) { 121a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu _mesa_clear_texture_object(ctx, texObj); 122a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu stObj->surface_based = GL_TRUE; 123a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 124a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 12583e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul texFormat = st_pipe_format_to_mesa_format(ps->format); 12683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul 127892a2542a3f0753a7064c710b96f077dd5490624Brian Paul _mesa_init_teximage_fields(ctx, texImage, 12883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul ps->width, ps->height, 1, 0, internalFormat, 12983e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul texFormat); 130a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 131a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu /* FIXME create a non-default sampler view from the pipe_surface? */ 1320f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu pipe_resource_reference(&stObj->pt, ps->texture); 133cfc81d93f7b07a89437cbbce173fc468070e06daChia-I Wu pipe_sampler_view_reference(&stObj->sampler_view, NULL); 1340f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu pipe_resource_reference(&stImage->pt, stObj->pt); 135a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 136719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu stObj->width0 = ps->width; 137719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu stObj->height0 = ps->height; 138719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu stObj->depth0 = 1; 139719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu 140a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu _mesa_dirty_texobj(ctx, texObj, GL_TRUE); 141a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu} 142a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 143a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wustatic void 144f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_egl_image_target_texture_2d(struct gl_context *ctx, GLenum target, 145a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct gl_texture_object *texObj, 146a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct gl_texture_image *texImage, 147a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu GLeglImageOES image_handle) 148a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu{ 14976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 150a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct pipe_surface *ps; 151a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu unsigned usage; 152a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 153127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger usage = PIPE_BIND_SAMPLER_VIEW; 154a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu ps = st_manager_get_egl_image_surface(st, (void *) image_handle, usage); 155a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (ps) { 156a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu st_bind_surface(ctx, target, texObj, texImage, ps); 157a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu pipe_surface_reference(&ps, NULL); 158a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 159a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu} 160a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 161a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wuvoid 162a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wust_init_eglimage_functions(struct dd_function_table *functions) 163a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu{ 164a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu functions->EGLImageTargetTexture2D = st_egl_image_target_texture_2d; 165a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu functions->EGLImageTargetRenderbufferStorage = st_egl_image_target_renderbuffer_storage; 166a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu} 167a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 168a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#endif /* FEATURE_OES_EGL_image */ 169