Home | History | Annotate | Download | only in state_tracker
      1 /**************************************************************************
      2  *
      3  * Copyright 2007 VMware, Inc.
      4  * All Rights Reserved.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the
      8  * "Software"), to deal in the Software without restriction, including
      9  * without limitation the rights to use, copy, modify, merge, publish,
     10  * distribute, sub license, and/or sell copies of the Software, and to
     11  * permit persons to whom the Software is furnished to do so, subject to
     12  * the following conditions:
     13  *
     14  * The above copyright notice and this permission notice (including the
     15  * next paragraph) shall be included in all copies or substantial portions
     16  * of the Software.
     17  *
     18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     21  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
     22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     25  *
     26  **************************************************************************/
     27 
     28 #ifndef ST_TEXTURE_H
     29 #define ST_TEXTURE_H
     30 
     31 
     32 #include "pipe/p_context.h"
     33 #include "util/u_sampler.h"
     34 #include "util/simple_mtx.h"
     35 
     36 #include "main/mtypes.h"
     37 
     38 
     39 struct pipe_resource;
     40 
     41 
     42 struct st_texture_image_transfer {
     43    struct pipe_transfer *transfer;
     44 
     45    /* For ETC fallback. */
     46    GLubyte *temp_data; /**< Temporary ETC texture storage. */
     47    unsigned temp_stride; /**< Stride of the ETC texture storage. */
     48    GLubyte *map; /**< Saved map pointer of the uncompressed transfer. */
     49 };
     50 
     51 
     52 /**
     53  * Container for one context's validated sampler view.
     54  */
     55 struct st_sampler_view {
     56    struct pipe_sampler_view *view;
     57 
     58    /** The glsl version of the shader seen during validation */
     59    bool glsl130_or_later;
     60    /** Derived from the sampler's sRGBDecode state during validation */
     61    bool srgb_skip_decode;
     62 };
     63 
     64 
     65 /**
     66  * Container for per-context sampler views of a texture.
     67  */
     68 struct st_sampler_views {
     69    struct st_sampler_views *next;
     70    uint32_t max;
     71    uint32_t count;
     72    struct st_sampler_view views[0];
     73 };
     74 
     75 /**
     76  * Subclass of gl_texure_image.
     77  */
     78 struct st_texture_image
     79 {
     80    struct gl_texture_image base;
     81 
     82    /* If stImage->pt != NULL, image data is stored here.
     83     * Else there is no image data.
     84     */
     85    struct pipe_resource *pt;
     86 
     87    /* List of transfers, allocated on demand.
     88     * transfer[layer] is a mapping for that layer.
     89     */
     90    struct st_texture_image_transfer *transfer;
     91    unsigned num_transfers;
     92 
     93    /* For ETC images, keep track of the original data. This is necessary for
     94     * mapping/unmapping, as well as image copies.
     95     */
     96    GLubyte *etc_data;
     97 };
     98 
     99 
    100 /**
    101  * Subclass of gl_texure_object.
    102  */
    103 struct st_texture_object
    104 {
    105    struct gl_texture_object base;       /* The "parent" object */
    106 
    107    /* The texture must include at levels [0..lastLevel] once validated:
    108     */
    109    GLuint lastLevel;
    110 
    111    unsigned int validated_first_level;
    112    unsigned int validated_last_level;
    113 
    114    /* On validation any active images held in main memory or in other
    115     * textures will be copied to this texture and the old storage freed.
    116     */
    117    struct pipe_resource *pt;
    118 
    119    /* Protect modifications of the sampler_views array */
    120    simple_mtx_t validate_mutex;
    121 
    122    /* Container of sampler views (one per context) attached to this texture
    123     * object. Created lazily on first binding in context.
    124     *
    125     * Purely read-only accesses to the current context's own sampler view
    126     * require no locking. Another thread may simultaneously replace the
    127     * container object in order to grow the array, but the old container will
    128     * be kept alive.
    129     *
    130     * Writing to the container (even for modifying the current context's own
    131     * sampler view) always requires taking the validate_mutex to protect against
    132     * concurrent container switches.
    133     *
    134     * NULL'ing another context's sampler view is allowed only while
    135     * implementing an API call that modifies the texture: an application which
    136     * calls those while simultaneously reading the texture in another context
    137     * invokes undefined behavior. (TODO: a dubious violation of this rule is
    138     * st_finalize_texture, which is a lazy operation that corresponds to a
    139     * texture modification.)
    140     */
    141    struct st_sampler_views *sampler_views;
    142 
    143    /* Old sampler views container objects that have not been freed yet because
    144     * other threads/contexts may still be reading from them.
    145     */
    146    struct st_sampler_views *sampler_views_old;
    147 
    148    /* True if this texture comes from the window system. Such a texture
    149     * cannot be reallocated and the format can only be changed with a sampler
    150     * view or a surface.
    151     */
    152    GLboolean surface_based;
    153 
    154    /* If surface_based is true, this format should be used for all sampler
    155     * views and surfaces instead of pt->format.
    156     */
    157    enum pipe_format surface_format;
    158 
    159    /* When non-zero, samplers should use this level instead of the level
    160     * range specified by the GL state.
    161     *
    162     * This is used for EGL images, which may correspond to a single level out
    163     * of an imported pipe_resources with multiple mip levels.
    164     */
    165    uint level_override;
    166 
    167    /* When non-zero, samplers should use this layer instead of the one
    168     * specified by the GL state.
    169     *
    170     * This is used for EGL images and VDPAU interop, where imported
    171     * pipe_resources may be cube, 3D, or array textures (containing layers
    172     * with different fields in the case of VDPAU) even though the GL state
    173     * describes one non-array texture per field.
    174     */
    175    uint layer_override;
    176 
    177     /**
    178      * Set when the texture images of this texture object might not all be in
    179      * the pipe_resource *pt above.
    180      */
    181     bool needs_validation;
    182 };
    183 
    184 
    185 static inline struct st_texture_image *
    186 st_texture_image(struct gl_texture_image *img)
    187 {
    188    return (struct st_texture_image *) img;
    189 }
    190 
    191 static inline const struct st_texture_image *
    192 st_texture_image_const(const struct gl_texture_image *img)
    193 {
    194    return (const struct st_texture_image *) img;
    195 }
    196 
    197 static inline struct st_texture_object *
    198 st_texture_object(struct gl_texture_object *obj)
    199 {
    200    return (struct st_texture_object *) obj;
    201 }
    202 
    203 static inline const struct st_texture_object *
    204 st_texture_object_const(const struct gl_texture_object *obj)
    205 {
    206    return (const struct st_texture_object *) obj;
    207 }
    208 
    209 
    210 static inline struct pipe_resource *
    211 st_get_texobj_resource(struct gl_texture_object *texObj)
    212 {
    213    struct st_texture_object *stObj = st_texture_object(texObj);
    214    return stObj ? stObj->pt : NULL;
    215 }
    216 
    217 
    218 static inline struct pipe_resource *
    219 st_get_stobj_resource(struct st_texture_object *stObj)
    220 {
    221    return stObj ? stObj->pt : NULL;
    222 }
    223 
    224 
    225 static inline struct st_texture_object *
    226 st_get_texture_object(struct gl_context *ctx,
    227                       const struct gl_program *prog,
    228                       unsigned unit)
    229 {
    230    const GLuint texUnit = prog->SamplerUnits[unit];
    231    struct gl_texture_object *texObj = ctx->Texture.Unit[texUnit]._Current;
    232 
    233    if (!texObj)
    234       return NULL;
    235 
    236    return st_texture_object(texObj);
    237 }
    238 
    239 static inline enum pipe_format
    240 st_get_view_format(struct st_texture_object *stObj)
    241 {
    242    if (!stObj)
    243       return PIPE_FORMAT_NONE;
    244    return stObj->surface_based ? stObj->surface_format : stObj->pt->format;
    245 }
    246 
    247 
    248 extern struct pipe_resource *
    249 st_texture_create(struct st_context *st,
    250                   enum pipe_texture_target target,
    251 		  enum pipe_format format,
    252                   GLuint last_level,
    253                   GLuint width0,
    254                   GLuint height0,
    255                   GLuint depth0,
    256                   GLuint layers,
    257                   GLuint nr_samples,
    258                   GLuint tex_usage );
    259 
    260 
    261 extern void
    262 st_gl_texture_dims_to_pipe_dims(GLenum texture,
    263                                 unsigned widthIn,
    264                                 uint16_t heightIn,
    265                                 uint16_t depthIn,
    266                                 unsigned *widthOut,
    267                                 uint16_t *heightOut,
    268                                 uint16_t *depthOut,
    269                                 uint16_t *layersOut);
    270 
    271 /* Check if an image fits into an existing texture object.
    272  */
    273 extern GLboolean
    274 st_texture_match_image(struct st_context *st,
    275                        const struct pipe_resource *pt,
    276                        const struct gl_texture_image *image);
    277 
    278 /* Return a pointer to an image within a texture.  Return image stride as
    279  * well.
    280  */
    281 extern GLubyte *
    282 st_texture_image_map(struct st_context *st, struct st_texture_image *stImage,
    283                      enum pipe_transfer_usage usage,
    284                      GLuint x, GLuint y, GLuint z,
    285                      GLuint w, GLuint h, GLuint d,
    286                      struct pipe_transfer **transfer);
    287 
    288 extern void
    289 st_texture_image_unmap(struct st_context *st,
    290                        struct st_texture_image *stImage, unsigned slice);
    291 
    292 
    293 /* Return pointers to each 2d slice within an image.  Indexed by depth
    294  * value.
    295  */
    296 extern const GLuint *
    297 st_texture_depth_offsets(struct pipe_resource *pt, GLuint level);
    298 
    299 /* Copy an image between two textures
    300  */
    301 extern void
    302 st_texture_image_copy(struct pipe_context *pipe,
    303                       struct pipe_resource *dst, GLuint dstLevel,
    304                       struct pipe_resource *src, GLuint srcLevel,
    305                       GLuint face);
    306 
    307 
    308 extern struct pipe_resource *
    309 st_create_color_map_texture(struct gl_context *ctx);
    310 
    311 void
    312 st_destroy_bound_texture_handles(struct st_context *st);
    313 
    314 void
    315 st_destroy_bound_image_handles(struct st_context *st);
    316 
    317 bool
    318 st_etc_fallback(struct st_context *st, struct gl_texture_image *texImage);
    319 
    320 void
    321 st_convert_image(const struct st_context *st, const struct gl_image_unit *u,
    322                  struct pipe_image_view *img);
    323 
    324 void
    325 st_convert_image_from_unit(const struct st_context *st,
    326                            struct pipe_image_view *img,
    327                            GLuint imgUnit);
    328 
    329 void
    330 st_convert_sampler(const struct st_context *st,
    331                    const struct gl_texture_object *texobj,
    332                    const struct gl_sampler_object *msamp,
    333                    float tex_unit_lod_bias,
    334                    struct pipe_sampler_state *sampler);
    335 
    336 void
    337 st_convert_sampler_from_unit(const struct st_context *st,
    338                              struct pipe_sampler_state *sampler,
    339                              GLuint texUnit);
    340 
    341 void
    342 st_update_single_texture(struct st_context *st,
    343                          struct pipe_sampler_view **sampler_view,
    344                          GLuint texUnit, bool glsl130_or_later,
    345                          bool ignore_srgb_decode);
    346 
    347 void
    348 st_make_bound_samplers_resident(struct st_context *st,
    349                                 struct gl_program *prog);
    350 
    351 void
    352 st_make_bound_images_resident(struct st_context *st,
    353                               struct gl_program *prog);
    354 
    355 #endif
    356