st_cb_eglimage.c revision 287c94ea4987033f9c99a2f91c5750c9083504ca
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 29a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "main/texobj.h" 30a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "main/texfetch.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" 36a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "st_texture.h" 37a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "st_format.h" 38a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "st_manager.h" 39a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 40a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#if FEATURE_OES_EGL_image 41a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 42a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu/** 43a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * Return the base format just like _mesa_base_fbo_format does. 44a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu */ 45a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wustatic GLenum 46a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wust_pipe_format_to_base_format(enum pipe_format format) 47a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu{ 48a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu GLenum base_format; 49a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 50a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (util_format_is_depth_or_stencil(format)) { 51a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (util_format_is_depth_and_stencil(format)) { 52a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu base_format = GL_DEPTH_STENCIL; 53a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 54a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu else { 55a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (format == PIPE_FORMAT_S8_USCALED) 56a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu base_format = GL_STENCIL_INDEX; 57a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu else 58a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu base_format = GL_DEPTH_COMPONENT; 59a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 60a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 61a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu else { 62a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu /* is this enough? */ 63a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (util_format_has_alpha(format)) 64a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu base_format = GL_RGBA; 65a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu else 66a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu base_format = GL_RGB; 67a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 68a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 69a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu return base_format; 70a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu} 71a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 72a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wustatic void 73a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wust_egl_image_target_renderbuffer_storage(GLcontext *ctx, 74a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct gl_renderbuffer *rb, 75a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu GLeglImageOES image_handle) 76a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu{ 77a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct st_context *st = ctx->st; 78a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct st_renderbuffer *strb = st_renderbuffer(rb); 79a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct pipe_surface *ps; 80a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu unsigned usage; 81a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 82287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell usage = PIPE_BIND_RENDER_TARGET | PIPE_BIND_BLIT_SOURCE | PIPE_BIND_BLIT_DESTINATION; 83a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu ps = st_manager_get_egl_image_surface(st, (void *) image_handle, usage); 84a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (ps) { 85a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu strb->Base.Width = ps->width; 86a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu strb->Base.Height = ps->height; 87a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu strb->Base.Format = st_pipe_format_to_mesa_format(ps->format); 88a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu strb->Base.DataType = st_format_datatype(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 100a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wust_bind_surface(GLcontext *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; 108a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 109a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu /* map pipe format to base format */ 110a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (util_format_get_component_bits(ps->format, UTIL_FORMAT_COLORSPACE_RGB, 3) > 0) 111a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu internalFormat = GL_RGBA; 112a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu else 113a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu internalFormat = GL_RGB; 114a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 115a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu stObj = st_texture_object(texObj); 116a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu stImage = st_texture_image(texImage); 117a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 118a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu /* switch to surface based */ 119a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (!stObj->surface_based) { 120a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu _mesa_clear_texture_object(ctx, texObj); 121a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu stObj->surface_based = GL_TRUE; 122a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 123a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 124a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu _mesa_init_teximage_fields(ctx, target, texImage, 125a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu ps->width, ps->height, 1, 0, internalFormat); 126a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu texImage->TexFormat = st_pipe_format_to_mesa_format(ps->format); 127a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu _mesa_set_fetch_functions(texImage, 2); 128a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 129a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu stObj->pipe = ctx->st->pipe; 130a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu /* FIXME create a non-default sampler view from the pipe_surface? */ 131287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, ps->texture); 132a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 133a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu _mesa_dirty_texobj(ctx, texObj, GL_TRUE); 134a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu} 135a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 136a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wustatic void 137a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wust_egl_image_target_texture_2d(GLcontext *ctx, GLenum target, 138a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct gl_texture_object *texObj, 139a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct gl_texture_image *texImage, 140a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu GLeglImageOES image_handle) 141a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu{ 142a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct st_context *st = ctx->st; 143a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct pipe_surface *ps; 144a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu unsigned usage; 145a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 146287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell usage = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_BLIT_DESTINATION | PIPE_BIND_BLIT_SOURCE; 147a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu ps = st_manager_get_egl_image_surface(st, (void *) image_handle, usage); 148a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (ps) { 149a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu st_bind_surface(ctx, target, texObj, texImage, ps); 150a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu pipe_surface_reference(&ps, NULL); 151a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 152a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu} 153a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 154a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wuvoid 155a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wust_init_eglimage_functions(struct dd_function_table *functions) 156a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu{ 157a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu functions->EGLImageTargetTexture2D = st_egl_image_target_texture_2d; 158a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu functions->EGLImageTargetRenderbufferStorage = st_egl_image_target_renderbuffer_storage; 159a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu} 160a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 161a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#endif /* FEATURE_OES_EGL_image */ 162