ilo: use ilo_shader_cso for FS
[mesa.git] / src / gallium / drivers / ilo / ilo_gpe.h
1 /*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (C) 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_GPE_H
29 #define ILO_GPE_H
30
31 #include "ilo_common.h"
32
33 /**
34 * \see brw_context.h
35 */
36 #define ILO_MAX_DRAW_BUFFERS 8
37 #define ILO_MAX_CONST_BUFFERS (1 + 12)
38 #define ILO_MAX_SAMPLER_VIEWS 16
39 #define ILO_MAX_SAMPLERS 16
40 #define ILO_MAX_SO_BINDINGS 64
41 #define ILO_MAX_SO_BUFFERS 4
42 #define ILO_MAX_VIEWPORTS 1
43
44 #define ILO_MAX_VS_SURFACES (ILO_MAX_CONST_BUFFERS + ILO_MAX_SAMPLER_VIEWS)
45 #define ILO_VS_CONST_SURFACE(i) (i)
46 #define ILO_VS_TEXTURE_SURFACE(i) (ILO_MAX_CONST_BUFFERS + i)
47
48 #define ILO_MAX_GS_SURFACES (ILO_MAX_SO_BINDINGS)
49 #define ILO_GS_SO_SURFACE(i) (i)
50
51 #define ILO_MAX_WM_SURFACES (ILO_MAX_DRAW_BUFFERS + ILO_MAX_CONST_BUFFERS + ILO_MAX_SAMPLER_VIEWS)
52 #define ILO_WM_DRAW_SURFACE(i) (i)
53 #define ILO_WM_CONST_SURFACE(i) (ILO_MAX_DRAW_BUFFERS + i)
54 #define ILO_WM_TEXTURE_SURFACE(i) (ILO_MAX_DRAW_BUFFERS + ILO_MAX_CONST_BUFFERS + i)
55
56 struct ilo_buffer;
57 struct ilo_texture;
58 struct ilo_shader_state;
59
60 struct ilo_vb_state {
61 struct pipe_vertex_buffer states[PIPE_MAX_ATTRIBS];
62 uint32_t enabled_mask;
63 };
64
65 struct ilo_ib_state {
66 struct pipe_index_buffer state;
67 };
68
69 struct ilo_ve_cso {
70 /* VERTEX_ELEMENT_STATE */
71 uint32_t payload[2];
72 };
73
74 struct ilo_ve_state {
75 struct ilo_ve_cso cso[PIPE_MAX_ATTRIBS];
76 unsigned count;
77
78 unsigned instance_divisors[PIPE_MAX_ATTRIBS];
79 unsigned vb_mapping[PIPE_MAX_ATTRIBS];
80 unsigned vb_count;
81 };
82
83 struct ilo_so_state {
84 struct pipe_stream_output_target *states[ILO_MAX_SO_BUFFERS];
85 unsigned count;
86 unsigned append_bitmask;
87
88 bool enabled;
89 };
90
91 struct ilo_viewport_cso {
92 /* matrix form */
93 float m00, m11, m22, m30, m31, m32;
94
95 /* guardband in NDC space */
96 float min_gbx, min_gby, max_gbx, max_gby;
97
98 /* viewport in screen space */
99 float min_x, min_y, min_z;
100 float max_x, max_y, max_z;
101 };
102
103 struct ilo_viewport_state {
104 struct ilo_viewport_cso cso[ILO_MAX_VIEWPORTS];
105 unsigned count;
106
107 struct pipe_viewport_state viewport0;
108 };
109
110 struct ilo_scissor_state {
111 /* SCISSOR_RECT */
112 uint32_t payload[ILO_MAX_VIEWPORTS * 2];
113 };
114
115 struct ilo_rasterizer_clip {
116 /* 3DSTATE_CLIP */
117 uint32_t payload[3];
118
119 uint32_t can_enable_guardband;
120 };
121
122 struct ilo_rasterizer_sf {
123 /* 3DSTATE_SF */
124 uint32_t payload[6];
125 uint32_t dw_msaa;
126 };
127
128 struct ilo_rasterizer_wm {
129 /* 3DSTATE_WM */
130 uint32_t payload[2];
131 uint32_t dw_msaa_rast;
132 uint32_t dw_msaa_disp;
133 };
134
135 struct ilo_rasterizer_state {
136 struct pipe_rasterizer_state state;
137
138 struct ilo_rasterizer_clip clip;
139 struct ilo_rasterizer_sf sf;
140 struct ilo_rasterizer_wm wm;
141 };
142
143 struct ilo_dsa_state {
144 /* DEPTH_STENCIL_STATE */
145 uint32_t payload[3];
146
147 struct pipe_alpha_state alpha;
148 };
149
150 struct ilo_blend_cso {
151 /* BLEND_STATE */
152 uint32_t payload[2];
153
154 uint32_t dw_blend;
155 uint32_t dw_blend_dst_alpha_forced_one;
156
157 uint32_t dw_logicop;
158 uint32_t dw_alpha_mod;
159 };
160
161 struct ilo_blend_state {
162 struct ilo_blend_cso cso[ILO_MAX_DRAW_BUFFERS];
163
164 bool independent_blend_enable;
165 bool dual_blend;
166 bool alpha_to_coverage;
167 };
168
169 struct ilo_sampler_cso {
170 /* SAMPLER_STATE and SAMPLER_BORDER_COLOR_STATE */
171 uint32_t payload[15];
172
173 uint32_t dw_filter;
174 uint32_t dw_filter_aniso;
175 uint32_t dw_wrap;
176 uint32_t dw_wrap_1d;
177 uint32_t dw_wrap_cube;
178
179 bool anisotropic;
180 bool saturate_r;
181 bool saturate_s;
182 bool saturate_t;
183 };
184
185 struct ilo_sampler_state {
186 const struct ilo_sampler_cso *cso[ILO_MAX_SAMPLERS];
187 unsigned count;
188 };
189
190 struct ilo_view_surface {
191 /* SURFACE_STATE */
192 uint32_t payload[8];
193 struct intel_bo *bo;
194 };
195
196 struct ilo_view_cso {
197 struct pipe_sampler_view base;
198
199 struct ilo_view_surface surface;
200 };
201
202 struct ilo_view_state {
203 struct pipe_sampler_view *states[ILO_MAX_SAMPLER_VIEWS];
204 unsigned count;
205 };
206
207 struct ilo_cbuf_cso {
208 struct pipe_resource *resource;
209 struct ilo_view_surface surface;
210 };
211
212 struct ilo_cbuf_state {
213 struct ilo_cbuf_cso cso[ILO_MAX_CONST_BUFFERS];
214 unsigned count;
215 };
216
217 struct ilo_resource_state {
218 struct pipe_surface *states[PIPE_MAX_SHADER_RESOURCES];
219 unsigned count;
220 };
221
222 struct ilo_surface_cso {
223 struct pipe_surface base;
224
225 bool is_rt;
226 union {
227 struct ilo_view_surface rt;
228 struct ilo_zs_surface {
229 uint32_t payload[10];
230 struct intel_bo *bo;
231 struct intel_bo *hiz_bo;
232 struct intel_bo *separate_s8_bo;
233 } zs;
234 } u;
235 };
236
237 struct ilo_fb_state {
238 struct pipe_framebuffer_state state;
239
240 struct ilo_zs_surface null_zs;
241 unsigned num_samples;
242 };
243
244 struct ilo_global_binding {
245 /*
246 * XXX These should not be treated as real resources (and there could be
247 * thousands of them). They should be treated as regions in GLOBAL
248 * resource, which is the only real resource.
249 *
250 * That is, a resource here should instead be
251 *
252 * struct ilo_global_region {
253 * struct pipe_resource base;
254 * int offset;
255 * int size;
256 * };
257 *
258 * and it describes the region [offset, offset + size) in GLOBAL
259 * resource.
260 */
261 struct pipe_resource *resources[PIPE_MAX_SHADER_RESOURCES];
262 uint32_t *handles[PIPE_MAX_SHADER_RESOURCES];
263 unsigned count;
264 };
265
266 struct ilo_shader_cso {
267 uint32_t payload[5];
268 };
269
270 void
271 ilo_gpe_init_ve(const struct ilo_dev_info *dev,
272 unsigned num_states,
273 const struct pipe_vertex_element *states,
274 struct ilo_ve_state *ve);
275
276 void
277 ilo_gpe_set_viewport_cso(const struct ilo_dev_info *dev,
278 const struct pipe_viewport_state *state,
279 struct ilo_viewport_cso *vp);
280
281 void
282 ilo_gpe_set_scissor(const struct ilo_dev_info *dev,
283 unsigned start_slot,
284 unsigned num_states,
285 const struct pipe_scissor_state *states,
286 struct ilo_scissor_state *scissor);
287
288 void
289 ilo_gpe_set_scissor_null(const struct ilo_dev_info *dev,
290 struct ilo_scissor_state *scissor);
291
292 void
293 ilo_gpe_init_rasterizer_clip(const struct ilo_dev_info *dev,
294 const struct pipe_rasterizer_state *state,
295 struct ilo_rasterizer_clip *clip);
296
297 void
298 ilo_gpe_init_rasterizer_sf(const struct ilo_dev_info *dev,
299 const struct pipe_rasterizer_state *state,
300 struct ilo_rasterizer_sf *sf);
301
302 void
303 ilo_gpe_init_rasterizer_wm_gen6(const struct ilo_dev_info *dev,
304 const struct pipe_rasterizer_state *state,
305 struct ilo_rasterizer_wm *wm);
306
307 void
308 ilo_gpe_init_rasterizer_wm_gen7(const struct ilo_dev_info *dev,
309 const struct pipe_rasterizer_state *state,
310 struct ilo_rasterizer_wm *wm);
311
312 static inline void
313 ilo_gpe_init_rasterizer(const struct ilo_dev_info *dev,
314 const struct pipe_rasterizer_state *state,
315 struct ilo_rasterizer_state *rasterizer)
316 {
317 ilo_gpe_init_rasterizer_clip(dev, state, &rasterizer->clip);
318 ilo_gpe_init_rasterizer_sf(dev, state, &rasterizer->sf);
319
320 if (dev->gen >= ILO_GEN(7))
321 ilo_gpe_init_rasterizer_wm_gen7(dev, state, &rasterizer->wm);
322 else
323 ilo_gpe_init_rasterizer_wm_gen6(dev, state, &rasterizer->wm);
324 }
325
326 void
327 ilo_gpe_init_dsa(const struct ilo_dev_info *dev,
328 const struct pipe_depth_stencil_alpha_state *state,
329 struct ilo_dsa_state *dsa);
330
331 void
332 ilo_gpe_init_blend(const struct ilo_dev_info *dev,
333 const struct pipe_blend_state *state,
334 struct ilo_blend_state *blend);
335
336 void
337 ilo_gpe_init_sampler_cso(const struct ilo_dev_info *dev,
338 const struct pipe_sampler_state *state,
339 struct ilo_sampler_cso *sampler);
340
341 void
342 ilo_gpe_init_view_surface_null_gen6(const struct ilo_dev_info *dev,
343 unsigned width, unsigned height,
344 unsigned depth, unsigned level,
345 struct ilo_view_surface *surf);
346
347 void
348 ilo_gpe_init_view_surface_for_buffer_gen6(const struct ilo_dev_info *dev,
349 const struct ilo_buffer *buf,
350 unsigned offset, unsigned size,
351 unsigned struct_size,
352 enum pipe_format elem_format,
353 bool is_rt, bool render_cache_rw,
354 struct ilo_view_surface *surf);
355
356 void
357 ilo_gpe_init_view_surface_for_texture_gen6(const struct ilo_dev_info *dev,
358 const struct ilo_texture *tex,
359 enum pipe_format format,
360 unsigned first_level,
361 unsigned num_levels,
362 unsigned first_layer,
363 unsigned num_layers,
364 bool is_rt, bool render_cache_rw,
365 struct ilo_view_surface *surf);
366
367 void
368 ilo_gpe_init_view_surface_null_gen7(const struct ilo_dev_info *dev,
369 unsigned width, unsigned height,
370 unsigned depth, unsigned level,
371 struct ilo_view_surface *surf);
372
373 void
374 ilo_gpe_init_view_surface_for_buffer_gen7(const struct ilo_dev_info *dev,
375 const struct ilo_buffer *buf,
376 unsigned offset, unsigned size,
377 unsigned struct_size,
378 enum pipe_format elem_format,
379 bool is_rt, bool render_cache_rw,
380 struct ilo_view_surface *surf);
381
382 void
383 ilo_gpe_init_view_surface_for_texture_gen7(const struct ilo_dev_info *dev,
384 const struct ilo_texture *tex,
385 enum pipe_format format,
386 unsigned first_level,
387 unsigned num_levels,
388 unsigned first_layer,
389 unsigned num_layers,
390 bool is_rt, bool render_cache_rw,
391 struct ilo_view_surface *surf);
392
393 static inline void
394 ilo_gpe_init_view_surface_null(const struct ilo_dev_info *dev,
395 unsigned width, unsigned height,
396 unsigned depth, unsigned level,
397 struct ilo_view_surface *surf)
398 {
399 if (dev->gen >= ILO_GEN(7)) {
400 ilo_gpe_init_view_surface_null_gen7(dev,
401 width, height, depth, level, surf);
402 }
403 else {
404 ilo_gpe_init_view_surface_null_gen6(dev,
405 width, height, depth, level, surf);
406 }
407 }
408
409 static inline void
410 ilo_gpe_init_view_surface_for_buffer(const struct ilo_dev_info *dev,
411 const struct ilo_buffer *buf,
412 unsigned offset, unsigned size,
413 unsigned struct_size,
414 enum pipe_format elem_format,
415 bool is_rt, bool render_cache_rw,
416 struct ilo_view_surface *surf)
417 {
418 if (dev->gen >= ILO_GEN(7)) {
419 ilo_gpe_init_view_surface_for_buffer_gen7(dev, buf, offset, size,
420 struct_size, elem_format, is_rt, render_cache_rw, surf);
421 }
422 else {
423 ilo_gpe_init_view_surface_for_buffer_gen6(dev, buf, offset, size,
424 struct_size, elem_format, is_rt, render_cache_rw, surf);
425 }
426 }
427
428 static inline void
429 ilo_gpe_init_view_surface_for_texture(const struct ilo_dev_info *dev,
430 const struct ilo_texture *tex,
431 enum pipe_format format,
432 unsigned first_level,
433 unsigned num_levels,
434 unsigned first_layer,
435 unsigned num_layers,
436 bool is_rt, bool render_cache_rw,
437 struct ilo_view_surface *surf)
438 {
439 if (dev->gen >= ILO_GEN(7)) {
440 ilo_gpe_init_view_surface_for_texture_gen7(dev, tex, format,
441 first_level, num_levels, first_layer, num_layers,
442 is_rt, render_cache_rw, surf);
443 }
444 else {
445 ilo_gpe_init_view_surface_for_texture_gen6(dev, tex, format,
446 first_level, num_levels, first_layer, num_layers,
447 is_rt, render_cache_rw, surf);
448 }
449 }
450
451 void
452 ilo_gpe_init_zs_surface(const struct ilo_dev_info *dev,
453 const struct ilo_texture *tex,
454 enum pipe_format format,
455 unsigned level,
456 unsigned first_layer, unsigned num_layers,
457 struct ilo_zs_surface *zs);
458
459 void
460 ilo_gpe_init_vs_cso(const struct ilo_dev_info *dev,
461 const struct ilo_shader_state *vs,
462 struct ilo_shader_cso *cso);
463
464 void
465 ilo_gpe_init_gs_cso_gen6(const struct ilo_dev_info *dev,
466 const struct ilo_shader_state *gs,
467 struct ilo_shader_cso *cso);
468
469 void
470 ilo_gpe_init_gs_cso_gen7(const struct ilo_dev_info *dev,
471 const struct ilo_shader_state *gs,
472 struct ilo_shader_cso *cso);
473
474 static inline void
475 ilo_gpe_init_gs_cso(const struct ilo_dev_info *dev,
476 const struct ilo_shader_state *gs,
477 struct ilo_shader_cso *cso)
478 {
479 if (dev->gen >= ILO_GEN(7)) {
480 ilo_gpe_init_gs_cso_gen7(dev, gs, cso);
481 }
482 else {
483 ilo_gpe_init_gs_cso_gen6(dev, gs, cso);
484 }
485 }
486
487 void
488 ilo_gpe_init_fs_cso_gen6(const struct ilo_dev_info *dev,
489 const struct ilo_shader_state *fs,
490 struct ilo_shader_cso *cso);
491
492 void
493 ilo_gpe_init_fs_cso_gen7(const struct ilo_dev_info *dev,
494 const struct ilo_shader_state *fs,
495 struct ilo_shader_cso *cso);
496
497 static inline void
498 ilo_gpe_init_fs_cso(const struct ilo_dev_info *dev,
499 const struct ilo_shader_state *fs,
500 struct ilo_shader_cso *cso)
501 {
502 if (dev->gen >= ILO_GEN(7)) {
503 ilo_gpe_init_fs_cso_gen7(dev, fs, cso);
504 }
505 else {
506 ilo_gpe_init_fs_cso_gen6(dev, fs, cso);
507 }
508 }
509
510 #endif /* ILO_GPE_H */