brw_structs.h revision e910241e9754b6e673ed0fc3133c8b1de56e76c7
1/*
2 Copyright (C) Intel Corp.  2006.  All Rights Reserved.
3 Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
4 develop this 3D driver.
5
6 Permission is hereby granted, free of charge, to any person obtaining
7 a copy of this software and associated documentation files (the
8 "Software"), to deal in the Software without restriction, including
9 without limitation the rights to use, copy, modify, merge, publish,
10 distribute, sublicense, and/or sell copies of the Software, and to
11 permit persons to whom the Software is furnished to do so, subject to
12 the following conditions:
13
14 The above copyright notice and this permission notice (including the
15 next paragraph) shall be included in all copies or substantial
16 portions of the Software.
17
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
26 **********************************************************************/
27 /*
28  * Authors:
29  *   Keith Whitwell <keith@tungstengraphics.com>
30  */
31
32
33#ifndef BRW_STRUCTS_H
34#define BRW_STRUCTS_H
35
36
37/** Number of general purpose registers (VS, WM, etc) */
38#define BRW_MAX_GRF 128
39
40/**
41 * First GRF used for the MRF hack.
42 *
43 * On gen7, MRFs are no longer used, and contiguous GRFs are used instead.  We
44 * haven't converted our compiler to be aware of this, so it asks for MRFs and
45 * brw_eu_emit.c quietly converts them to be accesses of the top GRFs.  The
46 * register allocators have to be careful of this to avoid corrupting the "MRF"s
47 * with actual GRF allocations.
48 */
49#define GEN7_MRF_HACK_START 112.
50
51/** Number of message register file registers */
52#define BRW_MAX_MRF 16
53
54/* These seem to be passed around as function args, so it works out
55 * better to keep them as #defines:
56 */
57#define BRW_FLUSH_READ_CACHE           0x1
58#define BRW_FLUSH_STATE_CACHE          0x2
59#define BRW_INHIBIT_FLUSH_RENDER_CACHE 0x4
60#define BRW_FLUSH_SNAPSHOT_COUNTERS    0x8
61
62struct brw_urb_fence
63{
64   struct
65   {
66      GLuint length:8;
67      GLuint vs_realloc:1;
68      GLuint gs_realloc:1;
69      GLuint clp_realloc:1;
70      GLuint sf_realloc:1;
71      GLuint vfe_realloc:1;
72      GLuint cs_realloc:1;
73      GLuint pad:2;
74      GLuint opcode:16;
75   } header;
76
77   struct
78   {
79      GLuint vs_fence:10;
80      GLuint gs_fence:10;
81      GLuint clp_fence:10;
82      GLuint pad:2;
83   } bits0;
84
85   struct
86   {
87      GLuint sf_fence:10;
88      GLuint vf_fence:10;
89      GLuint cs_fence:11;
90      GLuint pad:1;
91   } bits1;
92};
93
94/* State structs for the various fixed function units:
95 */
96
97
98struct thread0
99{
100   GLuint pad0:1;
101   GLuint grf_reg_count:3;
102   GLuint pad1:2;
103   GLuint kernel_start_pointer:26; /* Offset from GENERAL_STATE_BASE */
104};
105
106struct thread1
107{
108   GLuint ext_halt_exception_enable:1;
109   GLuint sw_exception_enable:1;
110   GLuint mask_stack_exception_enable:1;
111   GLuint timeout_exception_enable:1;
112   GLuint illegal_op_exception_enable:1;
113   GLuint pad0:3;
114   GLuint depth_coef_urb_read_offset:6;	/* WM only */
115   GLuint pad1:2;
116   GLuint floating_point_mode:1;
117   GLuint thread_priority:1;
118   GLuint binding_table_entry_count:8;
119   GLuint pad3:5;
120   GLuint single_program_flow:1;
121};
122
123struct thread2
124{
125   GLuint per_thread_scratch_space:4;
126   GLuint pad0:6;
127   GLuint scratch_space_base_pointer:22;
128};
129
130
131struct thread3
132{
133   GLuint dispatch_grf_start_reg:4;
134   GLuint urb_entry_read_offset:6;
135   GLuint pad0:1;
136   GLuint urb_entry_read_length:6;
137   GLuint pad1:1;
138   GLuint const_urb_entry_read_offset:6;
139   GLuint pad2:1;
140   GLuint const_urb_entry_read_length:6;
141   GLuint pad3:1;
142};
143
144
145
146struct brw_clip_unit_state
147{
148   struct thread0 thread0;
149   struct
150   {
151      GLuint pad0:7;
152      GLuint sw_exception_enable:1;
153      GLuint pad1:3;
154      GLuint mask_stack_exception_enable:1;
155      GLuint pad2:1;
156      GLuint illegal_op_exception_enable:1;
157      GLuint pad3:2;
158      GLuint floating_point_mode:1;
159      GLuint thread_priority:1;
160      GLuint binding_table_entry_count:8;
161      GLuint pad4:5;
162      GLuint single_program_flow:1;
163   } thread1;
164
165   struct thread2 thread2;
166   struct thread3 thread3;
167
168   struct
169   {
170      GLuint pad0:9;
171      GLuint gs_output_stats:1; /* not always */
172      GLuint stats_enable:1;
173      GLuint nr_urb_entries:7;
174      GLuint pad1:1;
175      GLuint urb_entry_allocation_size:5;
176      GLuint pad2:1;
177      GLuint max_threads:5; 	/* may be less */
178      GLuint pad3:2;
179   } thread4;
180
181   struct
182   {
183      GLuint pad0:13;
184      GLuint clip_mode:3;
185      GLuint userclip_enable_flags:8;
186      GLuint userclip_must_clip:1;
187      GLuint negative_w_clip_test:1;
188      GLuint guard_band_enable:1;
189      GLuint viewport_z_clip_enable:1;
190      GLuint viewport_xy_clip_enable:1;
191      GLuint vertex_position_space:1;
192      GLuint api_mode:1;
193      GLuint pad2:1;
194   } clip5;
195
196   struct
197   {
198      GLuint pad0:5;
199      GLuint clipper_viewport_state_ptr:27;
200   } clip6;
201
202
203   GLfloat viewport_xmin;
204   GLfloat viewport_xmax;
205   GLfloat viewport_ymin;
206   GLfloat viewport_ymax;
207};
208
209struct gen6_blend_state
210{
211   struct {
212      GLuint dest_blend_factor:5;
213      GLuint source_blend_factor:5;
214      GLuint pad3:1;
215      GLuint blend_func:3;
216      GLuint pad2:1;
217      GLuint ia_dest_blend_factor:5;
218      GLuint ia_source_blend_factor:5;
219      GLuint pad1:1;
220      GLuint ia_blend_func:3;
221      GLuint pad0:1;
222      GLuint ia_blend_enable:1;
223      GLuint blend_enable:1;
224   } blend0;
225
226   struct {
227      GLuint post_blend_clamp_enable:1;
228      GLuint pre_blend_clamp_enable:1;
229      GLuint clamp_range:2;
230      GLuint pad0:4;
231      GLuint x_dither_offset:2;
232      GLuint y_dither_offset:2;
233      GLuint dither_enable:1;
234      GLuint alpha_test_func:3;
235      GLuint alpha_test_enable:1;
236      GLuint pad1:1;
237      GLuint logic_op_func:4;
238      GLuint logic_op_enable:1;
239      GLuint pad2:1;
240      GLuint write_disable_b:1;
241      GLuint write_disable_g:1;
242      GLuint write_disable_r:1;
243      GLuint write_disable_a:1;
244      GLuint pad3:1;
245      GLuint alpha_to_coverage_dither:1;
246      GLuint alpha_to_one:1;
247      GLuint alpha_to_coverage:1;
248   } blend1;
249};
250
251struct gen6_color_calc_state
252{
253   struct {
254      GLuint alpha_test_format:1;
255      GLuint pad0:14;
256      GLuint round_disable:1;
257      GLuint bf_stencil_ref:8;
258      GLuint stencil_ref:8;
259   } cc0;
260
261   union {
262      GLfloat alpha_ref_f;
263      struct {
264	 GLuint ui:8;
265	 GLuint pad0:24;
266      } alpha_ref_fi;
267   } cc1;
268
269   GLfloat constant_r;
270   GLfloat constant_g;
271   GLfloat constant_b;
272   GLfloat constant_a;
273};
274
275struct gen6_depth_stencil_state
276{
277   struct {
278      GLuint pad0:3;
279      GLuint bf_stencil_pass_depth_pass_op:3;
280      GLuint bf_stencil_pass_depth_fail_op:3;
281      GLuint bf_stencil_fail_op:3;
282      GLuint bf_stencil_func:3;
283      GLuint bf_stencil_enable:1;
284      GLuint pad1:2;
285      GLuint stencil_write_enable:1;
286      GLuint stencil_pass_depth_pass_op:3;
287      GLuint stencil_pass_depth_fail_op:3;
288      GLuint stencil_fail_op:3;
289      GLuint stencil_func:3;
290      GLuint stencil_enable:1;
291   } ds0;
292
293   struct {
294      GLuint bf_stencil_write_mask:8;
295      GLuint bf_stencil_test_mask:8;
296      GLuint stencil_write_mask:8;
297      GLuint stencil_test_mask:8;
298   } ds1;
299
300   struct {
301      GLuint pad0:26;
302      GLuint depth_write_enable:1;
303      GLuint depth_test_func:3;
304      GLuint pad1:1;
305      GLuint depth_test_enable:1;
306   } ds2;
307};
308
309struct brw_cc_unit_state
310{
311   struct
312   {
313      GLuint pad0:3;
314      GLuint bf_stencil_pass_depth_pass_op:3;
315      GLuint bf_stencil_pass_depth_fail_op:3;
316      GLuint bf_stencil_fail_op:3;
317      GLuint bf_stencil_func:3;
318      GLuint bf_stencil_enable:1;
319      GLuint pad1:2;
320      GLuint stencil_write_enable:1;
321      GLuint stencil_pass_depth_pass_op:3;
322      GLuint stencil_pass_depth_fail_op:3;
323      GLuint stencil_fail_op:3;
324      GLuint stencil_func:3;
325      GLuint stencil_enable:1;
326   } cc0;
327
328
329   struct
330   {
331      GLuint bf_stencil_ref:8;
332      GLuint stencil_write_mask:8;
333      GLuint stencil_test_mask:8;
334      GLuint stencil_ref:8;
335   } cc1;
336
337
338   struct
339   {
340      GLuint logicop_enable:1;
341      GLuint pad0:10;
342      GLuint depth_write_enable:1;
343      GLuint depth_test_function:3;
344      GLuint depth_test:1;
345      GLuint bf_stencil_write_mask:8;
346      GLuint bf_stencil_test_mask:8;
347   } cc2;
348
349
350   struct
351   {
352      GLuint pad0:8;
353      GLuint alpha_test_func:3;
354      GLuint alpha_test:1;
355      GLuint blend_enable:1;
356      GLuint ia_blend_enable:1;
357      GLuint pad1:1;
358      GLuint alpha_test_format:1;
359      GLuint pad2:16;
360   } cc3;
361
362   struct
363   {
364      GLuint pad0:5;
365      GLuint cc_viewport_state_offset:27; /* Offset from GENERAL_STATE_BASE */
366   } cc4;
367
368   struct
369   {
370      GLuint pad0:2;
371      GLuint ia_dest_blend_factor:5;
372      GLuint ia_src_blend_factor:5;
373      GLuint ia_blend_function:3;
374      GLuint statistics_enable:1;
375      GLuint logicop_func:4;
376      GLuint pad1:11;
377      GLuint dither_enable:1;
378   } cc5;
379
380   struct
381   {
382      GLuint clamp_post_alpha_blend:1;
383      GLuint clamp_pre_alpha_blend:1;
384      GLuint clamp_range:2;
385      GLuint pad0:11;
386      GLuint y_dither_offset:2;
387      GLuint x_dither_offset:2;
388      GLuint dest_blend_factor:5;
389      GLuint src_blend_factor:5;
390      GLuint blend_function:3;
391   } cc6;
392
393   struct {
394      union {
395	 GLfloat f;
396	 GLubyte ub[4];
397      } alpha_ref;
398   } cc7;
399};
400
401struct brw_sf_unit_state
402{
403   struct thread0 thread0;
404   struct thread1 thread1;
405   struct thread2 thread2;
406   struct thread3 thread3;
407
408   struct
409   {
410      GLuint pad0:10;
411      GLuint stats_enable:1;
412      GLuint nr_urb_entries:7;
413      GLuint pad1:1;
414      GLuint urb_entry_allocation_size:5;
415      GLuint pad2:1;
416      GLuint max_threads:6;
417      GLuint pad3:1;
418   } thread4;
419
420   struct
421   {
422      GLuint front_winding:1;
423      GLuint viewport_transform:1;
424      GLuint pad0:3;
425      GLuint sf_viewport_state_offset:27; /* Offset from GENERAL_STATE_BASE */
426   } sf5;
427
428   struct
429   {
430      GLuint pad0:9;
431      GLuint dest_org_vbias:4;
432      GLuint dest_org_hbias:4;
433      GLuint scissor:1;
434      GLuint disable_2x2_trifilter:1;
435      GLuint disable_zero_pix_trifilter:1;
436      GLuint point_rast_rule:2;
437      GLuint line_endcap_aa_region_width:2;
438      GLuint line_width:4;
439      GLuint fast_scissor_disable:1;
440      GLuint cull_mode:2;
441      GLuint aa_enable:1;
442   } sf6;
443
444   struct
445   {
446      GLuint point_size:11;
447      GLuint use_point_size_state:1;
448      GLuint subpixel_precision:1;
449      GLuint sprite_point:1;
450      GLuint pad0:10;
451      GLuint aa_line_distance_mode:1;
452      GLuint trifan_pv:2;
453      GLuint linestrip_pv:2;
454      GLuint tristrip_pv:2;
455      GLuint line_last_pixel_enable:1;
456   } sf7;
457
458};
459
460struct gen6_scissor_rect
461{
462   GLuint xmin:16;
463   GLuint ymin:16;
464   GLuint xmax:16;
465   GLuint ymax:16;
466};
467
468struct brw_gs_unit_state
469{
470   struct thread0 thread0;
471   struct thread1 thread1;
472   struct thread2 thread2;
473   struct thread3 thread3;
474
475   struct
476   {
477      GLuint pad0:8;
478      GLuint rendering_enable:1; /* for Ironlake */
479      GLuint pad4:1;
480      GLuint stats_enable:1;
481      GLuint nr_urb_entries:7;
482      GLuint pad1:1;
483      GLuint urb_entry_allocation_size:5;
484      GLuint pad2:1;
485      GLuint max_threads:5;
486      GLuint pad3:2;
487   } thread4;
488
489   struct
490   {
491      GLuint sampler_count:3;
492      GLuint pad0:2;
493      GLuint sampler_state_pointer:27;
494   } gs5;
495
496
497   struct
498   {
499      GLuint max_vp_index:4;
500      GLuint pad0:12;
501      GLuint svbi_post_inc_value:10;
502      GLuint pad1:1;
503      GLuint svbi_post_inc_enable:1;
504      GLuint svbi_payload:1;
505      GLuint discard_adjaceny:1;
506      GLuint reorder_enable:1;
507      GLuint pad2:1;
508   } gs6;
509};
510
511
512struct brw_vs_unit_state
513{
514   struct thread0 thread0;
515   struct thread1 thread1;
516   struct thread2 thread2;
517   struct thread3 thread3;
518
519   struct
520   {
521      GLuint pad0:10;
522      GLuint stats_enable:1;
523      GLuint nr_urb_entries:7;
524      GLuint pad1:1;
525      GLuint urb_entry_allocation_size:5;
526      GLuint pad2:1;
527      GLuint max_threads:6;
528      GLuint pad3:1;
529   } thread4;
530
531   struct
532   {
533      GLuint sampler_count:3;
534      GLuint pad0:2;
535      GLuint sampler_state_pointer:27;
536   } vs5;
537
538   struct
539   {
540      GLuint vs_enable:1;
541      GLuint vert_cache_disable:1;
542      GLuint pad0:30;
543   } vs6;
544};
545
546
547struct brw_wm_unit_state
548{
549   struct thread0 thread0;
550   struct thread1 thread1;
551   struct thread2 thread2;
552   struct thread3 thread3;
553
554   struct {
555      GLuint stats_enable:1;
556      GLuint depth_buffer_clear:1;
557      GLuint sampler_count:3;
558      GLuint sampler_state_pointer:27;
559   } wm4;
560
561   struct
562   {
563      GLuint enable_8_pix:1;
564      GLuint enable_16_pix:1;
565      GLuint enable_32_pix:1;
566      GLuint enable_con_32_pix:1;
567      GLuint enable_con_64_pix:1;
568      GLuint pad0:1;
569
570      /* These next four bits are for Ironlake+ */
571      GLuint fast_span_coverage_enable:1;
572      GLuint depth_buffer_clear:1;
573      GLuint depth_buffer_resolve_enable:1;
574      GLuint hierarchical_depth_buffer_resolve_enable:1;
575
576      GLuint legacy_global_depth_bias:1;
577      GLuint line_stipple:1;
578      GLuint depth_offset:1;
579      GLuint polygon_stipple:1;
580      GLuint line_aa_region_width:2;
581      GLuint line_endcap_aa_region_width:2;
582      GLuint early_depth_test:1;
583      GLuint thread_dispatch_enable:1;
584      GLuint program_uses_depth:1;
585      GLuint program_computes_depth:1;
586      GLuint program_uses_killpixel:1;
587      GLuint legacy_line_rast: 1;
588      GLuint transposed_urb_read_enable:1;
589      GLuint max_threads:7;
590   } wm5;
591
592   GLfloat global_depth_offset_constant;
593   GLfloat global_depth_offset_scale;
594
595   /* for Ironlake only */
596   struct {
597      GLuint pad0:1;
598      GLuint grf_reg_count_1:3;
599      GLuint pad1:2;
600      GLuint kernel_start_pointer_1:26;
601   } wm8;
602
603   struct {
604      GLuint pad0:1;
605      GLuint grf_reg_count_2:3;
606      GLuint pad1:2;
607      GLuint kernel_start_pointer_2:26;
608   } wm9;
609
610   struct {
611      GLuint pad0:1;
612      GLuint grf_reg_count_3:3;
613      GLuint pad1:2;
614      GLuint kernel_start_pointer_3:26;
615   } wm10;
616};
617
618struct brw_sampler_default_color {
619   GLfloat color[4];
620};
621
622struct gen5_sampler_default_color {
623   uint8_t ub[4];
624   float f[4];
625   uint16_t hf[4];
626   uint16_t us[4];
627   int16_t s[4];
628   uint8_t b[4];
629};
630
631struct brw_sampler_state
632{
633
634   struct
635   {
636      GLuint shadow_function:3;
637      GLuint lod_bias:11;
638      GLuint min_filter:3;
639      GLuint mag_filter:3;
640      GLuint mip_filter:2;
641      GLuint base_level:5;
642      GLuint min_mag_neq:1;
643      GLuint lod_preclamp:1;
644      GLuint default_color_mode:1;
645      GLuint pad0:1;
646      GLuint disable:1;
647   } ss0;
648
649   struct
650   {
651      GLuint r_wrap_mode:3;
652      GLuint t_wrap_mode:3;
653      GLuint s_wrap_mode:3;
654      GLuint cube_control_mode:1;
655      GLuint pad:2;
656      GLuint max_lod:10;
657      GLuint min_lod:10;
658   } ss1;
659
660
661   struct
662   {
663      GLuint pad:5;
664      GLuint default_color_pointer:27;
665   } ss2;
666
667   struct
668   {
669      GLuint non_normalized_coord:1;
670      GLuint pad:12;
671      GLuint address_round:6;
672      GLuint max_aniso:3;
673      GLuint chroma_key_mode:1;
674      GLuint chroma_key_index:2;
675      GLuint chroma_key_enable:1;
676      GLuint monochrome_filter_width:3;
677      GLuint monochrome_filter_height:3;
678   } ss3;
679};
680
681struct gen7_sampler_state
682{
683   struct
684   {
685      GLuint aniso_algorithm:1;
686      GLuint lod_bias:13;
687      GLuint min_filter:3;
688      GLuint mag_filter:3;
689      GLuint mip_filter:2;
690      GLuint base_level:5;
691      GLuint pad1:1;
692      GLuint lod_preclamp:1;
693      GLuint default_color_mode:1;
694      GLuint pad0:1;
695      GLuint disable:1;
696   } ss0;
697
698   struct
699   {
700      GLuint cube_control_mode:1;
701      GLuint shadow_function:3;
702      GLuint pad:4;
703      GLuint max_lod:12;
704      GLuint min_lod:12;
705   } ss1;
706
707   struct
708   {
709      GLuint pad:5;
710      GLuint default_color_pointer:27;
711   } ss2;
712
713   struct
714   {
715      GLuint r_wrap_mode:3;
716      GLuint t_wrap_mode:3;
717      GLuint s_wrap_mode:3;
718      GLuint pad:1;
719      GLuint non_normalized_coord:1;
720      GLuint trilinear_quality:2;
721      GLuint address_round:6;
722      GLuint max_aniso:3;
723      GLuint chroma_key_mode:1;
724      GLuint chroma_key_index:2;
725      GLuint chroma_key_enable:1;
726      GLuint pad0:6;
727   } ss3;
728};
729
730struct brw_clipper_viewport
731{
732   GLfloat xmin;
733   GLfloat xmax;
734   GLfloat ymin;
735   GLfloat ymax;
736};
737
738struct brw_cc_viewport
739{
740   GLfloat min_depth;
741   GLfloat max_depth;
742};
743
744struct brw_sf_viewport
745{
746   struct {
747      GLfloat m00;
748      GLfloat m11;
749      GLfloat m22;
750      GLfloat m30;
751      GLfloat m31;
752      GLfloat m32;
753   } viewport;
754
755   /* scissor coordinates are inclusive */
756   struct {
757      GLshort xmin;
758      GLshort ymin;
759      GLshort xmax;
760      GLshort ymax;
761   } scissor;
762};
763
764struct gen6_sf_viewport {
765   GLfloat m00;
766   GLfloat m11;
767   GLfloat m22;
768   GLfloat m30;
769   GLfloat m31;
770   GLfloat m32;
771};
772
773struct gen7_sf_clip_viewport {
774   struct {
775      GLfloat m00;
776      GLfloat m11;
777      GLfloat m22;
778      GLfloat m30;
779      GLfloat m31;
780      GLfloat m32;
781   } viewport;
782
783   GLuint pad0[2];
784
785   struct {
786      GLfloat xmin;
787      GLfloat xmax;
788      GLfloat ymin;
789      GLfloat ymax;
790   } guardband;
791
792   GLfloat pad1[4];
793};
794
795/* volume 5c Shared Functions - 1.13.4.1.2 */
796struct gen7_surface_state
797{
798   struct {
799      GLuint cube_pos_z:1;
800      GLuint cube_neg_z:1;
801      GLuint cube_pos_y:1;
802      GLuint cube_neg_y:1;
803      GLuint cube_pos_x:1;
804      GLuint cube_neg_x:1;
805      GLuint pad2:2;
806      GLuint render_cache_read_write:1;
807      GLuint pad1:1;
808      GLuint surface_array_spacing:1;
809      GLuint vert_line_stride_ofs:1;
810      GLuint vert_line_stride:1;
811      GLuint tile_walk:1;
812      GLuint tiled_surface:1;
813      GLuint horizontal_alignment:1;
814      GLuint vertical_alignment:2;
815      GLuint surface_format:9;     /**< BRW_SURFACEFORMAT_x */
816      GLuint pad0:1;
817      GLuint is_array:1;
818      GLuint surface_type:3;       /**< BRW_SURFACE_1D/2D/3D/CUBE */
819   } ss0;
820
821   struct {
822      GLuint base_addr;
823   } ss1;
824
825   struct {
826      GLuint width:14;
827      GLuint pad1:2;
828      GLuint height:14;
829      GLuint pad0:2;
830   } ss2;
831
832   struct {
833      GLuint pitch:18;
834      GLuint pad:3;
835      GLuint depth:11;
836   } ss3;
837
838   struct {
839      GLuint multisample_position_palette_index:3;
840      GLuint num_multisamples:3;
841      GLuint multisampled_surface_storage_format:1;
842      GLuint render_target_view_extent:11;
843      GLuint min_array_elt:11;
844      GLuint rotation:2;
845      GLuint pad0:1;
846   } ss4;
847
848   struct {
849      GLuint mip_count:4;
850      GLuint min_lod:4;
851      GLuint pad1:12;
852      GLuint y_offset:4;
853      GLuint pad0:1;
854      GLuint x_offset:7;
855   } ss5;
856
857   struct {
858      GLuint pad; /* Multisample Control Surface stuff */
859   } ss6;
860
861   struct {
862      GLuint resource_min_lod:12;
863      GLuint pad0:16;
864      GLuint alpha_clear_color:1;
865      GLuint blue_clear_color:1;
866      GLuint green_clear_color:1;
867      GLuint red_clear_color:1;
868   } ss7;
869};
870
871
872struct brw_vertex_element_state
873{
874   struct
875   {
876      GLuint src_offset:11;
877      GLuint pad:5;
878      GLuint src_format:9;
879      GLuint pad0:1;
880      GLuint valid:1;
881      GLuint vertex_buffer_index:5;
882   } ve0;
883
884   struct
885   {
886      GLuint dst_offset:8;
887      GLuint pad:8;
888      GLuint vfcomponent3:4;
889      GLuint vfcomponent2:4;
890      GLuint vfcomponent1:4;
891      GLuint vfcomponent0:4;
892   } ve1;
893};
894
895struct brw_urb_immediate {
896   GLuint opcode:4;
897   GLuint offset:6;
898   GLuint swizzle_control:2;
899   GLuint pad:1;
900   GLuint allocate:1;
901   GLuint used:1;
902   GLuint complete:1;
903   GLuint response_length:4;
904   GLuint msg_length:4;
905   GLuint msg_target:4;
906   GLuint pad1:3;
907   GLuint end_of_thread:1;
908};
909
910/* Instruction format for the execution units:
911 */
912
913struct brw_instruction
914{
915   struct
916   {
917      GLuint opcode:7;
918      GLuint pad:1;
919      GLuint access_mode:1;
920      GLuint mask_control:1;
921      GLuint dependency_control:2;
922      GLuint compression_control:2; /* gen6: quater control */
923      GLuint thread_control:2;
924      GLuint predicate_control:4;
925      GLuint predicate_inverse:1;
926      GLuint execution_size:3;
927      /**
928       * Conditional Modifier for most instructions.  On Gen6+, this is also
929       * used for the SEND instruction's Message Target/SFID.
930       */
931      GLuint destreg__conditionalmod:4;
932      GLuint acc_wr_control:1;
933      GLuint cmpt_control:1;
934      GLuint debug_control:1;
935      GLuint saturate:1;
936   } header;
937
938   union {
939      struct
940      {
941	 GLuint dest_reg_file:2;
942	 GLuint dest_reg_type:3;
943	 GLuint src0_reg_file:2;
944	 GLuint src0_reg_type:3;
945	 GLuint src1_reg_file:2;
946	 GLuint src1_reg_type:3;
947	 GLuint pad:1;
948	 GLuint dest_subreg_nr:5;
949	 GLuint dest_reg_nr:8;
950	 GLuint dest_horiz_stride:2;
951	 GLuint dest_address_mode:1;
952      } da1;
953
954      struct
955      {
956	 GLuint dest_reg_file:2;
957	 GLuint dest_reg_type:3;
958	 GLuint src0_reg_file:2;
959	 GLuint src0_reg_type:3;
960	 GLuint src1_reg_file:2;        /* 0x00000c00 */
961	 GLuint src1_reg_type:3;        /* 0x00007000 */
962	 GLuint pad:1;
963	 GLint dest_indirect_offset:10;	/* offset against the deref'd address reg */
964	 GLuint dest_subreg_nr:3; /* subnr for the address reg a0.x */
965	 GLuint dest_horiz_stride:2;
966	 GLuint dest_address_mode:1;
967      } ia1;
968
969      struct
970      {
971	 GLuint dest_reg_file:2;
972	 GLuint dest_reg_type:3;
973	 GLuint src0_reg_file:2;
974	 GLuint src0_reg_type:3;
975	 GLuint src1_reg_file:2;
976	 GLuint src1_reg_type:3;
977	 GLuint pad:1;
978	 GLuint dest_writemask:4;
979	 GLuint dest_subreg_nr:1;
980	 GLuint dest_reg_nr:8;
981	 GLuint dest_horiz_stride:2;
982	 GLuint dest_address_mode:1;
983      } da16;
984
985      struct
986      {
987	 GLuint dest_reg_file:2;
988	 GLuint dest_reg_type:3;
989	 GLuint src0_reg_file:2;
990	 GLuint src0_reg_type:3;
991	 GLuint pad0:6;
992	 GLuint dest_writemask:4;
993	 GLint dest_indirect_offset:6;
994	 GLuint dest_subreg_nr:3;
995	 GLuint dest_horiz_stride:2;
996	 GLuint dest_address_mode:1;
997      } ia16;
998
999      struct {
1000	 GLuint dest_reg_file:2;
1001	 GLuint dest_reg_type:3;
1002	 GLuint src0_reg_file:2;
1003	 GLuint src0_reg_type:3;
1004	 GLuint src1_reg_file:2;
1005	 GLuint src1_reg_type:3;
1006	 GLuint pad:1;
1007
1008	 GLint jump_count:16;
1009      } branch_gen6;
1010   } bits1;
1011
1012
1013   union {
1014      struct
1015      {
1016	 GLuint src0_subreg_nr:5;
1017	 GLuint src0_reg_nr:8;
1018	 GLuint src0_abs:1;
1019	 GLuint src0_negate:1;
1020	 GLuint src0_address_mode:1;
1021	 GLuint src0_horiz_stride:2;
1022	 GLuint src0_width:3;
1023	 GLuint src0_vert_stride:4;
1024	 GLuint flag_reg_nr:1;
1025	 GLuint pad:6;
1026      } da1;
1027
1028      struct
1029      {
1030	 GLint src0_indirect_offset:10;
1031	 GLuint src0_subreg_nr:3;
1032	 GLuint src0_abs:1;
1033	 GLuint src0_negate:1;
1034	 GLuint src0_address_mode:1;
1035	 GLuint src0_horiz_stride:2;
1036	 GLuint src0_width:3;
1037	 GLuint src0_vert_stride:4;
1038	 GLuint flag_reg_nr:1;
1039	 GLuint pad:6;
1040      } ia1;
1041
1042      struct
1043      {
1044	 GLuint src0_swz_x:2;
1045	 GLuint src0_swz_y:2;
1046	 GLuint src0_subreg_nr:1;
1047	 GLuint src0_reg_nr:8;
1048	 GLuint src0_abs:1;
1049	 GLuint src0_negate:1;
1050	 GLuint src0_address_mode:1;
1051	 GLuint src0_swz_z:2;
1052	 GLuint src0_swz_w:2;
1053	 GLuint pad0:1;
1054	 GLuint src0_vert_stride:4;
1055	 GLuint flag_reg_nr:1;
1056	 GLuint pad1:6;
1057      } da16;
1058
1059      struct
1060      {
1061	 GLuint src0_swz_x:2;
1062	 GLuint src0_swz_y:2;
1063	 GLint src0_indirect_offset:6;
1064	 GLuint src0_subreg_nr:3;
1065	 GLuint src0_abs:1;
1066	 GLuint src0_negate:1;
1067	 GLuint src0_address_mode:1;
1068	 GLuint src0_swz_z:2;
1069	 GLuint src0_swz_w:2;
1070	 GLuint pad0:1;
1071	 GLuint src0_vert_stride:4;
1072	 GLuint flag_reg_nr:1;
1073	 GLuint pad1:6;
1074      } ia16;
1075
1076      /* Extended Message Descriptor for Ironlake (Gen5) SEND instruction.
1077       *
1078       * Does not apply to Gen6+.  The SFID/message target moved to bits
1079       * 27:24 of the header (destreg__conditionalmod); EOT is in bits3.
1080       */
1081       struct
1082       {
1083           GLuint pad:26;
1084           GLuint end_of_thread:1;
1085           GLuint pad1:1;
1086           GLuint sfid:4;
1087       } send_gen5;  /* for Ironlake only */
1088
1089   } bits2;
1090
1091   union
1092   {
1093      struct
1094      {
1095	 GLuint src1_subreg_nr:5;
1096	 GLuint src1_reg_nr:8;
1097	 GLuint src1_abs:1;
1098	 GLuint src1_negate:1;
1099	 GLuint src1_address_mode:1;
1100	 GLuint src1_horiz_stride:2;
1101	 GLuint src1_width:3;
1102	 GLuint src1_vert_stride:4;
1103	 GLuint pad0:7;
1104      } da1;
1105
1106      struct
1107      {
1108	 GLuint src1_swz_x:2;
1109	 GLuint src1_swz_y:2;
1110	 GLuint src1_subreg_nr:1;
1111	 GLuint src1_reg_nr:8;
1112	 GLuint src1_abs:1;
1113	 GLuint src1_negate:1;
1114	 GLuint src1_address_mode:1;
1115	 GLuint src1_swz_z:2;
1116	 GLuint src1_swz_w:2;
1117	 GLuint pad1:1;
1118	 GLuint src1_vert_stride:4;
1119	 GLuint pad2:7;
1120      } da16;
1121
1122      struct
1123      {
1124	 GLint  src1_indirect_offset:10;
1125	 GLuint src1_subreg_nr:3;
1126	 GLuint src1_abs:1;
1127	 GLuint src1_negate:1;
1128	 GLuint src1_address_mode:1;
1129	 GLuint src1_horiz_stride:2;
1130	 GLuint src1_width:3;
1131	 GLuint src1_vert_stride:4;
1132	 GLuint flag_reg_nr:1;
1133	 GLuint pad1:6;
1134      } ia1;
1135
1136      struct
1137      {
1138	 GLuint src1_swz_x:2;
1139	 GLuint src1_swz_y:2;
1140	 GLint  src1_indirect_offset:6;
1141	 GLuint src1_subreg_nr:3;
1142	 GLuint src1_abs:1;
1143	 GLuint src1_negate:1;
1144	 GLuint pad0:1;
1145	 GLuint src1_swz_z:2;
1146	 GLuint src1_swz_w:2;
1147	 GLuint pad1:1;
1148	 GLuint src1_vert_stride:4;
1149	 GLuint flag_reg_nr:1;
1150	 GLuint pad2:6;
1151      } ia16;
1152
1153
1154      struct
1155      {
1156	 GLint  jump_count:16;	/* note: signed */
1157	 GLuint  pop_count:4;
1158	 GLuint  pad0:12;
1159      } if_else;
1160
1161      /* This is also used for gen7 IF/ELSE instructions */
1162      struct
1163      {
1164	 /* Signed jump distance to the ip to jump to if all channels
1165	  * are disabled after the break or continue.  It should point
1166	  * to the end of the innermost control flow block, as that's
1167	  * where some channel could get re-enabled.
1168	  */
1169	 int jip:16;
1170
1171	 /* Signed jump distance to the location to resume execution
1172	  * of this channel if it's enabled for the break or continue.
1173	  */
1174	 int uip:16;
1175      } break_cont;
1176
1177      /**
1178       * \defgroup SEND instructions / Message Descriptors
1179       *
1180       * @{
1181       */
1182
1183      /**
1184       * Generic Message Descriptor for Gen4 SEND instructions.  The structs
1185       * below expand function_control to something specific for their
1186       * message.  Due to struct packing issues, they duplicate these bits.
1187       *
1188       * See the G45 PRM, Volume 4, Table 14-15.
1189       */
1190      struct {
1191	 GLuint function_control:16;
1192	 GLuint response_length:4;
1193	 GLuint msg_length:4;
1194	 GLuint msg_target:4;
1195	 GLuint pad1:3;
1196	 GLuint end_of_thread:1;
1197      } generic;
1198
1199      /**
1200       * Generic Message Descriptor for Gen5-7 SEND instructions.
1201       *
1202       * See the Sandybridge PRM, Volume 2 Part 2, Table 8-15.  (Sadly, most
1203       * of the information on the SEND instruction is missing from the public
1204       * Ironlake PRM.)
1205       *
1206       * The table claims that bit 31 is reserved/MBZ on Gen6+, but it lies.
1207       * According to the SEND instruction description:
1208       * "The MSb of the message description, the EOT field, always comes from
1209       *  bit 127 of the instruction word"...which is bit 31 of this field.
1210       */
1211      struct {
1212	 GLuint function_control:19;
1213	 GLuint header_present:1;
1214	 GLuint response_length:5;
1215	 GLuint msg_length:4;
1216	 GLuint pad1:2;
1217	 GLuint end_of_thread:1;
1218      } generic_gen5;
1219
1220      /** G45 PRM, Volume 4, Section 6.1.1.1 */
1221      struct {
1222	 GLuint function:4;
1223	 GLuint int_type:1;
1224	 GLuint precision:1;
1225	 GLuint saturate:1;
1226	 GLuint data_type:1;
1227	 GLuint pad0:8;
1228	 GLuint response_length:4;
1229	 GLuint msg_length:4;
1230	 GLuint msg_target:4;
1231	 GLuint pad1:3;
1232	 GLuint end_of_thread:1;
1233      } math;
1234
1235      /** Ironlake PRM, Volume 4 Part 1, Section 6.1.1.1 */
1236      struct {
1237	 GLuint function:4;
1238	 GLuint int_type:1;
1239	 GLuint precision:1;
1240	 GLuint saturate:1;
1241	 GLuint data_type:1;
1242	 GLuint snapshot:1;
1243	 GLuint pad0:10;
1244	 GLuint header_present:1;
1245	 GLuint response_length:5;
1246	 GLuint msg_length:4;
1247	 GLuint pad1:2;
1248	 GLuint end_of_thread:1;
1249      } math_gen5;
1250
1251      /** G45 PRM, Volume 4, Section 4.8.1.1.1 [DevBW] and [DevCL] */
1252      struct {
1253	 GLuint binding_table_index:8;
1254	 GLuint sampler:4;
1255	 GLuint return_format:2;
1256	 GLuint msg_type:2;
1257	 GLuint response_length:4;
1258	 GLuint msg_length:4;
1259	 GLuint msg_target:4;
1260	 GLuint pad1:3;
1261	 GLuint end_of_thread:1;
1262      } sampler;
1263
1264      /** G45 PRM, Volume 4, Section 4.8.1.1.2 [DevCTG] */
1265      struct {
1266         GLuint binding_table_index:8;
1267         GLuint sampler:4;
1268         GLuint msg_type:4;
1269         GLuint response_length:4;
1270         GLuint msg_length:4;
1271         GLuint msg_target:4;
1272         GLuint pad1:3;
1273         GLuint end_of_thread:1;
1274      } sampler_g4x;
1275
1276      /** Ironlake PRM, Volume 4 Part 1, Section 4.11.1.1.3 */
1277      struct {
1278	 GLuint binding_table_index:8;
1279	 GLuint sampler:4;
1280	 GLuint msg_type:4;
1281	 GLuint simd_mode:2;
1282	 GLuint pad0:1;
1283	 GLuint header_present:1;
1284	 GLuint response_length:5;
1285	 GLuint msg_length:4;
1286	 GLuint pad1:2;
1287	 GLuint end_of_thread:1;
1288      } sampler_gen5;
1289
1290      struct {
1291	 GLuint binding_table_index:8;
1292	 GLuint sampler:4;
1293	 GLuint msg_type:5;
1294	 GLuint simd_mode:2;
1295	 GLuint header_present:1;
1296	 GLuint response_length:5;
1297	 GLuint msg_length:4;
1298	 GLuint pad1:2;
1299	 GLuint end_of_thread:1;
1300      } sampler_gen7;
1301
1302      struct brw_urb_immediate urb;
1303
1304      struct {
1305	 GLuint opcode:4;
1306	 GLuint offset:6;
1307	 GLuint swizzle_control:2;
1308	 GLuint pad:1;
1309	 GLuint allocate:1;
1310	 GLuint used:1;
1311	 GLuint complete:1;
1312	 GLuint pad0:3;
1313	 GLuint header_present:1;
1314	 GLuint response_length:5;
1315	 GLuint msg_length:4;
1316	 GLuint pad1:2;
1317	 GLuint end_of_thread:1;
1318      } urb_gen5;
1319
1320      struct {
1321	 GLuint opcode:3;
1322	 GLuint offset:11;
1323	 GLuint swizzle_control:1;
1324	 GLuint complete:1;
1325	 GLuint per_slot_offset:1;
1326	 GLuint pad0:2;
1327	 GLuint header_present:1;
1328	 GLuint response_length:5;
1329	 GLuint msg_length:4;
1330	 GLuint pad1:2;
1331	 GLuint end_of_thread:1;
1332      } urb_gen7;
1333
1334      /** 965 PRM, Volume 4, Section 5.10.1.1: Message Descriptor */
1335      struct {
1336	 GLuint binding_table_index:8;
1337	 GLuint msg_control:4;
1338	 GLuint msg_type:2;
1339	 GLuint target_cache:2;
1340	 GLuint response_length:4;
1341	 GLuint msg_length:4;
1342	 GLuint msg_target:4;
1343	 GLuint pad1:3;
1344	 GLuint end_of_thread:1;
1345      } dp_read;
1346
1347      /** G45 PRM, Volume 4, Section 5.10.1.1.2 */
1348      struct {
1349	 GLuint binding_table_index:8;
1350	 GLuint msg_control:3;
1351	 GLuint msg_type:3;
1352	 GLuint target_cache:2;
1353	 GLuint response_length:4;
1354	 GLuint msg_length:4;
1355	 GLuint msg_target:4;
1356	 GLuint pad1:3;
1357	 GLuint end_of_thread:1;
1358      } dp_read_g4x;
1359
1360      /** Ironlake PRM, Volume 4 Part 1, Section 5.10.2.1.2. */
1361      struct {
1362	 GLuint binding_table_index:8;
1363	 GLuint msg_control:3;
1364	 GLuint msg_type:3;
1365	 GLuint target_cache:2;
1366	 GLuint pad0:3;
1367	 GLuint header_present:1;
1368	 GLuint response_length:5;
1369	 GLuint msg_length:4;
1370	 GLuint pad1:2;
1371	 GLuint end_of_thread:1;
1372      } dp_read_gen5;
1373
1374      /** G45 PRM, Volume 4, Section 5.10.1.1.2.  For both Gen4 and G45. */
1375      struct {
1376	 GLuint binding_table_index:8;
1377	 GLuint msg_control:3;
1378	 GLuint last_render_target:1;
1379	 GLuint msg_type:3;
1380	 GLuint send_commit_msg:1;
1381	 GLuint response_length:4;
1382	 GLuint msg_length:4;
1383	 GLuint msg_target:4;
1384	 GLuint pad1:3;
1385	 GLuint end_of_thread:1;
1386      } dp_write;
1387
1388      /** Ironlake PRM, Volume 4 Part 1, Section 5.10.2.1.2. */
1389      struct {
1390	 GLuint binding_table_index:8;
1391	 GLuint msg_control:3;
1392	 GLuint last_render_target:1;
1393	 GLuint msg_type:3;
1394	 GLuint send_commit_msg:1;
1395	 GLuint pad0:3;
1396	 GLuint header_present:1;
1397	 GLuint response_length:5;
1398	 GLuint msg_length:4;
1399	 GLuint pad1:2;
1400	 GLuint end_of_thread:1;
1401      } dp_write_gen5;
1402
1403      /**
1404       * Message for the Sandybridge Sampler Cache or Constant Cache Data Port.
1405       *
1406       * See the Sandybridge PRM, Volume 4 Part 1, Section 3.9.2.1.1.
1407       **/
1408      struct {
1409	 GLuint binding_table_index:8;
1410	 GLuint msg_control:5;
1411	 GLuint msg_type:3;
1412	 GLuint pad0:3;
1413	 GLuint header_present:1;
1414	 GLuint response_length:5;
1415	 GLuint msg_length:4;
1416	 GLuint pad1:2;
1417	 GLuint end_of_thread:1;
1418      } gen6_dp_sampler_const_cache;
1419
1420      /**
1421       * Message for the Sandybridge Render Cache Data Port.
1422       *
1423       * Most fields are defined in the Sandybridge PRM, Volume 4 Part 1,
1424       * Section 3.9.2.1.1: Message Descriptor.
1425       *
1426       * "Slot Group Select" and "Last Render Target" are part of the
1427       * 5-bit message control for Render Target Write messages.  See
1428       * Section 3.9.9.2.1 of the same volume.
1429       */
1430      struct {
1431	 GLuint binding_table_index:8;
1432	 GLuint msg_control:3;
1433	 GLuint slot_group_select:1;
1434	 GLuint last_render_target:1;
1435	 GLuint msg_type:4;
1436	 GLuint send_commit_msg:1;
1437	 GLuint pad0:1;
1438	 GLuint header_present:1;
1439	 GLuint response_length:5;
1440	 GLuint msg_length:4;
1441	 GLuint pad1:2;
1442	 GLuint end_of_thread:1;
1443      } gen6_dp;
1444
1445      /**
1446       * Message for any of the Gen7 Data Port caches.
1447       *
1448       * Most fields are defined in BSpec volume 5c.2 Data Port / Messages /
1449       * Data Port Messages / Message Descriptor.  Once again, "Slot Group
1450       * Select" and "Last Render Target" are part of the 6-bit message
1451       * control for Render Target Writes.
1452       */
1453      struct {
1454	 GLuint binding_table_index:8;
1455	 GLuint msg_control:3;
1456	 GLuint slot_group_select:1;
1457	 GLuint last_render_target:1;
1458	 GLuint msg_control_pad:1;
1459	 GLuint msg_type:4;
1460	 GLuint pad1:1;
1461	 GLuint header_present:1;
1462	 GLuint response_length:5;
1463	 GLuint msg_length:4;
1464	 GLuint pad2:2;
1465	 GLuint end_of_thread:1;
1466      } gen7_dp;
1467      /** @} */
1468
1469      GLint d;
1470      GLuint ud;
1471      float f;
1472   } bits3;
1473};
1474
1475
1476#endif
1477