Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5361 | serge | 1 | /* |
2 | * Copyright © 2012 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 DEALINGS |
||
21 | * IN THE SOFTWARE. |
||
22 | * |
||
23 | * Authors: |
||
24 | * Xiang Haihao |
||
25 | */ |
||
26 | |||
27 | #include |
||
28 | #include |
||
29 | #include |
||
30 | #include |
||
31 | |||
32 | #include "intel_batchbuffer.h" |
||
33 | #include "intel_driver.h" |
||
34 | |||
35 | #include "i965_gpe_utils.h" |
||
36 | |||
37 | static void |
||
38 | i965_gpe_select(VADriverContextP ctx, |
||
39 | struct i965_gpe_context *gpe_context, |
||
40 | struct intel_batchbuffer *batch) |
||
41 | { |
||
42 | BEGIN_BATCH(batch, 1); |
||
43 | OUT_BATCH(batch, CMD_PIPELINE_SELECT | PIPELINE_SELECT_MEDIA); |
||
44 | ADVANCE_BATCH(batch); |
||
45 | } |
||
46 | |||
47 | static void |
||
48 | gen6_gpe_state_base_address(VADriverContextP ctx, |
||
49 | struct i965_gpe_context *gpe_context, |
||
50 | struct intel_batchbuffer *batch) |
||
51 | { |
||
52 | BEGIN_BATCH(batch, 10); |
||
53 | |||
54 | OUT_BATCH(batch, CMD_STATE_BASE_ADDRESS | (10 - 2)); |
||
55 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* General State Base Address */ |
||
56 | OUT_RELOC(batch, |
||
57 | gpe_context->surface_state_binding_table.bo, |
||
58 | I915_GEM_DOMAIN_INSTRUCTION, |
||
59 | 0, |
||
60 | BASE_ADDRESS_MODIFY); /* Surface state base address */ |
||
61 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Dynamic State Base Address */ |
||
62 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Indirect Object Base Address */ |
||
63 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Instruction Base Address */ |
||
64 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* General State Access Upper Bound */ |
||
65 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Dynamic State Access Upper Bound */ |
||
66 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Indirect Object Access Upper Bound */ |
||
67 | OUT_BATCH(batch, BASE_ADDRESS_MODIFY); /* Instruction Access Upper Bound */ |
||
68 | |||
69 | ADVANCE_BATCH(batch); |
||
70 | } |
||
71 | |||
72 | static void |
||
73 | gen6_gpe_vfe_state(VADriverContextP ctx, |
||
74 | struct i965_gpe_context *gpe_context, |
||
75 | struct intel_batchbuffer *batch) |
||
76 | { |
||
77 | |||
78 | BEGIN_BATCH(batch, 8); |
||
79 | |||
80 | OUT_BATCH(batch, CMD_MEDIA_VFE_STATE | (8 - 2)); |
||
81 | OUT_BATCH(batch, 0); /* Scratch Space Base Pointer and Space */ |
||
82 | OUT_BATCH(batch, |
||
83 | gpe_context->vfe_state.max_num_threads << 16 | /* Maximum Number of Threads */ |
||
84 | gpe_context->vfe_state.num_urb_entries << 8 | /* Number of URB Entries */ |
||
85 | gpe_context->vfe_state.gpgpu_mode << 2); /* MEDIA Mode */ |
||
86 | OUT_BATCH(batch, 0); /* Debug: Object ID */ |
||
87 | OUT_BATCH(batch, |
||
88 | gpe_context->vfe_state.urb_entry_size << 16 | /* URB Entry Allocation Size */ |
||
89 | gpe_context->vfe_state.curbe_allocation_size); /* CURBE Allocation Size */ |
||
90 | /* the vfe_desc5/6/7 will decide whether the scoreboard is used. */ |
||
91 | OUT_BATCH(batch, gpe_context->vfe_desc5.dword); |
||
92 | OUT_BATCH(batch, gpe_context->vfe_desc6.dword); |
||
93 | OUT_BATCH(batch, gpe_context->vfe_desc7.dword); |
||
94 | |||
95 | ADVANCE_BATCH(batch); |
||
96 | |||
97 | } |
||
98 | |||
99 | static void |
||
100 | gen6_gpe_curbe_load(VADriverContextP ctx, |
||
101 | struct i965_gpe_context *gpe_context, |
||
102 | struct intel_batchbuffer *batch) |
||
103 | { |
||
104 | BEGIN_BATCH(batch, 4); |
||
105 | |||
106 | OUT_BATCH(batch, CMD_MEDIA_CURBE_LOAD | (4 - 2)); |
||
107 | OUT_BATCH(batch, 0); |
||
108 | OUT_BATCH(batch, gpe_context->curbe.length); |
||
109 | OUT_RELOC(batch, gpe_context->curbe.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); |
||
110 | |||
111 | ADVANCE_BATCH(batch); |
||
112 | } |
||
113 | |||
114 | static void |
||
115 | gen6_gpe_idrt(VADriverContextP ctx, |
||
116 | struct i965_gpe_context *gpe_context, |
||
117 | struct intel_batchbuffer *batch) |
||
118 | { |
||
119 | BEGIN_BATCH(batch, 4); |
||
120 | |||
121 | OUT_BATCH(batch, CMD_MEDIA_INTERFACE_LOAD | (4 - 2)); |
||
122 | OUT_BATCH(batch, 0); |
||
123 | OUT_BATCH(batch, gpe_context->idrt.max_entries * gpe_context->idrt.entry_size); |
||
124 | OUT_RELOC(batch, gpe_context->idrt.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); |
||
125 | |||
126 | ADVANCE_BATCH(batch); |
||
127 | } |
||
128 | |||
129 | void |
||
130 | i965_gpe_load_kernels(VADriverContextP ctx, |
||
131 | struct i965_gpe_context *gpe_context, |
||
132 | struct i965_kernel *kernel_list, |
||
133 | unsigned int num_kernels) |
||
134 | { |
||
135 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
136 | int i; |
||
137 | |||
138 | assert(num_kernels <= MAX_GPE_KERNELS); |
||
139 | memcpy(gpe_context->kernels, kernel_list, sizeof(*kernel_list) * num_kernels); |
||
140 | gpe_context->num_kernels = num_kernels; |
||
141 | |||
142 | for (i = 0; i < num_kernels; i++) { |
||
143 | struct i965_kernel *kernel = &gpe_context->kernels[i]; |
||
144 | |||
145 | kernel->bo = dri_bo_alloc(i965->intel.bufmgr, |
||
146 | kernel->name, |
||
147 | kernel->size, |
||
148 | 0x1000); |
||
149 | assert(kernel->bo); |
||
150 | dri_bo_subdata(kernel->bo, 0, kernel->size, kernel->bin); |
||
151 | } |
||
152 | } |
||
153 | |||
154 | void |
||
155 | i965_gpe_context_destroy(struct i965_gpe_context *gpe_context) |
||
156 | { |
||
157 | int i; |
||
158 | |||
159 | dri_bo_unreference(gpe_context->surface_state_binding_table.bo); |
||
160 | gpe_context->surface_state_binding_table.bo = NULL; |
||
161 | |||
162 | dri_bo_unreference(gpe_context->idrt.bo); |
||
163 | gpe_context->idrt.bo = NULL; |
||
164 | |||
165 | dri_bo_unreference(gpe_context->curbe.bo); |
||
166 | gpe_context->curbe.bo = NULL; |
||
167 | |||
168 | for (i = 0; i < gpe_context->num_kernels; i++) { |
||
169 | struct i965_kernel *kernel = &gpe_context->kernels[i]; |
||
170 | |||
171 | dri_bo_unreference(kernel->bo); |
||
172 | kernel->bo = NULL; |
||
173 | } |
||
174 | } |
||
175 | |||
176 | void |
||
177 | i965_gpe_context_init(VADriverContextP ctx, |
||
178 | struct i965_gpe_context *gpe_context) |
||
179 | { |
||
180 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
181 | dri_bo *bo; |
||
182 | |||
183 | dri_bo_unreference(gpe_context->surface_state_binding_table.bo); |
||
184 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
185 | "surface state & binding table", |
||
186 | gpe_context->surface_state_binding_table.length, |
||
187 | 4096); |
||
188 | assert(bo); |
||
189 | gpe_context->surface_state_binding_table.bo = bo; |
||
190 | |||
191 | dri_bo_unreference(gpe_context->idrt.bo); |
||
192 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
193 | "interface descriptor table", |
||
194 | gpe_context->idrt.entry_size * gpe_context->idrt.max_entries, |
||
195 | 4096); |
||
196 | assert(bo); |
||
197 | gpe_context->idrt.bo = bo; |
||
198 | |||
199 | dri_bo_unreference(gpe_context->curbe.bo); |
||
200 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
201 | "curbe buffer", |
||
202 | gpe_context->curbe.length, |
||
203 | 4096); |
||
204 | assert(bo); |
||
205 | gpe_context->curbe.bo = bo; |
||
206 | } |
||
207 | |||
208 | void |
||
209 | gen6_gpe_pipeline_setup(VADriverContextP ctx, |
||
210 | struct i965_gpe_context *gpe_context, |
||
211 | struct intel_batchbuffer *batch) |
||
212 | { |
||
213 | intel_batchbuffer_emit_mi_flush(batch); |
||
214 | |||
215 | i965_gpe_select(ctx, gpe_context, batch); |
||
216 | gen6_gpe_state_base_address(ctx, gpe_context, batch); |
||
217 | gen6_gpe_vfe_state(ctx, gpe_context, batch); |
||
218 | gen6_gpe_curbe_load(ctx, gpe_context, batch); |
||
219 | gen6_gpe_idrt(ctx, gpe_context, batch); |
||
220 | } |
||
221 | |||
222 | static void |
||
223 | i965_gpe_set_surface_tiling(struct i965_surface_state *ss, unsigned int tiling) |
||
224 | { |
||
225 | switch (tiling) { |
||
226 | case I915_TILING_NONE: |
||
227 | ss->ss3.tiled_surface = 0; |
||
228 | ss->ss3.tile_walk = 0; |
||
229 | break; |
||
230 | case I915_TILING_X: |
||
231 | ss->ss3.tiled_surface = 1; |
||
232 | ss->ss3.tile_walk = I965_TILEWALK_XMAJOR; |
||
233 | break; |
||
234 | case I915_TILING_Y: |
||
235 | ss->ss3.tiled_surface = 1; |
||
236 | ss->ss3.tile_walk = I965_TILEWALK_YMAJOR; |
||
237 | break; |
||
238 | } |
||
239 | } |
||
240 | |||
241 | static void |
||
242 | i965_gpe_set_surface2_tiling(struct i965_surface_state2 *ss, unsigned int tiling) |
||
243 | { |
||
244 | switch (tiling) { |
||
245 | case I915_TILING_NONE: |
||
246 | ss->ss2.tiled_surface = 0; |
||
247 | ss->ss2.tile_walk = 0; |
||
248 | break; |
||
249 | case I915_TILING_X: |
||
250 | ss->ss2.tiled_surface = 1; |
||
251 | ss->ss2.tile_walk = I965_TILEWALK_XMAJOR; |
||
252 | break; |
||
253 | case I915_TILING_Y: |
||
254 | ss->ss2.tiled_surface = 1; |
||
255 | ss->ss2.tile_walk = I965_TILEWALK_YMAJOR; |
||
256 | break; |
||
257 | } |
||
258 | } |
||
259 | |||
260 | static void |
||
261 | gen7_gpe_set_surface_tiling(struct gen7_surface_state *ss, unsigned int tiling) |
||
262 | { |
||
263 | switch (tiling) { |
||
264 | case I915_TILING_NONE: |
||
265 | ss->ss0.tiled_surface = 0; |
||
266 | ss->ss0.tile_walk = 0; |
||
267 | break; |
||
268 | case I915_TILING_X: |
||
269 | ss->ss0.tiled_surface = 1; |
||
270 | ss->ss0.tile_walk = I965_TILEWALK_XMAJOR; |
||
271 | break; |
||
272 | case I915_TILING_Y: |
||
273 | ss->ss0.tiled_surface = 1; |
||
274 | ss->ss0.tile_walk = I965_TILEWALK_YMAJOR; |
||
275 | break; |
||
276 | } |
||
277 | } |
||
278 | |||
279 | static void |
||
280 | gen7_gpe_set_surface2_tiling(struct gen7_surface_state2 *ss, unsigned int tiling) |
||
281 | { |
||
282 | switch (tiling) { |
||
283 | case I915_TILING_NONE: |
||
284 | ss->ss2.tiled_surface = 0; |
||
285 | ss->ss2.tile_walk = 0; |
||
286 | break; |
||
287 | case I915_TILING_X: |
||
288 | ss->ss2.tiled_surface = 1; |
||
289 | ss->ss2.tile_walk = I965_TILEWALK_XMAJOR; |
||
290 | break; |
||
291 | case I915_TILING_Y: |
||
292 | ss->ss2.tiled_surface = 1; |
||
293 | ss->ss2.tile_walk = I965_TILEWALK_YMAJOR; |
||
294 | break; |
||
295 | } |
||
296 | } |
||
297 | |||
298 | static void |
||
299 | gen8_gpe_set_surface_tiling(struct gen8_surface_state *ss, unsigned int tiling) |
||
300 | { |
||
301 | switch (tiling) { |
||
302 | case I915_TILING_NONE: |
||
303 | ss->ss0.tiled_surface = 0; |
||
304 | ss->ss0.tile_walk = 0; |
||
305 | break; |
||
306 | case I915_TILING_X: |
||
307 | ss->ss0.tiled_surface = 1; |
||
308 | ss->ss0.tile_walk = I965_TILEWALK_XMAJOR; |
||
309 | break; |
||
310 | case I915_TILING_Y: |
||
311 | ss->ss0.tiled_surface = 1; |
||
312 | ss->ss0.tile_walk = I965_TILEWALK_YMAJOR; |
||
313 | break; |
||
314 | } |
||
315 | } |
||
316 | |||
317 | static void |
||
318 | gen8_gpe_set_surface2_tiling(struct gen8_surface_state2 *ss, unsigned int tiling) |
||
319 | { |
||
320 | switch (tiling) { |
||
321 | case I915_TILING_NONE: |
||
322 | ss->ss2.tiled_surface = 0; |
||
323 | ss->ss2.tile_walk = 0; |
||
324 | break; |
||
325 | case I915_TILING_X: |
||
326 | ss->ss2.tiled_surface = 1; |
||
327 | ss->ss2.tile_walk = I965_TILEWALK_XMAJOR; |
||
328 | break; |
||
329 | case I915_TILING_Y: |
||
330 | ss->ss2.tiled_surface = 1; |
||
331 | ss->ss2.tile_walk = I965_TILEWALK_YMAJOR; |
||
332 | break; |
||
333 | } |
||
334 | } |
||
335 | |||
336 | static void |
||
337 | i965_gpe_set_surface2_state(VADriverContextP ctx, |
||
338 | struct object_surface *obj_surface, |
||
339 | struct i965_surface_state2 *ss) |
||
340 | { |
||
341 | int w, h, w_pitch; |
||
342 | unsigned int tiling, swizzle; |
||
343 | |||
344 | assert(obj_surface->bo); |
||
345 | assert(obj_surface->fourcc == VA_FOURCC_NV12); |
||
346 | |||
347 | dri_bo_get_tiling(obj_surface->bo, &tiling, &swizzle); |
||
348 | w = obj_surface->orig_width; |
||
349 | h = obj_surface->orig_height; |
||
350 | w_pitch = obj_surface->width; |
||
351 | |||
352 | memset(ss, 0, sizeof(*ss)); |
||
353 | /* ss0 */ |
||
354 | ss->ss0.surface_base_address = obj_surface->bo->offset; |
||
355 | /* ss1 */ |
||
356 | ss->ss1.cbcr_pixel_offset_v_direction = 2; |
||
357 | ss->ss1.width = w - 1; |
||
358 | ss->ss1.height = h - 1; |
||
359 | /* ss2 */ |
||
360 | ss->ss2.surface_format = MFX_SURFACE_PLANAR_420_8; |
||
361 | ss->ss2.interleave_chroma = 1; |
||
362 | ss->ss2.pitch = w_pitch - 1; |
||
363 | ss->ss2.half_pitch_for_chroma = 0; |
||
364 | i965_gpe_set_surface2_tiling(ss, tiling); |
||
365 | /* ss3: UV offset for interleave mode */ |
||
366 | ss->ss3.x_offset_for_cb = obj_surface->x_cb_offset; |
||
367 | ss->ss3.y_offset_for_cb = obj_surface->y_cb_offset; |
||
368 | } |
||
369 | |||
370 | void |
||
371 | i965_gpe_surface2_setup(VADriverContextP ctx, |
||
372 | struct i965_gpe_context *gpe_context, |
||
373 | struct object_surface *obj_surface, |
||
374 | unsigned long binding_table_offset, |
||
375 | unsigned long surface_state_offset) |
||
376 | { |
||
377 | struct i965_surface_state2 *ss; |
||
378 | dri_bo *bo; |
||
379 | |||
380 | bo = gpe_context->surface_state_binding_table.bo; |
||
381 | dri_bo_map(bo, 1); |
||
382 | assert(bo->virtual); |
||
383 | |||
384 | ss = (struct i965_surface_state2 *)((char *)bo->virtual + surface_state_offset); |
||
385 | i965_gpe_set_surface2_state(ctx, obj_surface, ss); |
||
386 | dri_bo_emit_reloc(bo, |
||
387 | I915_GEM_DOMAIN_RENDER, 0, |
||
388 | 0, |
||
389 | surface_state_offset + offsetof(struct i965_surface_state2, ss0), |
||
390 | obj_surface->bo); |
||
391 | |||
392 | *((unsigned int *)((char *)bo->virtual + binding_table_offset)) = surface_state_offset; |
||
393 | dri_bo_unmap(bo); |
||
394 | } |
||
395 | |||
396 | static void |
||
397 | i965_gpe_set_media_rw_surface_state(VADriverContextP ctx, |
||
398 | struct object_surface *obj_surface, |
||
399 | struct i965_surface_state *ss) |
||
400 | { |
||
401 | int w, h, w_pitch; |
||
402 | unsigned int tiling, swizzle; |
||
403 | |||
404 | dri_bo_get_tiling(obj_surface->bo, &tiling, &swizzle); |
||
405 | w = obj_surface->orig_width; |
||
406 | h = obj_surface->orig_height; |
||
407 | w_pitch = obj_surface->width; |
||
408 | |||
409 | memset(ss, 0, sizeof(*ss)); |
||
410 | /* ss0 */ |
||
411 | ss->ss0.surface_type = I965_SURFACE_2D; |
||
412 | ss->ss0.surface_format = I965_SURFACEFORMAT_R8_UNORM; |
||
413 | /* ss1 */ |
||
414 | ss->ss1.base_addr = obj_surface->bo->offset; |
||
415 | /* ss2 */ |
||
416 | ss->ss2.width = w / 4 - 1; /* in DWORDs for media read & write message */ |
||
417 | ss->ss2.height = h - 1; |
||
418 | /* ss3 */ |
||
419 | ss->ss3.pitch = w_pitch - 1; |
||
420 | i965_gpe_set_surface_tiling(ss, tiling); |
||
421 | } |
||
422 | |||
423 | void |
||
424 | i965_gpe_media_rw_surface_setup(VADriverContextP ctx, |
||
425 | struct i965_gpe_context *gpe_context, |
||
426 | struct object_surface *obj_surface, |
||
427 | unsigned long binding_table_offset, |
||
428 | unsigned long surface_state_offset) |
||
429 | { |
||
430 | struct i965_surface_state *ss; |
||
431 | dri_bo *bo; |
||
432 | |||
433 | bo = gpe_context->surface_state_binding_table.bo; |
||
434 | dri_bo_map(bo, True); |
||
435 | assert(bo->virtual); |
||
436 | |||
437 | ss = (struct i965_surface_state *)((char *)bo->virtual + surface_state_offset); |
||
438 | i965_gpe_set_media_rw_surface_state(ctx, obj_surface, ss); |
||
439 | dri_bo_emit_reloc(bo, |
||
440 | I915_GEM_DOMAIN_RENDER, 0, |
||
441 | 0, |
||
442 | surface_state_offset + offsetof(struct i965_surface_state, ss1), |
||
443 | obj_surface->bo); |
||
444 | |||
445 | *((unsigned int *)((char *)bo->virtual + binding_table_offset)) = surface_state_offset; |
||
446 | dri_bo_unmap(bo); |
||
447 | } |
||
448 | |||
449 | static void |
||
450 | i965_gpe_set_buffer_surface_state(VADriverContextP ctx, |
||
451 | struct i965_buffer_surface *buffer_surface, |
||
452 | struct i965_surface_state *ss) |
||
453 | { |
||
454 | int num_entries; |
||
455 | |||
456 | assert(buffer_surface->bo); |
||
457 | num_entries = buffer_surface->num_blocks * buffer_surface->size_block / buffer_surface->pitch; |
||
458 | |||
459 | memset(ss, 0, sizeof(*ss)); |
||
460 | /* ss0 */ |
||
461 | ss->ss0.render_cache_read_mode = 1; |
||
462 | ss->ss0.surface_type = I965_SURFACE_BUFFER; |
||
463 | /* ss1 */ |
||
464 | ss->ss1.base_addr = buffer_surface->bo->offset; |
||
465 | /* ss2 */ |
||
466 | ss->ss2.width = ((num_entries - 1) & 0x7f); |
||
467 | ss->ss2.height = (((num_entries - 1) >> 7) & 0x1fff); |
||
468 | /* ss3 */ |
||
469 | ss->ss3.depth = (((num_entries - 1) >> 20) & 0x7f); |
||
470 | ss->ss3.pitch = buffer_surface->pitch - 1; |
||
471 | } |
||
472 | |||
473 | void |
||
474 | i965_gpe_buffer_suface_setup(VADriverContextP ctx, |
||
475 | struct i965_gpe_context *gpe_context, |
||
476 | struct i965_buffer_surface *buffer_surface, |
||
477 | unsigned long binding_table_offset, |
||
478 | unsigned long surface_state_offset) |
||
479 | { |
||
480 | struct i965_surface_state *ss; |
||
481 | dri_bo *bo; |
||
482 | |||
483 | bo = gpe_context->surface_state_binding_table.bo; |
||
484 | dri_bo_map(bo, 1); |
||
485 | assert(bo->virtual); |
||
486 | |||
487 | ss = (struct i965_surface_state *)((char *)bo->virtual + surface_state_offset); |
||
488 | i965_gpe_set_buffer_surface_state(ctx, buffer_surface, ss); |
||
489 | dri_bo_emit_reloc(bo, |
||
490 | I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, |
||
491 | 0, |
||
492 | surface_state_offset + offsetof(struct i965_surface_state, ss1), |
||
493 | buffer_surface->bo); |
||
494 | |||
495 | *((unsigned int *)((char *)bo->virtual + binding_table_offset)) = surface_state_offset; |
||
496 | dri_bo_unmap(bo); |
||
497 | } |
||
498 | |||
499 | static void |
||
500 | gen7_gpe_set_surface2_state(VADriverContextP ctx, |
||
501 | struct object_surface *obj_surface, |
||
502 | struct gen7_surface_state2 *ss) |
||
503 | { |
||
504 | int w, h, w_pitch; |
||
505 | unsigned int tiling, swizzle; |
||
506 | |||
507 | assert(obj_surface->bo); |
||
508 | assert(obj_surface->fourcc == VA_FOURCC_NV12); |
||
509 | |||
510 | dri_bo_get_tiling(obj_surface->bo, &tiling, &swizzle); |
||
511 | w = obj_surface->orig_width; |
||
512 | h = obj_surface->orig_height; |
||
513 | w_pitch = obj_surface->width; |
||
514 | |||
515 | memset(ss, 0, sizeof(*ss)); |
||
516 | /* ss0 */ |
||
517 | ss->ss0.surface_base_address = obj_surface->bo->offset; |
||
518 | /* ss1 */ |
||
519 | ss->ss1.cbcr_pixel_offset_v_direction = 2; |
||
520 | ss->ss1.width = w - 1; |
||
521 | ss->ss1.height = h - 1; |
||
522 | /* ss2 */ |
||
523 | ss->ss2.surface_format = MFX_SURFACE_PLANAR_420_8; |
||
524 | ss->ss2.interleave_chroma = 1; |
||
525 | ss->ss2.pitch = w_pitch - 1; |
||
526 | ss->ss2.half_pitch_for_chroma = 0; |
||
527 | gen7_gpe_set_surface2_tiling(ss, tiling); |
||
528 | /* ss3: UV offset for interleave mode */ |
||
529 | ss->ss3.x_offset_for_cb = obj_surface->x_cb_offset; |
||
530 | ss->ss3.y_offset_for_cb = obj_surface->y_cb_offset; |
||
531 | } |
||
532 | |||
533 | void |
||
534 | gen7_gpe_surface2_setup(VADriverContextP ctx, |
||
535 | struct i965_gpe_context *gpe_context, |
||
536 | struct object_surface *obj_surface, |
||
537 | unsigned long binding_table_offset, |
||
538 | unsigned long surface_state_offset) |
||
539 | { |
||
540 | struct gen7_surface_state2 *ss; |
||
541 | dri_bo *bo; |
||
542 | |||
543 | bo = gpe_context->surface_state_binding_table.bo; |
||
544 | dri_bo_map(bo, 1); |
||
545 | assert(bo->virtual); |
||
546 | |||
547 | ss = (struct gen7_surface_state2 *)((char *)bo->virtual + surface_state_offset); |
||
548 | gen7_gpe_set_surface2_state(ctx, obj_surface, ss); |
||
549 | dri_bo_emit_reloc(bo, |
||
550 | I915_GEM_DOMAIN_RENDER, 0, |
||
551 | 0, |
||
552 | surface_state_offset + offsetof(struct gen7_surface_state2, ss0), |
||
553 | obj_surface->bo); |
||
554 | |||
555 | *((unsigned int *)((char *)bo->virtual + binding_table_offset)) = surface_state_offset; |
||
556 | dri_bo_unmap(bo); |
||
557 | } |
||
558 | |||
559 | static void |
||
560 | gen7_gpe_set_media_rw_surface_state(VADriverContextP ctx, |
||
561 | struct object_surface *obj_surface, |
||
562 | struct gen7_surface_state *ss) |
||
563 | { |
||
564 | int w, h, w_pitch; |
||
565 | unsigned int tiling, swizzle; |
||
566 | |||
567 | dri_bo_get_tiling(obj_surface->bo, &tiling, &swizzle); |
||
568 | w = obj_surface->orig_width; |
||
569 | h = obj_surface->orig_height; |
||
570 | w_pitch = obj_surface->width; |
||
571 | |||
572 | memset(ss, 0, sizeof(*ss)); |
||
573 | /* ss0 */ |
||
574 | ss->ss0.surface_type = I965_SURFACE_2D; |
||
575 | ss->ss0.surface_format = I965_SURFACEFORMAT_R8_UNORM; |
||
576 | /* ss1 */ |
||
577 | ss->ss1.base_addr = obj_surface->bo->offset; |
||
578 | /* ss2 */ |
||
579 | ss->ss2.width = w / 4 - 1; /* in DWORDs for media read & write message */ |
||
580 | ss->ss2.height = h - 1; |
||
581 | /* ss3 */ |
||
582 | ss->ss3.pitch = w_pitch - 1; |
||
583 | gen7_gpe_set_surface_tiling(ss, tiling); |
||
584 | } |
||
585 | |||
586 | static void |
||
587 | gen75_gpe_set_media_chroma_surface_state(VADriverContextP ctx, |
||
588 | struct object_surface *obj_surface, |
||
589 | struct gen7_surface_state *ss) |
||
590 | { |
||
591 | int w, w_pitch; |
||
592 | unsigned int tiling, swizzle; |
||
593 | int cbcr_offset; |
||
594 | |||
595 | dri_bo_get_tiling(obj_surface->bo, &tiling, &swizzle); |
||
596 | w = obj_surface->orig_width; |
||
597 | w_pitch = obj_surface->width; |
||
598 | |||
599 | cbcr_offset = obj_surface->height * obj_surface->width; |
||
600 | memset(ss, 0, sizeof(*ss)); |
||
601 | /* ss0 */ |
||
602 | ss->ss0.surface_type = I965_SURFACE_2D; |
||
603 | ss->ss0.surface_format = I965_SURFACEFORMAT_R8_UNORM; |
||
604 | /* ss1 */ |
||
605 | ss->ss1.base_addr = obj_surface->bo->offset + cbcr_offset; |
||
606 | /* ss2 */ |
||
607 | ss->ss2.width = w / 4 - 1; /* in DWORDs for media read & write message */ |
||
608 | ss->ss2.height = (obj_surface->height / 2) -1; |
||
609 | /* ss3 */ |
||
610 | ss->ss3.pitch = w_pitch - 1; |
||
611 | gen7_gpe_set_surface_tiling(ss, tiling); |
||
612 | } |
||
613 | |||
614 | void |
||
615 | gen7_gpe_media_rw_surface_setup(VADriverContextP ctx, |
||
616 | struct i965_gpe_context *gpe_context, |
||
617 | struct object_surface *obj_surface, |
||
618 | unsigned long binding_table_offset, |
||
619 | unsigned long surface_state_offset) |
||
620 | { |
||
621 | struct gen7_surface_state *ss; |
||
622 | dri_bo *bo; |
||
623 | |||
624 | bo = gpe_context->surface_state_binding_table.bo; |
||
625 | dri_bo_map(bo, True); |
||
626 | assert(bo->virtual); |
||
627 | |||
628 | ss = (struct gen7_surface_state *)((char *)bo->virtual + surface_state_offset); |
||
629 | gen7_gpe_set_media_rw_surface_state(ctx, obj_surface, ss); |
||
630 | dri_bo_emit_reloc(bo, |
||
631 | I915_GEM_DOMAIN_RENDER, 0, |
||
632 | 0, |
||
633 | surface_state_offset + offsetof(struct gen7_surface_state, ss1), |
||
634 | obj_surface->bo); |
||
635 | |||
636 | *((unsigned int *)((char *)bo->virtual + binding_table_offset)) = surface_state_offset; |
||
637 | dri_bo_unmap(bo); |
||
638 | } |
||
639 | |||
640 | void |
||
641 | gen75_gpe_media_chroma_surface_setup(VADriverContextP ctx, |
||
642 | struct i965_gpe_context *gpe_context, |
||
643 | struct object_surface *obj_surface, |
||
644 | unsigned long binding_table_offset, |
||
645 | unsigned long surface_state_offset) |
||
646 | { |
||
647 | struct gen7_surface_state *ss; |
||
648 | dri_bo *bo; |
||
649 | int cbcr_offset; |
||
650 | |||
651 | assert(obj_surface->fourcc == VA_FOURCC_NV12); |
||
652 | bo = gpe_context->surface_state_binding_table.bo; |
||
653 | dri_bo_map(bo, True); |
||
654 | assert(bo->virtual); |
||
655 | |||
656 | cbcr_offset = obj_surface->height * obj_surface->width; |
||
657 | ss = (struct gen7_surface_state *)((char *)bo->virtual + surface_state_offset); |
||
658 | gen75_gpe_set_media_chroma_surface_state(ctx, obj_surface, ss); |
||
659 | dri_bo_emit_reloc(bo, |
||
660 | I915_GEM_DOMAIN_RENDER, 0, |
||
661 | cbcr_offset, |
||
662 | surface_state_offset + offsetof(struct gen7_surface_state, ss1), |
||
663 | obj_surface->bo); |
||
664 | |||
665 | *((unsigned int *)((char *)bo->virtual + binding_table_offset)) = surface_state_offset; |
||
666 | dri_bo_unmap(bo); |
||
667 | } |
||
668 | |||
669 | |||
670 | static void |
||
671 | gen7_gpe_set_buffer_surface_state(VADriverContextP ctx, |
||
672 | struct i965_buffer_surface *buffer_surface, |
||
673 | struct gen7_surface_state *ss) |
||
674 | { |
||
675 | int num_entries; |
||
676 | |||
677 | assert(buffer_surface->bo); |
||
678 | num_entries = buffer_surface->num_blocks * buffer_surface->size_block / buffer_surface->pitch; |
||
679 | |||
680 | memset(ss, 0, sizeof(*ss)); |
||
681 | /* ss0 */ |
||
682 | ss->ss0.surface_type = I965_SURFACE_BUFFER; |
||
683 | /* ss1 */ |
||
684 | ss->ss1.base_addr = buffer_surface->bo->offset; |
||
685 | /* ss2 */ |
||
686 | ss->ss2.width = ((num_entries - 1) & 0x7f); |
||
687 | ss->ss2.height = (((num_entries - 1) >> 7) & 0x3fff); |
||
688 | /* ss3 */ |
||
689 | ss->ss3.depth = (((num_entries - 1) >> 21) & 0x3f); |
||
690 | ss->ss3.pitch = buffer_surface->pitch - 1; |
||
691 | } |
||
692 | |||
693 | void |
||
694 | gen7_gpe_buffer_suface_setup(VADriverContextP ctx, |
||
695 | struct i965_gpe_context *gpe_context, |
||
696 | struct i965_buffer_surface *buffer_surface, |
||
697 | unsigned long binding_table_offset, |
||
698 | unsigned long surface_state_offset) |
||
699 | { |
||
700 | struct gen7_surface_state *ss; |
||
701 | dri_bo *bo; |
||
702 | |||
703 | bo = gpe_context->surface_state_binding_table.bo; |
||
704 | dri_bo_map(bo, 1); |
||
705 | assert(bo->virtual); |
||
706 | |||
707 | ss = (struct gen7_surface_state *)((char *)bo->virtual + surface_state_offset); |
||
708 | gen7_gpe_set_buffer_surface_state(ctx, buffer_surface, ss); |
||
709 | dri_bo_emit_reloc(bo, |
||
710 | I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, |
||
711 | 0, |
||
712 | surface_state_offset + offsetof(struct gen7_surface_state, ss1), |
||
713 | buffer_surface->bo); |
||
714 | |||
715 | *((unsigned int *)((char *)bo->virtual + binding_table_offset)) = surface_state_offset; |
||
716 | dri_bo_unmap(bo); |
||
717 | } |
||
718 | |||
719 | static void |
||
720 | gen8_gpe_set_surface2_state(VADriverContextP ctx, |
||
721 | struct object_surface *obj_surface, |
||
722 | struct gen8_surface_state2 *ss) |
||
723 | { |
||
724 | int w, h, w_pitch; |
||
725 | unsigned int tiling, swizzle; |
||
726 | |||
727 | assert(obj_surface->bo); |
||
728 | assert(obj_surface->fourcc == VA_FOURCC_NV12); |
||
729 | |||
730 | dri_bo_get_tiling(obj_surface->bo, &tiling, &swizzle); |
||
731 | w = obj_surface->orig_width; |
||
732 | h = obj_surface->orig_height; |
||
733 | w_pitch = obj_surface->width; |
||
734 | |||
735 | memset(ss, 0, sizeof(*ss)); |
||
736 | /* ss0 */ |
||
737 | ss->ss6.base_addr = obj_surface->bo->offset; |
||
738 | /* ss1 */ |
||
739 | ss->ss1.cbcr_pixel_offset_v_direction = 2; |
||
740 | ss->ss1.width = w - 1; |
||
741 | ss->ss1.height = h - 1; |
||
742 | /* ss2 */ |
||
743 | ss->ss2.surface_format = MFX_SURFACE_PLANAR_420_8; |
||
744 | ss->ss2.interleave_chroma = 1; |
||
745 | ss->ss2.pitch = w_pitch - 1; |
||
746 | ss->ss2.half_pitch_for_chroma = 0; |
||
747 | gen8_gpe_set_surface2_tiling(ss, tiling); |
||
748 | /* ss3: UV offset for interleave mode */ |
||
749 | ss->ss3.x_offset_for_cb = obj_surface->x_cb_offset; |
||
750 | ss->ss3.y_offset_for_cb = obj_surface->y_cb_offset; |
||
751 | } |
||
752 | |||
753 | void |
||
754 | gen8_gpe_surface2_setup(VADriverContextP ctx, |
||
755 | struct i965_gpe_context *gpe_context, |
||
756 | struct object_surface *obj_surface, |
||
757 | unsigned long binding_table_offset, |
||
758 | unsigned long surface_state_offset) |
||
759 | { |
||
760 | struct gen8_surface_state2 *ss; |
||
761 | dri_bo *bo; |
||
762 | |||
763 | bo = gpe_context->surface_state_binding_table.bo; |
||
764 | dri_bo_map(bo, 1); |
||
765 | assert(bo->virtual); |
||
766 | |||
767 | ss = (struct gen8_surface_state2 *)((char *)bo->virtual + surface_state_offset); |
||
768 | gen8_gpe_set_surface2_state(ctx, obj_surface, ss); |
||
769 | dri_bo_emit_reloc(bo, |
||
770 | I915_GEM_DOMAIN_RENDER, 0, |
||
771 | 0, |
||
772 | surface_state_offset + offsetof(struct gen8_surface_state2, ss6), |
||
773 | obj_surface->bo); |
||
774 | |||
775 | *((unsigned int *)((char *)bo->virtual + binding_table_offset)) = surface_state_offset; |
||
776 | dri_bo_unmap(bo); |
||
777 | } |
||
778 | |||
779 | static void |
||
780 | gen8_gpe_set_media_rw_surface_state(VADriverContextP ctx, |
||
781 | struct object_surface *obj_surface, |
||
782 | struct gen8_surface_state *ss) |
||
783 | { |
||
784 | int w, h, w_pitch; |
||
785 | unsigned int tiling, swizzle; |
||
786 | |||
787 | dri_bo_get_tiling(obj_surface->bo, &tiling, &swizzle); |
||
788 | w = obj_surface->orig_width; |
||
789 | h = obj_surface->orig_height; |
||
790 | w_pitch = obj_surface->width; |
||
791 | |||
792 | memset(ss, 0, sizeof(*ss)); |
||
793 | /* ss0 */ |
||
794 | ss->ss0.surface_type = I965_SURFACE_2D; |
||
795 | ss->ss0.surface_format = I965_SURFACEFORMAT_R8_UNORM; |
||
796 | /* ss1 */ |
||
797 | ss->ss8.base_addr = obj_surface->bo->offset; |
||
798 | /* ss2 */ |
||
799 | ss->ss2.width = w / 4 - 1; /* in DWORDs for media read & write message */ |
||
800 | ss->ss2.height = h - 1; |
||
801 | /* ss3 */ |
||
802 | ss->ss3.pitch = w_pitch - 1; |
||
803 | gen8_gpe_set_surface_tiling(ss, tiling); |
||
804 | } |
||
805 | |||
806 | static void |
||
807 | gen8_gpe_set_media_chroma_surface_state(VADriverContextP ctx, |
||
808 | struct object_surface *obj_surface, |
||
809 | struct gen8_surface_state *ss) |
||
810 | { |
||
811 | int w, h, w_pitch; |
||
812 | unsigned int tiling, swizzle; |
||
813 | int cbcr_offset; |
||
814 | |||
815 | dri_bo_get_tiling(obj_surface->bo, &tiling, &swizzle); |
||
816 | w = obj_surface->orig_width; |
||
817 | h = obj_surface->orig_height; |
||
818 | w_pitch = obj_surface->width; |
||
819 | |||
820 | cbcr_offset = obj_surface->height * obj_surface->width; |
||
821 | memset(ss, 0, sizeof(*ss)); |
||
822 | /* ss0 */ |
||
823 | ss->ss0.surface_type = I965_SURFACE_2D; |
||
824 | ss->ss0.surface_format = I965_SURFACEFORMAT_R8_UNORM; |
||
825 | /* ss1 */ |
||
826 | ss->ss8.base_addr = obj_surface->bo->offset + cbcr_offset; |
||
827 | /* ss2 */ |
||
828 | ss->ss2.width = w / 4 - 1; /* in DWORDs for media read & write message */ |
||
829 | ss->ss2.height = (obj_surface->height / 2) -1; |
||
830 | /* ss3 */ |
||
831 | ss->ss3.pitch = w_pitch - 1; |
||
832 | gen8_gpe_set_surface_tiling(ss, tiling); |
||
833 | } |
||
834 | |||
835 | void |
||
836 | gen8_gpe_media_rw_surface_setup(VADriverContextP ctx, |
||
837 | struct i965_gpe_context *gpe_context, |
||
838 | struct object_surface *obj_surface, |
||
839 | unsigned long binding_table_offset, |
||
840 | unsigned long surface_state_offset) |
||
841 | { |
||
842 | struct gen8_surface_state *ss; |
||
843 | dri_bo *bo; |
||
844 | |||
845 | bo = gpe_context->surface_state_binding_table.bo; |
||
846 | dri_bo_map(bo, True); |
||
847 | assert(bo->virtual); |
||
848 | |||
849 | ss = (struct gen8_surface_state *)((char *)bo->virtual + surface_state_offset); |
||
850 | gen8_gpe_set_media_rw_surface_state(ctx, obj_surface, ss); |
||
851 | dri_bo_emit_reloc(bo, |
||
852 | I915_GEM_DOMAIN_RENDER, 0, |
||
853 | 0, |
||
854 | surface_state_offset + offsetof(struct gen8_surface_state, ss8), |
||
855 | obj_surface->bo); |
||
856 | |||
857 | *((unsigned int *)((char *)bo->virtual + binding_table_offset)) = surface_state_offset; |
||
858 | dri_bo_unmap(bo); |
||
859 | } |
||
860 | |||
861 | void |
||
862 | gen8_gpe_media_chroma_surface_setup(VADriverContextP ctx, |
||
863 | struct i965_gpe_context *gpe_context, |
||
864 | struct object_surface *obj_surface, |
||
865 | unsigned long binding_table_offset, |
||
866 | unsigned long surface_state_offset) |
||
867 | { |
||
868 | struct gen8_surface_state *ss; |
||
869 | dri_bo *bo; |
||
870 | int cbcr_offset; |
||
871 | |||
872 | assert(obj_surface->fourcc == VA_FOURCC_NV12); |
||
873 | bo = gpe_context->surface_state_binding_table.bo; |
||
874 | dri_bo_map(bo, True); |
||
875 | assert(bo->virtual); |
||
876 | |||
877 | cbcr_offset = obj_surface->height * obj_surface->width; |
||
878 | ss = (struct gen8_surface_state *)((char *)bo->virtual + surface_state_offset); |
||
879 | gen8_gpe_set_media_chroma_surface_state(ctx, obj_surface, ss); |
||
880 | dri_bo_emit_reloc(bo, |
||
881 | I915_GEM_DOMAIN_RENDER, 0, |
||
882 | cbcr_offset, |
||
883 | surface_state_offset + offsetof(struct gen8_surface_state, ss8), |
||
884 | obj_surface->bo); |
||
885 | |||
886 | *((unsigned int *)((char *)bo->virtual + binding_table_offset)) = surface_state_offset; |
||
887 | dri_bo_unmap(bo); |
||
888 | } |
||
889 | |||
890 | |||
891 | static void |
||
892 | gen8_gpe_set_buffer_surface_state(VADriverContextP ctx, |
||
893 | struct i965_buffer_surface *buffer_surface, |
||
894 | struct gen8_surface_state *ss) |
||
895 | { |
||
896 | int num_entries; |
||
897 | |||
898 | assert(buffer_surface->bo); |
||
899 | num_entries = buffer_surface->num_blocks * buffer_surface->size_block / buffer_surface->pitch; |
||
900 | |||
901 | memset(ss, 0, sizeof(*ss)); |
||
902 | /* ss0 */ |
||
903 | ss->ss0.surface_type = I965_SURFACE_BUFFER; |
||
904 | /* ss1 */ |
||
905 | ss->ss8.base_addr = buffer_surface->bo->offset; |
||
906 | /* ss2 */ |
||
907 | ss->ss2.width = ((num_entries - 1) & 0x7f); |
||
908 | ss->ss2.height = (((num_entries - 1) >> 7) & 0x3fff); |
||
909 | /* ss3 */ |
||
910 | ss->ss3.depth = (((num_entries - 1) >> 21) & 0x3f); |
||
911 | ss->ss3.pitch = buffer_surface->pitch - 1; |
||
912 | } |
||
913 | |||
914 | void |
||
915 | gen8_gpe_buffer_suface_setup(VADriverContextP ctx, |
||
916 | struct i965_gpe_context *gpe_context, |
||
917 | struct i965_buffer_surface *buffer_surface, |
||
918 | unsigned long binding_table_offset, |
||
919 | unsigned long surface_state_offset) |
||
920 | { |
||
921 | struct gen8_surface_state *ss; |
||
922 | dri_bo *bo; |
||
923 | |||
924 | bo = gpe_context->surface_state_binding_table.bo; |
||
925 | dri_bo_map(bo, 1); |
||
926 | assert(bo->virtual); |
||
927 | |||
928 | ss = (struct gen8_surface_state *)((char *)bo->virtual + surface_state_offset); |
||
929 | gen8_gpe_set_buffer_surface_state(ctx, buffer_surface, ss); |
||
930 | dri_bo_emit_reloc(bo, |
||
931 | I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, |
||
932 | 0, |
||
933 | surface_state_offset + offsetof(struct gen8_surface_state, ss8), |
||
934 | buffer_surface->bo); |
||
935 | |||
936 | *((unsigned int *)((char *)bo->virtual + binding_table_offset)) = surface_state_offset; |
||
937 | dri_bo_unmap(bo); |
||
938 | } |
||
939 | |||
940 | static void |
||
941 | gen8_gpe_state_base_address(VADriverContextP ctx, |
||
942 | struct i965_gpe_context *gpe_context, |
||
943 | struct intel_batchbuffer *batch) |
||
944 | { |
||
945 | BEGIN_BATCH(batch, 16); |
||
946 | |||
947 | OUT_BATCH(batch, CMD_STATE_BASE_ADDRESS | 14); |
||
948 | |||
949 | OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); //General State Base Address |
||
950 | OUT_BATCH(batch, 0); |
||
951 | OUT_BATCH(batch, 0); |
||
952 | |||
953 | /*DW4 Surface state base address */ |
||
954 | OUT_RELOC(batch, gpe_context->surface_state_binding_table.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, BASE_ADDRESS_MODIFY); /* Surface state base address */ |
||
955 | OUT_BATCH(batch, 0); |
||
956 | |||
957 | /*DW6. Dynamic state base address */ |
||
958 | if (gpe_context->dynamic_state.bo) |
||
959 | OUT_RELOC(batch, gpe_context->dynamic_state.bo, |
||
960 | I915_GEM_DOMAIN_RENDER | I915_GEM_DOMAIN_SAMPLER, |
||
961 | 0, BASE_ADDRESS_MODIFY); |
||
962 | else |
||
963 | OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); |
||
964 | |||
965 | OUT_BATCH(batch, 0); |
||
966 | |||
967 | /*DW8. Indirect Object base address */ |
||
968 | if (gpe_context->indirect_state.bo) |
||
969 | OUT_RELOC(batch, gpe_context->indirect_state.bo, |
||
970 | I915_GEM_DOMAIN_SAMPLER, |
||
971 | 0, BASE_ADDRESS_MODIFY); |
||
972 | else |
||
973 | OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); |
||
974 | |||
975 | OUT_BATCH(batch, 0); |
||
976 | |||
977 | /*DW10. Instruct base address */ |
||
978 | if (gpe_context->instruction_state.bo) |
||
979 | OUT_RELOC(batch, gpe_context->instruction_state.bo, |
||
980 | I915_GEM_DOMAIN_INSTRUCTION, |
||
981 | 0, BASE_ADDRESS_MODIFY); |
||
982 | else |
||
983 | OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); |
||
984 | |||
985 | OUT_BATCH(batch, 0); |
||
986 | |||
987 | /* DW12. Size limitation */ |
||
988 | OUT_BATCH(batch, 0xFFFFF000 | BASE_ADDRESS_MODIFY); //General State Access Upper Bound |
||
989 | OUT_BATCH(batch, 0xFFFFF000 | BASE_ADDRESS_MODIFY); //Dynamic State Access Upper Bound |
||
990 | OUT_BATCH(batch, 0xFFFFF000 | BASE_ADDRESS_MODIFY); //Indirect Object Access Upper Bound |
||
991 | OUT_BATCH(batch, 0xFFFFF000 | BASE_ADDRESS_MODIFY); //Instruction Access Upper Bound |
||
992 | |||
993 | /* |
||
994 | OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); //LLC Coherent Base Address |
||
995 | OUT_BATCH(batch, 0xFFFFF000 | BASE_ADDRESS_MODIFY ); //LLC Coherent Upper Bound |
||
996 | */ |
||
997 | |||
998 | ADVANCE_BATCH(batch); |
||
999 | } |
||
1000 | |||
1001 | static void |
||
1002 | gen8_gpe_vfe_state(VADriverContextP ctx, |
||
1003 | struct i965_gpe_context *gpe_context, |
||
1004 | struct intel_batchbuffer *batch) |
||
1005 | { |
||
1006 | |||
1007 | BEGIN_BATCH(batch, 9); |
||
1008 | |||
1009 | OUT_BATCH(batch, CMD_MEDIA_VFE_STATE | (9 - 2)); |
||
1010 | /* Scratch Space Base Pointer and Space */ |
||
1011 | OUT_BATCH(batch, 0); |
||
1012 | OUT_BATCH(batch, 0); |
||
1013 | |||
1014 | OUT_BATCH(batch, |
||
1015 | gpe_context->vfe_state.max_num_threads << 16 | /* Maximum Number of Threads */ |
||
1016 | gpe_context->vfe_state.num_urb_entries << 8 | /* Number of URB Entries */ |
||
1017 | gpe_context->vfe_state.gpgpu_mode << 2); /* MEDIA Mode */ |
||
1018 | OUT_BATCH(batch, 0); /* Debug: Object ID */ |
||
1019 | OUT_BATCH(batch, |
||
1020 | gpe_context->vfe_state.urb_entry_size << 16 | /* URB Entry Allocation Size */ |
||
1021 | gpe_context->vfe_state.curbe_allocation_size); /* CURBE Allocation Size */ |
||
1022 | |||
1023 | /* the vfe_desc5/6/7 will decide whether the scoreboard is used. */ |
||
1024 | OUT_BATCH(batch, gpe_context->vfe_desc5.dword); |
||
1025 | OUT_BATCH(batch, gpe_context->vfe_desc6.dword); |
||
1026 | OUT_BATCH(batch, gpe_context->vfe_desc7.dword); |
||
1027 | |||
1028 | ADVANCE_BATCH(batch); |
||
1029 | |||
1030 | } |
||
1031 | |||
1032 | |||
1033 | static void |
||
1034 | gen8_gpe_curbe_load(VADriverContextP ctx, |
||
1035 | struct i965_gpe_context *gpe_context, |
||
1036 | struct intel_batchbuffer *batch) |
||
1037 | { |
||
1038 | BEGIN_BATCH(batch, 4); |
||
1039 | |||
1040 | OUT_BATCH(batch, CMD_MEDIA_CURBE_LOAD | (4 - 2)); |
||
1041 | OUT_BATCH(batch, 0); |
||
1042 | OUT_BATCH(batch, gpe_context->curbe_size); |
||
1043 | OUT_BATCH(batch, gpe_context->curbe_offset); |
||
1044 | |||
1045 | ADVANCE_BATCH(batch); |
||
1046 | } |
||
1047 | |||
1048 | static void |
||
1049 | gen8_gpe_idrt(VADriverContextP ctx, |
||
1050 | struct i965_gpe_context *gpe_context, |
||
1051 | struct intel_batchbuffer *batch) |
||
1052 | { |
||
1053 | BEGIN_BATCH(batch, 6); |
||
1054 | |||
1055 | OUT_BATCH(batch, CMD_MEDIA_STATE_FLUSH); |
||
1056 | OUT_BATCH(batch, 0); |
||
1057 | |||
1058 | OUT_BATCH(batch, CMD_MEDIA_INTERFACE_LOAD | (4 - 2)); |
||
1059 | OUT_BATCH(batch, 0); |
||
1060 | OUT_BATCH(batch, gpe_context->idrt_size); |
||
1061 | OUT_BATCH(batch, gpe_context->idrt_offset); |
||
1062 | |||
1063 | ADVANCE_BATCH(batch); |
||
1064 | } |
||
1065 | |||
1066 | |||
1067 | void |
||
1068 | gen8_gpe_pipeline_setup(VADriverContextP ctx, |
||
1069 | struct i965_gpe_context *gpe_context, |
||
1070 | struct intel_batchbuffer *batch) |
||
1071 | { |
||
1072 | intel_batchbuffer_emit_mi_flush(batch); |
||
1073 | |||
1074 | i965_gpe_select(ctx, gpe_context, batch); |
||
1075 | gen8_gpe_state_base_address(ctx, gpe_context, batch); |
||
1076 | gen8_gpe_vfe_state(ctx, gpe_context, batch); |
||
1077 | gen8_gpe_curbe_load(ctx, gpe_context, batch); |
||
1078 | gen8_gpe_idrt(ctx, gpe_context, batch); |
||
1079 | } |
||
1080 | |||
1081 | void |
||
1082 | gen8_gpe_context_init(VADriverContextP ctx, |
||
1083 | struct i965_gpe_context *gpe_context) |
||
1084 | { |
||
1085 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1086 | dri_bo *bo; |
||
1087 | int bo_size; |
||
1088 | unsigned int start_offset, end_offset; |
||
1089 | |||
1090 | dri_bo_unreference(gpe_context->surface_state_binding_table.bo); |
||
1091 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1092 | "surface state & binding table", |
||
1093 | gpe_context->surface_state_binding_table.length, |
||
1094 | 4096); |
||
1095 | assert(bo); |
||
1096 | gpe_context->surface_state_binding_table.bo = bo; |
||
1097 | |||
1098 | bo_size = gpe_context->idrt_size + gpe_context->curbe_size + gpe_context->sampler_size + 192; |
||
1099 | dri_bo_unreference(gpe_context->dynamic_state.bo); |
||
1100 | bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1101 | "surface state & binding table", |
||
1102 | bo_size, |
||
1103 | 4096); |
||
1104 | assert(bo); |
||
1105 | gpe_context->dynamic_state.bo = bo; |
||
1106 | gpe_context->dynamic_state.bo_size = bo_size; |
||
1107 | |||
1108 | end_offset = 0; |
||
1109 | gpe_context->dynamic_state.end_offset = 0; |
||
1110 | |||
1111 | /* Constant buffer offset */ |
||
1112 | start_offset = ALIGN(end_offset, 64); |
||
1113 | gpe_context->curbe_offset = start_offset; |
||
1114 | end_offset = start_offset + gpe_context->curbe_size; |
||
1115 | |||
1116 | /* Interface descriptor offset */ |
||
1117 | start_offset = ALIGN(end_offset, 64); |
||
1118 | gpe_context->idrt_offset = start_offset; |
||
1119 | end_offset = start_offset + gpe_context->idrt_size; |
||
1120 | |||
1121 | /* Sampler state offset */ |
||
1122 | start_offset = ALIGN(end_offset, 64); |
||
1123 | gpe_context->sampler_offset = start_offset; |
||
1124 | end_offset = start_offset + gpe_context->sampler_size; |
||
1125 | |||
1126 | /* update the end offset of dynamic_state */ |
||
1127 | gpe_context->dynamic_state.end_offset = end_offset; |
||
1128 | } |
||
1129 | |||
1130 | |||
1131 | void |
||
1132 | gen8_gpe_context_destroy(struct i965_gpe_context *gpe_context) |
||
1133 | { |
||
1134 | int i; |
||
1135 | |||
1136 | dri_bo_unreference(gpe_context->surface_state_binding_table.bo); |
||
1137 | gpe_context->surface_state_binding_table.bo = NULL; |
||
1138 | |||
1139 | dri_bo_unreference(gpe_context->instruction_state.bo); |
||
1140 | gpe_context->instruction_state.bo = NULL; |
||
1141 | |||
1142 | dri_bo_unreference(gpe_context->dynamic_state.bo); |
||
1143 | gpe_context->dynamic_state.bo = NULL; |
||
1144 | |||
1145 | dri_bo_unreference(gpe_context->indirect_state.bo); |
||
1146 | gpe_context->indirect_state.bo = NULL; |
||
1147 | |||
1148 | } |
||
1149 | |||
1150 | |||
1151 | void |
||
1152 | gen8_gpe_load_kernels(VADriverContextP ctx, |
||
1153 | struct i965_gpe_context *gpe_context, |
||
1154 | struct i965_kernel *kernel_list, |
||
1155 | unsigned int num_kernels) |
||
1156 | { |
||
1157 | struct i965_driver_data *i965 = i965_driver_data(ctx); |
||
1158 | int i, kernel_size; |
||
1159 | unsigned int kernel_offset, end_offset; |
||
1160 | unsigned char *kernel_ptr; |
||
1161 | struct i965_kernel *kernel; |
||
1162 | |||
1163 | assert(num_kernels <= MAX_GPE_KERNELS); |
||
1164 | memcpy(gpe_context->kernels, kernel_list, sizeof(*kernel_list) * num_kernels); |
||
1165 | gpe_context->num_kernels = num_kernels; |
||
1166 | |||
1167 | kernel_size = num_kernels * 64; |
||
1168 | for (i = 0; i < num_kernels; i++) { |
||
1169 | kernel = &gpe_context->kernels[i]; |
||
1170 | |||
1171 | kernel_size += kernel->size; |
||
1172 | } |
||
1173 | |||
1174 | gpe_context->instruction_state.bo = dri_bo_alloc(i965->intel.bufmgr, |
||
1175 | "kernel shader", |
||
1176 | kernel_size, |
||
1177 | 0x1000); |
||
1178 | if (gpe_context->instruction_state.bo == NULL) { |
||
1179 | WARN_ONCE("failure to allocate the buffer space for kernel shader\n"); |
||
1180 | return; |
||
1181 | } |
||
1182 | |||
1183 | assert(gpe_context->instruction_state.bo); |
||
1184 | |||
1185 | gpe_context->instruction_state.bo_size = kernel_size; |
||
1186 | gpe_context->instruction_state.end_offset = 0; |
||
1187 | end_offset = 0; |
||
1188 | |||
1189 | dri_bo_map(gpe_context->instruction_state.bo, 1); |
||
1190 | kernel_ptr = (unsigned char *)(gpe_context->instruction_state.bo->virtual); |
||
1191 | for (i = 0; i < num_kernels; i++) { |
||
1192 | kernel_offset = ALIGN(end_offset, 64); |
||
1193 | kernel = &gpe_context->kernels[i]; |
||
1194 | kernel->kernel_offset = kernel_offset; |
||
1195 | |||
1196 | if (kernel->size) { |
||
1197 | memcpy(kernel_ptr + kernel_offset, kernel->bin, kernel->size); |
||
1198 | |||
1199 | end_offset = kernel_offset + kernel->size; |
||
1200 | } |
||
1201 | } |
||
1202 | |||
1203 | gpe_context->instruction_state.end_offset = end_offset; |
||
1204 | |||
1205 | dri_bo_unmap(gpe_context->instruction_state.bo); |
||
1206 | |||
1207 | return; |
||
1208 | }>>=>><>><>><>><>>>=>><>><>><>><> |
||
1209 |