Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3769 | Serge | 1 | /* |
2 | * Copyright © 2006 Intel Corporation |
||
3 | * |
||
4 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
5 | * copy of this software and associated documentation files (the "Software"), |
||
6 | * to deal in the Software without restriction, including without limitation |
||
7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||
8 | * and/or sell copies of the Software, and to permit persons to whom the |
||
9 | * Software is furnished to do so, subject to the following conditions: |
||
10 | * |
||
11 | * The above copyright notice and this permission notice (including the next |
||
12 | * paragraph) shall be included in all copies or substantial portions of the |
||
13 | * Software. |
||
14 | * |
||
15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||
16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||
17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||
18 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||
19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||
20 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||
21 | * DEALINGS IN THE SOFTWARE. |
||
22 | * |
||
23 | * Authors: |
||
24 | * Eric Anholt |
||
25 | * Keith Packard |
||
26 | * Xiang Haihao |
||
27 | * |
||
28 | */ |
||
29 | |||
30 | /* |
||
31 | * Most of rendering codes are ported from xf86-video-intel/src/i965_video.c |
||
32 | */ |
||
33 | |||
34 | #include |
||
35 | #include |
||
36 | #include |
||
37 | #include |
||
38 | |||
39 | #include "intel_batchbuffer.h" |
||
40 | #include "intel_driver.h" |
||
41 | #include "i965_defines.h" |
||
42 | #include "i965_drv_video.h" |
||
43 | #include "i965_structs.h" |
||
44 | |||
45 | #include "i965_render.h" |
||
46 | |||
47 | #define SF_KERNEL_NUM_GRF 16 |
||
48 | #define SF_MAX_THREADS 1 |
||
49 | |||
50 | static const uint32_t sf_kernel_static[][4] = |
||
51 | { |
||
52 | #include "shaders/render/exa_sf.g4b" |
||
53 | }; |
||
54 | |||
55 | #define PS_KERNEL_NUM_GRF 32 |
||
56 | #define PS_MAX_THREADS 32 |
||
57 | |||
58 | #define I965_GRF_BLOCKS(nreg) ((nreg + 15) / 16 - 1) |
||
59 | |||
60 | static const uint32_t ps_kernel_static[][4] = |
||
61 | { |
||
62 | #include "shaders/render/exa_wm_xy.g4b" |
||
63 | #include "shaders/render/exa_wm_src_affine.g4b" |
||
64 | #include "shaders/render/exa_wm_src_sample_planar.g4b" |
||
65 | #include "shaders/render/exa_wm_yuv_rgb.g4b" |
||
66 | #include "shaders/render/exa_wm_write.g4b" |
||
67 | }; |
||
68 | static const uint32_t ps_subpic_kernel_static[][4] = |
||
69 | { |
||
70 | #include "shaders/render/exa_wm_xy.g4b" |
||
71 | #include "shaders/render/exa_wm_src_affine.g4b" |
||
72 | #include "shaders/render/exa_wm_src_sample_argb.g4b" |
||
73 | #include "shaders/render/exa_wm_write.g4b" |
||
74 | }; |
||
75 | |||
76 | /* On IRONLAKE */ |
||
77 | static const uint32_t sf_kernel_static_gen5[][4] = |
||
78 | { |
||
79 | #include "shaders/render/exa_sf.g4b.gen5" |
||
80 | }; |
||
81 | |||
82 | static const uint32_t ps_kernel_static_gen5[][4] = |
||
83 | { |
||
84 | #include "shaders/render/exa_wm_xy.g4b.gen5" |
||
85 | #include "shaders/render/exa_wm_src_affine.g4b.gen5" |
||
86 | #include "shaders/render/exa_wm_src_sample_planar.g4b.gen5" |
||
87 | #include "shaders/render/exa_wm_yuv_rgb.g4b.gen5" |
||
88 | #include "shaders/render/exa_wm_write.g4b.gen5" |
||
89 | }; |
||
90 | static const uint32_t ps_subpic_kernel_static_gen5[][4] = |
||
91 | { |
||
92 | #include "shaders/render/exa_wm_xy.g4b.gen5" |
||
93 | #include "shaders/render/exa_wm_src_affine.g4b.gen5" |
||
94 | #include "shaders/render/exa_wm_src_sample_argb.g4b.gen5" |
||
95 | #include "shaders/render/exa_wm_write.g4b.gen5" |
||
96 | }; |
||
97 | |||
98 | /* programs for Sandybridge */ |
||
99 | static const uint32_t sf_kernel_static_gen6[][4] = |
||
100 | { |
||
101 | }; |
||
102 | |||
103 | static const uint32_t ps_kernel_static_gen6[][4] = { |
||
104 | #include "shaders/render/exa_wm_src_affine.g6b" |
||
105 | #include "shaders/render/exa_wm_src_sample_planar.g6b" |
||
106 | #include "shaders/render/exa_wm_yuv_rgb.g6b" |
||
107 | #include "shaders/render/exa_wm_write.g6b" |
||
108 | }; |
||
109 | |||
110 | static const uint32_t ps_subpic_kernel_static_gen6[][4] = { |
||
111 | #include "shaders/render/exa_wm_src_affine.g6b" |
||
112 | #include "shaders/render/exa_wm_src_sample_argb.g6b" |
||
113 | #include "shaders/render/exa_wm_write.g6b" |
||
114 | }; |
||
115 | |||
116 | /* programs for Ivybridge */ |
||
117 | static const uint32_t sf_kernel_static_gen7[][4] = |
||
118 | { |
||
119 | }; |
||
120 | |||
121 | static const uint32_t ps_kernel_static_gen7[][4] = { |
||
122 | #include "shaders/render/exa_wm_src_affine.g7b" |
||
123 | #include "shaders/render/exa_wm_src_sample_planar.g7b" |
||
124 | #include "shaders/render/exa_wm_yuv_rgb.g7b" |
||
125 | #include "shaders/render/exa_wm_write.g7b" |
||
126 | }; |
||
127 | |||
128 | static const uint32_t ps_subpic_kernel_static_gen7[][4] = { |
||
129 | #include "shaders/render/exa_wm_src_affine.g7b" |
||
130 | #include "shaders/render/exa_wm_src_sample_argb.g7b" |
||
131 | #include "shaders/render/exa_wm_write.g7b" |
||
132 | }; |
||
133 | |||
134 | /* Programs for Haswell */ |
||
135 | static const uint32_t ps_kernel_static_gen7_haswell[][4] = { |
||
136 | #include "shaders/render/exa_wm_src_affine.g7b" |
||
137 | #include "shaders/render/exa_wm_src_sample_planar.g7b.haswell" |
||
138 | #include "shaders/render/exa_wm_yuv_rgb.g7b" |
||
139 | #include "shaders/render/exa_wm_write.g7b" |
||
140 | }; |
||
141 | |||
142 | #define SURFACE_STATE_PADDED_SIZE_I965 ALIGN(sizeof(struct i965_surface_state), 32) |
||
143 | #define SURFACE_STATE_PADDED_SIZE_GEN7 ALIGN(sizeof(struct gen7_surface_state), 32) |
||
144 | #define SURFACE_STATE_PADDED_SIZE MAX(SURFACE_STATE_PADDED_SIZE_I965, SURFACE_STATE_PADDED_SIZE_GEN7) |
||
145 | #define SURFACE_STATE_OFFSET(index) (SURFACE_STATE_PADDED_SIZE * index) |
||
146 | #define BINDING_TABLE_OFFSET SURFACE_STATE_OFFSET(MAX_RENDER_SURFACES) |
||
147 | |||
148 | static uint32_t float_to_uint (float f) |
||
149 | { |
||
150 | union { |
||
151 | uint32_t i; |
||
152 | float f; |
||
153 | } x; |
||
154 | |||
155 | x.f = f; |
||
156 | return x.i; |
||
157 | } |
||
158 | |||
159 | enum |
||
160 | { |
||
161 | SF_KERNEL = 0, |
||
162 | PS_KERNEL, |
||
163 | PS_SUBPIC_KERNEL |
||
164 | }; |
||
165 | |||
166 | static struct i965_kernel render_kernels_gen4[] = { |
||
167 | { |
||
168 | "SF", |
||
169 | SF_KERNEL, |
||
170 | sf_kernel_static, |
||
171 | sizeof(sf_kernel_static), |
||
172 | NULL |
||
173 | }, |
||
174 | { |
||
175 | "PS", |
||
176 | PS_KERNEL, |
||
177 | ps_kernel_static, |
||
178 | sizeof(ps_kernel_static), |
||
179 | NULL |
||
180 | }, |
||
181 | |||
182 | { |
||
183 | "PS_SUBPIC", |
||
184 | PS_SUBPIC_KERNEL, |
||
185 | ps_subpic_kernel_static, |
||
186 | sizeof(ps_subpic_kernel_static), |
||
187 | NULL |
||
188 | } |
||
189 | }; |
||
190 | |||
191 | static struct i965_kernel render_kernels_gen5[] = { |
||
192 | { |
||
193 | "SF", |
||
194 | SF_KERNEL, |
||
195 | sf_kernel_static_gen5, |
||
196 | sizeof(sf_kernel_static_gen5), |
||
197 | NULL |
||
198 | }, |
||
199 | { |
||
200 | "PS", |
||
201 | PS_KERNEL, |
||
202 | ps_kernel_static_gen5, |
||
203 | sizeof(ps_kernel_static_gen5), |
||
204 | NULL |
||
205 | }, |
||
206 | |||
207 | { |
||
208 | "PS_SUBPIC", |
||
209 | PS_SUBPIC_KERNEL, |
||
210 | ps_subpic_kernel_static_gen5, |
||
211 | sizeof(ps_subpic_kernel_static_gen5), |
||
212 | NULL |
||
213 | } |
||
214 | }; |
||
215 | |||
216 | static struct i965_kernel render_kernels_gen6[] = { |
||
217 | { |
||
218 | "SF", |
||
219 | SF_KERNEL, |
||
220 | sf_kernel_static_gen6, |
||
221 | sizeof(sf_kernel_static_gen6), |
||
222 | NULL |
||
223 | }, |
||
224 | { |
||
225 | "PS", |
||
226 | PS_KERNEL, |
||
227 | ps_kernel_static_gen6, |
||
228 | sizeof(ps_kernel_static_gen6), |
||
229 | NULL |
||
230 | }, |
||
231 | |||
232 | { |
||
233 | "PS_SUBPIC", |
||
234 | PS_SUBPIC_KERNEL, |
||
235 | ps_subpic_kernel_static_gen6, |
||
236 | sizeof(ps_subpic_kernel_static_gen6), |
||
237 | NULL |
||
238 | } |
||
239 | }; |
||
240 | |||
241 | static struct i965_kernel render_kernels_gen7[] = { |
||
242 | { |
||
243 | "SF", |
||
244 | SF_KERNEL, |
||
245 | sf_kernel_static_gen7, |
||
246 | sizeof(sf_kernel_static_gen7), |
||
247 | NULL |
||
248 | }, |
||
249 | { |
||
250 | "PS", |
||
251 | PS_KERNEL, |
||
252 | ps_kernel_static_gen7, |
||
253 | sizeof(ps_kernel_static_gen7), |
||
254 | NULL |
||
255 | }, |
||
256 | |||
257 | { |
||
258 | "PS_SUBPIC", |
||
259 | PS_SUBPIC_KERNEL, |
||
260 | ps_subpic_kernel_static_gen7, |
||
261 | sizeof(ps_subpic_kernel_static_gen7), |
||
262 | NULL |
||
263 | } |
||
264 | }; |
||
265 | |||
266 | static struct i965_kernel render_kernels_gen7_haswell[] = { |
||
267 | { |
||
268 | "SF", |
||
269 | SF_KERNEL, |
||
270 | sf_kernel_static_gen7, |
||
271 | sizeof(sf_kernel_static_gen7), |
||
272 | NULL |
||
273 | }, |
||
274 | { |
||
275 | "PS", |
||
276 | PS_KERNEL, |
||
277 | ps_kernel_static_gen7_haswell, |
||
278 | sizeof(ps_kernel_static_gen7_haswell), |
||
279 | NULL |
||
280 | }, |
||
281 | |||
282 | { |
||
283 | "PS_SUBPIC", |
||
284 | PS_SUBPIC_KERNEL, |
||
285 | ps_subpic_kernel_static_gen7, |
||
286 | sizeof(ps_subpic_kernel_static_gen7), |
||
287 | NULL |
||
288 | } |
||
289 | }; |
||
290 | |||
291 | #define URB_VS_ENTRIES 8 |
||
292 | #define URB_VS_ENTRY_SIZE 1 |
||
293 | |||
294 | #define URB_GS_ENTRIES 0 |
||
295 | #define URB_GS_ENTRY_SIZE 0 |
||
296 | |||
297 | #define URB_CLIP_ENTRIES 0 |
||
298 | #define URB_CLIP_ENTRY_SIZE 0 |
||
299 | |||
300 | #define URB_SF_ENTRIES 1 |
||
301 | #define URB_SF_ENTRY_SIZE 2 |
||
302 | |||
303 | #define URB_CS_ENTRIES 1 |
||
304 | #define URB_CS_ENTRY_SIZE 1 |
||
305 | |||
306 | static void |
||
307 | i965_render_vs_unit(VADriverContextP ctx) |
||
308 | { |
||
309 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
310 | struct i965_render_state *render_state = &i965->render_state; |
||
311 | struct i965_vs_unit_state *vs_state; |
||
312 | |||
313 | dri_bo_map(render_state->vs.state, 1); |
||
314 | assert(render_state->vs.state->virtual); |
||
315 | vs_state = render_state->vs.state->virtual; |
||
316 | memset(vs_state, 0, sizeof(*vs_state)); |
||
317 | |||
318 | if (IS_IRONLAKE(i965->intel.device_id)) |
||
319 | vs_state->thread4.nr_urb_entries = URB_VS_ENTRIES >> 2; |
||
320 | else |
||
321 | vs_state->thread4.nr_urb_entries = URB_VS_ENTRIES; |
||
322 | |||
323 | vs_state->thread4.urb_entry_allocation_size = URB_VS_ENTRY_SIZE - 1; |
||
324 | vs_state->vs6.vs_enable = 0; |
||
325 | vs_state->vs6.vert_cache_disable = 1; |
||
326 | |||
327 | dri_bo_unmap(render_state->vs.state); |
||
328 | } |
||
329 | |||
330 | static void |
||
331 | i965_render_sf_unit(VADriverContextP ctx) |
||
332 | { |
||
333 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
334 | struct i965_render_state *render_state = &i965->render_state; |
||
335 | struct i965_sf_unit_state *sf_state; |
||
336 | |||
337 | dri_bo_map(render_state->sf.state, 1); |
||
338 | assert(render_state->sf.state->virtual); |
||
339 | sf_state = render_state->sf.state->virtual; |
||
340 | memset(sf_state, 0, sizeof(*sf_state)); |
||
341 | |||
342 | sf_state->thread0.grf_reg_count = I965_GRF_BLOCKS(SF_KERNEL_NUM_GRF); |
||
343 | sf_state->thread0.kernel_start_pointer = render_state->render_kernels[SF_KERNEL].bo->offset >> 6; |
||
344 | |||
345 | sf_state->sf1.single_program_flow = 1; /* XXX */ |
||
346 | sf_state->sf1.binding_table_entry_count = 0; |
||
347 | sf_state->sf1.thread_priority = 0; |
||
348 | sf_state->sf1.floating_point_mode = 0; /* Mesa does this */ |
||
349 | sf_state->sf1.illegal_op_exception_enable = 1; |
||
350 | sf_state->sf1.mask_stack_exception_enable = 1; |
||
351 | sf_state->sf1.sw_exception_enable = 1; |
||
352 | |||
353 | /* scratch space is not used in our kernel */ |
||
354 | sf_state->thread2.per_thread_scratch_space = 0; |
||
355 | sf_state->thread2.scratch_space_base_pointer = 0; |
||
356 | |||
357 | sf_state->thread3.const_urb_entry_read_length = 0; /* no const URBs */ |
||
358 | sf_state->thread3.const_urb_entry_read_offset = 0; /* no const URBs */ |
||
359 | sf_state->thread3.urb_entry_read_length = 1; /* 1 URB per vertex */ |
||
360 | sf_state->thread3.urb_entry_read_offset = 0; |
||
361 | sf_state->thread3.dispatch_grf_start_reg = 3; |
||
362 | |||
363 | sf_state->thread4.max_threads = SF_MAX_THREADS - 1; |
||
364 | sf_state->thread4.urb_entry_allocation_size = URB_SF_ENTRY_SIZE - 1; |
||
365 | sf_state->thread4.nr_urb_entries = URB_SF_ENTRIES; |
||
366 | sf_state->thread4.stats_enable = 1; |
||
367 | |||
368 | sf_state->sf5.viewport_transform = 0; /* skip viewport */ |
||
369 | |||
370 | sf_state->sf6.cull_mode = I965_CULLMODE_NONE; |
||
371 | sf_state->sf6.scissor = 0; |
||
372 | |||
373 | sf_state->sf7.trifan_pv = 2; |
||
374 | |||
375 | sf_state->sf6.dest_org_vbias = 0x8; |
||
376 | sf_state->sf6.dest_org_hbias = 0x8; |
||
377 | |||
378 | dri_bo_emit_reloc(render_state->sf.state, |
||
379 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
380 | sf_state->thread0.grf_reg_count << 1, |
||
381 | offsetof(struct i965_sf_unit_state, thread0), |
||
382 | render_state->render_kernels[SF_KERNEL].bo); |
||
383 | |||
384 | dri_bo_unmap(render_state->sf.state); |
||
385 | } |
||
386 | |||
387 | static void |
||
388 | i965_render_sampler(VADriverContextP ctx) |
||
389 | { |
||
390 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
391 | struct i965_render_state *render_state = &i965->render_state; |
||
392 | struct i965_sampler_state *sampler_state; |
||
393 | int i; |
||
394 | |||
395 | assert(render_state->wm.sampler_count > 0); |
||
396 | assert(render_state->wm.sampler_count <= MAX_SAMPLERS); |
||
397 | |||
398 | dri_bo_map(render_state->wm.sampler, 1); |
||
399 | assert(render_state->wm.sampler->virtual); |
||
400 | sampler_state = render_state->wm.sampler->virtual; |
||
401 | for (i = 0; i < render_state->wm.sampler_count; i++) { |
||
402 | memset(sampler_state, 0, sizeof(*sampler_state)); |
||
403 | sampler_state->ss0.min_filter = I965_MAPFILTER_LINEAR; |
||
404 | sampler_state->ss0.mag_filter = I965_MAPFILTER_LINEAR; |
||
405 | sampler_state->ss1.r_wrap_mode = I965_TEXCOORDMODE_CLAMP; |
||
406 | sampler_state->ss1.s_wrap_mode = I965_TEXCOORDMODE_CLAMP; |
||
407 | sampler_state->ss1.t_wrap_mode = I965_TEXCOORDMODE_CLAMP; |
||
408 | sampler_state++; |
||
409 | } |
||
410 | |||
411 | dri_bo_unmap(render_state->wm.sampler); |
||
412 | } |
||
413 | static void |
||
414 | i965_subpic_render_wm_unit(VADriverContextP ctx) |
||
415 | { |
||
416 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
417 | struct i965_render_state *render_state = &i965->render_state; |
||
418 | struct i965_wm_unit_state *wm_state; |
||
419 | |||
420 | assert(render_state->wm.sampler); |
||
421 | |||
422 | dri_bo_map(render_state->wm.state, 1); |
||
423 | assert(render_state->wm.state->virtual); |
||
424 | wm_state = render_state->wm.state->virtual; |
||
425 | memset(wm_state, 0, sizeof(*wm_state)); |
||
426 | |||
427 | wm_state->thread0.grf_reg_count = I965_GRF_BLOCKS(PS_KERNEL_NUM_GRF); |
||
428 | wm_state->thread0.kernel_start_pointer = render_state->render_kernels[PS_SUBPIC_KERNEL].bo->offset >> 6; |
||
429 | |||
430 | wm_state->thread1.single_program_flow = 1; /* XXX */ |
||
431 | |||
432 | if (IS_IRONLAKE(i965->intel.device_id)) |
||
433 | wm_state->thread1.binding_table_entry_count = 0; /* hardware requirement */ |
||
434 | else |
||
435 | wm_state->thread1.binding_table_entry_count = 7; |
||
436 | |||
437 | wm_state->thread2.scratch_space_base_pointer = 0; |
||
438 | wm_state->thread2.per_thread_scratch_space = 0; /* 1024 bytes */ |
||
439 | |||
440 | wm_state->thread3.dispatch_grf_start_reg = 3; /* XXX */ |
||
441 | wm_state->thread3.const_urb_entry_read_length = 0; |
||
442 | wm_state->thread3.const_urb_entry_read_offset = 0; |
||
443 | wm_state->thread3.urb_entry_read_length = 1; /* XXX */ |
||
444 | wm_state->thread3.urb_entry_read_offset = 0; /* XXX */ |
||
445 | |||
446 | wm_state->wm4.stats_enable = 0; |
||
447 | wm_state->wm4.sampler_state_pointer = render_state->wm.sampler->offset >> 5; |
||
448 | |||
449 | if (IS_IRONLAKE(i965->intel.device_id)) { |
||
450 | wm_state->wm4.sampler_count = 0; /* hardware requirement */ |
||
451 | } else { |
||
452 | wm_state->wm4.sampler_count = (render_state->wm.sampler_count + 3) / 4; |
||
453 | } |
||
454 | |||
455 | wm_state->wm5.max_threads = render_state->max_wm_threads - 1; |
||
456 | wm_state->wm5.thread_dispatch_enable = 1; |
||
457 | wm_state->wm5.enable_16_pix = 1; |
||
458 | wm_state->wm5.enable_8_pix = 0; |
||
459 | wm_state->wm5.early_depth_test = 1; |
||
460 | |||
461 | dri_bo_emit_reloc(render_state->wm.state, |
||
462 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
463 | wm_state->thread0.grf_reg_count << 1, |
||
464 | offsetof(struct i965_wm_unit_state, thread0), |
||
465 | render_state->render_kernels[PS_SUBPIC_KERNEL].bo); |
||
466 | |||
467 | dri_bo_emit_reloc(render_state->wm.state, |
||
468 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
469 | wm_state->wm4.sampler_count << 2, |
||
470 | offsetof(struct i965_wm_unit_state, wm4), |
||
471 | render_state->wm.sampler); |
||
472 | |||
473 | dri_bo_unmap(render_state->wm.state); |
||
474 | } |
||
475 | |||
476 | |||
477 | static void |
||
478 | i965_render_wm_unit(VADriverContextP ctx) |
||
479 | { |
||
480 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
481 | struct i965_render_state *render_state = &i965->render_state; |
||
482 | struct i965_wm_unit_state *wm_state; |
||
483 | |||
484 | assert(render_state->wm.sampler); |
||
485 | |||
486 | dri_bo_map(render_state->wm.state, 1); |
||
487 | assert(render_state->wm.state->virtual); |
||
488 | wm_state = render_state->wm.state->virtual; |
||
489 | memset(wm_state, 0, sizeof(*wm_state)); |
||
490 | |||
491 | wm_state->thread0.grf_reg_count = I965_GRF_BLOCKS(PS_KERNEL_NUM_GRF); |
||
492 | wm_state->thread0.kernel_start_pointer = render_state->render_kernels[PS_KERNEL].bo->offset >> 6; |
||
493 | |||
494 | wm_state->thread1.single_program_flow = 1; /* XXX */ |
||
495 | |||
496 | if (IS_IRONLAKE(i965->intel.device_id)) |
||
497 | wm_state->thread1.binding_table_entry_count = 0; /* hardware requirement */ |
||
498 | else |
||
499 | wm_state->thread1.binding_table_entry_count = 7; |
||
500 | |||
501 | wm_state->thread2.scratch_space_base_pointer = 0; |
||
502 | wm_state->thread2.per_thread_scratch_space = 0; /* 1024 bytes */ |
||
503 | |||
504 | wm_state->thread3.dispatch_grf_start_reg = 2; /* XXX */ |
||
505 | wm_state->thread3.const_urb_entry_read_length = 1; |
||
506 | wm_state->thread3.const_urb_entry_read_offset = 0; |
||
507 | wm_state->thread3.urb_entry_read_length = 1; /* XXX */ |
||
508 | wm_state->thread3.urb_entry_read_offset = 0; /* XXX */ |
||
509 | |||
510 | wm_state->wm4.stats_enable = 0; |
||
511 | wm_state->wm4.sampler_state_pointer = render_state->wm.sampler->offset >> 5; |
||
512 | |||
513 | if (IS_IRONLAKE(i965->intel.device_id)) { |
||
514 | wm_state->wm4.sampler_count = 0; /* hardware requirement */ |
||
515 | } else { |
||
516 | wm_state->wm4.sampler_count = (render_state->wm.sampler_count + 3) / 4; |
||
517 | } |
||
518 | |||
519 | wm_state->wm5.max_threads = render_state->max_wm_threads - 1; |
||
520 | wm_state->wm5.thread_dispatch_enable = 1; |
||
521 | wm_state->wm5.enable_16_pix = 1; |
||
522 | wm_state->wm5.enable_8_pix = 0; |
||
523 | wm_state->wm5.early_depth_test = 1; |
||
524 | |||
525 | dri_bo_emit_reloc(render_state->wm.state, |
||
526 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
527 | wm_state->thread0.grf_reg_count << 1, |
||
528 | offsetof(struct i965_wm_unit_state, thread0), |
||
529 | render_state->render_kernels[PS_KERNEL].bo); |
||
530 | |||
531 | dri_bo_emit_reloc(render_state->wm.state, |
||
532 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
533 | wm_state->wm4.sampler_count << 2, |
||
534 | offsetof(struct i965_wm_unit_state, wm4), |
||
535 | render_state->wm.sampler); |
||
536 | |||
537 | dri_bo_unmap(render_state->wm.state); |
||
538 | } |
||
539 | |||
540 | static void |
||
541 | i965_render_cc_viewport(VADriverContextP ctx) |
||
542 | { |
||
543 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
544 | struct i965_render_state *render_state = &i965->render_state; |
||
545 | struct i965_cc_viewport *cc_viewport; |
||
546 | |||
547 | dri_bo_map(render_state->cc.viewport, 1); |
||
548 | assert(render_state->cc.viewport->virtual); |
||
549 | cc_viewport = render_state->cc.viewport->virtual; |
||
550 | memset(cc_viewport, 0, sizeof(*cc_viewport)); |
||
551 | |||
552 | cc_viewport->min_depth = -1.e35; |
||
553 | cc_viewport->max_depth = 1.e35; |
||
554 | |||
555 | dri_bo_unmap(render_state->cc.viewport); |
||
556 | } |
||
557 | |||
558 | static void |
||
559 | i965_subpic_render_cc_unit(VADriverContextP ctx) |
||
560 | { |
||
561 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
562 | struct i965_render_state *render_state = &i965->render_state; |
||
563 | struct i965_cc_unit_state *cc_state; |
||
564 | |||
565 | assert(render_state->cc.viewport); |
||
566 | |||
567 | dri_bo_map(render_state->cc.state, 1); |
||
568 | assert(render_state->cc.state->virtual); |
||
569 | cc_state = render_state->cc.state->virtual; |
||
570 | memset(cc_state, 0, sizeof(*cc_state)); |
||
571 | |||
572 | cc_state->cc0.stencil_enable = 0; /* disable stencil */ |
||
573 | cc_state->cc2.depth_test = 0; /* disable depth test */ |
||
574 | cc_state->cc2.logicop_enable = 0; /* disable logic op */ |
||
575 | cc_state->cc3.ia_blend_enable = 0 ; /* blend alpha just like colors */ |
||
576 | cc_state->cc3.blend_enable = 1; /* enable color blend */ |
||
577 | cc_state->cc3.alpha_test = 0; /* disable alpha test */ |
||
578 | cc_state->cc3.alpha_test_format = 0;//0:ALPHATEST_UNORM8; /*store alpha value with UNORM8 */ |
||
579 | cc_state->cc3.alpha_test_func = 5;//COMPAREFUNCTION_LESS; /*pass if less than the reference */ |
||
580 | cc_state->cc4.cc_viewport_state_offset = render_state->cc.viewport->offset >> 5; |
||
581 | |||
582 | cc_state->cc5.dither_enable = 0; /* disable dither */ |
||
583 | cc_state->cc5.logicop_func = 0xc; /* WHITE */ |
||
584 | cc_state->cc5.statistics_enable = 1; |
||
585 | cc_state->cc5.ia_blend_function = I965_BLENDFUNCTION_ADD; |
||
586 | cc_state->cc5.ia_src_blend_factor = I965_BLENDFACTOR_DST_ALPHA; |
||
587 | cc_state->cc5.ia_dest_blend_factor = I965_BLENDFACTOR_DST_ALPHA; |
||
588 | |||
589 | cc_state->cc6.clamp_post_alpha_blend = 0; |
||
590 | cc_state->cc6.clamp_pre_alpha_blend =0; |
||
591 | |||
592 | /*final color = src_color*src_blend_factor +/- dst_color*dest_color_blend_factor*/ |
||
593 | cc_state->cc6.blend_function = I965_BLENDFUNCTION_ADD; |
||
594 | cc_state->cc6.src_blend_factor = I965_BLENDFACTOR_SRC_ALPHA; |
||
595 | cc_state->cc6.dest_blend_factor = I965_BLENDFACTOR_INV_SRC_ALPHA; |
||
596 | |||
597 | /*alpha test reference*/ |
||
598 | cc_state->cc7.alpha_ref.f =0.0 ; |
||
599 | |||
600 | |||
601 | dri_bo_emit_reloc(render_state->cc.state, |
||
602 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
603 | 0, |
||
604 | offsetof(struct i965_cc_unit_state, cc4), |
||
605 | render_state->cc.viewport); |
||
606 | |||
607 | dri_bo_unmap(render_state->cc.state); |
||
608 | } |
||
609 | |||
610 | |||
611 | static void |
||
612 | i965_render_cc_unit(VADriverContextP ctx) |
||
613 | { |
||
614 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
615 | struct i965_render_state *render_state = &i965->render_state; |
||
616 | struct i965_cc_unit_state *cc_state; |
||
617 | |||
618 | assert(render_state->cc.viewport); |
||
619 | |||
620 | dri_bo_map(render_state->cc.state, 1); |
||
621 | assert(render_state->cc.state->virtual); |
||
622 | cc_state = render_state->cc.state->virtual; |
||
623 | memset(cc_state, 0, sizeof(*cc_state)); |
||
624 | |||
625 | cc_state->cc0.stencil_enable = 0; /* disable stencil */ |
||
626 | cc_state->cc2.depth_test = 0; /* disable depth test */ |
||
627 | cc_state->cc2.logicop_enable = 1; /* enable logic op */ |
||
628 | cc_state->cc3.ia_blend_enable = 0; /* blend alpha just like colors */ |
||
629 | cc_state->cc3.blend_enable = 0; /* disable color blend */ |
||
630 | cc_state->cc3.alpha_test = 0; /* disable alpha test */ |
||
631 | cc_state->cc4.cc_viewport_state_offset = render_state->cc.viewport->offset >> 5; |
||
632 | |||
633 | cc_state->cc5.dither_enable = 0; /* disable dither */ |
||
634 | cc_state->cc5.logicop_func = 0xc; /* WHITE */ |
||
635 | cc_state->cc5.statistics_enable = 1; |
||
636 | cc_state->cc5.ia_blend_function = I965_BLENDFUNCTION_ADD; |
||
637 | cc_state->cc5.ia_src_blend_factor = I965_BLENDFACTOR_ONE; |
||
638 | cc_state->cc5.ia_dest_blend_factor = I965_BLENDFACTOR_ONE; |
||
639 | |||
640 | dri_bo_emit_reloc(render_state->cc.state, |
||
641 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
642 | 0, |
||
643 | offsetof(struct i965_cc_unit_state, cc4), |
||
644 | render_state->cc.viewport); |
||
645 | |||
646 | dri_bo_unmap(render_state->cc.state); |
||
647 | } |
||
648 | |||
649 | static void |
||
650 | i965_render_set_surface_tiling(struct i965_surface_state *ss, unsigned int tiling) |
||
651 | { |
||
652 | switch (tiling) { |
||
653 | case I915_TILING_NONE: |
||
654 | ss->ss3.tiled_surface = 0; |
||
655 | ss->ss3.tile_walk = 0; |
||
656 | break; |
||
657 | case I915_TILING_X: |
||
658 | ss->ss3.tiled_surface = 1; |
||
659 | ss->ss3.tile_walk = I965_TILEWALK_XMAJOR; |
||
660 | break; |
||
661 | case I915_TILING_Y: |
||
662 | ss->ss3.tiled_surface = 1; |
||
663 | ss->ss3.tile_walk = I965_TILEWALK_YMAJOR; |
||
664 | break; |
||
665 | } |
||
666 | } |
||
667 | |||
668 | static void |
||
669 | i965_render_set_surface_state( |
||
670 | struct i965_surface_state *ss, |
||
671 | dri_bo *bo, |
||
672 | unsigned long offset, |
||
673 | unsigned int width, |
||
674 | unsigned int height, |
||
675 | unsigned int pitch, |
||
676 | unsigned int format, |
||
677 | unsigned int flags |
||
678 | ) |
||
679 | { |
||
680 | unsigned int tiling; |
||
681 | unsigned int swizzle; |
||
682 | |||
683 | memset(ss, 0, sizeof(*ss)); |
||
684 | |||
685 | switch (flags & (I965_PP_FLAG_TOP_FIELD|I965_PP_FLAG_BOTTOM_FIELD)) { |
||
686 | case I965_PP_FLAG_BOTTOM_FIELD: |
||
687 | ss->ss0.vert_line_stride_ofs = 1; |
||
688 | /* fall-through */ |
||
689 | case I965_PP_FLAG_TOP_FIELD: |
||
690 | ss->ss0.vert_line_stride = 1; |
||
691 | height /= 2; |
||
692 | break; |
||
693 | } |
||
694 | |||
695 | ss->ss0.surface_type = I965_SURFACE_2D; |
||
696 | ss->ss0.surface_format = format; |
||
697 | ss->ss0.color_blend = 1; |
||
698 | |||
699 | ss->ss1.base_addr = bo->offset + offset; |
||
700 | |||
701 | ss->ss2.width = width - 1; |
||
702 | ss->ss2.height = height - 1; |
||
703 | |||
704 | ss->ss3.pitch = pitch - 1; |
||
705 | |||
706 | dri_bo_get_tiling(bo, &tiling, &swizzle); |
||
707 | i965_render_set_surface_tiling(ss, tiling); |
||
708 | } |
||
709 | |||
710 | static void |
||
711 | gen7_render_set_surface_tiling(struct gen7_surface_state *ss, uint32_t tiling) |
||
712 | { |
||
713 | switch (tiling) { |
||
714 | case I915_TILING_NONE: |
||
715 | ss->ss0.tiled_surface = 0; |
||
716 | ss->ss0.tile_walk = 0; |
||
717 | break; |
||
718 | case I915_TILING_X: |
||
719 | ss->ss0.tiled_surface = 1; |
||
720 | ss->ss0.tile_walk = I965_TILEWALK_XMAJOR; |
||
721 | break; |
||
722 | case I915_TILING_Y: |
||
723 | ss->ss0.tiled_surface = 1; |
||
724 | ss->ss0.tile_walk = I965_TILEWALK_YMAJOR; |
||
725 | break; |
||
726 | } |
||
727 | } |
||
728 | |||
729 | /* Set "Shader Channel Select" */ |
||
730 | void |
||
731 | gen7_render_set_surface_scs(struct gen7_surface_state *ss) |
||
732 | { |
||
733 | ss->ss7.shader_chanel_select_r = HSW_SCS_RED; |
||
734 | ss->ss7.shader_chanel_select_g = HSW_SCS_GREEN; |
||
735 | ss->ss7.shader_chanel_select_b = HSW_SCS_BLUE; |
||
736 | ss->ss7.shader_chanel_select_a = HSW_SCS_ALPHA; |
||
737 | } |
||
738 | |||
739 | static void |
||
740 | gen7_render_set_surface_state( |
||
741 | struct gen7_surface_state *ss, |
||
742 | dri_bo *bo, |
||
743 | unsigned long offset, |
||
744 | int width, |
||
745 | int height, |
||
746 | int pitch, |
||
747 | int format, |
||
748 | unsigned int flags |
||
749 | ) |
||
750 | { |
||
751 | unsigned int tiling; |
||
752 | unsigned int swizzle; |
||
753 | |||
754 | memset(ss, 0, sizeof(*ss)); |
||
755 | |||
756 | switch (flags & (I965_PP_FLAG_TOP_FIELD|I965_PP_FLAG_BOTTOM_FIELD)) { |
||
757 | case I965_PP_FLAG_BOTTOM_FIELD: |
||
758 | ss->ss0.vert_line_stride_ofs = 1; |
||
759 | /* fall-through */ |
||
760 | case I965_PP_FLAG_TOP_FIELD: |
||
761 | ss->ss0.vert_line_stride = 1; |
||
762 | height /= 2; |
||
763 | break; |
||
764 | } |
||
765 | |||
766 | ss->ss0.surface_type = I965_SURFACE_2D; |
||
767 | ss->ss0.surface_format = format; |
||
768 | |||
769 | ss->ss1.base_addr = bo->offset + offset; |
||
770 | |||
771 | ss->ss2.width = width - 1; |
||
772 | ss->ss2.height = height - 1; |
||
773 | |||
774 | ss->ss3.pitch = pitch - 1; |
||
775 | |||
776 | dri_bo_get_tiling(bo, &tiling, &swizzle); |
||
777 | gen7_render_set_surface_tiling(ss, tiling); |
||
778 | } |
||
779 | |||
780 | static void |
||
781 | i965_render_src_surface_state( |
||
782 | VADriverContextP ctx, |
||
783 | int index, |
||
784 | dri_bo *region, |
||
785 | unsigned long offset, |
||
786 | int w, |
||
787 | int h, |
||
788 | int pitch, |
||
789 | int format, |
||
790 | unsigned int flags |
||
791 | ) |
||
792 | { |
||
793 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
794 | struct i965_render_state *render_state = &i965->render_state; |
||
795 | void *ss; |
||
796 | dri_bo *ss_bo = render_state->wm.surface_state_binding_table_bo; |
||
797 | |||
798 | assert(index < MAX_RENDER_SURFACES); |
||
799 | |||
800 | dri_bo_map(ss_bo, 1); |
||
801 | assert(ss_bo->virtual); |
||
802 | ss = (char *)ss_bo->virtual + SURFACE_STATE_OFFSET(index); |
||
803 | |||
804 | if (IS_GEN7(i965->intel.device_id)) { |
||
805 | gen7_render_set_surface_state(ss, |
||
806 | region, offset, |
||
807 | w, h, |
||
808 | pitch, format, flags); |
||
809 | if (IS_HASWELL(i965->intel.device_id)) |
||
810 | gen7_render_set_surface_scs(ss); |
||
811 | dri_bo_emit_reloc(ss_bo, |
||
812 | I915_GEM_DOMAIN_SAMPLER, 0, |
||
813 | offset, |
||
814 | SURFACE_STATE_OFFSET(index) + offsetof(struct gen7_surface_state, ss1), |
||
815 | region); |
||
816 | } else { |
||
817 | i965_render_set_surface_state(ss, |
||
818 | region, offset, |
||
819 | w, h, |
||
820 | pitch, format, flags); |
||
821 | dri_bo_emit_reloc(ss_bo, |
||
822 | I915_GEM_DOMAIN_SAMPLER, 0, |
||
823 | offset, |
||
824 | SURFACE_STATE_OFFSET(index) + offsetof(struct i965_surface_state, ss1), |
||
825 | region); |
||
826 | } |
||
827 | |||
828 | ((unsigned int *)((char *)ss_bo->virtual + BINDING_TABLE_OFFSET))[index] = SURFACE_STATE_OFFSET(index); |
||
829 | dri_bo_unmap(ss_bo); |
||
830 | render_state->wm.sampler_count++; |
||
831 | } |
||
832 | |||
833 | static void |
||
834 | i965_render_src_surfaces_state( |
||
835 | VADriverContextP ctx, |
||
836 | VASurfaceID surface, |
||
837 | unsigned int flags |
||
838 | ) |
||
839 | { |
||
840 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
841 | struct object_surface *obj_surface; |
||
842 | int region_pitch; |
||
843 | int rw, rh; |
||
844 | dri_bo *region; |
||
845 | |||
846 | obj_surface = SURFACE(surface); |
||
847 | assert(obj_surface); |
||
848 | |||
849 | region_pitch = obj_surface->width; |
||
850 | rw = obj_surface->orig_width; |
||
851 | rh = obj_surface->orig_height; |
||
852 | region = obj_surface->bo; |
||
853 | |||
854 | i965_render_src_surface_state(ctx, 1, region, 0, rw, rh, region_pitch, I965_SURFACEFORMAT_R8_UNORM, flags); /* Y */ |
||
855 | i965_render_src_surface_state(ctx, 2, region, 0, rw, rh, region_pitch, I965_SURFACEFORMAT_R8_UNORM, flags); |
||
856 | |||
857 | if (obj_surface->fourcc == VA_FOURCC('N', 'V', '1', '2')) { |
||
858 | i965_render_src_surface_state(ctx, 3, region, |
||
859 | region_pitch * obj_surface->y_cb_offset, |
||
860 | obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch, |
||
861 | I965_SURFACEFORMAT_R8G8_UNORM, flags); /* UV */ |
||
862 | i965_render_src_surface_state(ctx, 4, region, |
||
863 | region_pitch * obj_surface->y_cb_offset, |
||
864 | obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch, |
||
865 | I965_SURFACEFORMAT_R8G8_UNORM, flags); |
||
866 | } else { |
||
867 | i965_render_src_surface_state(ctx, 3, region, |
||
868 | region_pitch * obj_surface->y_cb_offset, |
||
869 | obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch, |
||
870 | I965_SURFACEFORMAT_R8_UNORM, flags); /* U */ |
||
871 | i965_render_src_surface_state(ctx, 4, region, |
||
872 | region_pitch * obj_surface->y_cb_offset, |
||
873 | obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch, |
||
874 | I965_SURFACEFORMAT_R8_UNORM, flags); |
||
875 | i965_render_src_surface_state(ctx, 5, region, |
||
876 | region_pitch * obj_surface->y_cr_offset, |
||
877 | obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch, |
||
878 | I965_SURFACEFORMAT_R8_UNORM, flags); /* V */ |
||
879 | i965_render_src_surface_state(ctx, 6, region, |
||
880 | region_pitch * obj_surface->y_cr_offset, |
||
881 | obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch, |
||
882 | I965_SURFACEFORMAT_R8_UNORM, flags); |
||
883 | } |
||
884 | } |
||
885 | |||
886 | static void |
||
887 | i965_subpic_render_src_surfaces_state(VADriverContextP ctx, |
||
888 | VASurfaceID surface) |
||
889 | { |
||
890 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
891 | struct object_surface *obj_surface = SURFACE(surface); |
||
892 | dri_bo *subpic_region; |
||
893 | unsigned int index = obj_surface->subpic_render_idx; |
||
894 | struct object_subpic *obj_subpic = SUBPIC(obj_surface->subpic[index]); |
||
895 | struct object_image *obj_image = IMAGE(obj_subpic->image); |
||
896 | assert(obj_surface); |
||
897 | assert(obj_surface->bo); |
||
898 | subpic_region = obj_image->bo; |
||
899 | /*subpicture surface*/ |
||
900 | i965_render_src_surface_state(ctx, 1, subpic_region, 0, obj_subpic->width, obj_subpic->height, obj_subpic->pitch, obj_subpic->format, 0); |
||
901 | i965_render_src_surface_state(ctx, 2, subpic_region, 0, obj_subpic->width, obj_subpic->height, obj_subpic->pitch, obj_subpic->format, 0); |
||
902 | } |
||
903 | |||
904 | static void |
||
905 | i965_render_dest_surface_state(VADriverContextP ctx, int index) |
||
906 | { |
||
907 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
908 | struct i965_render_state *render_state = &i965->render_state; |
||
909 | struct intel_region *dest_region = render_state->draw_region; |
||
910 | void *ss; |
||
911 | dri_bo *ss_bo = render_state->wm.surface_state_binding_table_bo; |
||
912 | int format; |
||
913 | assert(index < MAX_RENDER_SURFACES); |
||
914 | |||
915 | if (dest_region->cpp == 2) { |
||
916 | format = I965_SURFACEFORMAT_B5G6R5_UNORM; |
||
917 | } else { |
||
918 | format = I965_SURFACEFORMAT_B8G8R8A8_UNORM; |
||
919 | } |
||
920 | |||
921 | dri_bo_map(ss_bo, 1); |
||
922 | assert(ss_bo->virtual); |
||
923 | ss = (char *)ss_bo->virtual + SURFACE_STATE_OFFSET(index); |
||
924 | |||
925 | if (IS_GEN7(i965->intel.device_id)) { |
||
926 | gen7_render_set_surface_state(ss, |
||
927 | dest_region->bo, 0, |
||
928 | dest_region->width, dest_region->height, |
||
929 | dest_region->pitch, format, 0); |
||
930 | if (IS_HASWELL(i965->intel.device_id)) |
||
931 | gen7_render_set_surface_scs(ss); |
||
932 | dri_bo_emit_reloc(ss_bo, |
||
933 | I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, |
||
934 | 0, |
||
935 | SURFACE_STATE_OFFSET(index) + offsetof(struct gen7_surface_state, ss1), |
||
936 | dest_region->bo); |
||
937 | } else { |
||
938 | i965_render_set_surface_state(ss, |
||
939 | dest_region->bo, 0, |
||
940 | dest_region->width, dest_region->height, |
||
941 | dest_region->pitch, format, 0); |
||
942 | dri_bo_emit_reloc(ss_bo, |
||
943 | I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, |
||
944 | 0, |
||
945 | SURFACE_STATE_OFFSET(index) + offsetof(struct i965_surface_state, ss1), |
||
946 | dest_region->bo); |
||
947 | } |
||
948 | |||
949 | ((unsigned int *)((char *)ss_bo->virtual + BINDING_TABLE_OFFSET))[index] = SURFACE_STATE_OFFSET(index); |
||
950 | dri_bo_unmap(ss_bo); |
||
951 | } |
||
952 | |||
953 | static void |
||
954 | i965_fill_vertex_buffer( |
||
955 | VADriverContextP ctx, |
||
956 | float tex_coords[4], /* [(u1,v1);(u2,v2)] */ |
||
957 | float vid_coords[4] /* [(x1,y1);(x2,y2)] */ |
||
958 | ) |
||
959 | { |
||
960 | struct i965_driver_data * const i965 = i965_driver_data(ctx); |
||
961 | float vb[12]; |
||
962 | |||
963 | enum { X1, Y1, X2, Y2 }; |
||
964 | |||
965 | static const unsigned int g_rotation_indices[][6] = { |
||
966 | [VA_ROTATION_NONE] = { X2, Y2, X1, Y2, X1, Y1 }, |
||
967 | [VA_ROTATION_90] = { X2, Y1, X2, Y2, X1, Y2 }, |
||
968 | [VA_ROTATION_180] = { X1, Y1, X2, Y1, X2, Y2 }, |
||
969 | [VA_ROTATION_270] = { X1, Y2, X1, Y1, X2, Y1 }, |
||
970 | }; |
||
971 | |||
972 | const unsigned int * const rotation_indices = |
||
973 | g_rotation_indices[i965->rotation_attrib->value]; |
||
974 | |||
975 | vb[0] = tex_coords[rotation_indices[0]]; /* bottom-right corner */ |
||
976 | vb[1] = tex_coords[rotation_indices[1]]; |
||
977 | vb[2] = vid_coords[X2]; |
||
978 | vb[3] = vid_coords[Y2]; |
||
979 | |||
980 | vb[4] = tex_coords[rotation_indices[2]]; /* bottom-left corner */ |
||
981 | vb[5] = tex_coords[rotation_indices[3]]; |
||
982 | vb[6] = vid_coords[X1]; |
||
983 | vb[7] = vid_coords[Y2]; |
||
984 | |||
985 | vb[8] = tex_coords[rotation_indices[4]]; /* top-left corner */ |
||
986 | vb[9] = tex_coords[rotation_indices[5]]; |
||
987 | vb[10] = vid_coords[X1]; |
||
988 | vb[11] = vid_coords[Y1]; |
||
989 | |||
990 | dri_bo_subdata(i965->render_state.vb.vertex_buffer, 0, sizeof(vb), vb); |
||
991 | } |
||
992 | |||
993 | static void |
||
994 | i965_subpic_render_upload_vertex(VADriverContextP ctx, |
||
995 | VASurfaceID surface, |
||
996 | const VARectangle *output_rect) |
||
997 | { |
||
998 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
999 | struct object_surface *obj_surface = SURFACE(surface); |
||
1000 | unsigned int index = obj_surface->subpic_render_idx; |
||
1001 | struct object_subpic *obj_subpic = SUBPIC(obj_surface->subpic[index]); |
||
1002 | float tex_coords[4], vid_coords[4]; |
||
1003 | VARectangle dst_rect; |
||
1004 | |||
1005 | if (obj_subpic->flags & VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD) |
||
1006 | dst_rect = obj_subpic->dst_rect; |
||
1007 | else { |
||
1008 | const float sx = (float)output_rect->width / obj_surface->orig_width; |
||
1009 | const float sy = (float)output_rect->height / obj_surface->orig_height; |
||
1010 | dst_rect.x = output_rect->x + sx * obj_subpic->dst_rect.x; |
||
1011 | dst_rect.y = output_rect->y + sy * obj_subpic->dst_rect.y; |
||
1012 | dst_rect.width = sx * obj_subpic->dst_rect.width; |
||
1013 | dst_rect.height = sy * obj_subpic->dst_rect.height; |
||
1014 | } |
||
1015 | |||
1016 | tex_coords[0] = (float)obj_subpic->src_rect.x / obj_subpic->width; |
||
1017 | tex_coords[1] = (float)obj_subpic->src_rect.y / obj_subpic->height; |
||
1018 | tex_coords[2] = (float)(obj_subpic->src_rect.x + obj_subpic->src_rect.width) / obj_subpic->width; |
||
1019 | tex_coords[3] = (float)(obj_subpic->src_rect.y + obj_subpic->src_rect.height) / obj_subpic->height; |
||
1020 | |||
1021 | vid_coords[0] = dst_rect.x; |
||
1022 | vid_coords[1] = dst_rect.y; |
||
1023 | vid_coords[2] = (float)(dst_rect.x + dst_rect.width); |
||
1024 | vid_coords[3] = (float)(dst_rect.y + dst_rect.height); |
||
1025 | |||
1026 | i965_fill_vertex_buffer(ctx, tex_coords, vid_coords); |
||
1027 | } |
||
1028 | |||
1029 | static void |
||
1030 | i965_render_upload_vertex( |
||
1031 | VADriverContextP ctx, |
||
1032 | VASurfaceID surface, |
||
1033 | const VARectangle *src_rect, |
||
1034 | const VARectangle *dst_rect |
||
1035 | ) |
||
1036 | { |
||
1037 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1038 | struct i965_render_state *render_state = &i965->render_state; |
||
1039 | struct intel_region *dest_region = render_state->draw_region; |
||
1040 | struct object_surface *obj_surface; |
||
1041 | float tex_coords[4], vid_coords[4]; |
||
1042 | int width, height; |
||
1043 | |||
1044 | obj_surface = SURFACE(surface); |
||
1045 | assert(surface); |
||
1046 | |||
1047 | width = obj_surface->orig_width; |
||
1048 | height = obj_surface->orig_height; |
||
1049 | |||
1050 | tex_coords[0] = (float)src_rect->x / width; |
||
1051 | tex_coords[1] = (float)src_rect->y / height; |
||
1052 | tex_coords[2] = (float)(src_rect->x + src_rect->width) / width; |
||
1053 | tex_coords[3] = (float)(src_rect->y + src_rect->height) / height; |
||
1054 | |||
1055 | vid_coords[0] = dest_region->x + dst_rect->x; |
||
1056 | vid_coords[1] = dest_region->y + dst_rect->y; |
||
1057 | vid_coords[2] = vid_coords[0] + dst_rect->width; |
||
1058 | vid_coords[3] = vid_coords[1] + dst_rect->height; |
||
1059 | |||
1060 | i965_fill_vertex_buffer(ctx, tex_coords, vid_coords); |
||
1061 | } |
||
1062 | |||
1063 | static void |
||
1064 | i965_render_upload_constants(VADriverContextP ctx, |
||
1065 | VASurfaceID surface) |
||
1066 | { |
||
1067 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1068 | struct i965_render_state *render_state = &i965->render_state; |
||
1069 | unsigned short *constant_buffer; |
||
1070 | struct object_surface *obj_surface = SURFACE(surface); |
||
1071 | |||
1072 | dri_bo_map(render_state->curbe.bo, 1); |
||
1073 | assert(render_state->curbe.bo->virtual); |
||
1074 | constant_buffer = render_state->curbe.bo->virtual; |
||
1075 | |||
1076 | if (obj_surface->subsampling == SUBSAMPLE_YUV400) { |
||
1077 | assert(obj_surface->fourcc == VA_FOURCC('I', 'M', 'C', '1') || |
||
1078 | obj_surface->fourcc == VA_FOURCC('I', 'M', 'C', '3')); |
||
1079 | *constant_buffer = 2; |
||
1080 | } else { |
||
1081 | if (obj_surface->fourcc == VA_FOURCC('N', 'V', '1', '2')) |
||
1082 | *constant_buffer = 1; |
||
1083 | else |
||
1084 | *constant_buffer = 0; |
||
1085 | } |
||
1086 | |||
1087 | dri_bo_unmap(render_state->curbe.bo); |
||
1088 | } |
||
1089 | |||
1090 | static void |
||
1091 | i965_subpic_render_upload_constants(VADriverContextP ctx, |
||
1092 | VASurfaceID surface) |
||
1093 | { |
||
1094 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1095 | struct i965_render_state *render_state = &i965->render_state; |
||
1096 | float *constant_buffer; |
||
1097 | float global_alpha = 1.0; |
||
1098 | struct object_surface *obj_surface = SURFACE(surface); |
||
1099 | unsigned int index = obj_surface->subpic_render_idx; |
||
1100 | |||
1101 | if(obj_surface->subpic[index] != VA_INVALID_ID){ |
||
1102 | struct object_subpic *obj_subpic= SUBPIC(obj_surface->subpic[index]); |
||
1103 | if(obj_subpic->flags & VA_SUBPICTURE_GLOBAL_ALPHA){ |
||
1104 | global_alpha = obj_subpic->global_alpha; |
||
1105 | } |
||
1106 | } |
||
1107 | |||
1108 | dri_bo_map(render_state->curbe.bo, 1); |
||
1109 | |||
1110 | assert(render_state->curbe.bo->virtual); |
||
1111 | constant_buffer = render_state->curbe.bo->virtual; |
||
1112 | *constant_buffer = global_alpha; |
||
1113 | |||
1114 | dri_bo_unmap(render_state->curbe.bo); |
||
1115 | } |
||
1116 | |||
1117 | static void |
||
1118 | i965_surface_render_state_setup( |
||
1119 | VADriverContextP ctx, |
||
1120 | VASurfaceID surface, |
||
1121 | const VARectangle *src_rect, |
||
1122 | const VARectangle *dst_rect, |
||
1123 | unsigned int flags |
||
1124 | ) |
||
1125 | { |
||
1126 | i965_render_vs_unit(ctx); |
||
1127 | i965_render_sf_unit(ctx); |
||
1128 | i965_render_dest_surface_state(ctx, 0); |
||
1129 | i965_render_src_surfaces_state(ctx, surface, flags); |
||
1130 | i965_render_sampler(ctx); |
||
1131 | i965_render_wm_unit(ctx); |
||
1132 | i965_render_cc_viewport(ctx); |
||
1133 | i965_render_cc_unit(ctx); |
||
1134 | i965_render_upload_vertex(ctx, surface, src_rect, dst_rect); |
||
1135 | i965_render_upload_constants(ctx, surface); |
||
1136 | } |
||
1137 | |||
1138 | static void |
||
1139 | i965_subpic_render_state_setup( |
||
1140 | VADriverContextP ctx, |
||
1141 | VASurfaceID surface, |
||
1142 | const VARectangle *src_rect, |
||
1143 | const VARectangle *dst_rect |
||
1144 | ) |
||
1145 | { |
||
1146 | i965_render_vs_unit(ctx); |
||
1147 | i965_render_sf_unit(ctx); |
||
1148 | i965_render_dest_surface_state(ctx, 0); |
||
1149 | i965_subpic_render_src_surfaces_state(ctx, surface); |
||
1150 | i965_render_sampler(ctx); |
||
1151 | i965_subpic_render_wm_unit(ctx); |
||
1152 | i965_render_cc_viewport(ctx); |
||
1153 | i965_subpic_render_cc_unit(ctx); |
||
1154 | i965_subpic_render_upload_constants(ctx, surface); |
||
1155 | i965_subpic_render_upload_vertex(ctx, surface, dst_rect); |
||
1156 | } |
||
1157 | |||
1158 | |||
1159 | static void |
||
1160 | i965_render_pipeline_select(VADriverContextP ctx) |
||
1161 | { |
||
1162 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1163 | struct intel_batchbuffer *batch = i965->batch; |
||
1164 | |||
1165 | BEGIN_BATCH(batch, 1); |
||
1166 | OUT_BATCH(batch, CMD_PIPELINE_SELECT | PIPELINE_SELECT_3D); |
||
1167 | ADVANCE_BATCH(batch); |
||
1168 | } |
||
1169 | |||
1170 | static void |
||
1171 | i965_render_state_sip(VADriverContextP ctx) |
||
1172 | { |
||
1173 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1174 | struct intel_batchbuffer *batch = i965->batch; |
||
1175 | |||
1176 | BEGIN_BATCH(batch, 2); |
||
1177 | OUT_BATCH(batch, CMD_STATE_SIP | 0); |
||
1178 | OUT_BATCH(batch, 0); |
||
1179 | ADVANCE_BATCH(batch); |
||
1180 | } |
||
1181 | |||
1182 | static void |
||
1183 | i965_render_state_base_address(VADriverContextP ctx) |
||
1184 | { |
||
1185 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1186 | struct intel_batchbuffer *batch = i965->batch; |
||
1187 | struct i965_render_state *render_state = &i965->render_state; |
||
1188 | |||
1189 | if (IS_IRONLAKE(i965->intel.device_id)) { |
||
1190 | BEGIN_BATCH(batch, 8); |
||
1191 | OUT_BATCH(batch, CMD_STATE_BASE_ADDRESS | 6); |
||
1192 | OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); |
||
1193 | OUT_RELOC(batch, render_state->wm.surface_state_binding_table_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, BASE_ADDRESS_MODIFY); |
||
1194 | OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); |
||
1195 | OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); |
||
1196 | OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); |
||
1197 | OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); |
||
1198 | OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); |
||
1199 | ADVANCE_BATCH(batch); |
||
1200 | } else { |
||
1201 | BEGIN_BATCH(batch, 6); |
||
1202 | OUT_BATCH(batch, CMD_STATE_BASE_ADDRESS | 4); |
||
1203 | OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); |
||
1204 | OUT_RELOC(batch, render_state->wm.surface_state_binding_table_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, BASE_ADDRESS_MODIFY); |
||
1205 | OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); |
||
1206 | OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); |
||
1207 | OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); |
||
1208 | ADVANCE_BATCH(batch); |
||
1209 | } |
||
1210 | } |
||
1211 | |||
1212 | static void |
||
1213 | i965_render_binding_table_pointers(VADriverContextP ctx) |
||
1214 | { |
||
1215 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1216 | struct intel_batchbuffer *batch = i965->batch; |
||
1217 | |||
1218 | BEGIN_BATCH(batch, 6); |
||
1219 | OUT_BATCH(batch, CMD_BINDING_TABLE_POINTERS | 4); |
||
1220 | OUT_BATCH(batch, 0); /* vs */ |
||
1221 | OUT_BATCH(batch, 0); /* gs */ |
||
1222 | OUT_BATCH(batch, 0); /* clip */ |
||
1223 | OUT_BATCH(batch, 0); /* sf */ |
||
1224 | OUT_BATCH(batch, BINDING_TABLE_OFFSET); |
||
1225 | ADVANCE_BATCH(batch); |
||
1226 | } |
||
1227 | |||
1228 | static void |
||
1229 | i965_render_constant_color(VADriverContextP ctx) |
||
1230 | { |
||
1231 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1232 | struct intel_batchbuffer *batch = i965->batch; |
||
1233 | |||
1234 | BEGIN_BATCH(batch, 5); |
||
1235 | OUT_BATCH(batch, CMD_CONSTANT_COLOR | 3); |
||
1236 | OUT_BATCH(batch, float_to_uint(1.0)); |
||
1237 | OUT_BATCH(batch, float_to_uint(0.0)); |
||
1238 | OUT_BATCH(batch, float_to_uint(1.0)); |
||
1239 | OUT_BATCH(batch, float_to_uint(1.0)); |
||
1240 | ADVANCE_BATCH(batch); |
||
1241 | } |
||
1242 | |||
1243 | static void |
||
1244 | i965_render_pipelined_pointers(VADriverContextP ctx) |
||
1245 | { |
||
1246 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1247 | struct intel_batchbuffer *batch = i965->batch; |
||
1248 | struct i965_render_state *render_state = &i965->render_state; |
||
1249 | |||
1250 | BEGIN_BATCH(batch, 7); |
||
1251 | OUT_BATCH(batch, CMD_PIPELINED_POINTERS | 5); |
||
1252 | OUT_RELOC(batch, render_state->vs.state, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); |
||
1253 | OUT_BATCH(batch, 0); /* disable GS */ |
||
1254 | OUT_BATCH(batch, 0); /* disable CLIP */ |
||
1255 | OUT_RELOC(batch, render_state->sf.state, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); |
||
1256 | OUT_RELOC(batch, render_state->wm.state, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); |
||
1257 | OUT_RELOC(batch, render_state->cc.state, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); |
||
1258 | ADVANCE_BATCH(batch); |
||
1259 | } |
||
1260 | |||
1261 | static void |
||
1262 | i965_render_urb_layout(VADriverContextP ctx) |
||
1263 | { |
||
1264 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1265 | struct intel_batchbuffer *batch = i965->batch; |
||
1266 | int urb_vs_start, urb_vs_size; |
||
1267 | int urb_gs_start, urb_gs_size; |
||
1268 | int urb_clip_start, urb_clip_size; |
||
1269 | int urb_sf_start, urb_sf_size; |
||
1270 | int urb_cs_start, urb_cs_size; |
||
1271 | |||
1272 | urb_vs_start = 0; |
||
1273 | urb_vs_size = URB_VS_ENTRIES * URB_VS_ENTRY_SIZE; |
||
1274 | urb_gs_start = urb_vs_start + urb_vs_size; |
||
1275 | urb_gs_size = URB_GS_ENTRIES * URB_GS_ENTRY_SIZE; |
||
1276 | urb_clip_start = urb_gs_start + urb_gs_size; |
||
1277 | urb_clip_size = URB_CLIP_ENTRIES * URB_CLIP_ENTRY_SIZE; |
||
1278 | urb_sf_start = urb_clip_start + urb_clip_size; |
||
1279 | urb_sf_size = URB_SF_ENTRIES * URB_SF_ENTRY_SIZE; |
||
1280 | urb_cs_start = urb_sf_start + urb_sf_size; |
||
1281 | urb_cs_size = URB_CS_ENTRIES * URB_CS_ENTRY_SIZE; |
||
1282 | |||
1283 | BEGIN_BATCH(batch, 3); |
||
1284 | OUT_BATCH(batch, |
||
1285 | CMD_URB_FENCE | |
||
1286 | UF0_CS_REALLOC | |
||
1287 | UF0_SF_REALLOC | |
||
1288 | UF0_CLIP_REALLOC | |
||
1289 | UF0_GS_REALLOC | |
||
1290 | UF0_VS_REALLOC | |
||
1291 | 1); |
||
1292 | OUT_BATCH(batch, |
||
1293 | ((urb_clip_start + urb_clip_size) << UF1_CLIP_FENCE_SHIFT) | |
||
1294 | ((urb_gs_start + urb_gs_size) << UF1_GS_FENCE_SHIFT) | |
||
1295 | ((urb_vs_start + urb_vs_size) << UF1_VS_FENCE_SHIFT)); |
||
1296 | OUT_BATCH(batch, |
||
1297 | ((urb_cs_start + urb_cs_size) << UF2_CS_FENCE_SHIFT) | |
||
1298 | ((urb_sf_start + urb_sf_size) << UF2_SF_FENCE_SHIFT)); |
||
1299 | ADVANCE_BATCH(batch); |
||
1300 | } |
||
1301 | |||
1302 | static void |
||
1303 | i965_render_cs_urb_layout(VADriverContextP ctx) |
||
1304 | { |
||
1305 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1306 | struct intel_batchbuffer *batch = i965->batch; |
||
1307 | |||
1308 | BEGIN_BATCH(batch, 2); |
||
1309 | OUT_BATCH(batch, CMD_CS_URB_STATE | 0); |
||
1310 | OUT_BATCH(batch, |
||
1311 | ((URB_CS_ENTRY_SIZE - 1) << 4) | /* URB Entry Allocation Size */ |
||
1312 | (URB_CS_ENTRIES << 0)); /* Number of URB Entries */ |
||
1313 | ADVANCE_BATCH(batch); |
||
1314 | } |
||
1315 | |||
1316 | static void |
||
1317 | i965_render_constant_buffer(VADriverContextP ctx) |
||
1318 | { |
||
1319 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1320 | struct intel_batchbuffer *batch = i965->batch; |
||
1321 | struct i965_render_state *render_state = &i965->render_state; |
||
1322 | |||
1323 | BEGIN_BATCH(batch, 2); |
||
1324 | OUT_BATCH(batch, CMD_CONSTANT_BUFFER | (1 << 8) | (2 - 2)); |
||
1325 | OUT_RELOC(batch, render_state->curbe.bo, |
||
1326 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
1327 | URB_CS_ENTRY_SIZE - 1); |
||
1328 | ADVANCE_BATCH(batch); |
||
1329 | } |
||
1330 | |||
1331 | static void |
||
1332 | i965_render_drawing_rectangle(VADriverContextP ctx) |
||
1333 | { |
||
1334 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1335 | struct intel_batchbuffer *batch = i965->batch; |
||
1336 | struct i965_render_state *render_state = &i965->render_state; |
||
1337 | struct intel_region *dest_region = render_state->draw_region; |
||
1338 | |||
1339 | BEGIN_BATCH(batch, 4); |
||
1340 | OUT_BATCH(batch, CMD_DRAWING_RECTANGLE | 2); |
||
1341 | OUT_BATCH(batch, 0x00000000); |
||
1342 | OUT_BATCH(batch, (dest_region->width - 1) | (dest_region->height - 1) << 16); |
||
1343 | OUT_BATCH(batch, 0x00000000); |
||
1344 | ADVANCE_BATCH(batch); |
||
1345 | } |
||
1346 | |||
1347 | static void |
||
1348 | i965_render_vertex_elements(VADriverContextP ctx) |
||
1349 | { |
||
1350 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1351 | struct intel_batchbuffer *batch = i965->batch; |
||
1352 | |||
1353 | if (IS_IRONLAKE(i965->intel.device_id)) { |
||
1354 | BEGIN_BATCH(batch, 5); |
||
1355 | OUT_BATCH(batch, CMD_VERTEX_ELEMENTS | 3); |
||
1356 | /* offset 0: X,Y -> {X, Y, 1.0, 1.0} */ |
||
1357 | OUT_BATCH(batch, (0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | |
||
1358 | VE0_VALID | |
||
1359 | (I965_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) | |
||
1360 | (0 << VE0_OFFSET_SHIFT)); |
||
1361 | OUT_BATCH(batch, (I965_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | |
||
1362 | (I965_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | |
||
1363 | (I965_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) | |
||
1364 | (I965_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT)); |
||
1365 | /* offset 8: S0, T0 -> {S0, T0, 1.0, 1.0} */ |
||
1366 | OUT_BATCH(batch, (0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | |
||
1367 | VE0_VALID | |
||
1368 | (I965_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) | |
||
1369 | (8 << VE0_OFFSET_SHIFT)); |
||
1370 | OUT_BATCH(batch, (I965_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | |
||
1371 | (I965_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | |
||
1372 | (I965_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) | |
||
1373 | (I965_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT)); |
||
1374 | ADVANCE_BATCH(batch); |
||
1375 | } else { |
||
1376 | BEGIN_BATCH(batch, 5); |
||
1377 | OUT_BATCH(batch, CMD_VERTEX_ELEMENTS | 3); |
||
1378 | /* offset 0: X,Y -> {X, Y, 1.0, 1.0} */ |
||
1379 | OUT_BATCH(batch, (0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | |
||
1380 | VE0_VALID | |
||
1381 | (I965_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) | |
||
1382 | (0 << VE0_OFFSET_SHIFT)); |
||
1383 | OUT_BATCH(batch, (I965_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | |
||
1384 | (I965_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | |
||
1385 | (I965_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) | |
||
1386 | (I965_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) | |
||
1387 | (0 << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); |
||
1388 | /* offset 8: S0, T0 -> {S0, T0, 1.0, 1.0} */ |
||
1389 | OUT_BATCH(batch, (0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | |
||
1390 | VE0_VALID | |
||
1391 | (I965_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) | |
||
1392 | (8 << VE0_OFFSET_SHIFT)); |
||
1393 | OUT_BATCH(batch, (I965_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | |
||
1394 | (I965_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | |
||
1395 | (I965_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) | |
||
1396 | (I965_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) | |
||
1397 | (4 << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); |
||
1398 | ADVANCE_BATCH(batch); |
||
1399 | } |
||
1400 | } |
||
1401 | |||
1402 | static void |
||
1403 | i965_render_upload_image_palette( |
||
1404 | VADriverContextP ctx, |
||
1405 | VAImageID image_id, |
||
1406 | unsigned int alpha |
||
1407 | ) |
||
1408 | { |
||
1409 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1410 | struct intel_batchbuffer *batch = i965->batch; |
||
1411 | unsigned int i; |
||
1412 | |||
1413 | struct object_image *obj_image = IMAGE(image_id); |
||
1414 | assert(obj_image); |
||
1415 | |||
1416 | if (obj_image->image.num_palette_entries == 0) |
||
1417 | return; |
||
1418 | |||
1419 | BEGIN_BATCH(batch, 1 + obj_image->image.num_palette_entries); |
||
1420 | OUT_BATCH(batch, CMD_SAMPLER_PALETTE_LOAD | (obj_image->image.num_palette_entries - 1)); |
||
1421 | /*fill palette*/ |
||
1422 | //int32_t out[16]; //0-23:color 23-31:alpha |
||
1423 | for (i = 0; i < obj_image->image.num_palette_entries; i++) |
||
1424 | OUT_BATCH(batch, (alpha << 24) | obj_image->palette[i]); |
||
1425 | ADVANCE_BATCH(batch); |
||
1426 | } |
||
1427 | |||
1428 | static void |
||
1429 | i965_render_startup(VADriverContextP ctx) |
||
1430 | { |
||
1431 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1432 | struct intel_batchbuffer *batch = i965->batch; |
||
1433 | struct i965_render_state *render_state = &i965->render_state; |
||
1434 | |||
1435 | BEGIN_BATCH(batch, 11); |
||
1436 | OUT_BATCH(batch, CMD_VERTEX_BUFFERS | 3); |
||
1437 | OUT_BATCH(batch, |
||
1438 | (0 << VB0_BUFFER_INDEX_SHIFT) | |
||
1439 | VB0_VERTEXDATA | |
||
1440 | ((4 * 4) << VB0_BUFFER_PITCH_SHIFT)); |
||
1441 | OUT_RELOC(batch, render_state->vb.vertex_buffer, I915_GEM_DOMAIN_VERTEX, 0, 0); |
||
1442 | |||
1443 | if (IS_IRONLAKE(i965->intel.device_id)) |
||
1444 | OUT_RELOC(batch, render_state->vb.vertex_buffer, I915_GEM_DOMAIN_VERTEX, 0, 12 * 4); |
||
1445 | else |
||
1446 | OUT_BATCH(batch, 3); |
||
1447 | |||
1448 | OUT_BATCH(batch, 0); |
||
1449 | |||
1450 | OUT_BATCH(batch, |
||
1451 | CMD_3DPRIMITIVE | |
||
1452 | _3DPRIMITIVE_VERTEX_SEQUENTIAL | |
||
1453 | (_3DPRIM_RECTLIST << _3DPRIMITIVE_TOPOLOGY_SHIFT) | |
||
1454 | (0 << 9) | |
||
1455 | 4); |
||
1456 | OUT_BATCH(batch, 3); /* vertex count per instance */ |
||
1457 | OUT_BATCH(batch, 0); /* start vertex offset */ |
||
1458 | OUT_BATCH(batch, 1); /* single instance */ |
||
1459 | OUT_BATCH(batch, 0); /* start instance location */ |
||
1460 | OUT_BATCH(batch, 0); /* index buffer offset, ignored */ |
||
1461 | ADVANCE_BATCH(batch); |
||
1462 | } |
||
1463 | |||
1464 | static void |
||
1465 | i965_clear_dest_region(VADriverContextP ctx) |
||
1466 | { |
||
1467 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1468 | struct intel_batchbuffer *batch = i965->batch; |
||
1469 | struct i965_render_state *render_state = &i965->render_state; |
||
1470 | struct intel_region *dest_region = render_state->draw_region; |
||
1471 | unsigned int blt_cmd, br13; |
||
1472 | int pitch; |
||
1473 | |||
1474 | blt_cmd = XY_COLOR_BLT_CMD; |
||
1475 | br13 = 0xf0 << 16; |
||
1476 | pitch = dest_region->pitch; |
||
1477 | |||
1478 | if (dest_region->cpp == 4) { |
||
1479 | br13 |= BR13_8888; |
||
1480 | blt_cmd |= (XY_COLOR_BLT_WRITE_RGB | XY_COLOR_BLT_WRITE_ALPHA); |
||
1481 | } else { |
||
1482 | assert(dest_region->cpp == 2); |
||
1483 | br13 |= BR13_565; |
||
1484 | } |
||
1485 | |||
1486 | if (dest_region->tiling != I915_TILING_NONE) { |
||
1487 | blt_cmd |= XY_COLOR_BLT_DST_TILED; |
||
1488 | pitch /= 4; |
||
1489 | } |
||
1490 | |||
1491 | br13 |= pitch; |
||
1492 | |||
1493 | if (IS_GEN6(i965->intel.device_id) || |
||
1494 | IS_GEN7(i965->intel.device_id)) { |
||
1495 | intel_batchbuffer_start_atomic_blt(batch, 24); |
||
1496 | BEGIN_BLT_BATCH(batch, 6); |
||
1497 | } else { |
||
1498 | intel_batchbuffer_start_atomic(batch, 24); |
||
1499 | BEGIN_BATCH(batch, 6); |
||
1500 | } |
||
1501 | |||
1502 | OUT_BATCH(batch, blt_cmd); |
||
1503 | OUT_BATCH(batch, br13); |
||
1504 | OUT_BATCH(batch, (dest_region->y << 16) | (dest_region->x)); |
||
1505 | OUT_BATCH(batch, ((dest_region->y + dest_region->height) << 16) | |
||
1506 | (dest_region->x + dest_region->width)); |
||
1507 | OUT_RELOC(batch, dest_region->bo, |
||
1508 | I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, |
||
1509 | 0); |
||
1510 | OUT_BATCH(batch, 0x0); |
||
1511 | ADVANCE_BATCH(batch); |
||
1512 | intel_batchbuffer_end_atomic(batch); |
||
1513 | } |
||
1514 | |||
1515 | static void |
||
1516 | i965_surface_render_pipeline_setup(VADriverContextP ctx) |
||
1517 | { |
||
1518 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1519 | struct intel_batchbuffer *batch = i965->batch; |
||
1520 | |||
1521 | i965_clear_dest_region(ctx); |
||
1522 | intel_batchbuffer_start_atomic(batch, 0x1000); |
||
1523 | intel_batchbuffer_emit_mi_flush(batch); |
||
1524 | i965_render_pipeline_select(ctx); |
||
1525 | i965_render_state_sip(ctx); |
||
1526 | i965_render_state_base_address(ctx); |
||
1527 | i965_render_binding_table_pointers(ctx); |
||
1528 | i965_render_constant_color(ctx); |
||
1529 | i965_render_pipelined_pointers(ctx); |
||
1530 | i965_render_urb_layout(ctx); |
||
1531 | i965_render_cs_urb_layout(ctx); |
||
1532 | i965_render_constant_buffer(ctx); |
||
1533 | i965_render_drawing_rectangle(ctx); |
||
1534 | i965_render_vertex_elements(ctx); |
||
1535 | i965_render_startup(ctx); |
||
1536 | intel_batchbuffer_end_atomic(batch); |
||
1537 | } |
||
1538 | |||
1539 | static void |
||
1540 | i965_subpic_render_pipeline_setup(VADriverContextP ctx) |
||
1541 | { |
||
1542 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1543 | struct intel_batchbuffer *batch = i965->batch; |
||
1544 | |||
1545 | intel_batchbuffer_start_atomic(batch, 0x1000); |
||
1546 | intel_batchbuffer_emit_mi_flush(batch); |
||
1547 | i965_render_pipeline_select(ctx); |
||
1548 | i965_render_state_sip(ctx); |
||
1549 | i965_render_state_base_address(ctx); |
||
1550 | i965_render_binding_table_pointers(ctx); |
||
1551 | i965_render_constant_color(ctx); |
||
1552 | i965_render_pipelined_pointers(ctx); |
||
1553 | i965_render_urb_layout(ctx); |
||
1554 | i965_render_cs_urb_layout(ctx); |
||
1555 | i965_render_drawing_rectangle(ctx); |
||
1556 | i965_render_vertex_elements(ctx); |
||
1557 | i965_render_startup(ctx); |
||
1558 | intel_batchbuffer_end_atomic(batch); |
||
1559 | } |
||
1560 | |||
1561 | |||
1562 | static void |
||
1563 | i965_render_initialize(VADriverContextP ctx) |
||
1564 | { |
||
1565 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1566 | struct i965_render_state *render_state = &i965->render_state; |
||
1567 | dri_bo *bo; |
||
1568 | |||
1569 | /* VERTEX BUFFER */ |
||
1570 | dri_bo_unreference(render_state->vb.vertex_buffer); |
||
1571 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1572 | "vertex buffer", |
||
1573 | 4096, |
||
1574 | 4096); |
||
1575 | assert(bo); |
||
1576 | render_state->vb.vertex_buffer = bo; |
||
1577 | |||
1578 | /* VS */ |
||
1579 | dri_bo_unreference(render_state->vs.state); |
||
1580 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1581 | "vs state", |
||
1582 | sizeof(struct i965_vs_unit_state), |
||
1583 | 64); |
||
1584 | assert(bo); |
||
1585 | render_state->vs.state = bo; |
||
1586 | |||
1587 | /* GS */ |
||
1588 | /* CLIP */ |
||
1589 | /* SF */ |
||
1590 | dri_bo_unreference(render_state->sf.state); |
||
1591 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1592 | "sf state", |
||
1593 | sizeof(struct i965_sf_unit_state), |
||
1594 | 64); |
||
1595 | assert(bo); |
||
1596 | render_state->sf.state = bo; |
||
1597 | |||
1598 | /* WM */ |
||
1599 | dri_bo_unreference(render_state->wm.surface_state_binding_table_bo); |
||
1600 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1601 | "surface state & binding table", |
||
1602 | (SURFACE_STATE_PADDED_SIZE + sizeof(unsigned int)) * MAX_RENDER_SURFACES, |
||
1603 | 4096); |
||
1604 | assert(bo); |
||
1605 | render_state->wm.surface_state_binding_table_bo = bo; |
||
1606 | |||
1607 | dri_bo_unreference(render_state->wm.sampler); |
||
1608 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1609 | "sampler state", |
||
1610 | MAX_SAMPLERS * sizeof(struct i965_sampler_state), |
||
1611 | 64); |
||
1612 | assert(bo); |
||
1613 | render_state->wm.sampler = bo; |
||
1614 | render_state->wm.sampler_count = 0; |
||
1615 | |||
1616 | dri_bo_unreference(render_state->wm.state); |
||
1617 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1618 | "wm state", |
||
1619 | sizeof(struct i965_wm_unit_state), |
||
1620 | 64); |
||
1621 | assert(bo); |
||
1622 | render_state->wm.state = bo; |
||
1623 | |||
1624 | /* COLOR CALCULATOR */ |
||
1625 | dri_bo_unreference(render_state->cc.state); |
||
1626 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1627 | "color calc state", |
||
1628 | sizeof(struct i965_cc_unit_state), |
||
1629 | 64); |
||
1630 | assert(bo); |
||
1631 | render_state->cc.state = bo; |
||
1632 | |||
1633 | dri_bo_unreference(render_state->cc.viewport); |
||
1634 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1635 | "cc viewport", |
||
1636 | sizeof(struct i965_cc_viewport), |
||
1637 | 64); |
||
1638 | assert(bo); |
||
1639 | render_state->cc.viewport = bo; |
||
1640 | } |
||
1641 | |||
1642 | static void |
||
1643 | i965_render_put_surface( |
||
1644 | VADriverContextP ctx, |
||
1645 | VASurfaceID surface, |
||
1646 | const VARectangle *src_rect, |
||
1647 | const VARectangle *dst_rect, |
||
1648 | unsigned int flags |
||
1649 | ) |
||
1650 | { |
||
1651 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1652 | struct intel_batchbuffer *batch = i965->batch; |
||
1653 | |||
1654 | i965_render_initialize(ctx); |
||
1655 | i965_surface_render_state_setup(ctx, surface, src_rect, dst_rect, flags); |
||
1656 | i965_surface_render_pipeline_setup(ctx); |
||
1657 | intel_batchbuffer_flush(batch); |
||
1658 | } |
||
1659 | |||
1660 | static void |
||
1661 | i965_render_put_subpicture( |
||
1662 | VADriverContextP ctx, |
||
1663 | VASurfaceID surface, |
||
1664 | const VARectangle *src_rect, |
||
1665 | const VARectangle *dst_rect |
||
1666 | ) |
||
1667 | { |
||
1668 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1669 | struct intel_batchbuffer *batch = i965->batch; |
||
1670 | struct object_surface *obj_surface = SURFACE(surface); |
||
1671 | unsigned int index = obj_surface->subpic_render_idx; |
||
1672 | struct object_subpic *obj_subpic = SUBPIC(obj_surface->subpic[index]); |
||
1673 | |||
1674 | assert(obj_subpic); |
||
1675 | |||
1676 | i965_render_initialize(ctx); |
||
1677 | i965_subpic_render_state_setup(ctx, surface, src_rect, dst_rect); |
||
1678 | i965_subpic_render_pipeline_setup(ctx); |
||
1679 | i965_render_upload_image_palette(ctx, obj_subpic->image, 0xff); |
||
1680 | intel_batchbuffer_flush(batch); |
||
1681 | } |
||
1682 | |||
1683 | /* |
||
1684 | * for GEN6+ |
||
1685 | */ |
||
1686 | static void |
||
1687 | gen6_render_initialize(VADriverContextP ctx) |
||
1688 | { |
||
1689 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1690 | struct i965_render_state *render_state = &i965->render_state; |
||
1691 | dri_bo *bo; |
||
1692 | |||
1693 | /* VERTEX BUFFER */ |
||
1694 | dri_bo_unreference(render_state->vb.vertex_buffer); |
||
1695 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1696 | "vertex buffer", |
||
1697 | 4096, |
||
1698 | 4096); |
||
1699 | assert(bo); |
||
1700 | render_state->vb.vertex_buffer = bo; |
||
1701 | |||
1702 | /* WM */ |
||
1703 | dri_bo_unreference(render_state->wm.surface_state_binding_table_bo); |
||
1704 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1705 | "surface state & binding table", |
||
1706 | (SURFACE_STATE_PADDED_SIZE + sizeof(unsigned int)) * MAX_RENDER_SURFACES, |
||
1707 | 4096); |
||
1708 | assert(bo); |
||
1709 | render_state->wm.surface_state_binding_table_bo = bo; |
||
1710 | |||
1711 | dri_bo_unreference(render_state->wm.sampler); |
||
1712 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1713 | "sampler state", |
||
1714 | MAX_SAMPLERS * sizeof(struct i965_sampler_state), |
||
1715 | 4096); |
||
1716 | assert(bo); |
||
1717 | render_state->wm.sampler = bo; |
||
1718 | render_state->wm.sampler_count = 0; |
||
1719 | |||
1720 | /* COLOR CALCULATOR */ |
||
1721 | dri_bo_unreference(render_state->cc.state); |
||
1722 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1723 | "color calc state", |
||
1724 | sizeof(struct gen6_color_calc_state), |
||
1725 | 4096); |
||
1726 | assert(bo); |
||
1727 | render_state->cc.state = bo; |
||
1728 | |||
1729 | /* CC VIEWPORT */ |
||
1730 | dri_bo_unreference(render_state->cc.viewport); |
||
1731 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1732 | "cc viewport", |
||
1733 | sizeof(struct i965_cc_viewport), |
||
1734 | 4096); |
||
1735 | assert(bo); |
||
1736 | render_state->cc.viewport = bo; |
||
1737 | |||
1738 | /* BLEND STATE */ |
||
1739 | dri_bo_unreference(render_state->cc.blend); |
||
1740 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1741 | "blend state", |
||
1742 | sizeof(struct gen6_blend_state), |
||
1743 | 4096); |
||
1744 | assert(bo); |
||
1745 | render_state->cc.blend = bo; |
||
1746 | |||
1747 | /* DEPTH & STENCIL STATE */ |
||
1748 | dri_bo_unreference(render_state->cc.depth_stencil); |
||
1749 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1750 | "depth & stencil state", |
||
1751 | sizeof(struct gen6_depth_stencil_state), |
||
1752 | 4096); |
||
1753 | assert(bo); |
||
1754 | render_state->cc.depth_stencil = bo; |
||
1755 | } |
||
1756 | |||
1757 | static void |
||
1758 | gen6_render_color_calc_state(VADriverContextP ctx) |
||
1759 | { |
||
1760 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1761 | struct i965_render_state *render_state = &i965->render_state; |
||
1762 | struct gen6_color_calc_state *color_calc_state; |
||
1763 | |||
1764 | dri_bo_map(render_state->cc.state, 1); |
||
1765 | assert(render_state->cc.state->virtual); |
||
1766 | color_calc_state = render_state->cc.state->virtual; |
||
1767 | memset(color_calc_state, 0, sizeof(*color_calc_state)); |
||
1768 | color_calc_state->constant_r = 1.0; |
||
1769 | color_calc_state->constant_g = 0.0; |
||
1770 | color_calc_state->constant_b = 1.0; |
||
1771 | color_calc_state->constant_a = 1.0; |
||
1772 | dri_bo_unmap(render_state->cc.state); |
||
1773 | } |
||
1774 | |||
1775 | static void |
||
1776 | gen6_render_blend_state(VADriverContextP ctx) |
||
1777 | { |
||
1778 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1779 | struct i965_render_state *render_state = &i965->render_state; |
||
1780 | struct gen6_blend_state *blend_state; |
||
1781 | |||
1782 | dri_bo_map(render_state->cc.blend, 1); |
||
1783 | assert(render_state->cc.blend->virtual); |
||
1784 | blend_state = render_state->cc.blend->virtual; |
||
1785 | memset(blend_state, 0, sizeof(*blend_state)); |
||
1786 | blend_state->blend1.logic_op_enable = 1; |
||
1787 | blend_state->blend1.logic_op_func = 0xc; |
||
1788 | dri_bo_unmap(render_state->cc.blend); |
||
1789 | } |
||
1790 | |||
1791 | static void |
||
1792 | gen6_render_depth_stencil_state(VADriverContextP ctx) |
||
1793 | { |
||
1794 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1795 | struct i965_render_state *render_state = &i965->render_state; |
||
1796 | struct gen6_depth_stencil_state *depth_stencil_state; |
||
1797 | |||
1798 | dri_bo_map(render_state->cc.depth_stencil, 1); |
||
1799 | assert(render_state->cc.depth_stencil->virtual); |
||
1800 | depth_stencil_state = render_state->cc.depth_stencil->virtual; |
||
1801 | memset(depth_stencil_state, 0, sizeof(*depth_stencil_state)); |
||
1802 | dri_bo_unmap(render_state->cc.depth_stencil); |
||
1803 | } |
||
1804 | |||
1805 | static void |
||
1806 | gen6_render_setup_states( |
||
1807 | VADriverContextP ctx, |
||
1808 | VASurfaceID surface, |
||
1809 | const VARectangle *src_rect, |
||
1810 | const VARectangle *dst_rect, |
||
1811 | unsigned int flags |
||
1812 | ) |
||
1813 | { |
||
1814 | i965_render_dest_surface_state(ctx, 0); |
||
1815 | i965_render_src_surfaces_state(ctx, surface, flags); |
||
1816 | i965_render_sampler(ctx); |
||
1817 | i965_render_cc_viewport(ctx); |
||
1818 | gen6_render_color_calc_state(ctx); |
||
1819 | gen6_render_blend_state(ctx); |
||
1820 | gen6_render_depth_stencil_state(ctx); |
||
1821 | i965_render_upload_constants(ctx, surface); |
||
1822 | i965_render_upload_vertex(ctx, surface, src_rect, dst_rect); |
||
1823 | } |
||
1824 | |||
1825 | static void |
||
1826 | gen6_emit_invarient_states(VADriverContextP ctx) |
||
1827 | { |
||
1828 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1829 | struct intel_batchbuffer *batch = i965->batch; |
||
1830 | |||
1831 | OUT_BATCH(batch, CMD_PIPELINE_SELECT | PIPELINE_SELECT_3D); |
||
1832 | |||
1833 | OUT_BATCH(batch, GEN6_3DSTATE_MULTISAMPLE | (3 - 2)); |
||
1834 | OUT_BATCH(batch, GEN6_3DSTATE_MULTISAMPLE_PIXEL_LOCATION_CENTER | |
||
1835 | GEN6_3DSTATE_MULTISAMPLE_NUMSAMPLES_1); /* 1 sample/pixel */ |
||
1836 | OUT_BATCH(batch, 0); |
||
1837 | |||
1838 | OUT_BATCH(batch, GEN6_3DSTATE_SAMPLE_MASK | (2 - 2)); |
||
1839 | OUT_BATCH(batch, 1); |
||
1840 | |||
1841 | /* Set system instruction pointer */ |
||
1842 | OUT_BATCH(batch, CMD_STATE_SIP | 0); |
||
1843 | OUT_BATCH(batch, 0); |
||
1844 | } |
||
1845 | |||
1846 | static void |
||
1847 | gen6_emit_state_base_address(VADriverContextP ctx) |
||
1848 | { |
||
1849 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1850 | struct intel_batchbuffer *batch = i965->batch; |
||
1851 | struct i965_render_state *render_state = &i965->render_state; |
||
1852 | |||
1853 | OUT_BATCH(batch, CMD_STATE_BASE_ADDRESS | (10 - 2)); |
||
1854 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* General state base address */ |
||
1855 | OUT_RELOC(batch, render_state->wm.surface_state_binding_table_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, BASE_ADDRESS_MODIFY); /* Surface state base address */ |
||
1856 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Dynamic state base address */ |
||
1857 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Indirect object base address */ |
||
1858 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Instruction base address */ |
||
1859 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* General state upper bound */ |
||
1860 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Dynamic state upper bound */ |
||
1861 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Indirect object upper bound */ |
||
1862 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Instruction access upper bound */ |
||
1863 | } |
||
1864 | |||
1865 | static void |
||
1866 | gen6_emit_viewport_state_pointers(VADriverContextP ctx) |
||
1867 | { |
||
1868 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1869 | struct intel_batchbuffer *batch = i965->batch; |
||
1870 | struct i965_render_state *render_state = &i965->render_state; |
||
1871 | |||
1872 | OUT_BATCH(batch, GEN6_3DSTATE_VIEWPORT_STATE_POINTERS | |
||
1873 | GEN6_3DSTATE_VIEWPORT_STATE_MODIFY_CC | |
||
1874 | (4 - 2)); |
||
1875 | OUT_BATCH(batch, 0); |
||
1876 | OUT_BATCH(batch, 0); |
||
1877 | OUT_RELOC(batch, render_state->cc.viewport, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); |
||
1878 | } |
||
1879 | |||
1880 | static void |
||
1881 | gen6_emit_urb(VADriverContextP ctx) |
||
1882 | { |
||
1883 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1884 | struct intel_batchbuffer *batch = i965->batch; |
||
1885 | |||
1886 | OUT_BATCH(batch, GEN6_3DSTATE_URB | (3 - 2)); |
||
1887 | OUT_BATCH(batch, ((1 - 1) << GEN6_3DSTATE_URB_VS_SIZE_SHIFT) | |
||
1888 | (24 << GEN6_3DSTATE_URB_VS_ENTRIES_SHIFT)); /* at least 24 on GEN6 */ |
||
1889 | OUT_BATCH(batch, (0 << GEN6_3DSTATE_URB_GS_SIZE_SHIFT) | |
||
1890 | (0 << GEN6_3DSTATE_URB_GS_ENTRIES_SHIFT)); /* no GS thread */ |
||
1891 | } |
||
1892 | |||
1893 | static void |
||
1894 | gen6_emit_cc_state_pointers(VADriverContextP ctx) |
||
1895 | { |
||
1896 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1897 | struct intel_batchbuffer *batch = i965->batch; |
||
1898 | struct i965_render_state *render_state = &i965->render_state; |
||
1899 | |||
1900 | OUT_BATCH(batch, GEN6_3DSTATE_CC_STATE_POINTERS | (4 - 2)); |
||
1901 | OUT_RELOC(batch, render_state->cc.blend, I915_GEM_DOMAIN_INSTRUCTION, 0, 1); |
||
1902 | OUT_RELOC(batch, render_state->cc.depth_stencil, I915_GEM_DOMAIN_INSTRUCTION, 0, 1); |
||
1903 | OUT_RELOC(batch, render_state->cc.state, I915_GEM_DOMAIN_INSTRUCTION, 0, 1); |
||
1904 | } |
||
1905 | |||
1906 | static void |
||
1907 | gen6_emit_sampler_state_pointers(VADriverContextP ctx) |
||
1908 | { |
||
1909 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1910 | struct intel_batchbuffer *batch = i965->batch; |
||
1911 | struct i965_render_state *render_state = &i965->render_state; |
||
1912 | |||
1913 | OUT_BATCH(batch, GEN6_3DSTATE_SAMPLER_STATE_POINTERS | |
||
1914 | GEN6_3DSTATE_SAMPLER_STATE_MODIFY_PS | |
||
1915 | (4 - 2)); |
||
1916 | OUT_BATCH(batch, 0); /* VS */ |
||
1917 | OUT_BATCH(batch, 0); /* GS */ |
||
1918 | OUT_RELOC(batch,render_state->wm.sampler, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); |
||
1919 | } |
||
1920 | |||
1921 | static void |
||
1922 | gen6_emit_binding_table(VADriverContextP ctx) |
||
1923 | { |
||
1924 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1925 | struct intel_batchbuffer *batch = i965->batch; |
||
1926 | |||
1927 | /* Binding table pointers */ |
||
1928 | OUT_BATCH(batch, CMD_BINDING_TABLE_POINTERS | |
||
1929 | GEN6_BINDING_TABLE_MODIFY_PS | |
||
1930 | (4 - 2)); |
||
1931 | OUT_BATCH(batch, 0); /* vs */ |
||
1932 | OUT_BATCH(batch, 0); /* gs */ |
||
1933 | /* Only the PS uses the binding table */ |
||
1934 | OUT_BATCH(batch, BINDING_TABLE_OFFSET); |
||
1935 | } |
||
1936 | |||
1937 | static void |
||
1938 | gen6_emit_depth_buffer_state(VADriverContextP ctx) |
||
1939 | { |
||
1940 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1941 | struct intel_batchbuffer *batch = i965->batch; |
||
1942 | |||
1943 | OUT_BATCH(batch, CMD_DEPTH_BUFFER | (7 - 2)); |
||
1944 | OUT_BATCH(batch, (I965_SURFACE_NULL << CMD_DEPTH_BUFFER_TYPE_SHIFT) | |
||
1945 | (I965_DEPTHFORMAT_D32_FLOAT << CMD_DEPTH_BUFFER_FORMAT_SHIFT)); |
||
1946 | OUT_BATCH(batch, 0); |
||
1947 | OUT_BATCH(batch, 0); |
||
1948 | OUT_BATCH(batch, 0); |
||
1949 | OUT_BATCH(batch, 0); |
||
1950 | OUT_BATCH(batch, 0); |
||
1951 | |||
1952 | OUT_BATCH(batch, CMD_CLEAR_PARAMS | (2 - 2)); |
||
1953 | OUT_BATCH(batch, 0); |
||
1954 | } |
||
1955 | |||
1956 | static void |
||
1957 | gen6_emit_drawing_rectangle(VADriverContextP ctx) |
||
1958 | { |
||
1959 | i965_render_drawing_rectangle(ctx); |
||
1960 | } |
||
1961 | |||
1962 | static void |
||
1963 | gen6_emit_vs_state(VADriverContextP ctx) |
||
1964 | { |
||
1965 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1966 | struct intel_batchbuffer *batch = i965->batch; |
||
1967 | |||
1968 | /* disable VS constant buffer */ |
||
1969 | OUT_BATCH(batch, GEN6_3DSTATE_CONSTANT_VS | (5 - 2)); |
||
1970 | OUT_BATCH(batch, 0); |
||
1971 | OUT_BATCH(batch, 0); |
||
1972 | OUT_BATCH(batch, 0); |
||
1973 | OUT_BATCH(batch, 0); |
||
1974 | |||
1975 | OUT_BATCH(batch, GEN6_3DSTATE_VS | (6 - 2)); |
||
1976 | OUT_BATCH(batch, 0); /* without VS kernel */ |
||
1977 | OUT_BATCH(batch, 0); |
||
1978 | OUT_BATCH(batch, 0); |
||
1979 | OUT_BATCH(batch, 0); |
||
1980 | OUT_BATCH(batch, 0); /* pass-through */ |
||
1981 | } |
||
1982 | |||
1983 | static void |
||
1984 | gen6_emit_gs_state(VADriverContextP ctx) |
||
1985 | { |
||
1986 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1987 | struct intel_batchbuffer *batch = i965->batch; |
||
1988 | |||
1989 | /* disable GS constant buffer */ |
||
1990 | OUT_BATCH(batch, GEN6_3DSTATE_CONSTANT_GS | (5 - 2)); |
||
1991 | OUT_BATCH(batch, 0); |
||
1992 | OUT_BATCH(batch, 0); |
||
1993 | OUT_BATCH(batch, 0); |
||
1994 | OUT_BATCH(batch, 0); |
||
1995 | |||
1996 | OUT_BATCH(batch, GEN6_3DSTATE_GS | (7 - 2)); |
||
1997 | OUT_BATCH(batch, 0); /* without GS kernel */ |
||
1998 | OUT_BATCH(batch, 0); |
||
1999 | OUT_BATCH(batch, 0); |
||
2000 | OUT_BATCH(batch, 0); |
||
2001 | OUT_BATCH(batch, 0); |
||
2002 | OUT_BATCH(batch, 0); /* pass-through */ |
||
2003 | } |
||
2004 | |||
2005 | static void |
||
2006 | gen6_emit_clip_state(VADriverContextP ctx) |
||
2007 | { |
||
2008 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2009 | struct intel_batchbuffer *batch = i965->batch; |
||
2010 | |||
2011 | OUT_BATCH(batch, GEN6_3DSTATE_CLIP | (4 - 2)); |
||
2012 | OUT_BATCH(batch, 0); |
||
2013 | OUT_BATCH(batch, 0); /* pass-through */ |
||
2014 | OUT_BATCH(batch, 0); |
||
2015 | } |
||
2016 | |||
2017 | static void |
||
2018 | gen6_emit_sf_state(VADriverContextP ctx) |
||
2019 | { |
||
2020 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2021 | struct intel_batchbuffer *batch = i965->batch; |
||
2022 | |||
2023 | OUT_BATCH(batch, GEN6_3DSTATE_SF | (20 - 2)); |
||
2024 | OUT_BATCH(batch, (1 << GEN6_3DSTATE_SF_NUM_OUTPUTS_SHIFT) | |
||
2025 | (1 << GEN6_3DSTATE_SF_URB_ENTRY_READ_LENGTH_SHIFT) | |
||
2026 | (0 << GEN6_3DSTATE_SF_URB_ENTRY_READ_OFFSET_SHIFT)); |
||
2027 | OUT_BATCH(batch, 0); |
||
2028 | OUT_BATCH(batch, GEN6_3DSTATE_SF_CULL_NONE); |
||
2029 | OUT_BATCH(batch, 2 << GEN6_3DSTATE_SF_TRIFAN_PROVOKE_SHIFT); /* DW4 */ |
||
2030 | OUT_BATCH(batch, 0); |
||
2031 | OUT_BATCH(batch, 0); |
||
2032 | OUT_BATCH(batch, 0); |
||
2033 | OUT_BATCH(batch, 0); |
||
2034 | OUT_BATCH(batch, 0); /* DW9 */ |
||
2035 | OUT_BATCH(batch, 0); |
||
2036 | OUT_BATCH(batch, 0); |
||
2037 | OUT_BATCH(batch, 0); |
||
2038 | OUT_BATCH(batch, 0); |
||
2039 | OUT_BATCH(batch, 0); /* DW14 */ |
||
2040 | OUT_BATCH(batch, 0); |
||
2041 | OUT_BATCH(batch, 0); |
||
2042 | OUT_BATCH(batch, 0); |
||
2043 | OUT_BATCH(batch, 0); |
||
2044 | OUT_BATCH(batch, 0); /* DW19 */ |
||
2045 | } |
||
2046 | |||
2047 | static void |
||
2048 | gen6_emit_wm_state(VADriverContextP ctx, int kernel) |
||
2049 | { |
||
2050 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2051 | struct intel_batchbuffer *batch = i965->batch; |
||
2052 | struct i965_render_state *render_state = &i965->render_state; |
||
2053 | |||
2054 | OUT_BATCH(batch, GEN6_3DSTATE_CONSTANT_PS | |
||
2055 | GEN6_3DSTATE_CONSTANT_BUFFER_0_ENABLE | |
||
2056 | (5 - 2)); |
||
2057 | OUT_RELOC(batch, |
||
2058 | render_state->curbe.bo, |
||
2059 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
2060 | 0); |
||
2061 | OUT_BATCH(batch, 0); |
||
2062 | OUT_BATCH(batch, 0); |
||
2063 | OUT_BATCH(batch, 0); |
||
2064 | |||
2065 | OUT_BATCH(batch, GEN6_3DSTATE_WM | (9 - 2)); |
||
2066 | OUT_RELOC(batch, render_state->render_kernels[kernel].bo, |
||
2067 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
2068 | 0); |
||
2069 | OUT_BATCH(batch, (1 << GEN6_3DSTATE_WM_SAMPLER_COUNT_SHITF) | |
||
2070 | (5 << GEN6_3DSTATE_WM_BINDING_TABLE_ENTRY_COUNT_SHIFT)); |
||
2071 | OUT_BATCH(batch, 0); |
||
2072 | OUT_BATCH(batch, (6 << GEN6_3DSTATE_WM_DISPATCH_START_GRF_0_SHIFT)); /* DW4 */ |
||
2073 | OUT_BATCH(batch, ((render_state->max_wm_threads - 1) << GEN6_3DSTATE_WM_MAX_THREADS_SHIFT) | |
||
2074 | GEN6_3DSTATE_WM_DISPATCH_ENABLE | |
||
2075 | GEN6_3DSTATE_WM_16_DISPATCH_ENABLE); |
||
2076 | OUT_BATCH(batch, (1 << GEN6_3DSTATE_WM_NUM_SF_OUTPUTS_SHIFT) | |
||
2077 | GEN6_3DSTATE_WM_PERSPECTIVE_PIXEL_BARYCENTRIC); |
||
2078 | OUT_BATCH(batch, 0); |
||
2079 | OUT_BATCH(batch, 0); |
||
2080 | } |
||
2081 | |||
2082 | static void |
||
2083 | gen6_emit_vertex_element_state(VADriverContextP ctx) |
||
2084 | { |
||
2085 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2086 | struct intel_batchbuffer *batch = i965->batch; |
||
2087 | |||
2088 | /* Set up our vertex elements, sourced from the single vertex buffer. */ |
||
2089 | OUT_BATCH(batch, CMD_VERTEX_ELEMENTS | (5 - 2)); |
||
2090 | /* offset 0: X,Y -> {X, Y, 1.0, 1.0} */ |
||
2091 | OUT_BATCH(batch, (0 << GEN6_VE0_VERTEX_BUFFER_INDEX_SHIFT) | |
||
2092 | GEN6_VE0_VALID | |
||
2093 | (I965_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) | |
||
2094 | (0 << VE0_OFFSET_SHIFT)); |
||
2095 | OUT_BATCH(batch, (I965_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | |
||
2096 | (I965_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | |
||
2097 | (I965_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) | |
||
2098 | (I965_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT)); |
||
2099 | /* offset 8: S0, T0 -> {S0, T0, 1.0, 1.0} */ |
||
2100 | OUT_BATCH(batch, (0 << GEN6_VE0_VERTEX_BUFFER_INDEX_SHIFT) | |
||
2101 | GEN6_VE0_VALID | |
||
2102 | (I965_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) | |
||
2103 | (8 << VE0_OFFSET_SHIFT)); |
||
2104 | OUT_BATCH(batch, (I965_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | |
||
2105 | (I965_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | |
||
2106 | (I965_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) | |
||
2107 | (I965_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT)); |
||
2108 | } |
||
2109 | |||
2110 | static void |
||
2111 | gen6_emit_vertices(VADriverContextP ctx) |
||
2112 | { |
||
2113 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2114 | struct intel_batchbuffer *batch = i965->batch; |
||
2115 | struct i965_render_state *render_state = &i965->render_state; |
||
2116 | |||
2117 | BEGIN_BATCH(batch, 11); |
||
2118 | OUT_BATCH(batch, CMD_VERTEX_BUFFERS | 3); |
||
2119 | OUT_BATCH(batch, |
||
2120 | (0 << GEN6_VB0_BUFFER_INDEX_SHIFT) | |
||
2121 | GEN6_VB0_VERTEXDATA | |
||
2122 | ((4 * 4) << VB0_BUFFER_PITCH_SHIFT)); |
||
2123 | OUT_RELOC(batch, render_state->vb.vertex_buffer, I915_GEM_DOMAIN_VERTEX, 0, 0); |
||
2124 | OUT_RELOC(batch, render_state->vb.vertex_buffer, I915_GEM_DOMAIN_VERTEX, 0, 12 * 4); |
||
2125 | OUT_BATCH(batch, 0); |
||
2126 | |||
2127 | OUT_BATCH(batch, |
||
2128 | CMD_3DPRIMITIVE | |
||
2129 | _3DPRIMITIVE_VERTEX_SEQUENTIAL | |
||
2130 | (_3DPRIM_RECTLIST << _3DPRIMITIVE_TOPOLOGY_SHIFT) | |
||
2131 | (0 << 9) | |
||
2132 | 4); |
||
2133 | OUT_BATCH(batch, 3); /* vertex count per instance */ |
||
2134 | OUT_BATCH(batch, 0); /* start vertex offset */ |
||
2135 | OUT_BATCH(batch, 1); /* single instance */ |
||
2136 | OUT_BATCH(batch, 0); /* start instance location */ |
||
2137 | OUT_BATCH(batch, 0); /* index buffer offset, ignored */ |
||
2138 | ADVANCE_BATCH(batch); |
||
2139 | } |
||
2140 | |||
2141 | static void |
||
2142 | gen6_render_emit_states(VADriverContextP ctx, int kernel) |
||
2143 | { |
||
2144 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2145 | struct intel_batchbuffer *batch = i965->batch; |
||
2146 | |||
2147 | intel_batchbuffer_start_atomic(batch, 0x1000); |
||
2148 | intel_batchbuffer_emit_mi_flush(batch); |
||
2149 | gen6_emit_invarient_states(ctx); |
||
2150 | gen6_emit_state_base_address(ctx); |
||
2151 | gen6_emit_viewport_state_pointers(ctx); |
||
2152 | gen6_emit_urb(ctx); |
||
2153 | gen6_emit_cc_state_pointers(ctx); |
||
2154 | gen6_emit_sampler_state_pointers(ctx); |
||
2155 | gen6_emit_vs_state(ctx); |
||
2156 | gen6_emit_gs_state(ctx); |
||
2157 | gen6_emit_clip_state(ctx); |
||
2158 | gen6_emit_sf_state(ctx); |
||
2159 | gen6_emit_wm_state(ctx, kernel); |
||
2160 | gen6_emit_binding_table(ctx); |
||
2161 | gen6_emit_depth_buffer_state(ctx); |
||
2162 | gen6_emit_drawing_rectangle(ctx); |
||
2163 | gen6_emit_vertex_element_state(ctx); |
||
2164 | gen6_emit_vertices(ctx); |
||
2165 | intel_batchbuffer_end_atomic(batch); |
||
2166 | } |
||
2167 | |||
2168 | static void |
||
2169 | gen6_render_put_surface( |
||
2170 | VADriverContextP ctx, |
||
2171 | VASurfaceID surface, |
||
2172 | const VARectangle *src_rect, |
||
2173 | const VARectangle *dst_rect, |
||
2174 | unsigned int flags |
||
2175 | ) |
||
2176 | { |
||
2177 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2178 | struct intel_batchbuffer *batch = i965->batch; |
||
2179 | |||
2180 | gen6_render_initialize(ctx); |
||
2181 | gen6_render_setup_states(ctx, surface, src_rect, dst_rect, flags); |
||
2182 | i965_clear_dest_region(ctx); |
||
2183 | gen6_render_emit_states(ctx, PS_KERNEL); |
||
2184 | intel_batchbuffer_flush(batch); |
||
2185 | } |
||
2186 | |||
2187 | static void |
||
2188 | gen6_subpicture_render_blend_state(VADriverContextP ctx) |
||
2189 | { |
||
2190 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2191 | struct i965_render_state *render_state = &i965->render_state; |
||
2192 | struct gen6_blend_state *blend_state; |
||
2193 | |||
2194 | dri_bo_unmap(render_state->cc.state); |
||
2195 | dri_bo_map(render_state->cc.blend, 1); |
||
2196 | assert(render_state->cc.blend->virtual); |
||
2197 | blend_state = render_state->cc.blend->virtual; |
||
2198 | memset(blend_state, 0, sizeof(*blend_state)); |
||
2199 | blend_state->blend0.dest_blend_factor = I965_BLENDFACTOR_INV_SRC_ALPHA; |
||
2200 | blend_state->blend0.source_blend_factor = I965_BLENDFACTOR_SRC_ALPHA; |
||
2201 | blend_state->blend0.blend_func = I965_BLENDFUNCTION_ADD; |
||
2202 | blend_state->blend0.blend_enable = 1; |
||
2203 | blend_state->blend1.post_blend_clamp_enable = 1; |
||
2204 | blend_state->blend1.pre_blend_clamp_enable = 1; |
||
2205 | blend_state->blend1.clamp_range = 0; /* clamp range [0, 1] */ |
||
2206 | dri_bo_unmap(render_state->cc.blend); |
||
2207 | } |
||
2208 | |||
2209 | static void |
||
2210 | gen6_subpicture_render_setup_states( |
||
2211 | VADriverContextP ctx, |
||
2212 | VASurfaceID surface, |
||
2213 | const VARectangle *src_rect, |
||
2214 | const VARectangle *dst_rect |
||
2215 | ) |
||
2216 | { |
||
2217 | i965_render_dest_surface_state(ctx, 0); |
||
2218 | i965_subpic_render_src_surfaces_state(ctx, surface); |
||
2219 | i965_render_sampler(ctx); |
||
2220 | i965_render_cc_viewport(ctx); |
||
2221 | gen6_render_color_calc_state(ctx); |
||
2222 | gen6_subpicture_render_blend_state(ctx); |
||
2223 | gen6_render_depth_stencil_state(ctx); |
||
2224 | i965_subpic_render_upload_constants(ctx, surface); |
||
2225 | i965_subpic_render_upload_vertex(ctx, surface, dst_rect); |
||
2226 | } |
||
2227 | |||
2228 | static void |
||
2229 | gen6_render_put_subpicture( |
||
2230 | VADriverContextP ctx, |
||
2231 | VASurfaceID surface, |
||
2232 | const VARectangle *src_rect, |
||
2233 | const VARectangle *dst_rect |
||
2234 | ) |
||
2235 | { |
||
2236 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2237 | struct intel_batchbuffer *batch = i965->batch; |
||
2238 | struct object_surface *obj_surface = SURFACE(surface); |
||
2239 | unsigned int index = obj_surface->subpic_render_idx; |
||
2240 | struct object_subpic *obj_subpic = SUBPIC(obj_surface->subpic[index]); |
||
2241 | |||
2242 | assert(obj_subpic); |
||
2243 | gen6_render_initialize(ctx); |
||
2244 | gen6_subpicture_render_setup_states(ctx, surface, src_rect, dst_rect); |
||
2245 | gen6_render_emit_states(ctx, PS_SUBPIC_KERNEL); |
||
2246 | i965_render_upload_image_palette(ctx, obj_subpic->image, 0xff); |
||
2247 | intel_batchbuffer_flush(batch); |
||
2248 | } |
||
2249 | |||
2250 | /* |
||
2251 | * for GEN7 |
||
2252 | */ |
||
2253 | static void |
||
2254 | gen7_render_initialize(VADriverContextP ctx) |
||
2255 | { |
||
2256 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2257 | struct i965_render_state *render_state = &i965->render_state; |
||
2258 | dri_bo *bo; |
||
2259 | |||
2260 | /* VERTEX BUFFER */ |
||
2261 | dri_bo_unreference(render_state->vb.vertex_buffer); |
||
2262 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
2263 | "vertex buffer", |
||
2264 | 4096, |
||
2265 | 4096); |
||
2266 | assert(bo); |
||
2267 | render_state->vb.vertex_buffer = bo; |
||
2268 | |||
2269 | /* WM */ |
||
2270 | dri_bo_unreference(render_state->wm.surface_state_binding_table_bo); |
||
2271 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
2272 | "surface state & binding table", |
||
2273 | (SURFACE_STATE_PADDED_SIZE + sizeof(unsigned int)) * MAX_RENDER_SURFACES, |
||
2274 | 4096); |
||
2275 | assert(bo); |
||
2276 | render_state->wm.surface_state_binding_table_bo = bo; |
||
2277 | |||
2278 | dri_bo_unreference(render_state->wm.sampler); |
||
2279 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
2280 | "sampler state", |
||
2281 | MAX_SAMPLERS * sizeof(struct gen7_sampler_state), |
||
2282 | 4096); |
||
2283 | assert(bo); |
||
2284 | render_state->wm.sampler = bo; |
||
2285 | render_state->wm.sampler_count = 0; |
||
2286 | |||
2287 | /* COLOR CALCULATOR */ |
||
2288 | dri_bo_unreference(render_state->cc.state); |
||
2289 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
2290 | "color calc state", |
||
2291 | sizeof(struct gen6_color_calc_state), |
||
2292 | 4096); |
||
2293 | assert(bo); |
||
2294 | render_state->cc.state = bo; |
||
2295 | |||
2296 | /* CC VIEWPORT */ |
||
2297 | dri_bo_unreference(render_state->cc.viewport); |
||
2298 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
2299 | "cc viewport", |
||
2300 | sizeof(struct i965_cc_viewport), |
||
2301 | 4096); |
||
2302 | assert(bo); |
||
2303 | render_state->cc.viewport = bo; |
||
2304 | |||
2305 | /* BLEND STATE */ |
||
2306 | dri_bo_unreference(render_state->cc.blend); |
||
2307 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
2308 | "blend state", |
||
2309 | sizeof(struct gen6_blend_state), |
||
2310 | 4096); |
||
2311 | assert(bo); |
||
2312 | render_state->cc.blend = bo; |
||
2313 | |||
2314 | /* DEPTH & STENCIL STATE */ |
||
2315 | dri_bo_unreference(render_state->cc.depth_stencil); |
||
2316 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
2317 | "depth & stencil state", |
||
2318 | sizeof(struct gen6_depth_stencil_state), |
||
2319 | 4096); |
||
2320 | assert(bo); |
||
2321 | render_state->cc.depth_stencil = bo; |
||
2322 | } |
||
2323 | |||
2324 | static void |
||
2325 | gen7_render_color_calc_state(VADriverContextP ctx) |
||
2326 | { |
||
2327 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2328 | struct i965_render_state *render_state = &i965->render_state; |
||
2329 | struct gen6_color_calc_state *color_calc_state; |
||
2330 | |||
2331 | dri_bo_map(render_state->cc.state, 1); |
||
2332 | assert(render_state->cc.state->virtual); |
||
2333 | color_calc_state = render_state->cc.state->virtual; |
||
2334 | memset(color_calc_state, 0, sizeof(*color_calc_state)); |
||
2335 | color_calc_state->constant_r = 1.0; |
||
2336 | color_calc_state->constant_g = 0.0; |
||
2337 | color_calc_state->constant_b = 1.0; |
||
2338 | color_calc_state->constant_a = 1.0; |
||
2339 | dri_bo_unmap(render_state->cc.state); |
||
2340 | } |
||
2341 | |||
2342 | static void |
||
2343 | gen7_render_blend_state(VADriverContextP ctx) |
||
2344 | { |
||
2345 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2346 | struct i965_render_state *render_state = &i965->render_state; |
||
2347 | struct gen6_blend_state *blend_state; |
||
2348 | |||
2349 | dri_bo_map(render_state->cc.blend, 1); |
||
2350 | assert(render_state->cc.blend->virtual); |
||
2351 | blend_state = render_state->cc.blend->virtual; |
||
2352 | memset(blend_state, 0, sizeof(*blend_state)); |
||
2353 | blend_state->blend1.logic_op_enable = 1; |
||
2354 | blend_state->blend1.logic_op_func = 0xc; |
||
2355 | blend_state->blend1.pre_blend_clamp_enable = 1; |
||
2356 | dri_bo_unmap(render_state->cc.blend); |
||
2357 | } |
||
2358 | |||
2359 | static void |
||
2360 | gen7_render_depth_stencil_state(VADriverContextP ctx) |
||
2361 | { |
||
2362 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2363 | struct i965_render_state *render_state = &i965->render_state; |
||
2364 | struct gen6_depth_stencil_state *depth_stencil_state; |
||
2365 | |||
2366 | dri_bo_map(render_state->cc.depth_stencil, 1); |
||
2367 | assert(render_state->cc.depth_stencil->virtual); |
||
2368 | depth_stencil_state = render_state->cc.depth_stencil->virtual; |
||
2369 | memset(depth_stencil_state, 0, sizeof(*depth_stencil_state)); |
||
2370 | dri_bo_unmap(render_state->cc.depth_stencil); |
||
2371 | } |
||
2372 | |||
2373 | static void |
||
2374 | gen7_render_sampler(VADriverContextP ctx) |
||
2375 | { |
||
2376 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2377 | struct i965_render_state *render_state = &i965->render_state; |
||
2378 | struct gen7_sampler_state *sampler_state; |
||
2379 | int i; |
||
2380 | |||
2381 | assert(render_state->wm.sampler_count > 0); |
||
2382 | assert(render_state->wm.sampler_count <= MAX_SAMPLERS); |
||
2383 | |||
2384 | dri_bo_map(render_state->wm.sampler, 1); |
||
2385 | assert(render_state->wm.sampler->virtual); |
||
2386 | sampler_state = render_state->wm.sampler->virtual; |
||
2387 | for (i = 0; i < render_state->wm.sampler_count; i++) { |
||
2388 | memset(sampler_state, 0, sizeof(*sampler_state)); |
||
2389 | sampler_state->ss0.min_filter = I965_MAPFILTER_LINEAR; |
||
2390 | sampler_state->ss0.mag_filter = I965_MAPFILTER_LINEAR; |
||
2391 | sampler_state->ss3.r_wrap_mode = I965_TEXCOORDMODE_CLAMP; |
||
2392 | sampler_state->ss3.s_wrap_mode = I965_TEXCOORDMODE_CLAMP; |
||
2393 | sampler_state->ss3.t_wrap_mode = I965_TEXCOORDMODE_CLAMP; |
||
2394 | sampler_state++; |
||
2395 | } |
||
2396 | |||
2397 | dri_bo_unmap(render_state->wm.sampler); |
||
2398 | } |
||
2399 | |||
2400 | static void |
||
2401 | gen7_render_setup_states( |
||
2402 | VADriverContextP ctx, |
||
2403 | VASurfaceID surface, |
||
2404 | const VARectangle *src_rect, |
||
2405 | const VARectangle *dst_rect, |
||
2406 | unsigned int flags |
||
2407 | ) |
||
2408 | { |
||
2409 | i965_render_dest_surface_state(ctx, 0); |
||
2410 | i965_render_src_surfaces_state(ctx, surface, flags); |
||
2411 | gen7_render_sampler(ctx); |
||
2412 | i965_render_cc_viewport(ctx); |
||
2413 | gen7_render_color_calc_state(ctx); |
||
2414 | gen7_render_blend_state(ctx); |
||
2415 | gen7_render_depth_stencil_state(ctx); |
||
2416 | i965_render_upload_constants(ctx, surface); |
||
2417 | i965_render_upload_vertex(ctx, surface, src_rect, dst_rect); |
||
2418 | } |
||
2419 | |||
2420 | static void |
||
2421 | gen7_emit_invarient_states(VADriverContextP ctx) |
||
2422 | { |
||
2423 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2424 | struct intel_batchbuffer *batch = i965->batch; |
||
2425 | |||
2426 | BEGIN_BATCH(batch, 1); |
||
2427 | OUT_BATCH(batch, CMD_PIPELINE_SELECT | PIPELINE_SELECT_3D); |
||
2428 | ADVANCE_BATCH(batch); |
||
2429 | |||
2430 | BEGIN_BATCH(batch, 4); |
||
2431 | OUT_BATCH(batch, GEN6_3DSTATE_MULTISAMPLE | (4 - 2)); |
||
2432 | OUT_BATCH(batch, GEN6_3DSTATE_MULTISAMPLE_PIXEL_LOCATION_CENTER | |
||
2433 | GEN6_3DSTATE_MULTISAMPLE_NUMSAMPLES_1); /* 1 sample/pixel */ |
||
2434 | OUT_BATCH(batch, 0); |
||
2435 | OUT_BATCH(batch, 0); |
||
2436 | ADVANCE_BATCH(batch); |
||
2437 | |||
2438 | BEGIN_BATCH(batch, 2); |
||
2439 | OUT_BATCH(batch, GEN6_3DSTATE_SAMPLE_MASK | (2 - 2)); |
||
2440 | OUT_BATCH(batch, 1); |
||
2441 | ADVANCE_BATCH(batch); |
||
2442 | |||
2443 | /* Set system instruction pointer */ |
||
2444 | BEGIN_BATCH(batch, 2); |
||
2445 | OUT_BATCH(batch, CMD_STATE_SIP | 0); |
||
2446 | OUT_BATCH(batch, 0); |
||
2447 | ADVANCE_BATCH(batch); |
||
2448 | } |
||
2449 | |||
2450 | static void |
||
2451 | gen7_emit_state_base_address(VADriverContextP ctx) |
||
2452 | { |
||
2453 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2454 | struct intel_batchbuffer *batch = i965->batch; |
||
2455 | struct i965_render_state *render_state = &i965->render_state; |
||
2456 | |||
2457 | OUT_BATCH(batch, CMD_STATE_BASE_ADDRESS | (10 - 2)); |
||
2458 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* General state base address */ |
||
2459 | OUT_RELOC(batch, render_state->wm.surface_state_binding_table_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, BASE_ADDRESS_MODIFY); /* Surface state base address */ |
||
2460 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Dynamic state base address */ |
||
2461 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Indirect object base address */ |
||
2462 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Instruction base address */ |
||
2463 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* General state upper bound */ |
||
2464 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Dynamic state upper bound */ |
||
2465 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Indirect object upper bound */ |
||
2466 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Instruction access upper bound */ |
||
2467 | } |
||
2468 | |||
2469 | static void |
||
2470 | gen7_emit_viewport_state_pointers(VADriverContextP ctx) |
||
2471 | { |
||
2472 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2473 | struct intel_batchbuffer *batch = i965->batch; |
||
2474 | struct i965_render_state *render_state = &i965->render_state; |
||
2475 | |||
2476 | BEGIN_BATCH(batch, 2); |
||
2477 | OUT_BATCH(batch, GEN7_3DSTATE_VIEWPORT_STATE_POINTERS_CC | (2 - 2)); |
||
2478 | OUT_RELOC(batch, |
||
2479 | render_state->cc.viewport, |
||
2480 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
2481 | 0); |
||
2482 | ADVANCE_BATCH(batch); |
||
2483 | |||
2484 | BEGIN_BATCH(batch, 2); |
||
2485 | OUT_BATCH(batch, GEN7_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CL | (2 - 2)); |
||
2486 | OUT_BATCH(batch, 0); |
||
2487 | ADVANCE_BATCH(batch); |
||
2488 | } |
||
2489 | |||
2490 | /* |
||
2491 | * URB layout on GEN7 |
||
2492 | * ---------------------------------------- |
||
2493 | * | PS Push Constants (8KB) | VS entries | |
||
2494 | * ---------------------------------------- |
||
2495 | */ |
||
2496 | static void |
||
2497 | gen7_emit_urb(VADriverContextP ctx) |
||
2498 | { |
||
2499 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2500 | struct intel_batchbuffer *batch = i965->batch; |
||
2501 | unsigned int num_urb_entries = 32; |
||
2502 | |||
2503 | if (IS_HASWELL(i965->intel.device_id)) |
||
2504 | num_urb_entries = 64; |
||
2505 | |||
2506 | BEGIN_BATCH(batch, 2); |
||
2507 | OUT_BATCH(batch, GEN7_3DSTATE_PUSH_CONSTANT_ALLOC_PS | (2 - 2)); |
||
2508 | OUT_BATCH(batch, 8); /* in 1KBs */ |
||
2509 | ADVANCE_BATCH(batch); |
||
2510 | |||
2511 | BEGIN_BATCH(batch, 2); |
||
2512 | OUT_BATCH(batch, GEN7_3DSTATE_URB_VS | (2 - 2)); |
||
2513 | OUT_BATCH(batch, |
||
2514 | (num_urb_entries << GEN7_URB_ENTRY_NUMBER_SHIFT) | |
||
2515 | (2 - 1) << GEN7_URB_ENTRY_SIZE_SHIFT | |
||
2516 | (1 << GEN7_URB_STARTING_ADDRESS_SHIFT)); |
||
2517 | ADVANCE_BATCH(batch); |
||
2518 | |||
2519 | BEGIN_BATCH(batch, 2); |
||
2520 | OUT_BATCH(batch, GEN7_3DSTATE_URB_GS | (2 - 2)); |
||
2521 | OUT_BATCH(batch, |
||
2522 | (0 << GEN7_URB_ENTRY_SIZE_SHIFT) | |
||
2523 | (1 << GEN7_URB_STARTING_ADDRESS_SHIFT)); |
||
2524 | ADVANCE_BATCH(batch); |
||
2525 | |||
2526 | BEGIN_BATCH(batch, 2); |
||
2527 | OUT_BATCH(batch, GEN7_3DSTATE_URB_HS | (2 - 2)); |
||
2528 | OUT_BATCH(batch, |
||
2529 | (0 << GEN7_URB_ENTRY_SIZE_SHIFT) | |
||
2530 | (2 << GEN7_URB_STARTING_ADDRESS_SHIFT)); |
||
2531 | ADVANCE_BATCH(batch); |
||
2532 | |||
2533 | BEGIN_BATCH(batch, 2); |
||
2534 | OUT_BATCH(batch, GEN7_3DSTATE_URB_DS | (2 - 2)); |
||
2535 | OUT_BATCH(batch, |
||
2536 | (0 << GEN7_URB_ENTRY_SIZE_SHIFT) | |
||
2537 | (2 << GEN7_URB_STARTING_ADDRESS_SHIFT)); |
||
2538 | ADVANCE_BATCH(batch); |
||
2539 | } |
||
2540 | |||
2541 | static void |
||
2542 | gen7_emit_cc_state_pointers(VADriverContextP ctx) |
||
2543 | { |
||
2544 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2545 | struct intel_batchbuffer *batch = i965->batch; |
||
2546 | struct i965_render_state *render_state = &i965->render_state; |
||
2547 | |||
2548 | BEGIN_BATCH(batch, 2); |
||
2549 | OUT_BATCH(batch, GEN6_3DSTATE_CC_STATE_POINTERS | (2 - 2)); |
||
2550 | OUT_RELOC(batch, |
||
2551 | render_state->cc.state, |
||
2552 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
2553 | 1); |
||
2554 | ADVANCE_BATCH(batch); |
||
2555 | |||
2556 | BEGIN_BATCH(batch, 2); |
||
2557 | OUT_BATCH(batch, GEN7_3DSTATE_BLEND_STATE_POINTERS | (2 - 2)); |
||
2558 | OUT_RELOC(batch, |
||
2559 | render_state->cc.blend, |
||
2560 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
2561 | 1); |
||
2562 | ADVANCE_BATCH(batch); |
||
2563 | |||
2564 | BEGIN_BATCH(batch, 2); |
||
2565 | OUT_BATCH(batch, GEN7_3DSTATE_DEPTH_STENCIL_STATE_POINTERS | (2 - 2)); |
||
2566 | OUT_RELOC(batch, |
||
2567 | render_state->cc.depth_stencil, |
||
2568 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
2569 | 1); |
||
2570 | ADVANCE_BATCH(batch); |
||
2571 | } |
||
2572 | |||
2573 | static void |
||
2574 | gen7_emit_sampler_state_pointers(VADriverContextP ctx) |
||
2575 | { |
||
2576 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2577 | struct intel_batchbuffer *batch = i965->batch; |
||
2578 | struct i965_render_state *render_state = &i965->render_state; |
||
2579 | |||
2580 | BEGIN_BATCH(batch, 2); |
||
2581 | OUT_BATCH(batch, GEN7_3DSTATE_SAMPLER_STATE_POINTERS_PS | (2 - 2)); |
||
2582 | OUT_RELOC(batch, |
||
2583 | render_state->wm.sampler, |
||
2584 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
2585 | 0); |
||
2586 | ADVANCE_BATCH(batch); |
||
2587 | } |
||
2588 | |||
2589 | static void |
||
2590 | gen7_emit_binding_table(VADriverContextP ctx) |
||
2591 | { |
||
2592 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2593 | struct intel_batchbuffer *batch = i965->batch; |
||
2594 | |||
2595 | BEGIN_BATCH(batch, 2); |
||
2596 | OUT_BATCH(batch, GEN7_3DSTATE_BINDING_TABLE_POINTERS_PS | (2 - 2)); |
||
2597 | OUT_BATCH(batch, BINDING_TABLE_OFFSET); |
||
2598 | ADVANCE_BATCH(batch); |
||
2599 | } |
||
2600 | |||
2601 | static void |
||
2602 | gen7_emit_depth_buffer_state(VADriverContextP ctx) |
||
2603 | { |
||
2604 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2605 | struct intel_batchbuffer *batch = i965->batch; |
||
2606 | |||
2607 | BEGIN_BATCH(batch, 7); |
||
2608 | OUT_BATCH(batch, GEN7_3DSTATE_DEPTH_BUFFER | (7 - 2)); |
||
2609 | OUT_BATCH(batch, |
||
2610 | (I965_DEPTHFORMAT_D32_FLOAT << 18) | |
||
2611 | (I965_SURFACE_NULL << 29)); |
||
2612 | OUT_BATCH(batch, 0); |
||
2613 | OUT_BATCH(batch, 0); |
||
2614 | OUT_BATCH(batch, 0); |
||
2615 | OUT_BATCH(batch, 0); |
||
2616 | OUT_BATCH(batch, 0); |
||
2617 | ADVANCE_BATCH(batch); |
||
2618 | |||
2619 | BEGIN_BATCH(batch, 3); |
||
2620 | OUT_BATCH(batch, GEN7_3DSTATE_CLEAR_PARAMS | (3 - 2)); |
||
2621 | OUT_BATCH(batch, 0); |
||
2622 | OUT_BATCH(batch, 0); |
||
2623 | ADVANCE_BATCH(batch); |
||
2624 | } |
||
2625 | |||
2626 | static void |
||
2627 | gen7_emit_drawing_rectangle(VADriverContextP ctx) |
||
2628 | { |
||
2629 | i965_render_drawing_rectangle(ctx); |
||
2630 | } |
||
2631 | |||
2632 | static void |
||
2633 | gen7_emit_vs_state(VADriverContextP ctx) |
||
2634 | { |
||
2635 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2636 | struct intel_batchbuffer *batch = i965->batch; |
||
2637 | |||
2638 | /* disable VS constant buffer */ |
||
2639 | OUT_BATCH(batch, GEN6_3DSTATE_CONSTANT_VS | (7 - 2)); |
||
2640 | OUT_BATCH(batch, 0); |
||
2641 | OUT_BATCH(batch, 0); |
||
2642 | OUT_BATCH(batch, 0); |
||
2643 | OUT_BATCH(batch, 0); |
||
2644 | OUT_BATCH(batch, 0); |
||
2645 | OUT_BATCH(batch, 0); |
||
2646 | |||
2647 | OUT_BATCH(batch, GEN6_3DSTATE_VS | (6 - 2)); |
||
2648 | OUT_BATCH(batch, 0); /* without VS kernel */ |
||
2649 | OUT_BATCH(batch, 0); |
||
2650 | OUT_BATCH(batch, 0); |
||
2651 | OUT_BATCH(batch, 0); |
||
2652 | OUT_BATCH(batch, 0); /* pass-through */ |
||
2653 | } |
||
2654 | |||
2655 | static void |
||
2656 | gen7_emit_bypass_state(VADriverContextP ctx) |
||
2657 | { |
||
2658 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2659 | struct intel_batchbuffer *batch = i965->batch; |
||
2660 | |||
2661 | /* bypass GS */ |
||
2662 | BEGIN_BATCH(batch, 7); |
||
2663 | OUT_BATCH(batch, GEN6_3DSTATE_CONSTANT_GS | (7 - 2)); |
||
2664 | OUT_BATCH(batch, 0); |
||
2665 | OUT_BATCH(batch, 0); |
||
2666 | OUT_BATCH(batch, 0); |
||
2667 | OUT_BATCH(batch, 0); |
||
2668 | OUT_BATCH(batch, 0); |
||
2669 | OUT_BATCH(batch, 0); |
||
2670 | ADVANCE_BATCH(batch); |
||
2671 | |||
2672 | BEGIN_BATCH(batch, 7); |
||
2673 | OUT_BATCH(batch, GEN6_3DSTATE_GS | (7 - 2)); |
||
2674 | OUT_BATCH(batch, 0); /* without GS kernel */ |
||
2675 | OUT_BATCH(batch, 0); |
||
2676 | OUT_BATCH(batch, 0); |
||
2677 | OUT_BATCH(batch, 0); |
||
2678 | OUT_BATCH(batch, 0); |
||
2679 | OUT_BATCH(batch, 0); /* pass-through */ |
||
2680 | ADVANCE_BATCH(batch); |
||
2681 | |||
2682 | BEGIN_BATCH(batch, 2); |
||
2683 | OUT_BATCH(batch, GEN7_3DSTATE_BINDING_TABLE_POINTERS_GS | (2 - 2)); |
||
2684 | OUT_BATCH(batch, 0); |
||
2685 | ADVANCE_BATCH(batch); |
||
2686 | |||
2687 | /* disable HS */ |
||
2688 | BEGIN_BATCH(batch, 7); |
||
2689 | OUT_BATCH(batch, GEN7_3DSTATE_CONSTANT_HS | (7 - 2)); |
||
2690 | OUT_BATCH(batch, 0); |
||
2691 | OUT_BATCH(batch, 0); |
||
2692 | OUT_BATCH(batch, 0); |
||
2693 | OUT_BATCH(batch, 0); |
||
2694 | OUT_BATCH(batch, 0); |
||
2695 | OUT_BATCH(batch, 0); |
||
2696 | ADVANCE_BATCH(batch); |
||
2697 | |||
2698 | BEGIN_BATCH(batch, 7); |
||
2699 | OUT_BATCH(batch, GEN7_3DSTATE_HS | (7 - 2)); |
||
2700 | OUT_BATCH(batch, 0); |
||
2701 | OUT_BATCH(batch, 0); |
||
2702 | OUT_BATCH(batch, 0); |
||
2703 | OUT_BATCH(batch, 0); |
||
2704 | OUT_BATCH(batch, 0); |
||
2705 | OUT_BATCH(batch, 0); |
||
2706 | ADVANCE_BATCH(batch); |
||
2707 | |||
2708 | BEGIN_BATCH(batch, 2); |
||
2709 | OUT_BATCH(batch, GEN7_3DSTATE_BINDING_TABLE_POINTERS_HS | (2 - 2)); |
||
2710 | OUT_BATCH(batch, 0); |
||
2711 | ADVANCE_BATCH(batch); |
||
2712 | |||
2713 | /* Disable TE */ |
||
2714 | BEGIN_BATCH(batch, 4); |
||
2715 | OUT_BATCH(batch, GEN7_3DSTATE_TE | (4 - 2)); |
||
2716 | OUT_BATCH(batch, 0); |
||
2717 | OUT_BATCH(batch, 0); |
||
2718 | OUT_BATCH(batch, 0); |
||
2719 | ADVANCE_BATCH(batch); |
||
2720 | |||
2721 | /* Disable DS */ |
||
2722 | BEGIN_BATCH(batch, 7); |
||
2723 | OUT_BATCH(batch, GEN7_3DSTATE_CONSTANT_DS | (7 - 2)); |
||
2724 | OUT_BATCH(batch, 0); |
||
2725 | OUT_BATCH(batch, 0); |
||
2726 | OUT_BATCH(batch, 0); |
||
2727 | OUT_BATCH(batch, 0); |
||
2728 | OUT_BATCH(batch, 0); |
||
2729 | OUT_BATCH(batch, 0); |
||
2730 | ADVANCE_BATCH(batch); |
||
2731 | |||
2732 | BEGIN_BATCH(batch, 6); |
||
2733 | OUT_BATCH(batch, GEN7_3DSTATE_DS | (6 - 2)); |
||
2734 | OUT_BATCH(batch, 0); |
||
2735 | OUT_BATCH(batch, 0); |
||
2736 | OUT_BATCH(batch, 0); |
||
2737 | OUT_BATCH(batch, 0); |
||
2738 | OUT_BATCH(batch, 0); |
||
2739 | ADVANCE_BATCH(batch); |
||
2740 | |||
2741 | BEGIN_BATCH(batch, 2); |
||
2742 | OUT_BATCH(batch, GEN7_3DSTATE_BINDING_TABLE_POINTERS_DS | (2 - 2)); |
||
2743 | OUT_BATCH(batch, 0); |
||
2744 | ADVANCE_BATCH(batch); |
||
2745 | |||
2746 | /* Disable STREAMOUT */ |
||
2747 | BEGIN_BATCH(batch, 3); |
||
2748 | OUT_BATCH(batch, GEN7_3DSTATE_STREAMOUT | (3 - 2)); |
||
2749 | OUT_BATCH(batch, 0); |
||
2750 | OUT_BATCH(batch, 0); |
||
2751 | ADVANCE_BATCH(batch); |
||
2752 | } |
||
2753 | |||
2754 | static void |
||
2755 | gen7_emit_clip_state(VADriverContextP ctx) |
||
2756 | { |
||
2757 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2758 | struct intel_batchbuffer *batch = i965->batch; |
||
2759 | |||
2760 | OUT_BATCH(batch, GEN6_3DSTATE_CLIP | (4 - 2)); |
||
2761 | OUT_BATCH(batch, 0); |
||
2762 | OUT_BATCH(batch, 0); /* pass-through */ |
||
2763 | OUT_BATCH(batch, 0); |
||
2764 | } |
||
2765 | |||
2766 | static void |
||
2767 | gen7_emit_sf_state(VADriverContextP ctx) |
||
2768 | { |
||
2769 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2770 | struct intel_batchbuffer *batch = i965->batch; |
||
2771 | |||
2772 | BEGIN_BATCH(batch, 14); |
||
2773 | OUT_BATCH(batch, GEN7_3DSTATE_SBE | (14 - 2)); |
||
2774 | OUT_BATCH(batch, |
||
2775 | (1 << GEN7_SBE_NUM_OUTPUTS_SHIFT) | |
||
2776 | (1 << GEN7_SBE_URB_ENTRY_READ_LENGTH_SHIFT) | |
||
2777 | (0 << GEN7_SBE_URB_ENTRY_READ_OFFSET_SHIFT)); |
||
2778 | OUT_BATCH(batch, 0); |
||
2779 | OUT_BATCH(batch, 0); |
||
2780 | OUT_BATCH(batch, 0); /* DW4 */ |
||
2781 | OUT_BATCH(batch, 0); |
||
2782 | OUT_BATCH(batch, 0); |
||
2783 | OUT_BATCH(batch, 0); |
||
2784 | OUT_BATCH(batch, 0); |
||
2785 | OUT_BATCH(batch, 0); /* DW9 */ |
||
2786 | OUT_BATCH(batch, 0); |
||
2787 | OUT_BATCH(batch, 0); |
||
2788 | OUT_BATCH(batch, 0); |
||
2789 | OUT_BATCH(batch, 0); |
||
2790 | ADVANCE_BATCH(batch); |
||
2791 | |||
2792 | BEGIN_BATCH(batch, 7); |
||
2793 | OUT_BATCH(batch, GEN6_3DSTATE_SF | (7 - 2)); |
||
2794 | OUT_BATCH(batch, 0); |
||
2795 | OUT_BATCH(batch, GEN6_3DSTATE_SF_CULL_NONE); |
||
2796 | OUT_BATCH(batch, 2 << GEN6_3DSTATE_SF_TRIFAN_PROVOKE_SHIFT); |
||
2797 | OUT_BATCH(batch, 0); |
||
2798 | OUT_BATCH(batch, 0); |
||
2799 | OUT_BATCH(batch, 0); |
||
2800 | ADVANCE_BATCH(batch); |
||
2801 | } |
||
2802 | |||
2803 | static void |
||
2804 | gen7_emit_wm_state(VADriverContextP ctx, int kernel) |
||
2805 | { |
||
2806 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2807 | struct intel_batchbuffer *batch = i965->batch; |
||
2808 | struct i965_render_state *render_state = &i965->render_state; |
||
2809 | unsigned int max_threads_shift = GEN7_PS_MAX_THREADS_SHIFT_IVB; |
||
2810 | unsigned int num_samples = 0; |
||
2811 | |||
2812 | if (IS_HASWELL(i965->intel.device_id)) { |
||
2813 | max_threads_shift = GEN7_PS_MAX_THREADS_SHIFT_HSW; |
||
2814 | num_samples = 1 << GEN7_PS_SAMPLE_MASK_SHIFT_HSW; |
||
2815 | } |
||
2816 | |||
2817 | BEGIN_BATCH(batch, 3); |
||
2818 | OUT_BATCH(batch, GEN6_3DSTATE_WM | (3 - 2)); |
||
2819 | OUT_BATCH(batch, |
||
2820 | GEN7_WM_DISPATCH_ENABLE | |
||
2821 | GEN7_WM_PERSPECTIVE_PIXEL_BARYCENTRIC); |
||
2822 | OUT_BATCH(batch, 0); |
||
2823 | ADVANCE_BATCH(batch); |
||
2824 | |||
2825 | BEGIN_BATCH(batch, 7); |
||
2826 | OUT_BATCH(batch, GEN6_3DSTATE_CONSTANT_PS | (7 - 2)); |
||
2827 | OUT_BATCH(batch, 1); |
||
2828 | OUT_BATCH(batch, 0); |
||
2829 | OUT_RELOC(batch, |
||
2830 | render_state->curbe.bo, |
||
2831 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
2832 | 0); |
||
2833 | OUT_BATCH(batch, 0); |
||
2834 | OUT_BATCH(batch, 0); |
||
2835 | OUT_BATCH(batch, 0); |
||
2836 | ADVANCE_BATCH(batch); |
||
2837 | |||
2838 | BEGIN_BATCH(batch, 8); |
||
2839 | OUT_BATCH(batch, GEN7_3DSTATE_PS | (8 - 2)); |
||
2840 | OUT_RELOC(batch, |
||
2841 | render_state->render_kernels[kernel].bo, |
||
2842 | I915_GEM_DOMAIN_INSTRUCTION, 0, |
||
2843 | 0); |
||
2844 | OUT_BATCH(batch, |
||
2845 | (1 << GEN7_PS_SAMPLER_COUNT_SHIFT) | |
||
2846 | (5 << GEN7_PS_BINDING_TABLE_ENTRY_COUNT_SHIFT)); |
||
2847 | OUT_BATCH(batch, 0); /* scratch space base offset */ |
||
2848 | OUT_BATCH(batch, |
||
2849 | ((render_state->max_wm_threads - 1) << max_threads_shift) | num_samples | |
||
2850 | GEN7_PS_PUSH_CONSTANT_ENABLE | |
||
2851 | GEN7_PS_ATTRIBUTE_ENABLE | |
||
2852 | GEN7_PS_16_DISPATCH_ENABLE); |
||
2853 | OUT_BATCH(batch, |
||
2854 | (6 << GEN7_PS_DISPATCH_START_GRF_SHIFT_0)); |
||
2855 | OUT_BATCH(batch, 0); /* kernel 1 pointer */ |
||
2856 | OUT_BATCH(batch, 0); /* kernel 2 pointer */ |
||
2857 | ADVANCE_BATCH(batch); |
||
2858 | } |
||
2859 | |||
2860 | static void |
||
2861 | gen7_emit_vertex_element_state(VADriverContextP ctx) |
||
2862 | { |
||
2863 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2864 | struct intel_batchbuffer *batch = i965->batch; |
||
2865 | |||
2866 | /* Set up our vertex elements, sourced from the single vertex buffer. */ |
||
2867 | OUT_BATCH(batch, CMD_VERTEX_ELEMENTS | (5 - 2)); |
||
2868 | /* offset 0: X,Y -> {X, Y, 1.0, 1.0} */ |
||
2869 | OUT_BATCH(batch, (0 << GEN6_VE0_VERTEX_BUFFER_INDEX_SHIFT) | |
||
2870 | GEN6_VE0_VALID | |
||
2871 | (I965_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) | |
||
2872 | (0 << VE0_OFFSET_SHIFT)); |
||
2873 | OUT_BATCH(batch, (I965_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | |
||
2874 | (I965_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | |
||
2875 | (I965_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) | |
||
2876 | (I965_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT)); |
||
2877 | /* offset 8: S0, T0 -> {S0, T0, 1.0, 1.0} */ |
||
2878 | OUT_BATCH(batch, (0 << GEN6_VE0_VERTEX_BUFFER_INDEX_SHIFT) | |
||
2879 | GEN6_VE0_VALID | |
||
2880 | (I965_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) | |
||
2881 | (8 << VE0_OFFSET_SHIFT)); |
||
2882 | OUT_BATCH(batch, (I965_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | |
||
2883 | (I965_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | |
||
2884 | (I965_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) | |
||
2885 | (I965_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT)); |
||
2886 | } |
||
2887 | |||
2888 | static void |
||
2889 | gen7_emit_vertices(VADriverContextP ctx) |
||
2890 | { |
||
2891 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2892 | struct intel_batchbuffer *batch = i965->batch; |
||
2893 | struct i965_render_state *render_state = &i965->render_state; |
||
2894 | |||
2895 | BEGIN_BATCH(batch, 5); |
||
2896 | OUT_BATCH(batch, CMD_VERTEX_BUFFERS | (5 - 2)); |
||
2897 | OUT_BATCH(batch, |
||
2898 | (0 << GEN6_VB0_BUFFER_INDEX_SHIFT) | |
||
2899 | GEN6_VB0_VERTEXDATA | |
||
2900 | GEN7_VB0_ADDRESS_MODIFYENABLE | |
||
2901 | ((4 * 4) << VB0_BUFFER_PITCH_SHIFT)); |
||
2902 | OUT_RELOC(batch, render_state->vb.vertex_buffer, I915_GEM_DOMAIN_VERTEX, 0, 0); |
||
2903 | OUT_RELOC(batch, render_state->vb.vertex_buffer, I915_GEM_DOMAIN_VERTEX, 0, 12 * 4); |
||
2904 | OUT_BATCH(batch, 0); |
||
2905 | ADVANCE_BATCH(batch); |
||
2906 | |||
2907 | BEGIN_BATCH(batch, 7); |
||
2908 | OUT_BATCH(batch, CMD_3DPRIMITIVE | (7 - 2)); |
||
2909 | OUT_BATCH(batch, |
||
2910 | _3DPRIM_RECTLIST | |
||
2911 | GEN7_3DPRIM_VERTEXBUFFER_ACCESS_SEQUENTIAL); |
||
2912 | OUT_BATCH(batch, 3); /* vertex count per instance */ |
||
2913 | OUT_BATCH(batch, 0); /* start vertex offset */ |
||
2914 | OUT_BATCH(batch, 1); /* single instance */ |
||
2915 | OUT_BATCH(batch, 0); /* start instance location */ |
||
2916 | OUT_BATCH(batch, 0); |
||
2917 | ADVANCE_BATCH(batch); |
||
2918 | } |
||
2919 | |||
2920 | static void |
||
2921 | gen7_render_emit_states(VADriverContextP ctx, int kernel) |
||
2922 | { |
||
2923 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2924 | struct intel_batchbuffer *batch = i965->batch; |
||
2925 | |||
2926 | intel_batchbuffer_start_atomic(batch, 0x1000); |
||
2927 | intel_batchbuffer_emit_mi_flush(batch); |
||
2928 | gen7_emit_invarient_states(ctx); |
||
2929 | gen7_emit_state_base_address(ctx); |
||
2930 | gen7_emit_viewport_state_pointers(ctx); |
||
2931 | gen7_emit_urb(ctx); |
||
2932 | gen7_emit_cc_state_pointers(ctx); |
||
2933 | gen7_emit_sampler_state_pointers(ctx); |
||
2934 | gen7_emit_bypass_state(ctx); |
||
2935 | gen7_emit_vs_state(ctx); |
||
2936 | gen7_emit_clip_state(ctx); |
||
2937 | gen7_emit_sf_state(ctx); |
||
2938 | gen7_emit_wm_state(ctx, kernel); |
||
2939 | gen7_emit_binding_table(ctx); |
||
2940 | gen7_emit_depth_buffer_state(ctx); |
||
2941 | gen7_emit_drawing_rectangle(ctx); |
||
2942 | gen7_emit_vertex_element_state(ctx); |
||
2943 | gen7_emit_vertices(ctx); |
||
2944 | intel_batchbuffer_end_atomic(batch); |
||
2945 | } |
||
2946 | |||
2947 | static void |
||
2948 | gen7_render_put_surface( |
||
2949 | VADriverContextP ctx, |
||
2950 | VASurfaceID surface, |
||
2951 | const VARectangle *src_rect, |
||
2952 | const VARectangle *dst_rect, |
||
2953 | unsigned int flags |
||
2954 | ) |
||
2955 | { |
||
2956 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2957 | struct intel_batchbuffer *batch = i965->batch; |
||
2958 | |||
2959 | gen7_render_initialize(ctx); |
||
2960 | gen7_render_setup_states(ctx, surface, src_rect, dst_rect, flags); |
||
2961 | i965_clear_dest_region(ctx); |
||
2962 | gen7_render_emit_states(ctx, PS_KERNEL); |
||
2963 | intel_batchbuffer_flush(batch); |
||
2964 | } |
||
2965 | |||
2966 | static void |
||
2967 | gen7_subpicture_render_blend_state(VADriverContextP ctx) |
||
2968 | { |
||
2969 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
2970 | struct i965_render_state *render_state = &i965->render_state; |
||
2971 | struct gen6_blend_state *blend_state; |
||
2972 | |||
2973 | dri_bo_unmap(render_state->cc.state); |
||
2974 | dri_bo_map(render_state->cc.blend, 1); |
||
2975 | assert(render_state->cc.blend->virtual); |
||
2976 | blend_state = render_state->cc.blend->virtual; |
||
2977 | memset(blend_state, 0, sizeof(*blend_state)); |
||
2978 | blend_state->blend0.dest_blend_factor = I965_BLENDFACTOR_INV_SRC_ALPHA; |
||
2979 | blend_state->blend0.source_blend_factor = I965_BLENDFACTOR_SRC_ALPHA; |
||
2980 | blend_state->blend0.blend_func = I965_BLENDFUNCTION_ADD; |
||
2981 | blend_state->blend0.blend_enable = 1; |
||
2982 | blend_state->blend1.post_blend_clamp_enable = 1; |
||
2983 | blend_state->blend1.pre_blend_clamp_enable = 1; |
||
2984 | blend_state->blend1.clamp_range = 0; /* clamp range [0, 1] */ |
||
2985 | dri_bo_unmap(render_state->cc.blend); |
||
2986 | } |
||
2987 | |||
2988 | static void |
||
2989 | gen7_subpicture_render_setup_states( |
||
2990 | VADriverContextP ctx, |
||
2991 | VASurfaceID surface, |
||
2992 | const VARectangle *src_rect, |
||
2993 | const VARectangle *dst_rect |
||
2994 | ) |
||
2995 | { |
||
2996 | i965_render_dest_surface_state(ctx, 0); |
||
2997 | i965_subpic_render_src_surfaces_state(ctx, surface); |
||
2998 | i965_render_sampler(ctx); |
||
2999 | i965_render_cc_viewport(ctx); |
||
3000 | gen7_render_color_calc_state(ctx); |
||
3001 | gen7_subpicture_render_blend_state(ctx); |
||
3002 | gen7_render_depth_stencil_state(ctx); |
||
3003 | i965_subpic_render_upload_constants(ctx, surface); |
||
3004 | i965_subpic_render_upload_vertex(ctx, surface, dst_rect); |
||
3005 | } |
||
3006 | |||
3007 | static void |
||
3008 | gen7_render_put_subpicture( |
||
3009 | VADriverContextP ctx, |
||
3010 | VASurfaceID surface, |
||
3011 | const VARectangle *src_rect, |
||
3012 | const VARectangle *dst_rect |
||
3013 | ) |
||
3014 | { |
||
3015 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
3016 | struct intel_batchbuffer *batch = i965->batch; |
||
3017 | struct object_surface *obj_surface = SURFACE(surface); |
||
3018 | unsigned int index = obj_surface->subpic_render_idx; |
||
3019 | struct object_subpic *obj_subpic = SUBPIC(obj_surface->subpic[index]); |
||
3020 | |||
3021 | assert(obj_subpic); |
||
3022 | gen7_render_initialize(ctx); |
||
3023 | gen7_subpicture_render_setup_states(ctx, surface, src_rect, dst_rect); |
||
3024 | gen7_render_emit_states(ctx, PS_SUBPIC_KERNEL); |
||
3025 | i965_render_upload_image_palette(ctx, obj_subpic->image, 0xff); |
||
3026 | intel_batchbuffer_flush(batch); |
||
3027 | } |
||
3028 | |||
3029 | |||
3030 | /* |
||
3031 | * global functions |
||
3032 | */ |
||
3033 | VAStatus |
||
3034 | i965_DestroySurfaces(VADriverContextP ctx, |
||
3035 | VASurfaceID *surface_list, |
||
3036 | int num_surfaces); |
||
3037 | void |
||
3038 | intel_render_put_surface( |
||
3039 | VADriverContextP ctx, |
||
3040 | VASurfaceID surface, |
||
3041 | const VARectangle *src_rect, |
||
3042 | const VARectangle *dst_rect, |
||
3043 | unsigned int flags |
||
3044 | ) |
||
3045 | { |
||
3046 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
3047 | int has_done_scaling = 0; |
||
3048 | VASurfaceID in_surface_id = surface; |
||
3049 | VASurfaceID out_surface_id = i965_post_processing(ctx, surface, src_rect, dst_rect, flags, &has_done_scaling); |
||
3050 | |||
3051 | assert((!has_done_scaling) || (out_surface_id != VA_INVALID_ID)); |
||
3052 | |||
3053 | if (out_surface_id != VA_INVALID_ID) |
||
3054 | in_surface_id = out_surface_id; |
||
3055 | |||
3056 | if (IS_GEN7(i965->intel.device_id)) |
||
3057 | gen7_render_put_surface(ctx, in_surface_id, has_done_scaling ? dst_rect : src_rect, dst_rect, flags); |
||
3058 | else if (IS_GEN6(i965->intel.device_id)) |
||
3059 | gen6_render_put_surface(ctx, in_surface_id, has_done_scaling ? dst_rect : src_rect, dst_rect, flags); |
||
3060 | else |
||
3061 | i965_render_put_surface(ctx, in_surface_id, has_done_scaling ? dst_rect : src_rect, dst_rect, flags); |
||
3062 | |||
3063 | if (in_surface_id != surface) |
||
3064 | i965_DestroySurfaces(ctx, &in_surface_id, 1); |
||
3065 | } |
||
3066 | |||
3067 | void |
||
3068 | intel_render_put_subpicture( |
||
3069 | VADriverContextP ctx, |
||
3070 | VASurfaceID surface, |
||
3071 | const VARectangle *src_rect, |
||
3072 | const VARectangle *dst_rect |
||
3073 | ) |
||
3074 | { |
||
3075 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
3076 | |||
3077 | if (IS_GEN7(i965->intel.device_id)) |
||
3078 | gen7_render_put_subpicture(ctx, surface, src_rect, dst_rect); |
||
3079 | else if (IS_GEN6(i965->intel.device_id)) |
||
3080 | gen6_render_put_subpicture(ctx, surface, src_rect, dst_rect); |
||
3081 | else |
||
3082 | i965_render_put_subpicture(ctx, surface, src_rect, dst_rect); |
||
3083 | } |
||
3084 | |||
3085 | Bool |
||
3086 | i965_render_init(VADriverContextP ctx) |
||
3087 | { |
||
3088 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
3089 | struct i965_render_state *render_state = &i965->render_state; |
||
3090 | int i; |
||
3091 | |||
3092 | printf("%s\n", __FUNCTION__); |
||
3093 | |||
3094 | /* kernel */ |
||
3095 | assert(NUM_RENDER_KERNEL == (sizeof(render_kernels_gen5) / |
||
3096 | sizeof(render_kernels_gen5[0]))); |
||
3097 | assert(NUM_RENDER_KERNEL == (sizeof(render_kernels_gen6) / |
||
3098 | sizeof(render_kernels_gen6[0]))); |
||
3099 | |||
3100 | if (IS_GEN7(i965->intel.device_id)) |
||
3101 | memcpy(render_state->render_kernels, |
||
3102 | (IS_HASWELL(i965->intel.device_id) ? render_kernels_gen7_haswell : render_kernels_gen7), |
||
3103 | sizeof(render_state->render_kernels)); |
||
3104 | else if (IS_GEN6(i965->intel.device_id)) |
||
3105 | memcpy(render_state->render_kernels, render_kernels_gen6, sizeof(render_state->render_kernels)); |
||
3106 | else if (IS_IRONLAKE(i965->intel.device_id)) |
||
3107 | memcpy(render_state->render_kernels, render_kernels_gen5, sizeof(render_state->render_kernels)); |
||
3108 | else |
||
3109 | memcpy(render_state->render_kernels, render_kernels_gen4, sizeof(render_state->render_kernels)); |
||
3110 | |||
3111 | for (i = 0; i < NUM_RENDER_KERNEL; i++) { |
||
3112 | struct i965_kernel *kernel = &render_state->render_kernels[i]; |
||
3113 | |||
3114 | if (!kernel->size) |
||
3115 | continue; |
||
3116 | |||
3117 | kernel->bo = dri_bo_alloc(i965->intel.bufmgr, |
||
3118 | kernel->name, |
||
3119 | kernel->size, 0x1000); |
||
3120 | assert(kernel->bo); |
||
3121 | dri_bo_subdata(kernel->bo, 0, kernel->size, kernel->bin); |
||
3122 | } |
||
3123 | |||
3124 | /* constant buffer */ |
||
3125 | render_state->curbe.bo = dri_bo_alloc(i965->intel.bufmgr, |
||
3126 | "constant buffer", |
||
3127 | 4096, 64); |
||
3128 | assert(render_state->curbe.bo); |
||
3129 | |||
3130 | if (IS_IVB_GT1(i965->intel.device_id) || |
||
3131 | IS_HSW_GT1(i965->intel.device_id)) { |
||
3132 | render_state->max_wm_threads = 48; |
||
3133 | } else if (IS_IVB_GT2(i965->intel.device_id) || |
||
3134 | IS_HSW_GT2(i965->intel.device_id)) { |
||
3135 | render_state->max_wm_threads = 172; |
||
3136 | } else if (IS_SNB_GT1(i965->intel.device_id)) { |
||
3137 | render_state->max_wm_threads = 40; |
||
3138 | } else if (IS_SNB_GT2(i965->intel.device_id)) { |
||
3139 | render_state->max_wm_threads = 80; |
||
3140 | } else if (IS_IRONLAKE(i965->intel.device_id)) { |
||
3141 | render_state->max_wm_threads = 72; /* 12 * 6 */ |
||
3142 | } else if (IS_G4X(i965->intel.device_id)) { |
||
3143 | render_state->max_wm_threads = 50; /* 12 * 5 */ |
||
3144 | } else { |
||
3145 | /* should never get here !!! */ |
||
3146 | assert(0); |
||
3147 | } |
||
3148 | |||
3149 | return True; |
||
3150 | } |
||
3151 | |||
3152 | Bool |
||
3153 | i965_render_terminate(VADriverContextP ctx) |
||
3154 | { |
||
3155 | int i; |
||
3156 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
3157 | struct i965_render_state *render_state = &i965->render_state; |
||
3158 | |||
3159 | dri_bo_unreference(render_state->curbe.bo); |
||
3160 | render_state->curbe.bo = NULL; |
||
3161 | |||
3162 | for (i = 0; i < NUM_RENDER_KERNEL; i++) { |
||
3163 | struct i965_kernel *kernel = &render_state->render_kernels[i]; |
||
3164 | |||
3165 | dri_bo_unreference(kernel->bo); |
||
3166 | kernel->bo = NULL; |
||
3167 | } |
||
3168 | |||
3169 | dri_bo_unreference(render_state->vb.vertex_buffer); |
||
3170 | render_state->vb.vertex_buffer = NULL; |
||
3171 | dri_bo_unreference(render_state->vs.state); |
||
3172 | render_state->vs.state = NULL; |
||
3173 | dri_bo_unreference(render_state->sf.state); |
||
3174 | render_state->sf.state = NULL; |
||
3175 | dri_bo_unreference(render_state->wm.sampler); |
||
3176 | render_state->wm.sampler = NULL; |
||
3177 | dri_bo_unreference(render_state->wm.state); |
||
3178 | render_state->wm.state = NULL; |
||
3179 | dri_bo_unreference(render_state->wm.surface_state_binding_table_bo); |
||
3180 | dri_bo_unreference(render_state->cc.viewport); |
||
3181 | render_state->cc.viewport = NULL; |
||
3182 | dri_bo_unreference(render_state->cc.state); |
||
3183 | render_state->cc.state = NULL; |
||
3184 | dri_bo_unreference(render_state->cc.blend); |
||
3185 | render_state->cc.blend = NULL; |
||
3186 | dri_bo_unreference(render_state->cc.depth_stencil); |
||
3187 | render_state->cc.depth_stencil = NULL; |
||
3188 | |||
3189 | if (render_state->draw_region) { |
||
3190 | dri_bo_unreference(render_state->draw_region->bo); |
||
3191 | free(render_state->draw_region); |
||
3192 | render_state->draw_region = NULL; |
||
3193 | } |
||
3194 | |||
3195 | return True; |
||
3196 | }>>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>>=>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>>>><>><>><>><>>=>><> |
||
3197 |