blob: a7762c7bbaaaad4fae47b4966a0c2aea85f2a31a [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 Wu310eece2015-03-27 12:56:09 +0800111 const struct intel_sampler **immutable_samplers;
112 const struct intel_sampler *shared_immutable_sampler;
Chia-I Wuf8385062015-01-04 16:27:24 +0800113
Chia-I Wu7732cb22015-03-26 15:27:55 +0800114 /* to initialize intel_desc_iter */
Chia-I Wuf8385062015-01-04 16:27:24 +0800115 struct intel_desc_offset offset;
116 struct intel_desc_offset increment;
Chia-I Wufc9d9132015-03-26 15:04:41 +0800117 } *bindings;
118 uint32_t binding_count;
Chia-I Wuf8385062015-01-04 16:27:24 +0800119
120 /* count of _DYNAMIC descriptors */
121 uint32_t dynamic_desc_count;
122
Chia-I Wu7732cb22015-03-26 15:27:55 +0800123 /* the size of the layout in the region */
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800124 struct intel_desc_offset region_size;
Chia-I Wuf8385062015-01-04 16:27:24 +0800125};
126
Chia-I Wu7732cb22015-03-26 15:27:55 +0800127struct intel_desc_layout_chain {
128 struct intel_obj obj;
Chia-I Wuf8385062015-01-04 16:27:24 +0800129
Chia-I Wu7732cb22015-03-26 15:27:55 +0800130 struct intel_desc_layout **layouts;
Chia-I Wu862c5572015-03-28 15:23:55 +0800131 uint32_t *dynamic_desc_indices;
Chia-I Wu7732cb22015-03-26 15:27:55 +0800132 uint32_t layout_count;
Chia-I Wu862c5572015-03-28 15:23:55 +0800133
134 uint32_t total_dynamic_desc_count;
Chia-I Wuf8385062015-01-04 16:27:24 +0800135};
136
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800137static inline struct intel_desc_pool *intel_desc_pool(XGL_DESCRIPTOR_POOL pool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800138{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800139 return (struct intel_desc_pool *) pool;
Chia-I Wuf8385062015-01-04 16:27:24 +0800140}
141
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800142static inline struct intel_desc_pool *intel_desc_pool_from_obj(struct intel_obj *obj)
Chia-I Wuf8385062015-01-04 16:27:24 +0800143{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800144 return (struct intel_desc_pool *) obj;
Chia-I Wuf8385062015-01-04 16:27:24 +0800145}
146
147static inline struct intel_desc_set *intel_desc_set(XGL_DESCRIPTOR_SET set)
148{
149 return (struct intel_desc_set *) set;
150}
151
152static inline struct intel_desc_set *intel_desc_set_from_obj(struct intel_obj *obj)
153{
154 return (struct intel_desc_set *) obj;
155}
156
157static inline struct intel_desc_layout *intel_desc_layout(XGL_DESCRIPTOR_SET_LAYOUT layout)
158{
159 return (struct intel_desc_layout *) layout;
160}
161
162static inline struct intel_desc_layout *intel_desc_layout_from_obj(struct intel_obj *obj)
163{
164 return (struct intel_desc_layout *) obj;
165}
166
Chia-I Wu7732cb22015-03-26 15:27:55 +0800167static inline struct intel_desc_layout_chain *intel_desc_layout_chain(XGL_DESCRIPTOR_SET_LAYOUT_CHAIN chain)
168{
169 return (struct intel_desc_layout_chain *) chain;
170}
171
172static inline struct intel_desc_layout_chain *intel_desc_layout_chain_from_obj(struct intel_obj *obj)
173{
174 return (struct intel_desc_layout_chain *) obj;
175}
176
Chia-I Wuf8385062015-01-04 16:27:24 +0800177static inline void intel_desc_offset_set(struct intel_desc_offset *offset,
178 uint32_t surface_offset,
179 uint32_t sampler_offset)
180{
181 offset->surface = surface_offset;
182 offset->sampler = sampler_offset;
183}
184
185static inline void intel_desc_offset_add(struct intel_desc_offset *offset,
186 const struct intel_desc_offset *lhs,
187 const struct intel_desc_offset *rhs)
188{
189 offset->surface = lhs->surface + rhs->surface;
190 offset->sampler = lhs->sampler + rhs->sampler;
191}
192
193static inline void intel_desc_offset_sub(struct intel_desc_offset *offset,
194 const struct intel_desc_offset *lhs,
195 const struct intel_desc_offset *rhs)
196{
197 offset->surface = lhs->surface - rhs->surface;
198 offset->sampler = lhs->sampler - rhs->sampler;
199}
200
201static inline void intel_desc_offset_mad(struct intel_desc_offset *offset,
202 const struct intel_desc_offset *lhs,
203 const struct intel_desc_offset *rhs,
204 uint32_t lhs_scale)
205{
206 offset->surface = lhs->surface * lhs_scale + rhs->surface;
207 offset->sampler = lhs->sampler * lhs_scale + rhs->sampler;
208}
209
210static inline bool intel_desc_offset_within(const struct intel_desc_offset *offset,
211 const struct intel_desc_offset *other)
212{
213 return (offset->surface <= other->surface &&
214 offset->sampler <= other->sampler);
215}
216
Chia-I Wu7732cb22015-03-26 15:27:55 +0800217bool intel_desc_iter_init_for_binding(struct intel_desc_iter *iter,
218 const struct intel_desc_layout *layout,
219 uint32_t binding_index, uint32_t array_base);
220
221bool intel_desc_iter_advance(struct intel_desc_iter *iter);
222
Chia-I Wuf8385062015-01-04 16:27:24 +0800223XGL_RESULT intel_desc_region_create(struct intel_dev *dev,
Chia-I Wuf8385062015-01-04 16:27:24 +0800224 struct intel_desc_region **region_ret);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800225void intel_desc_region_destroy(struct intel_dev *dev,
226 struct intel_desc_region *region);
Chia-I Wuf8385062015-01-04 16:27:24 +0800227
228XGL_RESULT intel_desc_region_alloc(struct intel_desc_region *region,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800229 const XGL_DESCRIPTOR_POOL_CREATE_INFO *info,
Chia-I Wuf8385062015-01-04 16:27:24 +0800230 struct intel_desc_offset *begin,
231 struct intel_desc_offset *end);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800232void intel_desc_region_free(struct intel_desc_region *region,
233 const struct intel_desc_offset *begin,
234 const struct intel_desc_offset *end);
235
236XGL_RESULT intel_desc_region_begin_update(struct intel_desc_region *region,
237 XGL_DESCRIPTOR_UPDATE_MODE mode);
238XGL_RESULT intel_desc_region_end_update(struct intel_desc_region *region,
239 struct intel_cmd *cmd);
240
241void intel_desc_region_clear(struct intel_desc_region *region,
242 const struct intel_desc_offset *begin,
243 const struct intel_desc_offset *end);
244
245void intel_desc_region_update(struct intel_desc_region *region,
246 const struct intel_desc_offset *begin,
247 const struct intel_desc_offset *end,
248 const struct intel_desc_surface *surfaces,
249 const struct intel_desc_sampler *samplers);
250
251void intel_desc_region_copy(struct intel_desc_region *region,
252 const struct intel_desc_offset *begin,
253 const struct intel_desc_offset *end,
254 const struct intel_desc_offset *src);
255
Chia-I Wu862c5572015-03-28 15:23:55 +0800256void intel_desc_region_read_surface(const struct intel_desc_region *region,
257 const struct intel_desc_offset *offset,
258 XGL_PIPELINE_SHADER_STAGE stage,
259 const struct intel_mem **mem,
260 bool *read_only,
261 const uint32_t **cmd,
262 uint32_t *cmd_len);
263void intel_desc_region_read_sampler(const struct intel_desc_region *region,
264 const struct intel_desc_offset *offset,
265 const struct intel_sampler **sampler);
266
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800267XGL_RESULT intel_desc_pool_create(struct intel_dev *dev,
268 XGL_DESCRIPTOR_POOL_USAGE usage,
269 uint32_t max_sets,
270 const XGL_DESCRIPTOR_POOL_CREATE_INFO *info,
271 struct intel_desc_pool **pool_ret);
272void intel_desc_pool_destroy(struct intel_desc_pool *pool);
273
274XGL_RESULT intel_desc_pool_alloc(struct intel_desc_pool *pool,
275 const struct intel_desc_layout *layout,
276 struct intel_desc_offset *begin,
277 struct intel_desc_offset *end);
Chia-I Wudee95612015-03-26 15:23:52 +0800278void intel_desc_pool_reset(struct intel_desc_pool *pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800279
280XGL_RESULT intel_desc_set_create(struct intel_dev *dev,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800281 struct intel_desc_pool *pool,
Chia-I Wuf8385062015-01-04 16:27:24 +0800282 XGL_DESCRIPTOR_SET_USAGE usage,
283 const struct intel_desc_layout *layout,
284 struct intel_desc_set **set_ret);
285void intel_desc_set_destroy(struct intel_desc_set *set);
286
287void intel_desc_set_update_samplers(struct intel_desc_set *set,
288 const XGL_UPDATE_SAMPLERS *update);
289void intel_desc_set_update_sampler_textures(struct intel_desc_set *set,
290 const XGL_UPDATE_SAMPLER_TEXTURES *update);
291void intel_desc_set_update_images(struct intel_desc_set *set,
292 const XGL_UPDATE_IMAGES *update);
293void intel_desc_set_update_buffers(struct intel_desc_set *set,
294 const XGL_UPDATE_BUFFERS *update);
295void intel_desc_set_update_as_copy(struct intel_desc_set *set,
296 const XGL_UPDATE_AS_COPY *update);
297
Chia-I Wuf8385062015-01-04 16:27:24 +0800298XGL_RESULT intel_desc_layout_create(struct intel_dev *dev,
Chia-I Wuf8385062015-01-04 16:27:24 +0800299 const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO *info,
300 struct intel_desc_layout **layout_ret);
301void intel_desc_layout_destroy(struct intel_desc_layout *layout);
302
Chia-I Wu7732cb22015-03-26 15:27:55 +0800303XGL_RESULT intel_desc_layout_chain_create(struct intel_dev *dev,
304 const XGL_DESCRIPTOR_SET_LAYOUT *layouts,
305 uint32_t count,
306 struct intel_desc_layout_chain **chain_ret);
307void intel_desc_layout_chain_destroy(struct intel_desc_layout_chain *chain);
Chia-I Wuf8385062015-01-04 16:27:24 +0800308
309#endif /* DESC_H */