• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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@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 *
ilo_buffer_resource(struct pipe_resource * res)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 *
ilo_texture(struct pipe_resource * res)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 *
ilo_resource_get_vma(struct pipe_resource * res)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 *
ilo_texture_get_slice(const struct ilo_texture * tex,unsigned level,unsigned 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
ilo_texture_set_slice_flags(struct ilo_texture * tex,unsigned level,unsigned first_slice,unsigned num_slices,unsigned mask,unsigned value)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
ilo_texture_set_slice_clear_value(struct ilo_texture * tex,unsigned level,unsigned first_slice,unsigned num_slices,uint32_t clear_value)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