Home | History | Annotate | Download | only in ilo
      1 /*
      2  * Mesa 3-D graphics library
      3  *
      4  * Copyright (C) 2012-2013 LunarG, Inc.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the "Software"),
      8  * to deal in the Software without restriction, including without limitation
      9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10  * and/or sell copies of the Software, and to permit persons to whom the
     11  * Software is furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included
     14  * in all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     22  * DEALINGS IN THE SOFTWARE.
     23  *
     24  * Authors:
     25  *    Chia-I Wu <olv (at) lunarg.com>
     26  */
     27 
     28 #ifndef ILO_RESOURCE_H
     29 #define ILO_RESOURCE_H
     30 
     31 #include "core/intel_winsys.h"
     32 #include "core/ilo_image.h"
     33 #include "core/ilo_vma.h"
     34 
     35 #include "ilo_common.h"
     36 #include "ilo_screen.h"
     37 
     38 enum ilo_texture_flags {
     39    /*
     40     * Possible writers of a texture.  There can be at most one writer at any
     41     * time.
     42     *
     43     * Wine set in resolve flags (in ilo_blit_resolve_slices()), they indicate
     44     * the new writer.  When set in slice flags (ilo_texture_slice::flags),
     45     * they indicate the writer since last resolve.
     46     */
     47    ILO_TEXTURE_RENDER_WRITE   = 1 << 0,
     48    ILO_TEXTURE_BLT_WRITE      = 1 << 1,
     49    ILO_TEXTURE_CPU_WRITE      = 1 << 2,
     50 
     51    /*
     52     * Possible readers of a texture.  There may be multiple readers at any
     53     * time.
     54     *
     55     * When set in resolve flags, they indicate the new readers.  They are
     56     * never set in slice flags.
     57     */
     58    ILO_TEXTURE_RENDER_READ    = 1 << 3,
     59    ILO_TEXTURE_BLT_READ       = 1 << 4,
     60    ILO_TEXTURE_CPU_READ       = 1 << 5,
     61 
     62    /*
     63     * Set when the texture is cleared.
     64     *
     65     * When set in resolve flags, the new writer will clear.  When set in slice
     66     * flags, the slice has been cleared to ilo_texture_slice::clear_value.
     67     */
     68    ILO_TEXTURE_CLEAR          = 1 << 6,
     69 };
     70 
     71 /**
     72  * A 3D image slice, cube face, or array layer.
     73  */
     74 struct ilo_texture_slice {
     75    unsigned flags;
     76 
     77    /*
     78     * Slice clear value.  It is served for two purposes
     79     *
     80     *  - the clear value used in commands such as 3DSTATE_CLEAR_PARAMS
     81     *  - the clear value when ILO_TEXTURE_CLEAR is set
     82     *
     83     * Since commands such as 3DSTATE_CLEAR_PARAMS expect a single clear value
     84     * for all slices, ilo_blit_resolve_slices() will silently make all slices
     85     * to have the same clear value.
     86     */
     87    uint32_t clear_value;
     88 };
     89 
     90 struct ilo_texture {
     91    struct pipe_resource base;
     92 
     93    bool imported;
     94 
     95    enum pipe_format image_format;
     96    struct ilo_image image;
     97    struct ilo_vma vma;
     98    struct ilo_vma aux_vma;
     99 
    100    /* XXX thread-safety */
    101    struct ilo_texture_slice *slices[PIPE_MAX_TEXTURE_LEVELS];
    102 
    103    struct ilo_texture *separate_s8;
    104 };
    105 
    106 struct ilo_buffer_resource {
    107    struct pipe_resource base;
    108 
    109    uint32_t bo_size;
    110    struct ilo_vma vma;
    111 };
    112 
    113 static inline struct ilo_buffer_resource *
    114 ilo_buffer_resource(struct pipe_resource *res)
    115 {
    116    return (struct ilo_buffer_resource *)
    117       ((res && res->target == PIPE_BUFFER) ? res : NULL);
    118 }
    119 
    120 static inline struct ilo_texture *
    121 ilo_texture(struct pipe_resource *res)
    122 {
    123    return (struct ilo_texture *)
    124       ((res && res->target != PIPE_BUFFER) ? res : NULL);
    125 }
    126 
    127 void
    128 ilo_init_resource_functions(struct ilo_screen *is);
    129 
    130 bool
    131 ilo_resource_rename_bo(struct pipe_resource *res);
    132 
    133 /**
    134  * Return the VMA of the resource.
    135  */
    136 static inline const struct ilo_vma *
    137 ilo_resource_get_vma(struct pipe_resource *res)
    138 {
    139    return (res->target == PIPE_BUFFER) ?
    140       &((struct ilo_buffer_resource *) res)->vma :
    141       &((struct ilo_texture *) res)->vma;
    142 }
    143 
    144 static inline struct ilo_texture_slice *
    145 ilo_texture_get_slice(const struct ilo_texture *tex,
    146                       unsigned level, unsigned slice)
    147 {
    148    assert(level <= tex->base.last_level);
    149    assert(slice < ((tex->base.target == PIPE_TEXTURE_3D) ?
    150          u_minify(tex->base.depth0, level) : tex->base.array_size));
    151 
    152    return &tex->slices[level][slice];
    153 }
    154 
    155 static inline void
    156 ilo_texture_set_slice_flags(struct ilo_texture *tex, unsigned level,
    157                             unsigned first_slice, unsigned num_slices,
    158                             unsigned mask, unsigned value)
    159 {
    160    const struct ilo_texture_slice *last =
    161       ilo_texture_get_slice(tex, level, first_slice + num_slices - 1);
    162    struct ilo_texture_slice *slice =
    163       ilo_texture_get_slice(tex, level, first_slice);
    164 
    165    while (slice <= last) {
    166       slice->flags = (slice->flags & ~mask) | (value & mask);
    167       slice++;
    168    }
    169 }
    170 
    171 static inline void
    172 ilo_texture_set_slice_clear_value(struct ilo_texture *tex, unsigned level,
    173                                   unsigned first_slice, unsigned num_slices,
    174                                   uint32_t clear_value)
    175 {
    176    const struct ilo_texture_slice *last =
    177       ilo_texture_get_slice(tex, level, first_slice + num_slices - 1);
    178    struct ilo_texture_slice *slice =
    179       ilo_texture_get_slice(tex, level, first_slice);
    180 
    181    while (slice <= last) {
    182       slice->clear_value = clear_value;
    183       slice++;
    184    }
    185 }
    186 
    187 #endif /* ILO_RESOURCE_H */
    188