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