st_cb_eglimage.c revision a1aa53b2a934ca026bb115aca18a46fd920f9e8d
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 * 17a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * 24a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * Authors: 25a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * Chia-I Wu <olv@lunarg.com> 26a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu */ 27a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 28a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "main/texobj.h" 29a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "main/texfetch.h" 30a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "main/teximage.h" 31a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "util/u_inlines.h" 32a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "util/u_format.h" 33a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "st_cb_eglimage.h" 34a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "st_cb_fbo.h" 35a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "st_texture.h" 36a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "st_format.h" 37a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#include "st_manager.h" 38a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 39a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#if FEATURE_OES_EGL_image 40a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 41a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu/** 42a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * Return the base format just like _mesa_base_fbo_format does. 43a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu */ 44a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wustatic GLenum 45a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wust_pipe_format_to_base_format(enum pipe_format format) 46a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu{ 47a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu GLenum base_format; 48a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 49a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (util_format_is_depth_or_stencil(format)) { 50a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (util_format_is_depth_and_stencil(format)) { 51a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu base_format = GL_DEPTH_STENCIL; 52a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 53a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu else { 54a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (format == PIPE_FORMAT_S8_USCALED) 55a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu base_format = GL_STENCIL_INDEX; 56a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu else 57a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu base_format = GL_DEPTH_COMPONENT; 58a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 59a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 60a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu else { 61a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu /* is this enough? */ 62a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (util_format_has_alpha(format)) 63a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu base_format = GL_RGBA; 64a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu else 65a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu base_format = GL_RGB; 66a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 67a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 68a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu return base_format; 69a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu} 70a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 71a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wustatic void 72a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wust_egl_image_target_renderbuffer_storage(GLcontext *ctx, 73a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct gl_renderbuffer *rb, 74a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu GLeglImageOES image_handle) 75a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu{ 76a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct st_context *st = ctx->st; 77a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct st_renderbuffer *strb = st_renderbuffer(rb); 78a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct pipe_surface *ps; 79a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu unsigned usage; 80a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 81a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu usage = PIPE_BUFFER_USAGE_GPU_READ | PIPE_BUFFER_USAGE_GPU_WRITE; 82a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu ps = st_manager_get_egl_image_surface(st, (void *) image_handle, usage); 83a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (ps) { 84a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu strb->Base.Width = ps->width; 85a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu strb->Base.Height = ps->height; 86a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu strb->Base.Format = st_pipe_format_to_mesa_format(ps->format); 87a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu strb->Base.DataType = st_format_datatype(ps->format); 88a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu strb->Base._BaseFormat = st_pipe_format_to_base_format(ps->format); 89a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu strb->Base.InternalFormat = strb->Base._BaseFormat; 90a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 91a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu pipe_surface_reference(&strb->surface, ps); 92a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu pipe_texture_reference(&strb->texture, ps->texture); 93a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 94a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu pipe_surface_reference(&ps, NULL); 95a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 96a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu} 97a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 98a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wustatic void 99a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wust_bind_surface(GLcontext *ctx, GLenum target, 100a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct gl_texture_object *texObj, 101a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct gl_texture_image *texImage, 102a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct pipe_surface *ps) 103a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu{ 104a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct st_texture_object *stObj; 105a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct st_texture_image *stImage; 106a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu GLenum internalFormat; 107a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 108a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu /* map pipe format to base format */ 109a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (util_format_get_component_bits(ps->format, UTIL_FORMAT_COLORSPACE_RGB, 3) > 0) 110a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu internalFormat = GL_RGBA; 111a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu else 112a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu internalFormat = GL_RGB; 113a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 114a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu stObj = st_texture_object(texObj); 115a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu stImage = st_texture_image(texImage); 116a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 117a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu /* switch to surface based */ 118a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (!stObj->surface_based) { 119a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu _mesa_clear_texture_object(ctx, texObj); 120a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu stObj->surface_based = GL_TRUE; 121a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 122a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 123a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu _mesa_init_teximage_fields(ctx, target, texImage, 124a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu ps->width, ps->height, 1, 0, internalFormat); 125a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu texImage->TexFormat = st_pipe_format_to_mesa_format(ps->format); 126a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu _mesa_set_fetch_functions(texImage, 2); 127a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 128a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu stObj->pipe = ctx->st->pipe; 129a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu /* FIXME create a non-default sampler view from the pipe_surface? */ 130a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu pipe_texture_reference(&stImage->pt, ps->texture); 131a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 132a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu _mesa_dirty_texobj(ctx, texObj, GL_TRUE); 133a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu} 134a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 135a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wustatic void 136a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wust_egl_image_target_texture_2d(GLcontext *ctx, GLenum target, 137a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct gl_texture_object *texObj, 138a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct gl_texture_image *texImage, 139a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu GLeglImageOES image_handle) 140a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu{ 141a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct st_context *st = ctx->st; 142a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu struct pipe_surface *ps; 143a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu unsigned usage; 144a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 145a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu usage = PIPE_BUFFER_USAGE_GPU_READ | PIPE_BUFFER_USAGE_GPU_WRITE; 146a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu ps = st_manager_get_egl_image_surface(st, (void *) image_handle, usage); 147a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu if (ps) { 148a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu st_bind_surface(ctx, target, texObj, texImage, ps); 149a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu pipe_surface_reference(&ps, NULL); 150a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu } 151a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu} 152a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 153a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wuvoid 154a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wust_init_eglimage_functions(struct dd_function_table *functions) 155a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu{ 156a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu functions->EGLImageTargetTexture2D = st_egl_image_target_texture_2d; 157a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu functions->EGLImageTargetRenderbufferStorage = st_egl_image_target_renderbuffer_storage; 158a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu} 159a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu 160a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu#endif /* FEATURE_OES_EGL_image */ 161