Home | History | Annotate | Download | only in state_tracker
      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 (at) 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  */
     46 static GLenum
     47 st_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 
     73 static void
     74 st_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 
     99 static void
    100 st_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 
    143 static void
    144 st_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 
    161 void
    162 st_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