2 * Mesa 3-D graphics library
4 * Copyright (C) 2013 LunarG, Inc.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
25 * Chia-I Wu <olv@lunarg.com>
28 #include "brw_defines.h"
29 #include "intel_reg.h"
32 #include "ilo_format.h"
33 #include "ilo_resource.h"
34 #include "ilo_shader.h"
35 #include "ilo_gpe_gen7.h"
38 gen7_emit_GPGPU_WALKER(const struct ilo_dev_info *dev,
41 assert(!"GPGPU_WALKER unsupported");
45 gen7_emit_3DSTATE_CLEAR_PARAMS(const struct ilo_dev_info *dev,
49 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x0, 0x04);
50 const uint8_t cmd_len = 3;
52 ILO_GPE_VALID_GEN(dev, 7, 7);
54 ilo_cp_begin(cp, cmd_len);
55 ilo_cp_write(cp, cmd | (cmd_len - 2));
56 ilo_cp_write(cp, clear_val);
62 gen7_emit_3DSTATE_DEPTH_BUFFER(const struct ilo_dev_info *dev,
63 const struct pipe_surface *surface,
64 const struct pipe_depth_stencil_alpha_state *dsa,
68 ilo_gpe_gen6_emit_3DSTATE_DEPTH_BUFFER(dev, surface, dsa, hiz, cp);
72 gen7_emit_3dstate_pointer(const struct ilo_dev_info *dev,
73 int subop, uint32_t pointer,
76 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x0, subop);
77 const uint8_t cmd_len = 2;
79 ILO_GPE_VALID_GEN(dev, 7, 7);
81 ilo_cp_begin(cp, cmd_len);
82 ilo_cp_write(cp, cmd | (cmd_len - 2));
83 ilo_cp_write(cp, pointer);
88 gen7_emit_3DSTATE_CC_STATE_POINTERS(const struct ilo_dev_info *dev,
89 uint32_t color_calc_state,
92 gen7_emit_3dstate_pointer(dev, 0x0e, color_calc_state, cp);
96 gen7_emit_3DSTATE_GS(const struct ilo_dev_info *dev,
97 const struct ilo_shader *gs,
101 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x0, 0x11);
102 const uint8_t cmd_len = 7;
103 uint32_t dw2, dw4, dw5;
106 ILO_GPE_VALID_GEN(dev, 7, 7);
110 max_threads = (dev->gt == 2) ? 128 : 36;
118 ilo_cp_begin(cp, cmd_len);
119 ilo_cp_write(cp, cmd | (cmd_len - 2));
124 ilo_cp_write(cp, GEN6_GS_STATISTICS_ENABLE);
130 dw2 = ((num_samplers + 3) / 4) << GEN6_GS_SAMPLER_COUNT_SHIFT;
132 dw4 = ((gs->in.count + 1) / 2) << GEN6_GS_URB_READ_LENGTH_SHIFT |
133 GEN7_GS_INCLUDE_VERTEX_HANDLES |
134 0 << GEN6_GS_URB_ENTRY_READ_OFFSET_SHIFT |
135 gs->in.start_grf << GEN6_GS_DISPATCH_START_GRF_SHIFT;
137 dw5 = (max_threads - 1) << GEN6_GS_MAX_THREADS_SHIFT |
138 GEN6_GS_STATISTICS_ENABLE |
141 ilo_cp_begin(cp, cmd_len);
142 ilo_cp_write(cp, cmd | (cmd_len - 2));
143 ilo_cp_write(cp, gs->cache_offset);
144 ilo_cp_write(cp, dw2);
145 ilo_cp_write(cp, 0); /* scratch */
146 ilo_cp_write(cp, dw4);
147 ilo_cp_write(cp, dw5);
153 gen7_emit_3DSTATE_SF(const struct ilo_dev_info *dev,
154 const struct pipe_rasterizer_state *rasterizer,
155 const struct pipe_surface *zs_surf,
158 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x0, 0x13);
159 const uint8_t cmd_len = 7;
162 ILO_GPE_VALID_GEN(dev, 7, 7);
164 ilo_gpe_gen6_fill_3dstate_sf_raster(dev, rasterizer,
165 1, (zs_surf) ? zs_surf->format : PIPE_FORMAT_NONE, true,
168 ilo_cp_begin(cp, cmd_len);
169 ilo_cp_write(cp, cmd | (cmd_len - 2));
170 ilo_cp_write_multi(cp, dw, 6);
175 gen7_emit_3DSTATE_WM(const struct ilo_dev_info *dev,
176 const struct ilo_shader *fs,
177 const struct pipe_rasterizer_state *rasterizer,
181 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x0, 0x14);
182 const uint8_t cmd_len = 3;
183 const int num_samples = 1;
186 ILO_GPE_VALID_GEN(dev, 7, 7);
188 dw1 = GEN7_WM_STATISTICS_ENABLE |
189 GEN7_WM_LINE_AA_WIDTH_2_0;
192 dw1 |= GEN7_WM_DEPTH_CLEAR;
193 dw1 |= GEN7_WM_DEPTH_RESOLVE;
194 dw1 |= GEN7_WM_HIERARCHICAL_DEPTH_RESOLVE;
201 * a) fs writes colors and color is not masked, or
202 * b) fs writes depth, or
205 dw1 |= GEN7_WM_DISPATCH_ENABLE;
208 * From the Ivy Bridge PRM, volume 2 part 1, page 278:
210 * "This bit (Pixel Shader Kill Pixel), if ENABLED, indicates that
211 * the PS kernel or color calculator has the ability to kill
212 * (discard) pixels or samples, other than due to depth or stencil
213 * testing. This bit is required to be ENABLED in the following
216 * - The API pixel shader program contains "killpix" or "discard"
217 * instructions, or other code in the pixel shader kernel that
218 * can cause the final pixel mask to differ from the pixel mask
219 * received on dispatch.
221 * - A sampler with chroma key enabled with kill pixel mode is used
222 * by the pixel shader.
224 * - Any render target has Alpha Test Enable or AlphaToCoverage
227 * - The pixel shader kernel generates and outputs oMask.
229 * Note: As ClipDistance clipping is fully supported in hardware
230 * and therefore not via PS instructions, there should be no need
231 * to ENABLE this bit due to ClipDistance clipping."
233 if (fs->has_kill || cc_may_kill)
234 dw1 |= GEN7_WM_KILL_ENABLE;
237 dw1 |= GEN7_WM_PSCDEPTH_ON;
239 dw1 |= GEN7_WM_USES_SOURCE_DEPTH | GEN7_WM_USES_SOURCE_W;
241 dw1 |= fs->in.barycentric_interpolation_mode <<
242 GEN7_WM_BARYCENTRIC_INTERPOLATION_MODE_SHIFT;
244 else if (cc_may_kill) {
245 dw1 |= GEN7_WM_DISPATCH_ENABLE |
249 dw1 |= GEN7_WM_POSITION_ZW_PIXEL;
251 /* same value as in 3DSTATE_SF */
252 if (rasterizer->line_smooth)
253 dw1 |= GEN7_WM_LINE_END_CAP_AA_WIDTH_1_0;
255 if (rasterizer->poly_stipple_enable)
256 dw1 |= GEN7_WM_POLYGON_STIPPLE_ENABLE;
257 if (rasterizer->line_stipple_enable)
258 dw1 |= GEN7_WM_LINE_STIPPLE_ENABLE;
260 if (rasterizer->bottom_edge_rule)
261 dw1 |= GEN7_WM_POINT_RASTRULE_UPPER_RIGHT;
263 if (num_samples > 1) {
264 if (rasterizer->multisample)
265 dw1 |= GEN7_WM_MSRAST_ON_PATTERN;
267 dw1 |= GEN7_WM_MSRAST_OFF_PIXEL;
269 dw2 = GEN7_WM_MSDISPMODE_PERPIXEL;
272 dw1 |= GEN7_WM_MSRAST_OFF_PIXEL;
274 dw2 = GEN7_WM_MSDISPMODE_PERSAMPLE;
277 ilo_cp_begin(cp, cmd_len);
278 ilo_cp_write(cp, cmd | (cmd_len - 2));
279 ilo_cp_write(cp, dw1);
280 ilo_cp_write(cp, dw2);
285 gen7_emit_3dstate_constant(const struct ilo_dev_info *dev,
287 const uint32_t *bufs, const int *sizes,
291 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x0, subop);
292 const uint8_t cmd_len = 7;
294 int total_read_length, i;
296 ILO_GPE_VALID_GEN(dev, 7, 7);
298 /* VS, HS, DS, GS, and PS variants */
299 assert(subop >= 0x15 && subop <= 0x1a && subop != 0x18);
301 assert(num_bufs <= 4);
306 total_read_length = 0;
307 for (i = 0; i < 4; i++) {
311 * From the Ivy Bridge PRM, volume 2 part 1, page 112:
313 * "Constant buffers must be enabled in order from Constant Buffer 0
314 * to Constant Buffer 3 within this command. For example, it is
315 * not allowed to enable Constant Buffer 1 by programming a
316 * non-zero value in the VS Constant Buffer 1 Read Length without a
317 * non-zero value in VS Constant Buffer 0 Read Length."
319 if (i >= num_bufs || !sizes[i]) {
321 assert(i >= num_bufs || !sizes[i]);
327 /* read lengths are in 256-bit units */
328 read_len = (sizes[i] + 31) / 32;
329 /* the lower 5 bits are used for memory object control state */
330 assert(bufs[i] % 32 == 0);
332 dw[i / 2] |= read_len << ((i % 2) ? 16 : 0);
335 total_read_length += read_len;
339 * From the Ivy Bridge PRM, volume 2 part 1, page 113:
341 * "The sum of all four read length fields must be less than or equal
344 assert(total_read_length <= 64);
346 ilo_cp_begin(cp, cmd_len);
347 ilo_cp_write(cp, cmd | (cmd_len - 2));
348 ilo_cp_write_multi(cp, dw, 6);
353 gen7_emit_3DSTATE_CONSTANT_VS(const struct ilo_dev_info *dev,
354 const uint32_t *bufs, const int *sizes,
358 gen7_emit_3dstate_constant(dev, 0x15, bufs, sizes, num_bufs, cp);
362 gen7_emit_3DSTATE_CONSTANT_GS(const struct ilo_dev_info *dev,
363 const uint32_t *bufs, const int *sizes,
367 gen7_emit_3dstate_constant(dev, 0x16, bufs, sizes, num_bufs, cp);
371 gen7_emit_3DSTATE_CONSTANT_PS(const struct ilo_dev_info *dev,
372 const uint32_t *bufs, const int *sizes,
376 gen7_emit_3dstate_constant(dev, 0x17, bufs, sizes, num_bufs, cp);
380 gen7_emit_3DSTATE_SAMPLE_MASK(const struct ilo_dev_info *dev,
381 unsigned sample_mask,
385 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x0, 0x18);
386 const uint8_t cmd_len = 2;
387 const unsigned valid_mask = ((1 << num_samples) - 1) | 0x1;
389 ILO_GPE_VALID_GEN(dev, 7, 7);
392 * From the Ivy Bridge PRM, volume 2 part 1, page 294:
394 * "If Number of Multisamples is NUMSAMPLES_1, bits 7:1 of this field
395 * (Sample Mask) must be zero.
397 * If Number of Multisamples is NUMSAMPLES_4, bits 7:4 of this field
400 sample_mask &= valid_mask;
402 ilo_cp_begin(cp, cmd_len);
403 ilo_cp_write(cp, cmd | (cmd_len - 2));
404 ilo_cp_write(cp, sample_mask);
409 gen7_emit_3DSTATE_CONSTANT_HS(const struct ilo_dev_info *dev,
410 const uint32_t *bufs, const int *sizes,
414 gen7_emit_3dstate_constant(dev, 0x19, bufs, sizes, num_bufs, cp);
418 gen7_emit_3DSTATE_CONSTANT_DS(const struct ilo_dev_info *dev,
419 const uint32_t *bufs, const int *sizes,
423 gen7_emit_3dstate_constant(dev, 0x1a, bufs, sizes, num_bufs, cp);
427 gen7_emit_3DSTATE_HS(const struct ilo_dev_info *dev,
428 const struct ilo_shader *hs,
429 int max_threads, int num_samplers,
432 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x0, 0x1b);
433 const uint8_t cmd_len = 7;
434 uint32_t dw1, dw2, dw5;
436 ILO_GPE_VALID_GEN(dev, 7, 7);
439 ilo_cp_begin(cp, cmd_len);
440 ilo_cp_write(cp, cmd | (cmd_len - 2));
452 dw1 = (num_samplers + 3) / 4 << 27 |
458 dw2 = 1 << 31 | /* HS Enable */
459 1 << 29 | /* HS Statistics Enable */
460 0; /* Instance Count */
462 dw5 = hs->in.start_grf << 19 |
466 ilo_cp_begin(cp, cmd_len);
467 ilo_cp_write(cp, cmd | (cmd_len - 2));
468 ilo_cp_write(cp, dw1);
469 ilo_cp_write(cp, dw2);
470 ilo_cp_write(cp, hs->cache_offset);
472 ilo_cp_write(cp, dw5);
478 gen7_emit_3DSTATE_TE(const struct ilo_dev_info *dev,
481 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x0, 0x1c);
482 const uint8_t cmd_len = 4;
484 ILO_GPE_VALID_GEN(dev, 7, 7);
486 ilo_cp_begin(cp, cmd_len);
487 ilo_cp_write(cp, cmd | (cmd_len - 2));
495 gen7_emit_3DSTATE_DS(const struct ilo_dev_info *dev,
496 const struct ilo_shader *ds,
497 int max_threads, int num_samplers,
500 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x0, 0x1d);
501 const uint8_t cmd_len = 6;
502 uint32_t dw2, dw4, dw5;
504 ILO_GPE_VALID_GEN(dev, 7, 7);
507 ilo_cp_begin(cp, cmd_len);
508 ilo_cp_write(cp, cmd | (cmd_len - 2));
519 dw2 = (num_samplers + 3) / 4 << 27 |
525 dw4 = ds->in.start_grf << 20 |
529 dw5 = (max_threads - 1) << 25 |
533 ilo_cp_begin(cp, cmd_len);
534 ilo_cp_write(cp, cmd | (cmd_len - 2));
535 ilo_cp_write(cp, ds->cache_offset);
536 ilo_cp_write(cp, dw2);
538 ilo_cp_write(cp, dw4);
539 ilo_cp_write(cp, dw5);
544 gen7_emit_3DSTATE_STREAMOUT(const struct ilo_dev_info *dev,
545 unsigned buffer_mask,
546 int vertex_attrib_count,
547 bool rasterizer_discard,
550 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x0, 0x1e);
551 const uint8_t cmd_len = 3;
552 const bool enable = (buffer_mask != 0);
556 ILO_GPE_VALID_GEN(dev, 7, 7);
559 dw1 = 0 << SO_RENDER_STREAM_SELECT_SHIFT;
560 if (rasterizer_discard)
561 dw1 |= SO_RENDERING_DISABLE;
565 ilo_cp_begin(cp, cmd_len);
566 ilo_cp_write(cp, cmd | (cmd_len - 2));
567 ilo_cp_write(cp, dw1);
568 ilo_cp_write(cp, dw2);
573 read_len = (vertex_attrib_count + 1) / 2;
577 dw1 = SO_FUNCTION_ENABLE |
578 0 << SO_RENDER_STREAM_SELECT_SHIFT |
579 SO_STATISTICS_ENABLE |
582 if (rasterizer_discard)
583 dw1 |= SO_RENDERING_DISABLE;
587 dw1 |= SO_REORDER_TRAILING;
589 dw2 = 0 << SO_STREAM_3_VERTEX_READ_OFFSET_SHIFT |
590 0 << SO_STREAM_3_VERTEX_READ_LENGTH_SHIFT |
591 0 << SO_STREAM_2_VERTEX_READ_OFFSET_SHIFT |
592 0 << SO_STREAM_2_VERTEX_READ_LENGTH_SHIFT |
593 0 << SO_STREAM_1_VERTEX_READ_OFFSET_SHIFT |
594 0 << SO_STREAM_1_VERTEX_READ_LENGTH_SHIFT |
595 0 << SO_STREAM_0_VERTEX_READ_OFFSET_SHIFT |
596 (read_len - 1) << SO_STREAM_0_VERTEX_READ_LENGTH_SHIFT;
598 ilo_cp_begin(cp, cmd_len);
599 ilo_cp_write(cp, cmd | (cmd_len - 2));
600 ilo_cp_write(cp, dw1);
601 ilo_cp_write(cp, dw2);
606 gen7_emit_3DSTATE_SBE(const struct ilo_dev_info *dev,
607 const struct pipe_rasterizer_state *rasterizer,
608 const struct ilo_shader *fs,
609 const struct ilo_shader *last_sh,
612 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x0, 0x1f);
613 const uint8_t cmd_len = 14;
616 ILO_GPE_VALID_GEN(dev, 7, 7);
618 ilo_gpe_gen6_fill_3dstate_sf_sbe(dev, rasterizer,
619 fs, last_sh, dw, Elements(dw));
621 ilo_cp_begin(cp, cmd_len);
622 ilo_cp_write(cp, cmd | (cmd_len - 2));
623 ilo_cp_write_multi(cp, dw, 13);
628 gen7_emit_3DSTATE_PS(const struct ilo_dev_info *dev,
629 const struct ilo_shader *fs,
630 int num_samplers, bool dual_blend,
633 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x0, 0x20);
634 const uint8_t cmd_len = 8;
635 uint32_t dw2, dw4, dw5;
638 ILO_GPE_VALID_GEN(dev, 7, 7);
640 /* see brwCreateContext() */
641 max_threads = (dev->gt == 2) ? 172 : 48;
644 ilo_cp_begin(cp, cmd_len);
645 ilo_cp_write(cp, cmd | (cmd_len - 2));
649 /* GPU hangs if none of the dispatch enable bits is set */
650 ilo_cp_write(cp, (max_threads - 1) << IVB_PS_MAX_THREADS_SHIFT |
651 GEN7_PS_8_DISPATCH_ENABLE);
660 dw2 = (num_samplers + 3) / 4 << GEN7_PS_SAMPLER_COUNT_SHIFT |
661 0 << GEN7_PS_BINDING_TABLE_ENTRY_COUNT_SHIFT;
663 dw2 |= GEN7_PS_FLOATING_POINT_MODE_ALT;
665 dw4 = (max_threads - 1) << IVB_PS_MAX_THREADS_SHIFT |
666 GEN7_PS_POSOFFSET_NONE;
669 dw4 |= GEN7_PS_PUSH_CONSTANT_ENABLE;
671 dw4 |= GEN7_PS_ATTRIBUTE_ENABLE;
673 dw4 |= GEN7_PS_DUAL_SOURCE_BLEND_ENABLE;
676 dw4 |= GEN7_PS_16_DISPATCH_ENABLE;
678 dw4 |= GEN7_PS_8_DISPATCH_ENABLE;
680 dw5 = fs->in.start_grf << GEN7_PS_DISPATCH_START_GRF_SHIFT_0 |
681 0 << GEN7_PS_DISPATCH_START_GRF_SHIFT_1 |
682 0 << GEN7_PS_DISPATCH_START_GRF_SHIFT_2;
684 ilo_cp_begin(cp, cmd_len);
685 ilo_cp_write(cp, cmd | (cmd_len - 2));
686 ilo_cp_write(cp, fs->cache_offset);
687 ilo_cp_write(cp, dw2);
688 ilo_cp_write(cp, 0); /* scratch */
689 ilo_cp_write(cp, dw4);
690 ilo_cp_write(cp, dw5);
691 ilo_cp_write(cp, 0); /* kernel 1 */
692 ilo_cp_write(cp, 0); /* kernel 2 */
697 gen7_emit_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP(const struct ilo_dev_info *dev,
698 uint32_t sf_clip_viewport,
701 gen7_emit_3dstate_pointer(dev, 0x21, sf_clip_viewport, cp);
705 gen7_emit_3DSTATE_VIEWPORT_STATE_POINTERS_CC(const struct ilo_dev_info *dev,
706 uint32_t cc_viewport,
709 gen7_emit_3dstate_pointer(dev, 0x23, cc_viewport, cp);
713 gen7_emit_3DSTATE_BLEND_STATE_POINTERS(const struct ilo_dev_info *dev,
714 uint32_t blend_state,
717 gen7_emit_3dstate_pointer(dev, 0x24, blend_state, cp);
721 gen7_emit_3DSTATE_DEPTH_STENCIL_STATE_POINTERS(const struct ilo_dev_info *dev,
722 uint32_t depth_stencil_state,
725 gen7_emit_3dstate_pointer(dev, 0x25, depth_stencil_state, cp);
729 gen7_emit_3DSTATE_BINDING_TABLE_POINTERS_VS(const struct ilo_dev_info *dev,
730 uint32_t binding_table,
733 gen7_emit_3dstate_pointer(dev, 0x26, binding_table, cp);
737 gen7_emit_3DSTATE_BINDING_TABLE_POINTERS_HS(const struct ilo_dev_info *dev,
738 uint32_t binding_table,
741 gen7_emit_3dstate_pointer(dev, 0x27, binding_table, cp);
745 gen7_emit_3DSTATE_BINDING_TABLE_POINTERS_DS(const struct ilo_dev_info *dev,
746 uint32_t binding_table,
749 gen7_emit_3dstate_pointer(dev, 0x28, binding_table, cp);
753 gen7_emit_3DSTATE_BINDING_TABLE_POINTERS_GS(const struct ilo_dev_info *dev,
754 uint32_t binding_table,
757 gen7_emit_3dstate_pointer(dev, 0x29, binding_table, cp);
761 gen7_emit_3DSTATE_BINDING_TABLE_POINTERS_PS(const struct ilo_dev_info *dev,
762 uint32_t binding_table,
765 gen7_emit_3dstate_pointer(dev, 0x2a, binding_table, cp);
769 gen7_emit_3DSTATE_SAMPLER_STATE_POINTERS_VS(const struct ilo_dev_info *dev,
770 uint32_t sampler_state,
773 gen7_emit_3dstate_pointer(dev, 0x2b, sampler_state, cp);
777 gen7_emit_3DSTATE_SAMPLER_STATE_POINTERS_HS(const struct ilo_dev_info *dev,
778 uint32_t sampler_state,
781 gen7_emit_3dstate_pointer(dev, 0x2c, sampler_state, cp);
785 gen7_emit_3DSTATE_SAMPLER_STATE_POINTERS_DS(const struct ilo_dev_info *dev,
786 uint32_t sampler_state,
789 gen7_emit_3dstate_pointer(dev, 0x2d, sampler_state, cp);
793 gen7_emit_3DSTATE_SAMPLER_STATE_POINTERS_GS(const struct ilo_dev_info *dev,
794 uint32_t sampler_state,
797 gen7_emit_3dstate_pointer(dev, 0x2e, sampler_state, cp);
801 gen7_emit_3DSTATE_SAMPLER_STATE_POINTERS_PS(const struct ilo_dev_info *dev,
802 uint32_t sampler_state,
805 gen7_emit_3dstate_pointer(dev, 0x2f, sampler_state, cp);
809 gen7_emit_3dstate_urb(const struct ilo_dev_info *dev,
810 int subop, int offset, int size,
814 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x0, subop);
815 const uint8_t cmd_len = 2;
816 const int row_size = 64; /* 512 bits */
817 int alloc_size, num_entries, min_entries, max_entries;
819 ILO_GPE_VALID_GEN(dev, 7, 7);
821 /* VS, HS, DS, and GS variants */
822 assert(subop >= 0x30 && subop <= 0x33);
824 /* in multiples of 8KB */
825 assert(offset % 8192 == 0);
828 /* in multiple of 512-bit rows */
829 alloc_size = (entry_size + row_size - 1) / row_size;
834 * From the Ivy Bridge PRM, volume 2 part 1, page 34:
836 * "VS URB Entry Allocation Size equal to 4(5 512-bit URB rows) may
837 * cause performance to decrease due to banking in the URB. Element
838 * sizes of 16 to 20 should be programmed with six 512-bit URB rows."
840 if (subop == 0x30 && alloc_size == 5)
843 /* in multiples of 8 */
844 num_entries = (size / row_size / alloc_size) & ~7;
847 case 0x30: /* 3DSTATE_URB_VS */
849 max_entries = (dev->gt == 2) ? 704 : 512;
851 assert(num_entries >= min_entries);
852 if (num_entries > max_entries)
853 num_entries = max_entries;
855 case 0x31: /* 3DSTATE_URB_HS */
856 max_entries = (dev->gt == 2) ? 64 : 32;
857 if (num_entries > max_entries)
858 num_entries = max_entries;
860 case 0x32: /* 3DSTATE_URB_DS */
862 assert(num_entries >= 138);
864 case 0x33: /* 3DSTATE_URB_GS */
865 max_entries = (dev->gt == 2) ? 320 : 192;
866 if (num_entries > max_entries)
867 num_entries = max_entries;
873 ilo_cp_begin(cp, cmd_len);
874 ilo_cp_write(cp, cmd | (cmd_len - 2));
875 ilo_cp_write(cp, offset << GEN7_URB_STARTING_ADDRESS_SHIFT |
876 (alloc_size - 1) << GEN7_URB_ENTRY_SIZE_SHIFT |
882 gen7_emit_3DSTATE_URB_VS(const struct ilo_dev_info *dev,
883 int offset, int size, int entry_size,
886 gen7_emit_3dstate_urb(dev, 0x30, offset, size, entry_size, cp);
890 gen7_emit_3DSTATE_URB_HS(const struct ilo_dev_info *dev,
891 int offset, int size, int entry_size,
894 gen7_emit_3dstate_urb(dev, 0x31, offset, size, entry_size, cp);
898 gen7_emit_3DSTATE_URB_DS(const struct ilo_dev_info *dev,
899 int offset, int size, int entry_size,
902 gen7_emit_3dstate_urb(dev, 0x32, offset, size, entry_size, cp);
906 gen7_emit_3DSTATE_URB_GS(const struct ilo_dev_info *dev,
907 int offset, int size, int entry_size,
910 gen7_emit_3dstate_urb(dev, 0x33, offset, size, entry_size, cp);
914 gen7_emit_3dstate_push_constant_alloc(const struct ilo_dev_info *dev,
915 int subop, int offset, int size,
918 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x1, subop);
919 const uint8_t cmd_len = 2;
922 ILO_GPE_VALID_GEN(dev, 7, 7);
924 /* VS, HS, DS, GS, and PS variants */
925 assert(subop >= 0x12 && subop <= 0x16);
928 * From the Ivy Bridge PRM, volume 2 part 1, page 68:
930 * "(A table that says the maximum size of each constant buffer is
933 * From the Ivy Bridge PRM, volume 2 part 1, page 115:
935 * "The sum of the Constant Buffer Offset and the Constant Buffer Size
936 * may not exceed the maximum value of the Constant Buffer Size."
938 * Thus, the valid range of buffer end is [0KB, 16KB].
940 end = (offset + size) / 1024;
942 assert(!"invalid constant buffer end");
946 /* the valid range of buffer offset is [0KB, 15KB] */
947 offset = (offset + 1023) / 1024;
949 assert(!"invalid constant buffer offset");
958 /* the valid range of buffer size is [0KB, 15KB] */
961 assert(!"invalid constant buffer size");
965 ilo_cp_begin(cp, cmd_len);
966 ilo_cp_write(cp, cmd | (cmd_len - 2));
967 ilo_cp_write(cp, offset << GEN7_PUSH_CONSTANT_BUFFER_OFFSET_SHIFT |
973 gen7_emit_3DSTATE_PUSH_CONSTANT_ALLOC_VS(const struct ilo_dev_info *dev,
974 int offset, int size,
977 gen7_emit_3dstate_push_constant_alloc(dev, 0x12, offset, size, cp);
981 gen7_emit_3DSTATE_PUSH_CONSTANT_ALLOC_HS(const struct ilo_dev_info *dev,
982 int offset, int size,
985 gen7_emit_3dstate_push_constant_alloc(dev, 0x13, offset, size, cp);
989 gen7_emit_3DSTATE_PUSH_CONSTANT_ALLOC_DS(const struct ilo_dev_info *dev,
990 int offset, int size,
993 gen7_emit_3dstate_push_constant_alloc(dev, 0x14, offset, size, cp);
997 gen7_emit_3DSTATE_PUSH_CONSTANT_ALLOC_GS(const struct ilo_dev_info *dev,
998 int offset, int size,
1001 gen7_emit_3dstate_push_constant_alloc(dev, 0x15, offset, size, cp);
1005 gen7_emit_3DSTATE_PUSH_CONSTANT_ALLOC_PS(const struct ilo_dev_info *dev,
1006 int offset, int size,
1009 gen7_emit_3dstate_push_constant_alloc(dev, 0x16, offset, size, cp);
1013 gen7_emit_3DSTATE_SO_DECL_LIST(const struct ilo_dev_info *dev,
1014 const struct pipe_stream_output_info *so_info,
1015 const struct ilo_shader *sh,
1018 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x1, 0x17);
1020 int buffer_selects, num_entries, i;
1021 uint16_t so_decls[128];
1023 ILO_GPE_VALID_GEN(dev, 7, 7);
1029 int buffer_offsets[PIPE_MAX_SO_BUFFERS];
1031 memset(buffer_offsets, 0, sizeof(buffer_offsets));
1033 for (i = 0; i < so_info->num_outputs; i++) {
1034 unsigned decl, buf, attr, mask;
1036 buf = so_info->output[i].output_buffer;
1038 /* pad with holes */
1039 assert(buffer_offsets[buf] <= so_info->output[i].dst_offset);
1040 while (buffer_offsets[buf] < so_info->output[i].dst_offset) {
1043 num_dwords = so_info->output[i].dst_offset - buffer_offsets[buf];
1047 decl = buf << SO_DECL_OUTPUT_BUFFER_SLOT_SHIFT |
1049 ((1 << num_dwords) - 1) << SO_DECL_COMPONENT_MASK_SHIFT;
1051 so_decls[num_entries++] = decl;
1052 buffer_offsets[buf] += num_dwords;
1055 /* figure out which attribute is sourced */
1056 for (attr = 0; attr < sh->out.count; attr++) {
1057 const int idx = sh->out.register_indices[attr];
1058 if (idx == so_info->output[i].register_index)
1062 decl = buf << SO_DECL_OUTPUT_BUFFER_SLOT_SHIFT;
1064 if (attr < sh->out.count) {
1065 mask = ((1 << so_info->output[i].num_components) - 1) <<
1066 so_info->output[i].start_component;
1068 /* PSIZE is at W channel */
1069 if (sh->out.semantic_names[attr] == TGSI_SEMANTIC_PSIZE) {
1070 assert(mask == 0x1);
1071 mask = (mask << 3) & 0xf;
1074 decl |= attr << SO_DECL_REGISTER_INDEX_SHIFT |
1075 mask << SO_DECL_COMPONENT_MASK_SHIFT;
1078 assert(!"stream output an undefined register");
1079 mask = (1 << so_info->output[i].num_components) - 1;
1080 decl |= SO_DECL_HOLE_FLAG |
1081 mask << SO_DECL_COMPONENT_MASK_SHIFT;
1084 so_decls[num_entries++] = decl;
1085 buffer_selects |= 1 << buf;
1086 buffer_offsets[buf] += so_info->output[i].num_components;
1091 * From the Ivy Bridge PRM, volume 2 part 1, page 201:
1093 * "Errata: All 128 decls for all four streams must be included
1094 * whenever this command is issued. The "Num Entries [n]" fields still
1095 * contain the actual numbers of valid decls."
1097 * Also note that "DWord Length" has 9 bits for this command, and the type
1098 * of cmd_len is thus uint16_t.
1100 cmd_len = 2 * 128 + 3;
1102 ilo_cp_begin(cp, cmd_len);
1103 ilo_cp_write(cp, cmd | (cmd_len - 2));
1104 ilo_cp_write(cp, 0 << SO_STREAM_TO_BUFFER_SELECTS_3_SHIFT |
1105 0 << SO_STREAM_TO_BUFFER_SELECTS_2_SHIFT |
1106 0 << SO_STREAM_TO_BUFFER_SELECTS_1_SHIFT |
1107 buffer_selects << SO_STREAM_TO_BUFFER_SELECTS_0_SHIFT);
1108 ilo_cp_write(cp, 0 << SO_NUM_ENTRIES_3_SHIFT |
1109 0 << SO_NUM_ENTRIES_2_SHIFT |
1110 0 << SO_NUM_ENTRIES_1_SHIFT |
1111 num_entries << SO_NUM_ENTRIES_0_SHIFT);
1113 for (i = 0; i < num_entries; i++) {
1114 ilo_cp_write(cp, so_decls[i]);
1115 ilo_cp_write(cp, 0);
1117 for (; i < 128; i++) {
1118 ilo_cp_write(cp, 0);
1119 ilo_cp_write(cp, 0);
1126 gen7_emit_3DSTATE_SO_BUFFER(const struct ilo_dev_info *dev,
1127 int index, int base, int stride,
1128 const struct pipe_stream_output_target *so_target,
1131 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x1, 0x18);
1132 const uint8_t cmd_len = 4;
1133 struct ilo_buffer *buf;
1136 ILO_GPE_VALID_GEN(dev, 7, 7);
1138 if (!so_target || !so_target->buffer) {
1139 ilo_cp_begin(cp, cmd_len);
1140 ilo_cp_write(cp, cmd | (cmd_len - 2));
1141 ilo_cp_write(cp, index << SO_BUFFER_INDEX_SHIFT);
1142 ilo_cp_write(cp, 0);
1143 ilo_cp_write(cp, 0);
1148 buf = ilo_buffer(so_target->buffer);
1151 assert(stride % 4 == 0 && base % 4 == 0);
1152 assert(so_target->buffer_offset % 4 == 0);
1155 base = (base + so_target->buffer_offset) & ~3;
1156 end = (base + so_target->buffer_size) & ~3;
1158 ilo_cp_begin(cp, cmd_len);
1159 ilo_cp_write(cp, cmd | (cmd_len - 2));
1160 ilo_cp_write(cp, index << SO_BUFFER_INDEX_SHIFT |
1162 ilo_cp_write_bo(cp, base, buf->bo, INTEL_DOMAIN_RENDER, INTEL_DOMAIN_RENDER);
1163 ilo_cp_write_bo(cp, end, buf->bo, INTEL_DOMAIN_RENDER, INTEL_DOMAIN_RENDER);
1168 gen7_emit_3DPRIMITIVE(const struct ilo_dev_info *dev,
1169 const struct pipe_draw_info *info,
1173 const uint32_t cmd = ILO_GPE_CMD(0x3, 0x3, 0x00);
1174 const uint8_t cmd_len = 7;
1175 const int prim = (rectlist) ?
1176 _3DPRIM_RECTLIST : ilo_gpe_gen6_translate_pipe_prim(info->mode);
1177 const int vb_access = (info->indexed) ?
1178 GEN7_3DPRIM_VERTEXBUFFER_ACCESS_RANDOM :
1179 GEN7_3DPRIM_VERTEXBUFFER_ACCESS_SEQUENTIAL;
1181 ILO_GPE_VALID_GEN(dev, 7, 7);
1183 ilo_cp_begin(cp, cmd_len);
1184 ilo_cp_write(cp, cmd | (cmd_len - 2));
1185 ilo_cp_write(cp, vb_access | prim);
1186 ilo_cp_write(cp, info->count);
1187 ilo_cp_write(cp, info->start);
1188 ilo_cp_write(cp, info->instance_count);
1189 ilo_cp_write(cp, info->start_instance);
1190 ilo_cp_write(cp, info->index_bias);
1195 gen7_emit_SF_CLIP_VIEWPORT(const struct ilo_dev_info *dev,
1196 const struct pipe_viewport_state *viewports,
1200 const int state_align = 64 / 4;
1201 const int state_len = 16 * num_viewports;
1202 uint32_t state_offset, *dw;
1205 ILO_GPE_VALID_GEN(dev, 7, 7);
1208 * From the Ivy Bridge PRM, volume 2 part 1, page 270:
1210 * "The viewport-specific state used by both the SF and CL units
1211 * (SF_CLIP_VIEWPORT) is stored as an array of up to 16 elements, each
1212 * of which contains the DWords described below. The start of each
1213 * element is spaced 16 DWords apart. The location of first element of
1214 * the array, as specified by both Pointer to SF_VIEWPORT and Pointer
1215 * to CLIP_VIEWPORT, is aligned to a 64-byte boundary."
1217 assert(num_viewports && num_viewports <= 16);
1219 dw = ilo_cp_steal_ptr(cp, "SF_CLIP_VIEWPORT",
1220 state_len, state_align, &state_offset);
1222 for (i = 0; i < num_viewports; i++) {
1223 const struct pipe_viewport_state *vp = &viewports[i];
1225 ilo_gpe_gen6_fill_SF_VIEWPORT(dev, vp, 1, dw, 8);
1227 ilo_gpe_gen6_fill_CLIP_VIEWPORT(dev, vp, 1, dw + 8, 4);
1237 return state_offset;
1241 gen7_fill_null_SURFACE_STATE(const struct ilo_dev_info *dev,
1242 unsigned width, unsigned height,
1243 unsigned depth, unsigned lod,
1244 uint32_t *dw, int num_dwords)
1246 ILO_GPE_VALID_GEN(dev, 7, 7);
1247 assert(num_dwords == 8);
1250 * From the Ivy Bridge PRM, volume 4 part 1, page 62:
1252 * "A null surface is used in instances where an actual surface is not
1253 * bound. When a write message is generated to a null surface, no
1254 * actual surface is written to. When a read message (including any
1255 * sampling engine message) is generated to a null surface, the result
1256 * is all zeros. Note that a null surface type is allowed to be used
1257 * with all messages, even if it is not specificially indicated as
1258 * supported. All of the remaining fields in surface state are ignored
1259 * for null surfaces, with the following exceptions:
1261 * * Width, Height, Depth, LOD, and Render Target View Extent fields
1262 * must match the depth buffer's corresponding state for all render
1263 * target surfaces, including null.
1264 * * All sampling engine and data port messages support null surfaces
1265 * with the above behavior, even if not mentioned as specifically
1266 * supported, except for the following:
1267 * * Data Port Media Block Read/Write messages.
1268 * * The Surface Type of a surface used as a render target (accessed
1269 * via the Data Port's Render Target Write message) must be the same
1270 * as the Surface Type of all other render targets and of the depth
1271 * buffer (defined in 3DSTATE_DEPTH_BUFFER), unless either the depth
1272 * buffer or render targets are SURFTYPE_NULL."
1274 * From the Ivy Bridge PRM, volume 4 part 1, page 65:
1276 * "If Surface Type is SURFTYPE_NULL, this field (Tiled Surface) must be
1280 dw[0] = BRW_SURFACE_NULL << BRW_SURFACE_TYPE_SHIFT |
1281 BRW_SURFACEFORMAT_B8G8R8A8_UNORM << BRW_SURFACE_FORMAT_SHIFT |
1282 BRW_SURFACE_TILED << 13;
1286 dw[2] = SET_FIELD(height - 1, GEN7_SURFACE_HEIGHT) |
1287 SET_FIELD(width - 1, GEN7_SURFACE_WIDTH);
1289 dw[3] = SET_FIELD(depth - 1, BRW_SURFACE_DEPTH);
1298 gen7_fill_buffer_SURFACE_STATE(const struct ilo_dev_info *dev,
1299 const struct ilo_buffer *buf,
1300 unsigned offset, unsigned size,
1301 unsigned struct_size,
1302 enum pipe_format elem_format,
1303 bool is_rt, bool render_cache_rw,
1304 uint32_t *dw, int num_dwords)
1306 const bool typed = (elem_format != PIPE_FORMAT_NONE);
1307 const bool structured = (!typed && struct_size > 1);
1308 const int elem_size = (typed) ?
1309 util_format_get_blocksize(elem_format) : 1;
1310 int width, height, depth, pitch;
1311 int surface_type, surface_format, num_entries;
1313 ILO_GPE_VALID_GEN(dev, 7, 7);
1314 assert(num_dwords == 8);
1316 surface_type = (structured) ? 5 : BRW_SURFACE_BUFFER;
1318 surface_format = (typed) ?
1319 ilo_translate_color_format(elem_format) : BRW_SURFACEFORMAT_RAW;
1321 num_entries = size / struct_size;
1322 /* see if there is enough space to fit another element */
1323 if (size % struct_size >= elem_size && !structured)
1327 * From the Ivy Bridge PRM, volume 4 part 1, page 67:
1329 * "For SURFTYPE_BUFFER render targets, this field (Surface Base
1330 * Address) specifies the base address of first element of the
1331 * surface. The surface is interpreted as a simple array of that
1332 * single element type. The address must be naturally-aligned to the
1333 * element size (e.g., a buffer containing R32G32B32A32_FLOAT elements
1334 * must be 16-byte aligned)
1336 * For SURFTYPE_BUFFER non-rendertarget surfaces, this field specifies
1337 * the base address of the first element of the surface, computed in
1338 * software by adding the surface base address to the byte offset of
1339 * the element in the buffer."
1342 assert(offset % elem_size == 0);
1345 * From the Ivy Bridge PRM, volume 4 part 1, page 68:
1347 * "For typed buffer and structured buffer surfaces, the number of
1348 * entries in the buffer ranges from 1 to 2^27. For raw buffer
1349 * surfaces, the number of entries in the buffer is the number of
1350 * bytes which can range from 1 to 2^30."
1352 assert(num_entries >= 1 &&
1353 num_entries <= 1 << ((typed || structured) ? 27 : 30));
1356 * From the Ivy Bridge PRM, volume 4 part 1, page 69:
1358 * "For SURFTYPE_BUFFER: The low two bits of this field (Width) must be
1359 * 11 if the Surface Format is RAW (the size of the buffer must be a
1360 * multiple of 4 bytes)."
1362 * From the Ivy Bridge PRM, volume 4 part 1, page 70:
1364 * "For surfaces of type SURFTYPE_BUFFER and SURFTYPE_STRBUF, this
1365 * field (Surface Pitch) indicates the size of the structure."
1367 * "For linear surfaces with Surface Type of SURFTYPE_STRBUF, the pitch
1368 * must be a multiple of 4 bytes."
1371 assert(struct_size % 4 == 0);
1373 assert(num_entries % 4 == 0);
1375 pitch = struct_size;
1380 width = (num_entries & 0x0000007f);
1382 height = (num_entries & 0x001fff80) >> 7;
1384 depth = (num_entries & 0x7fe00000) >> 21;
1385 /* limit to [26:21] */
1386 if (typed || structured)
1389 dw[0] = surface_type << BRW_SURFACE_TYPE_SHIFT |
1390 surface_format << BRW_SURFACE_FORMAT_SHIFT;
1391 if (render_cache_rw)
1392 dw[0] |= BRW_SURFACE_RC_READ_WRITE;
1396 dw[2] = SET_FIELD(height, GEN7_SURFACE_HEIGHT) |
1397 SET_FIELD(width, GEN7_SURFACE_WIDTH);
1399 dw[3] = SET_FIELD(depth, BRW_SURFACE_DEPTH) |
1409 gen7_fill_normal_SURFACE_STATE(const struct ilo_dev_info *dev,
1410 struct ilo_texture *tex,
1411 enum pipe_format format,
1412 unsigned first_level, unsigned num_levels,
1413 unsigned first_layer, unsigned num_layers,
1414 bool is_rt, bool render_cache_rw,
1415 uint32_t *dw, int num_dwords)
1417 int surface_type, surface_format;
1418 int width, height, depth, pitch, lod;
1419 unsigned layer_offset, x_offset, y_offset;
1421 ILO_GPE_VALID_GEN(dev, 7, 7);
1422 assert(num_dwords == 8);
1424 surface_type = ilo_gpe_gen6_translate_texture(tex->base.target);
1425 assert(surface_type != BRW_SURFACE_BUFFER);
1427 if (format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT && tex->separate_s8)
1428 format = PIPE_FORMAT_Z32_FLOAT;
1431 surface_format = ilo_translate_render_format(format);
1433 surface_format = ilo_translate_texture_format(format);
1434 assert(surface_format >= 0);
1436 width = tex->base.width0;
1437 height = tex->base.height0;
1438 depth = (tex->base.target == PIPE_TEXTURE_3D) ?
1439 tex->base.depth0 : num_layers;
1440 pitch = tex->bo_stride;
1442 if (surface_type == BRW_SURFACE_CUBE) {
1444 * From the Ivy Bridge PRM, volume 4 part 1, page 70:
1446 * "For SURFTYPE_CUBE:For Sampling Engine Surfaces, the range of
1447 * this field is [0,340], indicating the number of cube array
1448 * elements (equal to the number of underlying 2D array elements
1449 * divided by 6). For other surfaces, this field must be zero."
1451 * When is_rt is true, we treat the texture as a 2D one to avoid the
1455 surface_type = BRW_SURFACE_2D;
1458 assert(num_layers % 6 == 0);
1459 depth = num_layers / 6;
1463 /* sanity check the size */
1464 assert(width >= 1 && height >= 1 && depth >= 1 && pitch >= 1);
1465 assert(first_layer < 2048 && num_layers <= 2048);
1466 switch (surface_type) {
1467 case BRW_SURFACE_1D:
1468 assert(width <= 16384 && height == 1 && depth <= 2048);
1470 case BRW_SURFACE_2D:
1471 assert(width <= 16384 && height <= 16384 && depth <= 2048);
1473 case BRW_SURFACE_3D:
1474 assert(width <= 2048 && height <= 2048 && depth <= 2048);
1476 assert(first_layer == 0);
1478 case BRW_SURFACE_CUBE:
1479 assert(width <= 16384 && height <= 16384 && depth <= 86);
1480 assert(width == height);
1482 assert(first_layer == 0);
1485 assert(!"unexpected surface type");
1491 * Compute the offset to the layer manually.
1493 * For rendering, the hardware requires LOD to be the same for all
1494 * render targets and the depth buffer. We need to compute the offset
1495 * to the layer manually and always set LOD to 0.
1498 /* we lose the capability for layered rendering */
1499 assert(num_layers == 1);
1501 layer_offset = ilo_texture_get_slice_offset(tex,
1502 first_level, first_layer, &x_offset, &y_offset);
1504 assert(x_offset % 4 == 0);
1505 assert(y_offset % 2 == 0);
1509 /* derive the size for the LOD */
1510 width = u_minify(width, first_level);
1511 height = u_minify(height, first_level);
1512 if (surface_type == BRW_SURFACE_3D)
1513 depth = u_minify(depth, first_level);
1527 assert(num_levels == 1);
1535 lod = num_levels - 1;
1539 * From the Ivy Bridge PRM, volume 4 part 1, page 68:
1541 * "The Base Address for linear render target surfaces and surfaces
1542 * accessed with the typed surface read/write data port messages must
1543 * be element-size aligned, for non-YUV surface formats, or a multiple
1544 * of 2 element-sizes for YUV surface formats. Other linear surfaces
1545 * have no alignment requirements (byte alignment is sufficient)."
1547 * From the Ivy Bridge PRM, volume 4 part 1, page 70:
1549 * "For linear render target surfaces and surfaces accessed with the
1550 * typed data port messages, the pitch must be a multiple of the
1551 * element size for non-YUV surface formats. Pitch must be a multiple
1552 * of 2 * element size for YUV surface formats. For linear surfaces
1553 * with Surface Type of SURFTYPE_STRBUF, the pitch must be a multiple
1554 * of 4 bytes.For other linear surfaces, the pitch can be any multiple
1557 * From the Ivy Bridge PRM, volume 4 part 1, page 74:
1559 * "For linear surfaces, this field (X Offset) must be zero."
1561 if (tex->tiling == INTEL_TILING_NONE) {
1563 const int elem_size = util_format_get_blocksize(format);
1564 assert(layer_offset % elem_size == 0);
1565 assert(pitch % elem_size == 0);
1571 dw[0] = surface_type << BRW_SURFACE_TYPE_SHIFT |
1572 surface_format << BRW_SURFACE_FORMAT_SHIFT |
1573 ilo_gpe_gen6_translate_winsys_tiling(tex->tiling) << 13;
1575 if (surface_type != BRW_SURFACE_3D && depth > 1)
1576 dw[0] |= GEN7_SURFACE_IS_ARRAY;
1579 dw[0] |= GEN7_SURFACE_VALIGN_4;
1582 dw[0] |= GEN7_SURFACE_HALIGN_8;
1584 if (tex->array_spacing_full)
1585 dw[0] |= GEN7_SURFACE_ARYSPC_FULL;
1587 dw[0] |= GEN7_SURFACE_ARYSPC_LOD0;
1589 if (render_cache_rw)
1590 dw[0] |= BRW_SURFACE_RC_READ_WRITE;
1592 if (surface_type == BRW_SURFACE_CUBE && !is_rt)
1593 dw[0] |= BRW_SURFACE_CUBEFACE_ENABLES;
1595 dw[1] = layer_offset;
1597 dw[2] = SET_FIELD(height - 1, GEN7_SURFACE_HEIGHT) |
1598 SET_FIELD(width - 1, GEN7_SURFACE_WIDTH);
1600 dw[3] = SET_FIELD(depth - 1, BRW_SURFACE_DEPTH) |
1603 dw[4] = first_layer << 18 |
1604 (num_layers - 1) << 7;
1607 * MSFMT_MSS means the samples are not interleaved and MSFMT_DEPTH_STENCIL
1608 * means the samples are interleaved. The layouts are the same when the
1609 * number of samples is 1.
1611 if (tex->interleaved && tex->base.nr_samples > 1) {
1613 dw[4] |= GEN7_SURFACE_MSFMT_DEPTH_STENCIL;
1616 dw[4] |= GEN7_SURFACE_MSFMT_MSS;
1619 if (tex->base.nr_samples > 4)
1620 dw[4] |= GEN7_SURFACE_MULTISAMPLECOUNT_8;
1621 else if (tex->base.nr_samples > 2)
1622 dw[4] |= GEN7_SURFACE_MULTISAMPLECOUNT_4;
1624 dw[4] |= GEN7_SURFACE_MULTISAMPLECOUNT_1;
1626 dw[5] = x_offset << BRW_SURFACE_X_OFFSET_SHIFT |
1627 y_offset << BRW_SURFACE_Y_OFFSET_SHIFT |
1628 SET_FIELD(first_level, GEN7_SURFACE_MIN_LOD) |
1636 gen7_emit_SURFACE_STATE(const struct ilo_dev_info *dev,
1637 struct intel_bo *bo, bool for_render,
1638 const uint32_t *dw, int num_dwords,
1641 const int state_align = 32 / 4;
1642 const int state_len = 8;
1643 uint32_t state_offset;
1644 uint32_t read_domains, write_domain;
1646 ILO_GPE_VALID_GEN(dev, 7, 7);
1647 assert(num_dwords == state_len);
1650 read_domains = INTEL_DOMAIN_RENDER;
1651 write_domain = INTEL_DOMAIN_RENDER;
1654 read_domains = INTEL_DOMAIN_SAMPLER;
1658 ilo_cp_steal(cp, "SURFACE_STATE", state_len, state_align, &state_offset);
1659 ilo_cp_write(cp, dw[0]);
1660 ilo_cp_write_bo(cp, dw[1], bo, read_domains, write_domain);
1661 ilo_cp_write(cp, dw[2]);
1662 ilo_cp_write(cp, dw[3]);
1663 ilo_cp_write(cp, dw[4]);
1664 ilo_cp_write(cp, dw[5]);
1665 ilo_cp_write(cp, dw[6]);
1666 ilo_cp_write(cp, dw[7]);
1669 return state_offset;
1673 gen7_emit_surf_SURFACE_STATE(const struct ilo_dev_info *dev,
1674 const struct pipe_surface *surface,
1677 struct intel_bo *bo;
1680 ILO_GPE_VALID_GEN(dev, 7, 7);
1682 if (surface && surface->texture) {
1683 struct ilo_texture *tex = ilo_texture(surface->texture);
1688 * classic i965 sets render_cache_rw for constant buffers and sol
1689 * surfaces but not render buffers. Why?
1691 gen7_fill_normal_SURFACE_STATE(dev, tex, surface->format,
1692 surface->u.tex.level, 1,
1693 surface->u.tex.first_layer,
1694 surface->u.tex.last_layer - surface->u.tex.first_layer + 1,
1695 true, true, dw, Elements(dw));
1699 gen7_fill_null_SURFACE_STATE(dev,
1700 surface->width, surface->height, 1, 0, dw, Elements(dw));
1703 return gen7_emit_SURFACE_STATE(dev, bo, true, dw, Elements(dw), cp);
1707 gen7_emit_view_SURFACE_STATE(const struct ilo_dev_info *dev,
1708 const struct pipe_sampler_view *view,
1711 struct intel_bo *bo;
1714 ILO_GPE_VALID_GEN(dev, 7, 7);
1716 if (view->texture->target == PIPE_BUFFER) {
1717 const unsigned elem_size = util_format_get_blocksize(view->format);
1718 const unsigned first_elem = view->u.buf.first_element;
1719 const unsigned num_elems = view->u.buf.last_element - first_elem + 1;
1720 struct ilo_buffer *buf = ilo_buffer(view->texture);
1722 gen7_fill_buffer_SURFACE_STATE(dev, buf,
1723 first_elem * elem_size, num_elems * elem_size,
1724 elem_size, view->format, false, false, dw, Elements(dw));
1729 struct ilo_texture *tex = ilo_texture(view->texture);
1731 gen7_fill_normal_SURFACE_STATE(dev, tex, view->format,
1732 view->u.tex.first_level,
1733 view->u.tex.last_level - view->u.tex.first_level + 1,
1734 view->u.tex.first_layer,
1735 view->u.tex.last_layer - view->u.tex.first_layer + 1,
1736 false, false, dw, Elements(dw));
1741 return gen7_emit_SURFACE_STATE(dev, bo, false, dw, Elements(dw), cp);
1745 gen7_emit_cbuf_SURFACE_STATE(const struct ilo_dev_info *dev,
1746 const struct pipe_constant_buffer *cbuf,
1749 const enum pipe_format elem_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
1750 struct ilo_buffer *buf = ilo_buffer(cbuf->buffer);
1753 ILO_GPE_VALID_GEN(dev, 7, 7);
1755 gen7_fill_buffer_SURFACE_STATE(dev, buf,
1756 cbuf->buffer_offset, cbuf->buffer_size,
1757 util_format_get_blocksize(elem_format), elem_format,
1758 false, false, dw, Elements(dw));
1760 return gen7_emit_SURFACE_STATE(dev, buf->bo, false, dw, Elements(dw), cp);
1764 gen7_emit_SAMPLER_BORDER_COLOR_STATE(const struct ilo_dev_info *dev,
1765 const union pipe_color_union *color,
1768 const int state_align = 32 / 4;
1769 const int state_len = 4;
1770 uint32_t state_offset, *dw;
1772 ILO_GPE_VALID_GEN(dev, 7, 7);
1774 dw = ilo_cp_steal_ptr(cp, "SAMPLER_BORDER_COLOR_STATE",
1775 state_len, state_align, &state_offset);
1776 memcpy(dw, color->f, 4 * 4);
1778 return state_offset;
1782 gen7_estimate_command_size(const struct ilo_dev_info *dev,
1783 enum ilo_gpe_gen7_command cmd,
1786 static const struct {
1789 } gen7_command_size_table[ILO_GPE_GEN7_COMMAND_COUNT] = {
1790 [ILO_GPE_GEN7_STATE_BASE_ADDRESS] = { 0, 10 },
1791 [ILO_GPE_GEN7_STATE_SIP] = { 0, 2 },
1792 [ILO_GPE_GEN7_3DSTATE_VF_STATISTICS] = { 0, 1 },
1793 [ILO_GPE_GEN7_PIPELINE_SELECT] = { 0, 1 },
1794 [ILO_GPE_GEN7_MEDIA_VFE_STATE] = { 0, 8 },
1795 [ILO_GPE_GEN7_MEDIA_CURBE_LOAD] = { 0, 4 },
1796 [ILO_GPE_GEN7_MEDIA_INTERFACE_DESCRIPTOR_LOAD] = { 0, 4 },
1797 [ILO_GPE_GEN7_MEDIA_STATE_FLUSH] = { 0, 2 },
1798 [ILO_GPE_GEN7_GPGPU_WALKER] = { 0, 11 },
1799 [ILO_GPE_GEN7_3DSTATE_CLEAR_PARAMS] = { 0, 3 },
1800 [ILO_GPE_GEN7_3DSTATE_DEPTH_BUFFER] = { 0, 7 },
1801 [ILO_GPE_GEN7_3DSTATE_STENCIL_BUFFER] = { 0, 3 },
1802 [ILO_GPE_GEN7_3DSTATE_HIER_DEPTH_BUFFER] = { 0, 3 },
1803 [ILO_GPE_GEN7_3DSTATE_VERTEX_BUFFERS] = { 1, 4 },
1804 [ILO_GPE_GEN7_3DSTATE_VERTEX_ELEMENTS] = { 1, 2 },
1805 [ILO_GPE_GEN7_3DSTATE_INDEX_BUFFER] = { 0, 3 },
1806 [ILO_GPE_GEN7_3DSTATE_CC_STATE_POINTERS] = { 0, 2 },
1807 [ILO_GPE_GEN7_3DSTATE_SCISSOR_STATE_POINTERS] = { 0, 2 },
1808 [ILO_GPE_GEN7_3DSTATE_VS] = { 0, 6 },
1809 [ILO_GPE_GEN7_3DSTATE_GS] = { 0, 7 },
1810 [ILO_GPE_GEN7_3DSTATE_CLIP] = { 0, 4 },
1811 [ILO_GPE_GEN7_3DSTATE_SF] = { 0, 7 },
1812 [ILO_GPE_GEN7_3DSTATE_WM] = { 0, 3 },
1813 [ILO_GPE_GEN7_3DSTATE_CONSTANT_VS] = { 0, 7 },
1814 [ILO_GPE_GEN7_3DSTATE_CONSTANT_GS] = { 0, 7 },
1815 [ILO_GPE_GEN7_3DSTATE_CONSTANT_PS] = { 0, 7 },
1816 [ILO_GPE_GEN7_3DSTATE_SAMPLE_MASK] = { 0, 2 },
1817 [ILO_GPE_GEN7_3DSTATE_CONSTANT_HS] = { 0, 7 },
1818 [ILO_GPE_GEN7_3DSTATE_CONSTANT_DS] = { 0, 7 },
1819 [ILO_GPE_GEN7_3DSTATE_HS] = { 0, 7 },
1820 [ILO_GPE_GEN7_3DSTATE_TE] = { 0, 4 },
1821 [ILO_GPE_GEN7_3DSTATE_DS] = { 0, 6 },
1822 [ILO_GPE_GEN7_3DSTATE_STREAMOUT] = { 0, 3 },
1823 [ILO_GPE_GEN7_3DSTATE_SBE] = { 0, 14 },
1824 [ILO_GPE_GEN7_3DSTATE_PS] = { 0, 8 },
1825 [ILO_GPE_GEN7_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP] = { 0, 2 },
1826 [ILO_GPE_GEN7_3DSTATE_VIEWPORT_STATE_POINTERS_CC] = { 0, 2 },
1827 [ILO_GPE_GEN7_3DSTATE_BLEND_STATE_POINTERS] = { 0, 2 },
1828 [ILO_GPE_GEN7_3DSTATE_DEPTH_STENCIL_STATE_POINTERS] = { 0, 2 },
1829 [ILO_GPE_GEN7_3DSTATE_BINDING_TABLE_POINTERS_VS] = { 0, 2 },
1830 [ILO_GPE_GEN7_3DSTATE_BINDING_TABLE_POINTERS_HS] = { 0, 2 },
1831 [ILO_GPE_GEN7_3DSTATE_BINDING_TABLE_POINTERS_DS] = { 0, 2 },
1832 [ILO_GPE_GEN7_3DSTATE_BINDING_TABLE_POINTERS_GS] = { 0, 2 },
1833 [ILO_GPE_GEN7_3DSTATE_BINDING_TABLE_POINTERS_PS] = { 0, 2 },
1834 [ILO_GPE_GEN7_3DSTATE_SAMPLER_STATE_POINTERS_VS] = { 0, 2 },
1835 [ILO_GPE_GEN7_3DSTATE_SAMPLER_STATE_POINTERS_HS] = { 0, 2 },
1836 [ILO_GPE_GEN7_3DSTATE_SAMPLER_STATE_POINTERS_DS] = { 0, 2 },
1837 [ILO_GPE_GEN7_3DSTATE_SAMPLER_STATE_POINTERS_GS] = { 0, 2 },
1838 [ILO_GPE_GEN7_3DSTATE_SAMPLER_STATE_POINTERS_PS] = { 0, 2 },
1839 [ILO_GPE_GEN7_3DSTATE_URB_VS] = { 0, 2 },
1840 [ILO_GPE_GEN7_3DSTATE_URB_HS] = { 0, 2 },
1841 [ILO_GPE_GEN7_3DSTATE_URB_DS] = { 0, 2 },
1842 [ILO_GPE_GEN7_3DSTATE_URB_GS] = { 0, 2 },
1843 [ILO_GPE_GEN7_3DSTATE_DRAWING_RECTANGLE] = { 0, 4 },
1844 [ILO_GPE_GEN7_3DSTATE_POLY_STIPPLE_OFFSET] = { 0, 2 },
1845 [ILO_GPE_GEN7_3DSTATE_POLY_STIPPLE_PATTERN] = { 0, 33, },
1846 [ILO_GPE_GEN7_3DSTATE_LINE_STIPPLE] = { 0, 3 },
1847 [ILO_GPE_GEN7_3DSTATE_AA_LINE_PARAMETERS] = { 0, 3 },
1848 [ILO_GPE_GEN7_3DSTATE_MULTISAMPLE] = { 0, 4 },
1849 [ILO_GPE_GEN7_3DSTATE_PUSH_CONSTANT_ALLOC_VS] = { 0, 2 },
1850 [ILO_GPE_GEN7_3DSTATE_PUSH_CONSTANT_ALLOC_HS] = { 0, 2 },
1851 [ILO_GPE_GEN7_3DSTATE_PUSH_CONSTANT_ALLOC_DS] = { 0, 2 },
1852 [ILO_GPE_GEN7_3DSTATE_PUSH_CONSTANT_ALLOC_GS] = { 0, 2 },
1853 [ILO_GPE_GEN7_3DSTATE_PUSH_CONSTANT_ALLOC_PS] = { 0, 2 },
1854 [ILO_GPE_GEN7_3DSTATE_SO_DECL_LIST] = { 3, 2 },
1855 [ILO_GPE_GEN7_3DSTATE_SO_BUFFER] = { 0, 4 },
1856 [ILO_GPE_GEN7_PIPE_CONTROL] = { 0, 5 },
1857 [ILO_GPE_GEN7_3DPRIMITIVE] = { 0, 7 },
1859 const int header = gen7_command_size_table[cmd].header;
1860 const int body = gen7_command_size_table[cmd].body;
1861 const int count = arg;
1863 ILO_GPE_VALID_GEN(dev, 7, 7);
1864 assert(cmd < ILO_GPE_GEN7_COMMAND_COUNT);
1866 return (likely(count)) ? header + body * count : 0;
1870 gen7_estimate_state_size(const struct ilo_dev_info *dev,
1871 enum ilo_gpe_gen7_state state,
1874 static const struct {
1878 } gen7_state_size_table[ILO_GPE_GEN7_STATE_COUNT] = {
1879 [ILO_GPE_GEN7_INTERFACE_DESCRIPTOR_DATA] = { 8, 8, true },
1880 [ILO_GPE_GEN7_SF_CLIP_VIEWPORT] = { 16, 16, true },
1881 [ILO_GPE_GEN7_CC_VIEWPORT] = { 8, 2, true },
1882 [ILO_GPE_GEN7_COLOR_CALC_STATE] = { 16, 6, false },
1883 [ILO_GPE_GEN7_BLEND_STATE] = { 16, 2, true },
1884 [ILO_GPE_GEN7_DEPTH_STENCIL_STATE] = { 16, 3, false },
1885 [ILO_GPE_GEN7_SCISSOR_RECT] = { 8, 2, true },
1886 [ILO_GPE_GEN7_BINDING_TABLE_STATE] = { 8, 1, true },
1887 [ILO_GPE_GEN7_SURFACE_STATE] = { 8, 8, false },
1888 [ILO_GPE_GEN7_SAMPLER_STATE] = { 8, 4, true },
1889 [ILO_GPE_GEN7_SAMPLER_BORDER_COLOR_STATE] = { 8, 4, false },
1890 [ILO_GPE_GEN7_PUSH_CONSTANT_BUFFER] = { 8, 1, true },
1892 const int alignment = gen7_state_size_table[state].alignment;
1893 const int body = gen7_state_size_table[state].body;
1894 const bool is_array = gen7_state_size_table[state].is_array;
1895 const int count = arg;
1898 ILO_GPE_VALID_GEN(dev, 7, 7);
1899 assert(state < ILO_GPE_GEN7_STATE_COUNT);
1901 if (likely(count)) {
1903 estimate = (alignment - 1) + body * count;
1906 estimate = (alignment - 1) + body;
1907 /* all states are aligned */
1909 estimate += util_align_npot(body, alignment) * (count - 1);
1920 gen7_init(struct ilo_gpe_gen7 *gen7)
1922 const struct ilo_gpe_gen6 *gen6 = ilo_gpe_gen6_get();
1924 gen7->estimate_command_size = gen7_estimate_command_size;
1925 gen7->estimate_state_size = gen7_estimate_state_size;
1927 #define GEN7_USE(gen7, name, from) gen7->emit_ ## name = from->emit_ ## name
1928 #define GEN7_SET(gen7, name) gen7->emit_ ## name = gen7_emit_ ## name
1929 GEN7_USE(gen7, STATE_BASE_ADDRESS, gen6);
1930 GEN7_USE(gen7, STATE_SIP, gen6);
1931 GEN7_USE(gen7, 3DSTATE_VF_STATISTICS, gen6);
1932 GEN7_USE(gen7, PIPELINE_SELECT, gen6);
1933 GEN7_USE(gen7, MEDIA_VFE_STATE, gen6);
1934 GEN7_USE(gen7, MEDIA_CURBE_LOAD, gen6);
1935 GEN7_USE(gen7, MEDIA_INTERFACE_DESCRIPTOR_LOAD, gen6);
1936 GEN7_USE(gen7, MEDIA_STATE_FLUSH, gen6);
1937 GEN7_SET(gen7, GPGPU_WALKER);
1938 GEN7_SET(gen7, 3DSTATE_CLEAR_PARAMS);
1939 GEN7_SET(gen7, 3DSTATE_DEPTH_BUFFER);
1940 GEN7_USE(gen7, 3DSTATE_STENCIL_BUFFER, gen6);
1941 GEN7_USE(gen7, 3DSTATE_HIER_DEPTH_BUFFER, gen6);
1942 GEN7_USE(gen7, 3DSTATE_VERTEX_BUFFERS, gen6);
1943 GEN7_USE(gen7, 3DSTATE_VERTEX_ELEMENTS, gen6);
1944 GEN7_USE(gen7, 3DSTATE_INDEX_BUFFER, gen6);
1945 GEN7_SET(gen7, 3DSTATE_CC_STATE_POINTERS);
1946 GEN7_USE(gen7, 3DSTATE_SCISSOR_STATE_POINTERS, gen6);
1947 GEN7_USE(gen7, 3DSTATE_VS, gen6);
1948 GEN7_SET(gen7, 3DSTATE_GS);
1949 GEN7_USE(gen7, 3DSTATE_CLIP, gen6);
1950 GEN7_SET(gen7, 3DSTATE_SF);
1951 GEN7_SET(gen7, 3DSTATE_WM);
1952 GEN7_SET(gen7, 3DSTATE_CONSTANT_VS);
1953 GEN7_SET(gen7, 3DSTATE_CONSTANT_GS);
1954 GEN7_SET(gen7, 3DSTATE_CONSTANT_PS);
1955 GEN7_SET(gen7, 3DSTATE_SAMPLE_MASK);
1956 GEN7_SET(gen7, 3DSTATE_CONSTANT_HS);
1957 GEN7_SET(gen7, 3DSTATE_CONSTANT_DS);
1958 GEN7_SET(gen7, 3DSTATE_HS);
1959 GEN7_SET(gen7, 3DSTATE_TE);
1960 GEN7_SET(gen7, 3DSTATE_DS);
1961 GEN7_SET(gen7, 3DSTATE_STREAMOUT);
1962 GEN7_SET(gen7, 3DSTATE_SBE);
1963 GEN7_SET(gen7, 3DSTATE_PS);
1964 GEN7_SET(gen7, 3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP);
1965 GEN7_SET(gen7, 3DSTATE_VIEWPORT_STATE_POINTERS_CC);
1966 GEN7_SET(gen7, 3DSTATE_BLEND_STATE_POINTERS);
1967 GEN7_SET(gen7, 3DSTATE_DEPTH_STENCIL_STATE_POINTERS);
1968 GEN7_SET(gen7, 3DSTATE_BINDING_TABLE_POINTERS_VS);
1969 GEN7_SET(gen7, 3DSTATE_BINDING_TABLE_POINTERS_HS);
1970 GEN7_SET(gen7, 3DSTATE_BINDING_TABLE_POINTERS_DS);
1971 GEN7_SET(gen7, 3DSTATE_BINDING_TABLE_POINTERS_GS);
1972 GEN7_SET(gen7, 3DSTATE_BINDING_TABLE_POINTERS_PS);
1973 GEN7_SET(gen7, 3DSTATE_SAMPLER_STATE_POINTERS_VS);
1974 GEN7_SET(gen7, 3DSTATE_SAMPLER_STATE_POINTERS_HS);
1975 GEN7_SET(gen7, 3DSTATE_SAMPLER_STATE_POINTERS_DS);
1976 GEN7_SET(gen7, 3DSTATE_SAMPLER_STATE_POINTERS_GS);
1977 GEN7_SET(gen7, 3DSTATE_SAMPLER_STATE_POINTERS_PS);
1978 GEN7_SET(gen7, 3DSTATE_URB_VS);
1979 GEN7_SET(gen7, 3DSTATE_URB_HS);
1980 GEN7_SET(gen7, 3DSTATE_URB_DS);
1981 GEN7_SET(gen7, 3DSTATE_URB_GS);
1982 GEN7_USE(gen7, 3DSTATE_DRAWING_RECTANGLE, gen6);
1983 GEN7_USE(gen7, 3DSTATE_POLY_STIPPLE_OFFSET, gen6);
1984 GEN7_USE(gen7, 3DSTATE_POLY_STIPPLE_PATTERN, gen6);
1985 GEN7_USE(gen7, 3DSTATE_LINE_STIPPLE, gen6);
1986 GEN7_USE(gen7, 3DSTATE_AA_LINE_PARAMETERS, gen6);
1987 GEN7_USE(gen7, 3DSTATE_MULTISAMPLE, gen6);
1988 GEN7_SET(gen7, 3DSTATE_PUSH_CONSTANT_ALLOC_VS);
1989 GEN7_SET(gen7, 3DSTATE_PUSH_CONSTANT_ALLOC_HS);
1990 GEN7_SET(gen7, 3DSTATE_PUSH_CONSTANT_ALLOC_DS);
1991 GEN7_SET(gen7, 3DSTATE_PUSH_CONSTANT_ALLOC_GS);
1992 GEN7_SET(gen7, 3DSTATE_PUSH_CONSTANT_ALLOC_PS);
1993 GEN7_SET(gen7, 3DSTATE_SO_DECL_LIST);
1994 GEN7_SET(gen7, 3DSTATE_SO_BUFFER);
1995 GEN7_USE(gen7, PIPE_CONTROL, gen6);
1996 GEN7_SET(gen7, 3DPRIMITIVE);
1997 GEN7_USE(gen7, INTERFACE_DESCRIPTOR_DATA, gen6);
1998 GEN7_SET(gen7, SF_CLIP_VIEWPORT);
1999 GEN7_USE(gen7, CC_VIEWPORT, gen6);
2000 GEN7_USE(gen7, COLOR_CALC_STATE, gen6);
2001 GEN7_USE(gen7, BLEND_STATE, gen6);
2002 GEN7_USE(gen7, DEPTH_STENCIL_STATE, gen6);
2003 GEN7_USE(gen7, SCISSOR_RECT, gen6);
2004 GEN7_USE(gen7, BINDING_TABLE_STATE, gen6);
2005 GEN7_SET(gen7, surf_SURFACE_STATE);
2006 GEN7_SET(gen7, view_SURFACE_STATE);
2007 GEN7_SET(gen7, cbuf_SURFACE_STATE);
2008 GEN7_USE(gen7, SAMPLER_STATE, gen6);
2009 GEN7_SET(gen7, SAMPLER_BORDER_COLOR_STATE);
2010 GEN7_USE(gen7, push_constant_buffer, gen6);
2015 static struct ilo_gpe_gen7 gen7_gpe;
2017 const struct ilo_gpe_gen7 *
2018 ilo_gpe_gen7_get(void)
2020 if (!gen7_gpe.estimate_command_size)
2021 gen7_init(&gen7_gpe);