blob: 5c5f84bf7c6a1b2b673b1a0350e698489b59cc33 [file] [log] [blame]
Chia-I Wuf8385062015-01-04 16:27:24 +08001/*
2 * XGL
3 *
4 * Copyright (C) 2015 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 DESC_H
29#define DESC_H
30
31#include "intel.h"
32#include "obj.h"
33
34struct intel_cmd;
35struct intel_dev;
36
37/**
38 * Opaque descriptors.
39 */
40struct intel_desc_surface;
41struct intel_desc_sampler;
42
43/**
Chia-I Wu8d24b3b2015-03-26 13:14:16 +080044 * Descriptor region offset (or size) in bytes.
Chia-I Wuf8385062015-01-04 16:27:24 +080045 */
46struct intel_desc_offset {
47 uint32_t surface;
48 uint32_t sampler;
49};
50
Chia-I Wu7732cb22015-03-26 15:27:55 +080051struct intel_desc_iter {
52 XGL_DESCRIPTOR_TYPE type;
53 struct intel_desc_offset increment;
54 uint32_t size;
55
56 struct intel_desc_offset begin;
57 struct intel_desc_offset end;
58 uint32_t cur;
59};
60
Chia-I Wuf8385062015-01-04 16:27:24 +080061/**
Chia-I Wu8d24b3b2015-03-26 13:14:16 +080062 * Per-device descriptor region.
Chia-I Wuf8385062015-01-04 16:27:24 +080063 */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +080064struct intel_desc_region {
Chia-I Wuf8385062015-01-04 16:27:24 +080065 /* this is not an intel_obj */
66
67 uint32_t surface_desc_size;
68 uint32_t sampler_desc_size;
69
70 /* surface descriptors (in system memory until RS is enabled) */
71 struct intel_desc_surface *surfaces;
72 /* sampler desciptors */
73 struct intel_desc_sampler *samplers;
74
75 struct intel_desc_offset size;
76 struct intel_desc_offset cur;
77};
78
Chia-I Wu8d24b3b2015-03-26 13:14:16 +080079struct intel_desc_pool {
Chia-I Wuf8385062015-01-04 16:27:24 +080080 struct intel_obj obj;
81
82 struct intel_dev *dev;
83
Chia-I Wu8d24b3b2015-03-26 13:14:16 +080084 /* point to a continuous area in the device's region */
85 struct intel_desc_offset region_begin;
86 struct intel_desc_offset region_end;
Chia-I Wuf8385062015-01-04 16:27:24 +080087
88 struct intel_desc_offset cur;
89};
90
91struct intel_desc_layout;
92
93struct intel_desc_set {
94 struct intel_obj obj;
95
Chia-I Wu8d24b3b2015-03-26 13:14:16 +080096 /* suballocated from a pool */
97 struct intel_desc_region *region;
98 struct intel_desc_offset region_begin;
99 struct intel_desc_offset region_end;
Chia-I Wuf8385062015-01-04 16:27:24 +0800100
101 const struct intel_desc_layout *layout;
102};
103
104struct intel_desc_layout {
105 struct intel_obj obj;
106
Chia-I Wufc9d9132015-03-26 15:04:41 +0800107 /* homogeneous bindings in this layout */
108 struct intel_desc_layout_binding {
Chia-I Wuf8385062015-01-04 16:27:24 +0800109 XGL_DESCRIPTOR_TYPE type;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800110 uint32_t array_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800111 const struct intel_sampler *immutable_sampler;
112
Chia-I Wu7732cb22015-03-26 15:27:55 +0800113 /* to initialize intel_desc_iter */
Chia-I Wuf8385062015-01-04 16:27:24 +0800114 struct intel_desc_offset offset;
115 struct intel_desc_offset increment;
Chia-I Wufc9d9132015-03-26 15:04:41 +0800116 } *bindings;
117 uint32_t binding_count;
Chia-I Wuf8385062015-01-04 16:27:24 +0800118
119 /* count of _DYNAMIC descriptors */
120 uint32_t dynamic_desc_count;
121
Chia-I Wu7732cb22015-03-26 15:27:55 +0800122 /* the size of the layout in the region */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800123 struct intel_desc_offset region_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800124};
125
Chia-I Wu7732cb22015-03-26 15:27:55 +0800126struct intel_desc_layout_chain {
127 struct intel_obj obj;
Chia-I Wuf8385062015-01-04 16:27:24 +0800128
Chia-I Wu7732cb22015-03-26 15:27:55 +0800129 struct intel_desc_layout **layouts;
130 uint32_t layout_count;
Chia-I Wuf8385062015-01-04 16:27:24 +0800131};
132
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800133static inline struct intel_desc_pool *intel_desc_pool(XGL_DESCRIPTOR_POOL pool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800134{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800135 return (struct intel_desc_pool *) pool;
Chia-I Wuf8385062015-01-04 16:27:24 +0800136}
137
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800138static inline struct intel_desc_pool *intel_desc_pool_from_obj(struct intel_obj *obj)
Chia-I Wuf8385062015-01-04 16:27:24 +0800139{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800140 return (struct intel_desc_pool *) obj;
Chia-I Wuf8385062015-01-04 16:27:24 +0800141}
142
143static inline struct intel_desc_set *intel_desc_set(XGL_DESCRIPTOR_SET set)
144{
145 return (struct intel_desc_set *) set;
146}
147
148static inline struct intel_desc_set *intel_desc_set_from_obj(struct intel_obj *obj)
149{
150 return (struct intel_desc_set *) obj;
151}
152
153static inline struct intel_desc_layout *intel_desc_layout(XGL_DESCRIPTOR_SET_LAYOUT layout)
154{
155 return (struct intel_desc_layout *) layout;
156}
157
158static inline struct intel_desc_layout *intel_desc_layout_from_obj(struct intel_obj *obj)
159{
160 return (struct intel_desc_layout *) obj;
161}
162
Chia-I Wu7732cb22015-03-26 15:27:55 +0800163static inline struct intel_desc_layout_chain *intel_desc_layout_chain(XGL_DESCRIPTOR_SET_LAYOUT_CHAIN chain)
164{
165 return (struct intel_desc_layout_chain *) chain;
166}
167
168static inline struct intel_desc_layout_chain *intel_desc_layout_chain_from_obj(struct intel_obj *obj)
169{
170 return (struct intel_desc_layout_chain *) obj;
171}
172
Chia-I Wuf8385062015-01-04 16:27:24 +0800173static inline void intel_desc_offset_set(struct intel_desc_offset *offset,
174 uint32_t surface_offset,
175 uint32_t sampler_offset)
176{
177 offset->surface = surface_offset;
178 offset->sampler = sampler_offset;
179}
180
181static inline void intel_desc_offset_add(struct intel_desc_offset *offset,
182 const struct intel_desc_offset *lhs,
183 const struct intel_desc_offset *rhs)
184{
185 offset->surface = lhs->surface + rhs->surface;
186 offset->sampler = lhs->sampler + rhs->sampler;
187}
188
189static inline void intel_desc_offset_sub(struct intel_desc_offset *offset,
190 const struct intel_desc_offset *lhs,
191 const struct intel_desc_offset *rhs)
192{
193 offset->surface = lhs->surface - rhs->surface;
194 offset->sampler = lhs->sampler - rhs->sampler;
195}
196
197static inline void intel_desc_offset_mad(struct intel_desc_offset *offset,
198 const struct intel_desc_offset *lhs,
199 const struct intel_desc_offset *rhs,
200 uint32_t lhs_scale)
201{
202 offset->surface = lhs->surface * lhs_scale + rhs->surface;
203 offset->sampler = lhs->sampler * lhs_scale + rhs->sampler;
204}
205
206static inline bool intel_desc_offset_within(const struct intel_desc_offset *offset,
207 const struct intel_desc_offset *other)
208{
209 return (offset->surface <= other->surface &&
210 offset->sampler <= other->sampler);
211}
212
Chia-I Wu7732cb22015-03-26 15:27:55 +0800213bool intel_desc_iter_init_for_binding(struct intel_desc_iter *iter,
214 const struct intel_desc_layout *layout,
215 uint32_t binding_index, uint32_t array_base);
216
217bool intel_desc_iter_advance(struct intel_desc_iter *iter);
218
Chia-I Wuf8385062015-01-04 16:27:24 +0800219XGL_RESULT intel_desc_region_create(struct intel_dev *dev,
Chia-I Wuf8385062015-01-04 16:27:24 +0800220 struct intel_desc_region **region_ret);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800221void intel_desc_region_destroy(struct intel_dev *dev,
222 struct intel_desc_region *region);
Chia-I Wuf8385062015-01-04 16:27:24 +0800223
224XGL_RESULT intel_desc_region_alloc(struct intel_desc_region *region,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800225 const XGL_DESCRIPTOR_POOL_CREATE_INFO *info,
Chia-I Wuf8385062015-01-04 16:27:24 +0800226 struct intel_desc_offset *begin,
227 struct intel_desc_offset *end);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800228void intel_desc_region_free(struct intel_desc_region *region,
229 const struct intel_desc_offset *begin,
230 const struct intel_desc_offset *end);
231
232XGL_RESULT intel_desc_region_begin_update(struct intel_desc_region *region,
233 XGL_DESCRIPTOR_UPDATE_MODE mode);
234XGL_RESULT intel_desc_region_end_update(struct intel_desc_region *region,
235 struct intel_cmd *cmd);
236
237void intel_desc_region_clear(struct intel_desc_region *region,
238 const struct intel_desc_offset *begin,
239 const struct intel_desc_offset *end);
240
241void intel_desc_region_update(struct intel_desc_region *region,
242 const struct intel_desc_offset *begin,
243 const struct intel_desc_offset *end,
244 const struct intel_desc_surface *surfaces,
245 const struct intel_desc_sampler *samplers);
246
247void intel_desc_region_copy(struct intel_desc_region *region,
248 const struct intel_desc_offset *begin,
249 const struct intel_desc_offset *end,
250 const struct intel_desc_offset *src);
251
252XGL_RESULT intel_desc_pool_create(struct intel_dev *dev,
253 XGL_DESCRIPTOR_POOL_USAGE usage,
254 uint32_t max_sets,
255 const XGL_DESCRIPTOR_POOL_CREATE_INFO *info,
256 struct intel_desc_pool **pool_ret);
257void intel_desc_pool_destroy(struct intel_desc_pool *pool);
258
259XGL_RESULT intel_desc_pool_alloc(struct intel_desc_pool *pool,
260 const struct intel_desc_layout *layout,
261 struct intel_desc_offset *begin,
262 struct intel_desc_offset *end);
Chia-I Wudee95612015-03-26 15:23:52 +0800263void intel_desc_pool_reset(struct intel_desc_pool *pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800264
265XGL_RESULT intel_desc_set_create(struct intel_dev *dev,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800266 struct intel_desc_pool *pool,
Chia-I Wuf8385062015-01-04 16:27:24 +0800267 XGL_DESCRIPTOR_SET_USAGE usage,
268 const struct intel_desc_layout *layout,
269 struct intel_desc_set **set_ret);
270void intel_desc_set_destroy(struct intel_desc_set *set);
271
272void intel_desc_set_update_samplers(struct intel_desc_set *set,
273 const XGL_UPDATE_SAMPLERS *update);
274void intel_desc_set_update_sampler_textures(struct intel_desc_set *set,
275 const XGL_UPDATE_SAMPLER_TEXTURES *update);
276void intel_desc_set_update_images(struct intel_desc_set *set,
277 const XGL_UPDATE_IMAGES *update);
278void intel_desc_set_update_buffers(struct intel_desc_set *set,
279 const XGL_UPDATE_BUFFERS *update);
280void intel_desc_set_update_as_copy(struct intel_desc_set *set,
281 const XGL_UPDATE_AS_COPY *update);
282
Chia-I Wu2f0cba82015-02-12 10:15:42 -0700283void intel_desc_set_read_surface(const struct intel_desc_set *set,
284 const struct intel_desc_offset *offset,
285 XGL_PIPELINE_SHADER_STAGE stage,
286 const struct intel_mem **mem,
287 bool *read_only,
288 const uint32_t **cmd,
289 uint32_t *cmd_len);
290void intel_desc_set_read_sampler(const struct intel_desc_set *set,
291 const struct intel_desc_offset *offset,
292 const struct intel_sampler **sampler);
293
Chia-I Wuf8385062015-01-04 16:27:24 +0800294XGL_RESULT intel_desc_layout_create(struct intel_dev *dev,
Chia-I Wuf8385062015-01-04 16:27:24 +0800295 const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO *info,
296 struct intel_desc_layout **layout_ret);
297void intel_desc_layout_destroy(struct intel_desc_layout *layout);
298
Chia-I Wu7732cb22015-03-26 15:27:55 +0800299XGL_RESULT intel_desc_layout_chain_create(struct intel_dev *dev,
300 const XGL_DESCRIPTOR_SET_LAYOUT *layouts,
301 uint32_t count,
302 struct intel_desc_layout_chain **chain_ret);
303void intel_desc_layout_chain_destroy(struct intel_desc_layout_chain *chain);
Chia-I Wuf8385062015-01-04 16:27:24 +0800304
305#endif /* DESC_H */