i915_structs.h revision fa225cbc
1/*
2 * Copyright © 2006 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 * SOFTWARE.
22 *
23 * Authors:
24 *    Xiang Haihao <haihao.xiang@intel.com>
25 *
26 */
27
28#ifndef _I915_STRUCTS_H
29#define _I915_STRUCTS_H
30
31#include <stdint.h>
32
33/* MI_INSTRUCTION */
34#define CMD_MI          0x00
35
36#define OPC_MI_FLUSH                            (0x04)
37
38struct i915_mi_flush
39{
40    struct {
41        unsigned map_cache_invalidate : 1;
42        unsigned pad0 : 1;
43        unsigned render_cache_flush_inhibit : 1;
44        unsigned scene_count : 1;
45        unsigned end_scene : 1;
46        unsigned pad1 : 18;
47        unsigned opcode : 6;
48        unsigned type : 3;
49    } dw0;
50};
51
52/* BLT */
53#define CMD_2D          0x02
54#define OPC_COLOR_BLT                           (0x40)
55
56struct i915_color_blt
57{
58    struct {
59        unsigned length : 5;
60        unsigned pad0 : 15;
61        unsigned bpp_mask : 2;
62        unsigned opcode : 7;
63        unsigned type : 3;
64    } dw0;
65
66    struct {
67        unsigned pitch : 16;
68        unsigned rop : 8;
69        unsigned color_depth : 2;
70        unsigned pad0 : 6;
71    } dw1;
72
73    struct {
74        unsigned width : 16;
75        unsigned height : 16;
76    } dw2;
77
78    struct {
79        unsigned address;
80    } dw3;
81
82    struct {
83        unsigned pattern;
84    } dw4;
85};
86
87/* 3D_INSTRUCTION */
88#define CMD_3D          0x03
89
90#define OPC_3DMPEG_MACROBLOCK_IPICTURE          (0x01 + (0x1e << 5))
91#define OPC_3DMPEG_SET_ORIGIN                   (0x10 + (0x1e << 5))
92#define OPC_3DMPEG_MACROBLOCK                   (0x11 + (0x1e << 5))
93#define OPC_3DMPEG_SLICE                        (0x12 + (0x1e << 5))
94#define OPC_3DMPEG_QM_PALETTE_LOAD              (0x13 + (0x1e << 5))
95
96#define OPC_3DSTATE_SCISSOR_ENABLE              (0x10 + (0x1c << 5))
97
98#define OPC_3DSTATE_MAP_STATE                   (0x00 + (0x1d << 8))
99#define OPC_3DSTATE_SAMPLER_STATE               (0x01 + (0x1d << 8))
100#define OPC_3DSTATE_LOAD_STATE_IMMEDIATE_1      (0x04 + (0x1d << 8))
101#define OPC_3DSTATE_PIXEL_SHADER_PROGRAM        (0x05 + (0x1d << 8))
102#define OPC_3DSTATE_PIXEL_SHADER_CONSTANTS      (0x06 + (0x1d << 8))
103#define OPC_3DSTATE_LOAD_INDIRECT               (0x07 + (0x1d << 8))
104
105#define OPC_3DSTATE_MODES_5                     (0x0c)
106#define OPC_3DSTATE_COORD_SET_BINDINGS          (0x16)
107#define OPC_3DPRIMITIVE                         (0x1f)
108
109#define OPC_3DSTATE_DRAWING_RECTANGLE           (0x80 + (0x1d << 8))
110#define OPC_3DSTATE_SCISSOR_RECTANGLE           (0x81 + (0x1d << 8))
111#define OPC_3DSTATE_DEST_BUFFER_VARIABLES       (0x85 + (0x1d << 8))
112#define OPC_3DSTATE_DEST_BUFFER_VARIABLES_MPEG  (0x87 + (0x1d << 8))
113#define OPC_3DSTATE_BUFFER_INFO                 (0x8e + (0x1d << 8))
114
115/*
116 * 3DMPEG instructions
117 */
118struct i915_3dmpeg_macroblock_header
119{
120    struct {
121        unsigned length : 19;
122        unsigned opcode : 10;
123        unsigned type : 3;
124    } dw0;
125
126    struct {
127        unsigned mb_intra : 1;
128        unsigned forward : 1;
129        unsigned backward : 1;
130        unsigned h263_4mv : 1;
131        unsigned pad0 : 1;
132        unsigned dct_type : 1;
133        unsigned pad1 : 2;
134        unsigned motion_type : 2;
135        unsigned pad2 : 2;
136        unsigned vertical_field_select : 4;
137        unsigned coded_block_pattern : 6;
138        unsigned pad3 : 2;
139        unsigned skipped_macroblocks : 7;
140        unsigned pad4 : 1;
141    } dw1;
142};
143
144struct i915_3dmpeg_macroblock_0mv
145{
146    struct i915_3dmpeg_macroblock_header header;
147};
148
149struct i915_3dmpeg_macroblock_1fbmv
150{
151    struct i915_3dmpeg_macroblock_header header;
152    unsigned dw2;
153    unsigned dw3;
154};
155struct i915_3dmpeg_macroblock_2fbmv
156{
157    struct i915_3dmpeg_macroblock_header header;
158    unsigned dw2;
159    unsigned dw3;
160    unsigned dw4;
161    unsigned dw5;
162};
163
164struct i915_3dmpeg_macroblock_5fmv
165{
166    struct i915_3dmpeg_macroblock_header header;
167    unsigned dw2;
168    unsigned dw3;
169    unsigned dw4;
170    unsigned dw5;
171    unsigned dw6;
172};
173
174struct i915_3dmpeg_macroblock_ipicture
175{
176    struct {
177        unsigned pad0 : 5;
178        unsigned dct_type : 1;
179        unsigned pad1 : 13;
180        unsigned opcode : 10;
181        unsigned type : 3;
182    } dw0;
183};
184
185struct i915_3dmpeg_set_origin
186{
187    struct {
188        unsigned length : 19;
189        unsigned opcode : 10;
190        unsigned type : 3;
191    } dw0;
192
193    struct {
194        unsigned v_origin : 7;
195        unsigned pad0 : 1;
196        unsigned h_origin : 7;
197        unsigned pad1 : 17;
198    } dw1;
199};
200
201struct i915_3dmpeg_slice
202{
203    struct {
204        unsigned length : 19;
205        unsigned opcode : 10;
206        unsigned type : 3;
207    } dw0;
208
209    struct {
210        unsigned fst_mb_bit_off : 3;
211        unsigned pad0 : 5;
212        unsigned mb_count : 7;
213        unsigned pad1 : 1;
214        unsigned v_position : 7;
215        unsigned pad2 : 1;
216        unsigned h_position : 7;
217        unsigned pad3 : 1;
218    } dw1;
219
220    struct {
221        unsigned length_minus_one : 17;
222        unsigned pad0 : 7;
223        unsigned qt_scale_code : 5;
224        unsigned pad1 : 3;
225    } dw2;
226};
227
228struct i915_3dmpeg_qm_palette_load
229{
230    struct {
231        unsigned length : 4;
232        unsigned pad0 : 15;
233        unsigned opcode : 10;
234        unsigned type : 3;
235    } dw0;
236
237    unsigned quantmatrix[16];
238};
239
240
241/*
242 * 3DSTATE instruction
243 */
244#define BUFFERID_COLOR_BACK     3
245#define BUFFERID_COLOR_AUX      4
246#define BUFFERID_MC_INTRA_CORR  5
247#define BUFFERID_DEPTH          7
248
249#define TILEWALK_XMAJOR         0
250#define TILEWALK_YMAJOR         1
251
252struct i915_3dstate_buffer_info
253{
254    struct {
255        unsigned length : 16;
256        unsigned opcode : 13;
257        unsigned type : 3;
258    } dw0;
259
260    struct {
261        unsigned pad0 : 2;
262        unsigned pitch : 12;
263        unsigned pad1 : 7;
264        unsigned walk : 1;
265        unsigned tiled_surface : 1;
266        unsigned fence_regs : 1;
267        unsigned buffer_id : 4;
268        unsigned aux_id : 1;
269        unsigned pad2 : 3;
270    } dw1;
271
272    struct {
273        unsigned pad0 : 2;
274        unsigned base_address : 27;
275        unsigned pad1 : 3;
276    } dw2;
277};
278
279#define COLORBUFFER_8BIT         0x00
280#define COLORBUFFER_X1R5G5B5     0x01
281#define COLORBUFFER_R5G6B5       0x02
282#define COLORBUFFER_A8R8G8B8     0x03
283#define COLORBUFFER_YCRCB_SWAP   0x04
284#define COLORBUFFER_YCRCB_NORMAL 0x05
285#define COLORBUFFER_YCRCB_SWAPUV 0x06
286#define COLORBUFFER_YCRCB_SWAPUVY   0x07
287#define COLORBUFFER_A4R4G4B4     0x08
288#define COLORBUFFER_A1R5G5B5     0x09
289#define COLORBUFFER_A2R10G10B10  0x0a
290
291
292struct i915_3dstate_dest_buffer_variables
293{
294    struct {
295        unsigned length : 16;
296        unsigned opcode : 13;
297        unsigned type : 3;
298    } dw0;
299
300    struct {
301        unsigned v_ls_offset : 1;
302        unsigned v_ls : 1;
303        unsigned depth_fmt : 2;
304        unsigned pad0 : 4;
305        unsigned color_fmt : 4;
306        unsigned yuv422_select : 3;
307        unsigned pad1 : 1;
308        unsigned dest_v_bias : 4;
309        unsigned dest_h_bias : 4;
310        unsigned dither_enhancement : 1;
311        unsigned linear_gamma : 1;
312        unsigned dither_pattern : 2;
313        unsigned lod_preclamp : 1;
314        unsigned edt_zone : 1;          /* early depth test in zone rendering */
315        unsigned texture_default_color : 1;
316        unsigned edt_classic : 1;       /* early depth test in classic mode */
317    } dw1;
318};
319
320#define MPEG_DECODE_MC          0
321#define MPEG_DECODE_VLD_IDCT_MC 1
322
323#define MPEG_I_PICTURE          1
324#define MPEG_P_PICTURE          2
325#define MPEG_B_PICTURE          3
326
327#define MC_SUB_1H               0
328#define MC_SUB_2H               1
329#define MC_SUB_4H               2
330
331#define MC_SUB_1V               0
332#define MC_SUB_2V               1
333
334struct i915_3dstate_dest_buffer_variables_mpeg
335{
336    struct {
337        unsigned length : 16;
338        unsigned opcode : 13;
339        unsigned type : 3;
340    } dw0;
341
342    struct {
343        unsigned picture_width : 7;
344        unsigned pad0 : 1;
345        unsigned v_subsample_factor : 2;
346        unsigned h_subsample_factor : 2;
347        unsigned tff : 1;
348        unsigned mismatch : 1;
349        unsigned pad1 : 1;
350        unsigned intra8 : 1;
351        unsigned abort_on_error : 8;
352        unsigned pad2 : 4;
353        unsigned bidir_avrg_control : 1;
354        unsigned rcontrol : 1;
355        unsigned decode_mode : 2;
356    } dw1;
357
358    struct {
359        unsigned pad0 : 1;
360        unsigned picture_coding_type : 2;
361        unsigned pad1 : 2;
362        unsigned scan_order : 1;
363        unsigned pad2 : 2;
364        unsigned q_scale_type : 1;
365        unsigned concealment : 1;
366        unsigned fpf_dct : 1;
367        unsigned pad3 : 2;
368        unsigned intra_dc : 2;
369        unsigned intra_vlc : 1;
370        unsigned f_code00 : 4;
371        unsigned f_code01 : 4;
372        unsigned f_code10 : 4;
373        unsigned f_code11 : 4;
374    } dw2;
375};
376
377struct i915_mc_static_indirect_state_buffer {
378    struct i915_3dstate_buffer_info dest_y;
379    struct i915_3dstate_buffer_info dest_u;
380    struct i915_3dstate_buffer_info dest_v;
381    struct i915_3dstate_dest_buffer_variables dest_buf;
382    struct i915_3dstate_dest_buffer_variables_mpeg dest_buf_mpeg;
383    struct i915_3dstate_buffer_info corr;
384};
385
386#define MAP_MAP0        0x0001
387#define MAP_MAP1        0x0002
388#define MAP_MAP2        0x0004
389#define MAP_MAP3        0x0008
390#define MAP_MAP4        0x0010
391#define MAP_MAP5        0x0020
392#define MAP_MAP6        0x0040
393#define MAP_MAP7        0x0080
394#define MAP_MAP8        0x0100
395#define MAP_MAP9        0x0200
396#define MAP_MAP10       0x0400
397#define MAP_MAP11       0x0800
398#define MAP_MAP12       0x1000
399#define MAP_MAP13       0x2000
400#define MAP_MAP14       0x4000
401#define MAP_MAP15       0x8000
402
403struct texture_map
404{
405    struct {
406        unsigned v_ls_offset : 1;
407        unsigned v_ls : 1;
408        unsigned base_address : 27;
409        unsigned pad0 : 2;
410        unsigned untrusted : 1;
411    } tm0;
412
413    struct {
414        unsigned tile_walk : 1;
415        unsigned tiled_surface : 1;
416        unsigned utilize_fence_regs : 1;
417        unsigned texel_fmt : 4;
418        unsigned surface_fmt : 3;
419        unsigned width : 11;
420        unsigned height : 11;
421    } tm1;
422
423    struct {
424        unsigned depth : 8;
425        unsigned mipmap_layout : 1;
426        unsigned max_lod : 6;
427        unsigned cube_face : 6;
428        unsigned pitch : 11;
429    } tm2;
430};
431
432struct i915_3dstate_map_state
433{
434    struct {
435        unsigned length : 6;
436        unsigned pad0 : 9;
437        unsigned retain : 1;
438        unsigned opcode : 13;
439        unsigned type : 3;
440    } dw0;
441
442    struct {
443        unsigned map_mask : 16;
444        unsigned pad0 : 16;
445    } dw1;
446};
447
448struct i915_mc_map_state {
449    struct i915_3dstate_map_state y_map;
450    struct texture_map y_forward;
451    struct texture_map y_backward;
452    struct i915_3dstate_map_state u_map;
453    struct texture_map u_forward;
454    struct texture_map u_backward;
455    struct i915_3dstate_map_state v_map;
456    struct texture_map v_forward;
457    struct texture_map v_backward;
458};
459
460#define SAMPLER_SAMPLER0        0x0001
461#define SAMPLER_SAMPLER1        0x0002
462#define SAMPLER_SAMPLER2        0x0004
463#define SAMPLER_SAMPLER3        0x0008
464#define SAMPLER_SAMPLER4        0x0010
465#define SAMPLER_SAMPLER5        0x0020
466#define SAMPLER_SAMPLER6        0x0040
467#define SAMPLER_SAMPLER7        0x0080
468#define SAMPLER_SAMPLER8        0x0100
469#define SAMPLER_SAMPLER9        0x0200
470#define SAMPLER_SAMPLER10       0x0400
471#define SAMPLER_SAMPLER11       0x0800
472#define SAMPLER_SAMPLER12       0x1000
473#define SAMPLER_SAMPLER13       0x2000
474#define SAMPLER_SAMPLER14       0x4000
475#define SAMPLER_SAMPLER15       0x8000
476
477#define MIPFILTER_NONE          0
478#define MIPFILTER_NEAREST       1
479#define MIPFILTER_LINEAR        3
480
481#define MAPFILTER_NEAREST       0
482#define MAPFILTER_LINEAR        1
483#define MAPFILTER_ANISOTROPIC   2
484#define MAPFILTER_4X4_1         3
485#define MAPFILTER_4X4_2         4
486#define MAPFILTER_4X4_FLAT      5
487#define MAPFILTER_MONO          6
488
489#define ANISORATIO_2            0
490#define ANISORATIO_4            1
491
492#define PREFILTEROP_ALWAYS      0
493#define PREFILTEROP_NEVER       1
494#define PREFILTEROP_LESS        2
495#define PREFILTEROP_EQUAL       3
496#define PREFILTEROP_LEQUAL      4
497#define PREFILTEROP_GREATER     5
498#define PREFILTEROP_NOTEQUAL    6
499#define PREFILTEROP_GEQUAL      7
500
501#define TEXCOORDMODE_WRAP       0
502#define TEXCOORDMODE_MIRROR     1
503#define TEXCOORDMODE_CLAMP      2
504#define TEXCOORDMODE_CUBE       3
505#define TEXCOORDMODE_CLAMP_BORDER       4
506#define TEXCOORDMODE_MIRROR_ONCE        5
507
508struct texture_sampler
509{
510    struct {
511        unsigned shadow_function : 3;
512        unsigned max_anisotropy : 1;
513        unsigned shadow_enable : 1;
514        unsigned lod_bias : 9;
515        unsigned min_filter : 3;
516        unsigned mag_filter : 3;
517        unsigned mip_filter : 2;
518        unsigned base_level : 5;
519        unsigned chromakey_index : 2;
520        unsigned color_conversion : 1;
521        unsigned planar2packet : 1;
522        unsigned reverse_gamma : 1;
523    } ts0;
524
525    struct {
526        unsigned east_deinterlacer : 1;
527        unsigned map_index : 4;
528        unsigned normalized_coor : 1;
529        unsigned tcz_control : 3;
530        unsigned tcy_control : 3;
531        unsigned tcx_control : 3;
532        unsigned chromakey_enable : 1;
533        unsigned keyed_texture_filter : 1;
534        unsigned kill_pixel : 1;
535        unsigned pad0 : 6;
536        unsigned min_lod : 8;
537    } ts1;
538
539    struct {
540        unsigned default_color;
541    } ts2;
542};
543
544struct i915_3dstate_sampler_state
545{
546    struct {
547        unsigned length : 6;
548        unsigned pad0 : 10;
549        unsigned opcode : 13;
550        unsigned type : 3;
551    } dw0;
552
553    struct {
554        unsigned sampler_masker : 16;
555        unsigned pad0 : 16;
556    } dw1;
557    /* we always use two samplers for mc */
558    struct texture_sampler sampler0;
559    struct texture_sampler sampler1;
560};
561
562struct arithmetic_inst
563{
564    struct {
565        unsigned pad0 : 2;
566        unsigned src0_reg : 5;
567        unsigned src0_reg_t : 3;
568        unsigned dest_channel_mask : 4;
569        unsigned dest_reg : 4;
570        unsigned pad1 : 1;
571        unsigned dest_reg_t: 3;
572        unsigned dest_saturate : 1;
573        unsigned pad2 : 1;
574        unsigned opcode : 5;
575        unsigned pad3 : 3;
576    } dw0;
577
578    struct {
579        unsigned src1_y_select : 3;
580        unsigned src1_y_negate : 1;
581        unsigned src1_x_select : 3;
582        unsigned src1_x_negate : 1;
583        unsigned src1_reg : 5;
584        unsigned src1_reg_t : 3;
585        unsigned src0_w_select : 3;
586        unsigned src0_w_negate : 1;
587        unsigned src0_z_select : 3;
588        unsigned src0_z_negate : 1;
589        unsigned src0_y_select : 3;
590        unsigned src0_y_negate : 1;
591        unsigned src0_x_select : 3;
592        unsigned src0_x_negate : 1;
593    } dw1;
594
595    struct {
596        unsigned src2_w_select : 3;
597        unsigned src2_w_negate : 1;
598        unsigned src2_z_select : 3;
599        unsigned src2_z_negate : 1;
600        unsigned src2_y_select : 3;
601        unsigned src2_y_negate : 1;
602        unsigned src2_x_select : 3;
603        unsigned src2_x_negate : 1;
604        unsigned src2_reg : 5;
605        unsigned src2_reg_t : 3;
606        unsigned src1_w_select : 3;
607        unsigned src1_w_negate : 1;
608        unsigned src1_z_select : 3;
609        unsigned src1_z_negate : 1;
610    } dw2;
611};
612
613struct texture_inst
614{
615    struct {
616        unsigned sampler_reg : 4;
617        unsigned pad0 : 10;
618        unsigned dest_reg : 4;
619        unsigned pad1 : 1;
620        unsigned dest_reg_t : 3;
621        unsigned pad2 : 2;
622        unsigned opcode : 5;
623        unsigned pad3 : 3;
624    } dw0;
625
626    struct {
627        unsigned pad0 : 16;
628        unsigned address_reg : 5;
629        unsigned pad1 : 3;
630        unsigned address_reg_t : 3;
631        unsigned pad2 : 5;
632    } dw1;
633
634    struct {
635        unsigned pad0;
636    } dw2;
637};
638
639struct declaration_inst
640{
641    struct {
642        unsigned pad0 : 10;
643        unsigned decl_channel_mask : 4;
644        unsigned decl_reg : 4;
645        unsigned pad1 : 1;
646        unsigned decl_reg_t : 2;
647        unsigned pad2 : 1;
648        unsigned sampler_type : 2;
649        unsigned opcode : 5;
650        unsigned pad3 : 3;
651    } dw0;
652
653    struct {
654        unsigned pad0;
655    } dw1;
656
657    struct {
658        unsigned pad0;
659    } dw2;
660};
661
662union shader_inst
663{
664    struct arithmetic_inst a;
665    struct texture_inst t;
666    struct declaration_inst d;
667};
668
669struct i915_3dstate_pixel_shader_header {
670    unsigned length : 9;
671    unsigned pad0 : 6;
672    unsigned retain : 1;
673    unsigned opcode : 13;
674    unsigned type : 3;
675};
676
677struct i915_3dstate_pixel_shader_program
678{
679    struct i915_3dstate_pixel_shader_header shader0;
680    /* mov oC, c0.0000 */
681    uint32_t inst0[3];
682
683    struct i915_3dstate_pixel_shader_header shader1;
684    /* dcl t0.xy */
685    /* dcl t1.xy */
686    /* dcl_2D s0 */
687    /* texld r0, t0, s0 */
688    /* mov oC, r0 */
689    uint32_t inst1[3*5];
690
691    struct i915_3dstate_pixel_shader_header shader2;
692    /* dcl t2.xy */
693    /* dcl t3.xy */
694    /* dcl_2D s1 */
695    /* texld r0, t2, s1 */
696    /* mov oC, r0 */
697    uint32_t inst2[3*5];
698
699    struct i915_3dstate_pixel_shader_header shader3;
700    /* dcl t0.xy */
701    /* dcl t1.xy */
702    /* dcl t2.xy */
703    /* dcl t3.xy */
704    /* dcl_2D s0 */
705    /* dcl_2D s1 */
706    /* texld r0, t0, s0 */
707    /* texld r0, t2, s1 */
708    /* add r0, r0, r1*/
709    /* mov oC, r0 */
710    uint32_t inst3[3*10];
711};
712
713#define REG_CR0         0x00000001
714#define REG_CR1         0x00000002
715#define REG_CR2         0x00000004
716#define REG_CR3         0x00000008
717#define REG_CR4         0x00000010
718#define REG_CR5         0x00000020
719#define REG_CR6         0x00000040
720#define REG_CR7         0x00000080
721#define REG_CR8         0x00000100
722#define REG_CR9         0x00000200
723#define REG_CR10        0x00000400
724#define REG_CR11        0x00000800
725#define REG_CR12        0x00001000
726#define REG_CR13        0x00002000
727#define REG_CR14        0x00004000
728#define REG_CR15        0x00008000
729#define REG_CR16        0x00010000
730#define REG_CR17        0x00020000
731#define REG_CR18        0x00040000
732#define REG_CR19        0x00080000
733#define REG_CR20        0x00100000
734#define REG_CR21        0x00200000
735#define REG_CR22        0x00400000
736#define REG_CR23        0x00800000
737#define REG_CR24        0x01000000
738#define REG_CR25        0x02000000
739#define REG_CR26        0x04000000
740#define REG_CR27        0x08000000
741#define REG_CR28        0x10000000
742#define REG_CR29        0x20000000
743#define REG_CR30        0x40000000
744#define REG_CR31        0x80000000
745
746struct shader_constant
747{
748    float x;
749    float y;
750    float z;
751    float w;
752};
753
754struct i915_3dstate_pixel_shader_constants
755{
756    struct {
757        unsigned length : 8;
758        unsigned pad0 : 8;
759        unsigned opcode : 13;
760        unsigned type : 3;
761    } dw0;
762
763    struct {
764        unsigned reg_mask;
765    } dw1;
766    /* we only need one constant */
767    struct shader_constant value;
768};
769
770#define BLOCK_SIS       0x01
771#define BLOCK_DIS       0x02
772#define BLOCK_SSB       0x04
773#define BLOCK_MSB       0x08
774#define BLOCK_PSP       0x10
775#define BLOCK_PSC       0x20
776
777typedef struct _state_ddword
778{
779    struct {
780        unsigned valid : 1;
781        unsigned force : 1;
782        unsigned buffer_address : 30;
783    } dw0;
784
785    struct {
786        unsigned length : 9;
787        unsigned pad0 : 23;
788    } dw1;
789} sis_state, ssb_state, msb_state, psp_state, psc_state;
790
791typedef struct _state_dword
792{
793    struct {
794        unsigned valid : 1;
795        unsigned reset : 1;
796        unsigned buffer_address : 30;
797    } dw0;
798} dis_state;
799
800struct i915_3dstate_load_indirect
801{
802    struct {
803        unsigned length : 8;
804        unsigned block_mask : 6;
805        unsigned mem_select : 1;
806        unsigned pad0 : 1;
807        unsigned opcode : 13;
808        unsigned type : 3;
809    } dw0;
810};
811
812#define TEXCOORDFMT_2FP       0x00
813#define TEXCOORDFMT_3FP       0x01
814#define TEXCOORDFMT_4FP       0x02
815#define TEXCOORDFMT_1FP       0x03
816#define TEXCOORDFMT_2FP_16    0x04
817#define TEXCOORDFMT_4FP_16    0x05
818#define TEXCOORDFMT_NOT_PRESENT  0x0f
819struct s2_dword
820{
821    unsigned set0_texcoord_fmt : 4;
822    unsigned set1_texcoord_fmt : 4;
823    unsigned set2_texcoord_fmt : 4;
824    unsigned set3_texcoord_fmt : 4;
825    unsigned set4_texcoord_fmt : 4;
826    unsigned set5_texcoord_fmt : 4;
827    unsigned set6_texcoord_fmt : 4;
828    unsigned set7_texcoord_fmt : 4;
829};
830
831struct s3_dword
832{
833    unsigned set0_pcd : 1;
834    unsigned set0_ws_tcz : 1;
835    unsigned set0_ws_tcy : 1;
836    unsigned set0_ws_tcx : 1;
837    unsigned set1_pcd : 1;
838    unsigned set1_ws_tcz : 1;
839    unsigned set1_ws_tcy : 1;
840    unsigned set1_ws_tcx : 1;
841    unsigned set2_pcd : 1;
842    unsigned set2_ws_tcz : 1;
843    unsigned set2_ws_tcy : 1;
844    unsigned set2_ws_tcx : 1;
845    unsigned set3_pcd : 1;
846    unsigned set3_ws_tcz : 1;
847    unsigned set3_ws_tcy : 1;
848    unsigned set3_ws_tcx : 1;
849    unsigned set4_pcd : 1;
850    unsigned set4_ws_tcz : 1;
851    unsigned set4_ws_tcy : 1;
852    unsigned set4_ws_tcx : 1;
853    unsigned set5_pcd : 1;
854    unsigned set5_ws_tcz : 1;
855    unsigned set5_ws_tcy : 1;
856    unsigned set5_ws_tcx : 1;
857    unsigned set6_pcd : 1;
858    unsigned set6_ws_tcz : 1;
859    unsigned set6_ws_tcy : 1;
860    unsigned set6_ws_tcx : 1;
861    unsigned set7_pcd : 1;
862    unsigned set7_ws_tcz : 1;
863    unsigned set7_ws_tcy : 1;
864    unsigned set7_ws_tcx : 1;
865};
866
867#define VERTEXHAS_XYZ      1
868#define VERTEXHAS_XYZW     2
869#define VERTEXHAS_XY       3
870#define VERTEXHAS_XYW      4
871
872#define CULLMODE_BOTH      0
873#define CULLMODE_NONE      1
874#define CULLMODE_CW        2
875#define CULLMODE_CCW       3
876
877#define SHADEMODE_LINEAR   0
878#define SHADEMODE_FLAT     1
879struct s4_dword
880{
881    unsigned anti_aliasing_enable : 1;
882    unsigned sprite_point_enable : 1;
883    unsigned fog_parameter_present : 1;
884    unsigned local_depth_offset_enable : 1;
885    unsigned force_specular_diffuse_color : 1;
886    unsigned force_default_diffuse_color : 1;
887    unsigned position_mask : 3;
888    unsigned local_depth_offset_present : 1;
889    unsigned diffuse_color_presetn : 1;
890    unsigned specular_color_fog_factor_present : 1;
891    unsigned point_width_present : 1;
892    unsigned cull_mode : 2;
893    unsigned color_shade_mode : 1;
894    unsigned specular_shade_mode : 1;
895    unsigned fog_shade_mode : 1;
896    unsigned alpha_shade_mode : 1;
897    unsigned line_width : 4;
898    unsigned point_width : 9;
899};
900
901struct s5_dword
902{
903    unsigned logic_op_enable : 1;
904    unsigned color_dither_enable  : 1;
905    unsigned stencil_test_enable : 1;
906    unsigned stencil_buffer_write_enable : 1;
907    unsigned stencil_pass_depth_pass_op : 3;
908    unsigned stencil_pass_depth_fail_op : 3;
909    unsigned stencil_fail_op : 3;
910    unsigned stencil_test_function : 3;
911    unsigned stencil_reference_value : 8;
912    unsigned fog_enable : 1;
913    unsigned global_depth_offset_enable : 1;
914    unsigned last_pixel_enable : 1;
915    unsigned force_default_point_width : 1;
916    unsigned color_buffer_component_write_disable : 4;
917};
918
919struct s6_dword
920{
921    unsigned triangle_pv : 2;
922    unsigned color_buffer_write : 1;
923    unsigned depth_buffer_write : 1;
924    unsigned dest_blend_factor : 4;
925    unsigned src_blend_factor : 4;
926    unsigned color_blend_function : 3;
927    unsigned color_buffer_blend : 1;
928    unsigned depth_test_function : 3;
929    unsigned depth_test_enable : 1;
930    unsigned alpha_reference_value : 8;
931    unsigned alpha_test_function : 3;
932    unsigned alpha_test_enable : 1;
933
934};
935
936struct s7_dword
937{
938    unsigned global_depth_offset_const;
939};
940
941struct i915_3dstate_load_state_immediate_1
942{
943    struct {
944        unsigned length : 4;
945        unsigned load_s0 : 1;
946        unsigned load_s1 : 1;
947        unsigned load_s2 : 1;
948        unsigned load_s3 : 1;
949        unsigned load_s4 : 1;
950        unsigned load_s5 : 1;
951        unsigned load_s6 : 1;
952        unsigned load_s7 : 1;
953        unsigned pad0 : 4;
954        unsigned opcode : 13;
955        unsigned type : 3;
956    } dw0;
957};
958
959struct i915_3dstate_scissor_rectangle
960{
961    struct {
962        unsigned length : 16;
963        unsigned opcode : 13;
964        unsigned type : 3;
965    } dw0;
966
967    struct {
968        unsigned min_x : 16;
969        unsigned min_y : 16;
970    } dw1;
971
972    struct {
973        unsigned max_x : 16;
974        unsigned max_y : 16;
975    } dw2;
976};
977
978#define VERTEX_INLINE         0x00
979#define VERTEX_INDIRECT       0x01
980
981#define PRIM_TRILIST          0x00
982#define PRIM_TRISTRIP         0x01
983#define PRIM_TRISTRIP_REVERSE 0x02
984#define PRIM_TRIFAN           0x03
985#define PRIM_POLYGON          0x04
986#define PRIM_LINELIST         0x05
987#define PRIM_LINESTRIP        0x06
988#define PRIM_RECTLIST         0x07
989#define PRIM_POINTLIST        0x08
990#define PRIM_DIB              0x09
991#define PRIM_CLEAR_RECT       0x0a
992#define PRIM_ZONE_INIT        0x0d
993
994struct texture_coordinate_set
995{
996    unsigned tcx;
997    unsigned tcy;
998};
999
1000struct vertex_data
1001{
1002    unsigned x;
1003    unsigned y;
1004    struct texture_coordinate_set tc0;
1005    struct texture_coordinate_set tc1;
1006};
1007
1008struct i915_3dprimitive
1009{
1010    union {
1011        struct {
1012            unsigned length : 18;
1013            unsigned prim : 5;
1014            unsigned vertex_location : 1;
1015            unsigned opcode : 5;
1016            unsigned type : 3;
1017        } inline_prim;
1018
1019        struct {
1020            unsigned vertex_count : 16;
1021            unsigned pad0 : 1;
1022            unsigned vertex_access_mode : 1;
1023            unsigned prim : 5;
1024            unsigned vertex_location : 1;
1025            unsigned opcode : 5;
1026            unsigned type : 3;
1027        } indirect_prim;
1028    } dw0;
1029};
1030#endif /*_I915_STRUCTS_H */
1031