blob: daf48178d7719dab18918ce0a5da527c818eeeb0 [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;
131 uint32_t layout_count;
Chia-I Wuf8385062015-01-04 16:27:24 +0800132};
133
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800134static inline struct intel_desc_pool *intel_desc_pool(XGL_DESCRIPTOR_POOL pool)
Chia-I Wuf8385062015-01-04 16:27:24 +0800135{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800136 return (struct intel_desc_pool *) pool;
Chia-I Wuf8385062015-01-04 16:27:24 +0800137}
138
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800139static inline struct intel_desc_pool *intel_desc_pool_from_obj(struct intel_obj *obj)
Chia-I Wuf8385062015-01-04 16:27:24 +0800140{
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800141 return (struct intel_desc_pool *) obj;
Chia-I Wuf8385062015-01-04 16:27:24 +0800142}
143
144static inline struct intel_desc_set *intel_desc_set(XGL_DESCRIPTOR_SET set)
145{
146 return (struct intel_desc_set *) set;
147}
148
149static inline struct intel_desc_set *intel_desc_set_from_obj(struct intel_obj *obj)
150{
151 return (struct intel_desc_set *) obj;
152}
153
154static inline struct intel_desc_layout *intel_desc_layout(XGL_DESCRIPTOR_SET_LAYOUT layout)
155{
156 return (struct intel_desc_layout *) layout;
157}
158
159static inline struct intel_desc_layout *intel_desc_layout_from_obj(struct intel_obj *obj)
160{
161 return (struct intel_desc_layout *) obj;
162}
163
Chia-I Wu7732cb22015-03-26 15:27:55 +0800164static inline struct intel_desc_layout_chain *intel_desc_layout_chain(XGL_DESCRIPTOR_SET_LAYOUT_CHAIN chain)
165{
166 return (struct intel_desc_layout_chain *) chain;
167}
168
169static inline struct intel_desc_layout_chain *intel_desc_layout_chain_from_obj(struct intel_obj *obj)
170{
171 return (struct intel_desc_layout_chain *) obj;
172}
173
Chia-I Wuf8385062015-01-04 16:27:24 +0800174static inline void intel_desc_offset_set(struct intel_desc_offset *offset,
175 uint32_t surface_offset,
176 uint32_t sampler_offset)
177{
178 offset->surface = surface_offset;
179 offset->sampler = sampler_offset;
180}
181
182static inline void intel_desc_offset_add(struct intel_desc_offset *offset,
183 const struct intel_desc_offset *lhs,
184 const struct intel_desc_offset *rhs)
185{
186 offset->surface = lhs->surface + rhs->surface;
187 offset->sampler = lhs->sampler + rhs->sampler;
188}
189
190static inline void intel_desc_offset_sub(struct intel_desc_offset *offset,
191 const struct intel_desc_offset *lhs,
192 const struct intel_desc_offset *rhs)
193{
194 offset->surface = lhs->surface - rhs->surface;
195 offset->sampler = lhs->sampler - rhs->sampler;
196}
197
198static inline void intel_desc_offset_mad(struct intel_desc_offset *offset,
199 const struct intel_desc_offset *lhs,
200 const struct intel_desc_offset *rhs,
201 uint32_t lhs_scale)
202{
203 offset->surface = lhs->surface * lhs_scale + rhs->surface;
204 offset->sampler = lhs->sampler * lhs_scale + rhs->sampler;
205}
206
207static inline bool intel_desc_offset_within(const struct intel_desc_offset *offset,
208 const struct intel_desc_offset *other)
209{
210 return (offset->surface <= other->surface &&
211 offset->sampler <= other->sampler);
212}
213
Chia-I Wu7732cb22015-03-26 15:27:55 +0800214bool intel_desc_iter_init_for_binding(struct intel_desc_iter *iter,
215 const struct intel_desc_layout *layout,
216 uint32_t binding_index, uint32_t array_base);
217
218bool intel_desc_iter_advance(struct intel_desc_iter *iter);
219
Chia-I Wuf8385062015-01-04 16:27:24 +0800220XGL_RESULT intel_desc_region_create(struct intel_dev *dev,
Chia-I Wuf8385062015-01-04 16:27:24 +0800221 struct intel_desc_region **region_ret);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800222void intel_desc_region_destroy(struct intel_dev *dev,
223 struct intel_desc_region *region);
Chia-I Wuf8385062015-01-04 16:27:24 +0800224
225XGL_RESULT intel_desc_region_alloc(struct intel_desc_region *region,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800226 const XGL_DESCRIPTOR_POOL_CREATE_INFO *info,
Chia-I Wuf8385062015-01-04 16:27:24 +0800227 struct intel_desc_offset *begin,
228 struct intel_desc_offset *end);
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800229void intel_desc_region_free(struct intel_desc_region *region,
230 const struct intel_desc_offset *begin,
231 const struct intel_desc_offset *end);
232
233XGL_RESULT intel_desc_region_begin_update(struct intel_desc_region *region,
234 XGL_DESCRIPTOR_UPDATE_MODE mode);
235XGL_RESULT intel_desc_region_end_update(struct intel_desc_region *region,
236 struct intel_cmd *cmd);
237
238void intel_desc_region_clear(struct intel_desc_region *region,
239 const struct intel_desc_offset *begin,
240 const struct intel_desc_offset *end);
241
242void intel_desc_region_update(struct intel_desc_region *region,
243 const struct intel_desc_offset *begin,
244 const struct intel_desc_offset *end,
245 const struct intel_desc_surface *surfaces,
246 const struct intel_desc_sampler *samplers);
247
248void intel_desc_region_copy(struct intel_desc_region *region,
249 const struct intel_desc_offset *begin,
250 const struct intel_desc_offset *end,
251 const struct intel_desc_offset *src);
252
253XGL_RESULT intel_desc_pool_create(struct intel_dev *dev,
254 XGL_DESCRIPTOR_POOL_USAGE usage,
255 uint32_t max_sets,
256 const XGL_DESCRIPTOR_POOL_CREATE_INFO *info,
257 struct intel_desc_pool **pool_ret);
258void intel_desc_pool_destroy(struct intel_desc_pool *pool);
259
260XGL_RESULT intel_desc_pool_alloc(struct intel_desc_pool *pool,
261 const struct intel_desc_layout *layout,
262 struct intel_desc_offset *begin,
263 struct intel_desc_offset *end);
Chia-I Wudee95612015-03-26 15:23:52 +0800264void intel_desc_pool_reset(struct intel_desc_pool *pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800265
266XGL_RESULT intel_desc_set_create(struct intel_dev *dev,
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800267 struct intel_desc_pool *pool,
Chia-I Wuf8385062015-01-04 16:27:24 +0800268 XGL_DESCRIPTOR_SET_USAGE usage,
269 const struct intel_desc_layout *layout,
270 struct intel_desc_set **set_ret);
271void intel_desc_set_destroy(struct intel_desc_set *set);
272
273void intel_desc_set_update_samplers(struct intel_desc_set *set,
274 const XGL_UPDATE_SAMPLERS *update);
275void intel_desc_set_update_sampler_textures(struct intel_desc_set *set,
276 const XGL_UPDATE_SAMPLER_TEXTURES *update);
277void intel_desc_set_update_images(struct intel_desc_set *set,
278 const XGL_UPDATE_IMAGES *update);
279void intel_desc_set_update_buffers(struct intel_desc_set *set,
280 const XGL_UPDATE_BUFFERS *update);
281void intel_desc_set_update_as_copy(struct intel_desc_set *set,
282 const XGL_UPDATE_AS_COPY *update);
283
Chia-I Wu2f0cba82015-02-12 10:15:42 -0700284void intel_desc_set_read_surface(const struct intel_desc_set *set,
285 const struct intel_desc_offset *offset,
286 XGL_PIPELINE_SHADER_STAGE stage,
287 const struct intel_mem **mem,
288 bool *read_only,
289 const uint32_t **cmd,
290 uint32_t *cmd_len);
291void intel_desc_set_read_sampler(const struct intel_desc_set *set,
292 const struct intel_desc_offset *offset,
293 const struct intel_sampler **sampler);
294
Chia-I Wuf8385062015-01-04 16:27:24 +0800295XGL_RESULT intel_desc_layout_create(struct intel_dev *dev,
Chia-I Wuf8385062015-01-04 16:27:24 +0800296 const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO *info,
297 struct intel_desc_layout **layout_ret);
298void intel_desc_layout_destroy(struct intel_desc_layout *layout);
299
Chia-I Wu7732cb22015-03-26 15:27:55 +0800300XGL_RESULT intel_desc_layout_chain_create(struct intel_dev *dev,
301 const XGL_DESCRIPTOR_SET_LAYOUT *layouts,
302 uint32_t count,
303 struct intel_desc_layout_chain **chain_ret);
304void intel_desc_layout_chain_destroy(struct intel_desc_layout_chain *chain);
Chia-I Wuf8385062015-01-04 16:27:24 +0800305
306#endif /* DESC_H */