1 /*
2 * Mesa 3-D graphics library
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 ILO_STATE_SHADER_H
29 #define ILO_STATE_SHADER_H
30
31 #include "genhw/genhw.h"
32
33 #include "ilo_core.h"
34 #include "ilo_dev.h"
35
36 /**
37 * Kernel information.
38 */
39 struct ilo_state_shader_kernel_info {
40 /* usually 0 unless the shader has multiple kernels */
41 uint32_t offset;
42
43 uint8_t grf_start;
44 uint8_t pcb_attr_count;
45 };
46
47 /**
48 * Shader resources.
49 */
50 struct ilo_state_shader_resource_info {
51 /* for prefetches */
52 uint8_t sampler_count;
53 uint8_t surface_count;
54
55 bool has_uav;
56 };
57
58 /**
59 * URB inputs/outputs.
60 */
61 struct ilo_state_shader_urb_info {
62 uint8_t cv_input_attr_count;
63
64 uint8_t read_base;
65 uint8_t read_count;
66
67 uint8_t output_attr_count;
68
69 uint8_t user_cull_enables;
70 uint8_t user_clip_enables;
71 };
72
73 struct ilo_state_vs_info {
74 struct ilo_state_shader_kernel_info kernel;
75 struct ilo_state_shader_resource_info resource;
76 struct ilo_state_shader_urb_info urb;
77
78 uint32_t per_thread_scratch_size;
79 bool dispatch_enable;
80 bool stats_enable;
81 };
82
83 struct ilo_state_hs_info {
84 struct ilo_state_shader_kernel_info kernel;
85 struct ilo_state_shader_resource_info resource;
86 struct ilo_state_shader_urb_info urb;
87
88 uint32_t per_thread_scratch_size;
89 bool dispatch_enable;
90 bool stats_enable;
91 };
92
93 struct ilo_state_ds_info {
94 struct ilo_state_shader_kernel_info kernel;
95 struct ilo_state_shader_resource_info resource;
96 struct ilo_state_shader_urb_info urb;
97
98 uint32_t per_thread_scratch_size;
99 bool dispatch_enable;
100 bool stats_enable;
101 };
102
103 /**
104 * Stream output. Must be consistent with ilo_state_sol_info.
105 */
106 struct ilo_state_gs_sol_info {
107 bool sol_enable;
108 bool stats_enable;
109 bool render_disable;
110
111 uint16_t svbi_post_inc;
112
113 enum gen_reorder_mode tristrip_reorder;
114 };
115
116 struct ilo_state_gs_info {
117 struct ilo_state_shader_kernel_info kernel;
118 struct ilo_state_shader_resource_info resource;
119 struct ilo_state_shader_urb_info urb;
120
121 struct ilo_state_gs_sol_info sol;
122
123 uint32_t per_thread_scratch_size;
124 bool dispatch_enable;
125 bool stats_enable;
126 };
127
128 struct ilo_state_ps_io_info {
129 /* inputs */
130 enum gen_position_offset posoffset;
131 uint8_t attr_count;
132 bool use_z;
133 bool use_w;
134 bool use_coverage_mask;
135
136 /* outputs */
137 enum gen_pscdepth_mode pscdepth;
138 bool has_rt_write;
139 bool write_pixel_mask;
140 bool write_omask;
141 };
142
143 struct ilo_state_ps_params_info {
144 /* compatibility with raster states */
145 uint32_t sample_mask;
146 bool earlyz_control_psexec;
147
148 /* compatibility with cc states */
149 bool alpha_may_kill;
150 bool dual_source_blending;
151 bool has_writeable_rt;
152 };
153
154 struct ilo_state_ps_info {
155 struct ilo_state_shader_kernel_info kernel_8;
156 struct ilo_state_shader_kernel_info kernel_16;
157 struct ilo_state_shader_kernel_info kernel_32;
158 struct ilo_state_shader_resource_info resource;
159
160 struct ilo_state_ps_io_info io;
161 struct ilo_state_ps_params_info params;
162
163 uint32_t per_thread_scratch_size;
164
165 /* bitmask of GEN6_PS_DISPATCH_x */
166 uint8_t valid_kernels;
167 bool per_sample_dispatch;
168 bool sample_count_one;
169 bool cv_per_sample_interp;
170 bool cv_has_earlyz_op;
171
172 bool rt_clear_enable;
173 bool rt_resolve_enable;
174
175 bool cv_has_depth_buffer;
176 };
177
178 struct ilo_state_vs {
179 uint32_t vs[5];
180 uint32_t scratch_size;
181 };
182
183 struct ilo_state_hs {
184 uint32_t hs[4];
185 uint32_t scratch_size;
186 };
187
188 struct ilo_state_ds {
189 uint32_t te[3];
190 uint32_t ds[5];
191 uint32_t scratch_size;
192 };
193
194 struct ilo_state_gs {
195 uint32_t gs[5];
196 uint32_t scratch_size;
197 };
198
199 struct ilo_state_ps {
200 uint32_t ps[8];
201 uint32_t scratch_size;
202
203 struct ilo_state_ps_dispatch_conds {
204 bool ps_valid;
205
206 bool has_rt_write;
207 bool write_odepth;
208 bool write_ostencil;
209 bool has_uav_write;
210 bool ps_may_kill;
211 } conds;
212 };
213
214 bool
215 ilo_state_vs_init(struct ilo_state_vs *vs,
216 const struct ilo_dev *dev,
217 const struct ilo_state_vs_info *info);
218
219 bool
220 ilo_state_vs_init_disabled(struct ilo_state_vs *vs,
221 const struct ilo_dev *dev);
222
223 static inline uint32_t
ilo_state_vs_get_scratch_size(const struct ilo_state_vs * vs)224 ilo_state_vs_get_scratch_size(const struct ilo_state_vs *vs)
225 {
226 return vs->scratch_size;
227 }
228
229 bool
230 ilo_state_hs_init(struct ilo_state_hs *hs,
231 const struct ilo_dev *dev,
232 const struct ilo_state_hs_info *info);
233
234 bool
235 ilo_state_hs_init_disabled(struct ilo_state_hs *hs,
236 const struct ilo_dev *dev);
237
238
239 static inline uint32_t
ilo_state_hs_get_scratch_size(const struct ilo_state_hs * hs)240 ilo_state_hs_get_scratch_size(const struct ilo_state_hs *hs)
241 {
242 return hs->scratch_size;
243 }
244
245 bool
246 ilo_state_ds_init(struct ilo_state_ds *ds,
247 const struct ilo_dev *dev,
248 const struct ilo_state_ds_info *info);
249
250 bool
251 ilo_state_ds_init_disabled(struct ilo_state_ds *ds,
252 const struct ilo_dev *dev);
253
254 static inline uint32_t
ilo_state_ds_get_scratch_size(const struct ilo_state_ds * ds)255 ilo_state_ds_get_scratch_size(const struct ilo_state_ds *ds)
256 {
257 return ds->scratch_size;
258 }
259
260 bool
261 ilo_state_gs_init(struct ilo_state_gs *gs,
262 const struct ilo_dev *dev,
263 const struct ilo_state_gs_info *info);
264
265 bool
266 ilo_state_gs_init_disabled(struct ilo_state_gs *gs,
267 const struct ilo_dev *dev);
268
269 static inline uint32_t
ilo_state_gs_get_scratch_size(const struct ilo_state_gs * gs)270 ilo_state_gs_get_scratch_size(const struct ilo_state_gs *gs)
271 {
272 return gs->scratch_size;
273 }
274
275 bool
276 ilo_state_ps_init(struct ilo_state_ps *ps,
277 const struct ilo_dev *dev,
278 const struct ilo_state_ps_info *info);
279
280 bool
281 ilo_state_ps_init_disabled(struct ilo_state_ps *ps,
282 const struct ilo_dev *dev);
283
284 bool
285 ilo_state_ps_set_params(struct ilo_state_ps *ps,
286 const struct ilo_dev *dev,
287 const struct ilo_state_ps_params_info *params);
288
289 static inline uint32_t
ilo_state_ps_get_scratch_size(const struct ilo_state_ps * ps)290 ilo_state_ps_get_scratch_size(const struct ilo_state_ps *ps)
291 {
292 return ps->scratch_size;
293 }
294
295 #endif /* ILO_STATE_SHADER_H */
296