1b8e80941Smrg/*
2b8e80941Smrg Copyright (C) Intel Corp.  2006.  All Rights Reserved.
3b8e80941Smrg Intel funded Tungsten Graphics to
4b8e80941Smrg develop this 3D driver.
5b8e80941Smrg
6b8e80941Smrg Permission is hereby granted, free of charge, to any person obtaining
7b8e80941Smrg a copy of this software and associated documentation files (the
8b8e80941Smrg "Software"), to deal in the Software without restriction, including
9b8e80941Smrg without limitation the rights to use, copy, modify, merge, publish,
10b8e80941Smrg distribute, sublicense, and/or sell copies of the Software, and to
11b8e80941Smrg permit persons to whom the Software is furnished to do so, subject to
12b8e80941Smrg the following conditions:
13b8e80941Smrg
14b8e80941Smrg The above copyright notice and this permission notice (including the
15b8e80941Smrg next paragraph) shall be included in all copies or substantial
16b8e80941Smrg portions of the Software.
17b8e80941Smrg
18b8e80941Smrg THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19b8e80941Smrg EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20b8e80941Smrg MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21b8e80941Smrg IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22b8e80941Smrg LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23b8e80941Smrg OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24b8e80941Smrg WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25b8e80941Smrg
26b8e80941Smrg **********************************************************************/
27b8e80941Smrg /*
28b8e80941Smrg  * Authors:
29b8e80941Smrg  *   Keith Whitwell <keithw@vmware.com>
30b8e80941Smrg  */
31b8e80941Smrg
32b8e80941Smrg#ifndef BRW_EU_DEFINES_H
33b8e80941Smrg#define BRW_EU_DEFINES_H
34b8e80941Smrg
35b8e80941Smrg#include "util/macros.h"
36b8e80941Smrg
37b8e80941Smrg/* The following hunk, up-to "Execution Unit" is used by both the
38b8e80941Smrg * intel/compiler and i965 codebase. */
39b8e80941Smrg
40b8e80941Smrg#define INTEL_MASK(high, low) (((1u<<((high)-(low)+1))-1)<<(low))
41b8e80941Smrg/* Using the GNU statement expression extension */
42b8e80941Smrg#define SET_FIELD(value, field)                                         \
43b8e80941Smrg   ({                                                                   \
44b8e80941Smrg      uint32_t fieldval = (uint32_t)(value) << field ## _SHIFT;         \
45b8e80941Smrg      assert((fieldval & ~ field ## _MASK) == 0);                       \
46b8e80941Smrg      fieldval & field ## _MASK;                                        \
47b8e80941Smrg   })
48b8e80941Smrg
49b8e80941Smrg#define SET_BITS(value, high, low)                                      \
50b8e80941Smrg   ({                                                                   \
51b8e80941Smrg      const uint32_t fieldval = (uint32_t)(value) << (low);             \
52b8e80941Smrg      assert((fieldval & ~INTEL_MASK(high, low)) == 0);                 \
53b8e80941Smrg      fieldval & INTEL_MASK(high, low);                                 \
54b8e80941Smrg   })
55b8e80941Smrg
56b8e80941Smrg#define GET_BITS(data, high, low) ((data & INTEL_MASK((high), (low))) >> (low))
57b8e80941Smrg#define GET_FIELD(word, field) (((word)  & field ## _MASK) >> field ## _SHIFT)
58b8e80941Smrg
59b8e80941Smrg#define _3DPRIM_POINTLIST         0x01
60b8e80941Smrg#define _3DPRIM_LINELIST          0x02
61b8e80941Smrg#define _3DPRIM_LINESTRIP         0x03
62b8e80941Smrg#define _3DPRIM_TRILIST           0x04
63b8e80941Smrg#define _3DPRIM_TRISTRIP          0x05
64b8e80941Smrg#define _3DPRIM_TRIFAN            0x06
65b8e80941Smrg#define _3DPRIM_QUADLIST          0x07
66b8e80941Smrg#define _3DPRIM_QUADSTRIP         0x08
67b8e80941Smrg#define _3DPRIM_LINELIST_ADJ      0x09 /* G45+ */
68b8e80941Smrg#define _3DPRIM_LINESTRIP_ADJ     0x0A /* G45+ */
69b8e80941Smrg#define _3DPRIM_TRILIST_ADJ       0x0B /* G45+ */
70b8e80941Smrg#define _3DPRIM_TRISTRIP_ADJ      0x0C /* G45+ */
71b8e80941Smrg#define _3DPRIM_TRISTRIP_REVERSE  0x0D
72b8e80941Smrg#define _3DPRIM_POLYGON           0x0E
73b8e80941Smrg#define _3DPRIM_RECTLIST          0x0F
74b8e80941Smrg#define _3DPRIM_LINELOOP          0x10
75b8e80941Smrg#define _3DPRIM_POINTLIST_BF      0x11
76b8e80941Smrg#define _3DPRIM_LINESTRIP_CONT    0x12
77b8e80941Smrg#define _3DPRIM_LINESTRIP_BF      0x13
78b8e80941Smrg#define _3DPRIM_LINESTRIP_CONT_BF 0x14
79b8e80941Smrg#define _3DPRIM_TRIFAN_NOSTIPPLE  0x16
80b8e80941Smrg#define _3DPRIM_PATCHLIST(n) ({ assert(n > 0 && n <= 32); 0x20 + (n - 1); })
81b8e80941Smrg
82b8e80941Smrg/* Bitfields for the URB_WRITE message, DW2 of message header: */
83b8e80941Smrg#define URB_WRITE_PRIM_END		0x1
84b8e80941Smrg#define URB_WRITE_PRIM_START		0x2
85b8e80941Smrg#define URB_WRITE_PRIM_TYPE_SHIFT	2
86b8e80941Smrg
87b8e80941Smrg#define BRW_SPRITE_POINT_ENABLE  16
88b8e80941Smrg
89b8e80941Smrg# define GEN7_GS_CONTROL_DATA_FORMAT_GSCTL_CUT		0
90b8e80941Smrg# define GEN7_GS_CONTROL_DATA_FORMAT_GSCTL_SID		1
91b8e80941Smrg
92b8e80941Smrg/* Execution Unit (EU) defines
93b8e80941Smrg */
94b8e80941Smrg
95b8e80941Smrg#define BRW_ALIGN_1   0
96b8e80941Smrg#define BRW_ALIGN_16  1
97b8e80941Smrg
98b8e80941Smrg#define BRW_ADDRESS_DIRECT                        0
99b8e80941Smrg#define BRW_ADDRESS_REGISTER_INDIRECT_REGISTER    1
100b8e80941Smrg
101b8e80941Smrg#define BRW_CHANNEL_X     0
102b8e80941Smrg#define BRW_CHANNEL_Y     1
103b8e80941Smrg#define BRW_CHANNEL_Z     2
104b8e80941Smrg#define BRW_CHANNEL_W     3
105b8e80941Smrg
106b8e80941Smrgenum brw_compression {
107b8e80941Smrg   BRW_COMPRESSION_NONE       = 0,
108b8e80941Smrg   BRW_COMPRESSION_2NDHALF    = 1,
109b8e80941Smrg   BRW_COMPRESSION_COMPRESSED = 2,
110b8e80941Smrg};
111b8e80941Smrg
112b8e80941Smrg#define GEN6_COMPRESSION_1Q		0
113b8e80941Smrg#define GEN6_COMPRESSION_2Q		1
114b8e80941Smrg#define GEN6_COMPRESSION_3Q		2
115b8e80941Smrg#define GEN6_COMPRESSION_4Q		3
116b8e80941Smrg#define GEN6_COMPRESSION_1H		0
117b8e80941Smrg#define GEN6_COMPRESSION_2H		2
118b8e80941Smrg
119b8e80941Smrgenum PACKED brw_conditional_mod {
120b8e80941Smrg   BRW_CONDITIONAL_NONE = 0,
121b8e80941Smrg   BRW_CONDITIONAL_Z    = 1,
122b8e80941Smrg   BRW_CONDITIONAL_NZ   = 2,
123b8e80941Smrg   BRW_CONDITIONAL_EQ   = 1,	/* Z */
124b8e80941Smrg   BRW_CONDITIONAL_NEQ  = 2,	/* NZ */
125b8e80941Smrg   BRW_CONDITIONAL_G    = 3,
126b8e80941Smrg   BRW_CONDITIONAL_GE   = 4,
127b8e80941Smrg   BRW_CONDITIONAL_L    = 5,
128b8e80941Smrg   BRW_CONDITIONAL_LE   = 6,
129b8e80941Smrg   BRW_CONDITIONAL_R    = 7,    /* Gen <= 5 */
130b8e80941Smrg   BRW_CONDITIONAL_O    = 8,
131b8e80941Smrg   BRW_CONDITIONAL_U    = 9,
132b8e80941Smrg};
133b8e80941Smrg
134b8e80941Smrg#define BRW_DEBUG_NONE        0
135b8e80941Smrg#define BRW_DEBUG_BREAKPOINT  1
136b8e80941Smrg
137b8e80941Smrg#define BRW_DEPENDENCY_NORMAL         0
138b8e80941Smrg#define BRW_DEPENDENCY_NOTCLEARED     1
139b8e80941Smrg#define BRW_DEPENDENCY_NOTCHECKED     2
140b8e80941Smrg#define BRW_DEPENDENCY_DISABLE        3
141b8e80941Smrg
142b8e80941Smrgenum PACKED brw_execution_size {
143b8e80941Smrg   BRW_EXECUTE_1  = 0,
144b8e80941Smrg   BRW_EXECUTE_2  = 1,
145b8e80941Smrg   BRW_EXECUTE_4  = 2,
146b8e80941Smrg   BRW_EXECUTE_8  = 3,
147b8e80941Smrg   BRW_EXECUTE_16 = 4,
148b8e80941Smrg   BRW_EXECUTE_32 = 5,
149b8e80941Smrg};
150b8e80941Smrg
151b8e80941Smrgenum PACKED brw_horizontal_stride {
152b8e80941Smrg   BRW_HORIZONTAL_STRIDE_0 = 0,
153b8e80941Smrg   BRW_HORIZONTAL_STRIDE_1 = 1,
154b8e80941Smrg   BRW_HORIZONTAL_STRIDE_2 = 2,
155b8e80941Smrg   BRW_HORIZONTAL_STRIDE_4 = 3,
156b8e80941Smrg};
157b8e80941Smrg
158b8e80941Smrgenum PACKED gen10_align1_3src_src_horizontal_stride {
159b8e80941Smrg   BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_0 = 0,
160b8e80941Smrg   BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_1 = 1,
161b8e80941Smrg   BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_2 = 2,
162b8e80941Smrg   BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_4 = 3,
163b8e80941Smrg};
164b8e80941Smrg
165b8e80941Smrgenum PACKED gen10_align1_3src_dst_horizontal_stride {
166b8e80941Smrg   BRW_ALIGN1_3SRC_DST_HORIZONTAL_STRIDE_1 = 0,
167b8e80941Smrg   BRW_ALIGN1_3SRC_DST_HORIZONTAL_STRIDE_2 = 1,
168b8e80941Smrg};
169b8e80941Smrg
170b8e80941Smrg#define BRW_INSTRUCTION_NORMAL    0
171b8e80941Smrg#define BRW_INSTRUCTION_SATURATE  1
172b8e80941Smrg
173b8e80941Smrg#define BRW_MASK_ENABLE   0
174b8e80941Smrg#define BRW_MASK_DISABLE  1
175b8e80941Smrg
176b8e80941Smrg/** @{
177b8e80941Smrg *
178b8e80941Smrg * Gen6 has replaced "mask enable/disable" with WECtrl, which is
179b8e80941Smrg * effectively the same but much simpler to think about.  Now, there
180b8e80941Smrg * are two contributors ANDed together to whether channels are
181b8e80941Smrg * executed: The predication on the instruction, and the channel write
182b8e80941Smrg * enable.
183b8e80941Smrg */
184b8e80941Smrg/**
185b8e80941Smrg * This is the default value.  It means that a channel's write enable is set
186b8e80941Smrg * if the per-channel IP is pointing at this instruction.
187b8e80941Smrg */
188b8e80941Smrg#define BRW_WE_NORMAL		0
189b8e80941Smrg/**
190b8e80941Smrg * This is used like BRW_MASK_DISABLE, and causes all channels to have
191b8e80941Smrg * their write enable set.  Note that predication still contributes to
192b8e80941Smrg * whether the channel actually gets written.
193b8e80941Smrg */
194b8e80941Smrg#define BRW_WE_ALL		1
195b8e80941Smrg/** @} */
196b8e80941Smrg
197b8e80941Smrgenum opcode {
198b8e80941Smrg   /* These are the actual hardware opcodes. */
199b8e80941Smrg   BRW_OPCODE_ILLEGAL = 0,
200b8e80941Smrg   BRW_OPCODE_MOV =	1,
201b8e80941Smrg   BRW_OPCODE_SEL =	2,
202b8e80941Smrg   BRW_OPCODE_MOVI =	3,   /**< G45+ */
203b8e80941Smrg   BRW_OPCODE_NOT =	4,
204b8e80941Smrg   BRW_OPCODE_AND =	5,
205b8e80941Smrg   BRW_OPCODE_OR =	6,
206b8e80941Smrg   BRW_OPCODE_XOR =	7,
207b8e80941Smrg   BRW_OPCODE_SHR =	8,
208b8e80941Smrg   BRW_OPCODE_SHL =	9,
209b8e80941Smrg   BRW_OPCODE_DIM =	10,  /**< Gen7.5 only */ /* Reused */
210b8e80941Smrg   BRW_OPCODE_SMOV =	10,  /**< Gen8+       */ /* Reused */
211b8e80941Smrg   /* Reserved - 11 */
212b8e80941Smrg   BRW_OPCODE_ASR =	12,
213b8e80941Smrg   /* Reserved - 13-15 */
214b8e80941Smrg   BRW_OPCODE_CMP =	16,
215b8e80941Smrg   BRW_OPCODE_CMPN =	17,
216b8e80941Smrg   BRW_OPCODE_CSEL =	18,  /**< Gen8+ */
217b8e80941Smrg   BRW_OPCODE_F32TO16 = 19,  /**< Gen7 only */
218b8e80941Smrg   BRW_OPCODE_F16TO32 = 20,  /**< Gen7 only */
219b8e80941Smrg   /* Reserved - 21-22 */
220b8e80941Smrg   BRW_OPCODE_BFREV =	23,  /**< Gen7+ */
221b8e80941Smrg   BRW_OPCODE_BFE =	24,  /**< Gen7+ */
222b8e80941Smrg   BRW_OPCODE_BFI1 =	25,  /**< Gen7+ */
223b8e80941Smrg   BRW_OPCODE_BFI2 =	26,  /**< Gen7+ */
224b8e80941Smrg   /* Reserved - 27-31 */
225b8e80941Smrg   BRW_OPCODE_JMPI =	32,
226b8e80941Smrg   BRW_OPCODE_BRD =	33,  /**< Gen7+ */
227b8e80941Smrg   BRW_OPCODE_IF =	34,
228b8e80941Smrg   BRW_OPCODE_IFF =	35,  /**< Pre-Gen6    */ /* Reused */
229b8e80941Smrg   BRW_OPCODE_BRC =	35,  /**< Gen7+       */ /* Reused */
230b8e80941Smrg   BRW_OPCODE_ELSE =	36,
231b8e80941Smrg   BRW_OPCODE_ENDIF =	37,
232b8e80941Smrg   BRW_OPCODE_DO =	38,  /**< Pre-Gen6    */ /* Reused */
233b8e80941Smrg   BRW_OPCODE_CASE =	38,  /**< Gen6 only   */ /* Reused */
234b8e80941Smrg   BRW_OPCODE_WHILE =	39,
235b8e80941Smrg   BRW_OPCODE_BREAK =	40,
236b8e80941Smrg   BRW_OPCODE_CONTINUE = 41,
237b8e80941Smrg   BRW_OPCODE_HALT =	42,
238b8e80941Smrg   BRW_OPCODE_CALLA =	43,  /**< Gen7.5+     */
239b8e80941Smrg   BRW_OPCODE_MSAVE =	44,  /**< Pre-Gen6    */ /* Reused */
240b8e80941Smrg   BRW_OPCODE_CALL =	44,  /**< Gen6+       */ /* Reused */
241b8e80941Smrg   BRW_OPCODE_MREST =	45,  /**< Pre-Gen6    */ /* Reused */
242b8e80941Smrg   BRW_OPCODE_RET =	45,  /**< Gen6+       */ /* Reused */
243b8e80941Smrg   BRW_OPCODE_PUSH =	46,  /**< Pre-Gen6    */ /* Reused */
244b8e80941Smrg   BRW_OPCODE_FORK =	46,  /**< Gen6 only   */ /* Reused */
245b8e80941Smrg   BRW_OPCODE_GOTO =	46,  /**< Gen8+       */ /* Reused */
246b8e80941Smrg   BRW_OPCODE_POP =	47,  /**< Pre-Gen6    */
247b8e80941Smrg   BRW_OPCODE_WAIT =	48,
248b8e80941Smrg   BRW_OPCODE_SEND =	49,
249b8e80941Smrg   BRW_OPCODE_SENDC =	50,
250b8e80941Smrg   BRW_OPCODE_SENDS =	51,  /**< Gen9+ */
251b8e80941Smrg   BRW_OPCODE_SENDSC =	52,  /**< Gen9+ */
252b8e80941Smrg   /* Reserved 53-55 */
253b8e80941Smrg   BRW_OPCODE_MATH =	56,  /**< Gen6+ */
254b8e80941Smrg   /* Reserved 57-63 */
255b8e80941Smrg   BRW_OPCODE_ADD =	64,
256b8e80941Smrg   BRW_OPCODE_MUL =	65,
257b8e80941Smrg   BRW_OPCODE_AVG =	66,
258b8e80941Smrg   BRW_OPCODE_FRC =	67,
259b8e80941Smrg   BRW_OPCODE_RNDU =	68,
260b8e80941Smrg   BRW_OPCODE_RNDD =	69,
261b8e80941Smrg   BRW_OPCODE_RNDE =	70,
262b8e80941Smrg   BRW_OPCODE_RNDZ =	71,
263b8e80941Smrg   BRW_OPCODE_MAC =	72,
264b8e80941Smrg   BRW_OPCODE_MACH =	73,
265b8e80941Smrg   BRW_OPCODE_LZD =	74,
266b8e80941Smrg   BRW_OPCODE_FBH =	75,  /**< Gen7+ */
267b8e80941Smrg   BRW_OPCODE_FBL =	76,  /**< Gen7+ */
268b8e80941Smrg   BRW_OPCODE_CBIT =	77,  /**< Gen7+ */
269b8e80941Smrg   BRW_OPCODE_ADDC =	78,  /**< Gen7+ */
270b8e80941Smrg   BRW_OPCODE_SUBB =	79,  /**< Gen7+ */
271b8e80941Smrg   BRW_OPCODE_SAD2 =	80,
272b8e80941Smrg   BRW_OPCODE_SADA2 =	81,
273b8e80941Smrg   /* Reserved 82-83 */
274b8e80941Smrg   BRW_OPCODE_DP4 =	84,
275b8e80941Smrg   BRW_OPCODE_DPH =	85,
276b8e80941Smrg   BRW_OPCODE_DP3 =	86,
277b8e80941Smrg   BRW_OPCODE_DP2 =	87,
278b8e80941Smrg   /* Reserved 88 */
279b8e80941Smrg   BRW_OPCODE_LINE =	89,
280b8e80941Smrg   BRW_OPCODE_PLN =	90,  /**< G45+ */
281b8e80941Smrg   BRW_OPCODE_MAD =	91,  /**< Gen6+ */
282b8e80941Smrg   BRW_OPCODE_LRP =	92,  /**< Gen6+ */
283b8e80941Smrg   BRW_OPCODE_MADM =	93,  /**< Gen8+ */
284b8e80941Smrg   /* Reserved 94-124 */
285b8e80941Smrg   BRW_OPCODE_NENOP =	125, /**< G45 only */
286b8e80941Smrg   BRW_OPCODE_NOP =	126,
287b8e80941Smrg   /* Reserved 127 */
288b8e80941Smrg
289b8e80941Smrg   /* These are compiler backend opcodes that get translated into other
290b8e80941Smrg    * instructions.
291b8e80941Smrg    */
292b8e80941Smrg   FS_OPCODE_FB_WRITE = 128,
293b8e80941Smrg
294b8e80941Smrg   /**
295b8e80941Smrg    * Same as FS_OPCODE_FB_WRITE but expects its arguments separately as
296b8e80941Smrg    * individual sources instead of as a single payload blob. The
297b8e80941Smrg    * position/ordering of the arguments are defined by the enum
298b8e80941Smrg    * fb_write_logical_srcs.
299b8e80941Smrg    */
300b8e80941Smrg   FS_OPCODE_FB_WRITE_LOGICAL,
301b8e80941Smrg
302b8e80941Smrg   FS_OPCODE_REP_FB_WRITE,
303b8e80941Smrg
304b8e80941Smrg   FS_OPCODE_FB_READ,
305b8e80941Smrg   FS_OPCODE_FB_READ_LOGICAL,
306b8e80941Smrg
307b8e80941Smrg   SHADER_OPCODE_RCP,
308b8e80941Smrg   SHADER_OPCODE_RSQ,
309b8e80941Smrg   SHADER_OPCODE_SQRT,
310b8e80941Smrg   SHADER_OPCODE_EXP2,
311b8e80941Smrg   SHADER_OPCODE_LOG2,
312b8e80941Smrg   SHADER_OPCODE_POW,
313b8e80941Smrg   SHADER_OPCODE_INT_QUOTIENT,
314b8e80941Smrg   SHADER_OPCODE_INT_REMAINDER,
315b8e80941Smrg   SHADER_OPCODE_SIN,
316b8e80941Smrg   SHADER_OPCODE_COS,
317b8e80941Smrg
318b8e80941Smrg   /**
319b8e80941Smrg    * A generic "send" opcode.  The first two sources are the message
320b8e80941Smrg    * descriptor and extended message descriptor respectively.  The third
321b8e80941Smrg    * and optional fourth sources are the message payload
322b8e80941Smrg    */
323b8e80941Smrg   SHADER_OPCODE_SEND,
324b8e80941Smrg
325b8e80941Smrg   /**
326b8e80941Smrg    * Texture sampling opcodes.
327b8e80941Smrg    *
328b8e80941Smrg    * LOGICAL opcodes are eventually translated to the matching non-LOGICAL
329b8e80941Smrg    * opcode but instead of taking a single payload blob they expect their
330b8e80941Smrg    * arguments separately as individual sources. The position/ordering of the
331b8e80941Smrg    * arguments are defined by the enum tex_logical_srcs.
332b8e80941Smrg    */
333b8e80941Smrg   SHADER_OPCODE_TEX,
334b8e80941Smrg   SHADER_OPCODE_TEX_LOGICAL,
335b8e80941Smrg   SHADER_OPCODE_TXD,
336b8e80941Smrg   SHADER_OPCODE_TXD_LOGICAL,
337b8e80941Smrg   SHADER_OPCODE_TXF,
338b8e80941Smrg   SHADER_OPCODE_TXF_LOGICAL,
339b8e80941Smrg   SHADER_OPCODE_TXF_LZ,
340b8e80941Smrg   SHADER_OPCODE_TXL,
341b8e80941Smrg   SHADER_OPCODE_TXL_LOGICAL,
342b8e80941Smrg   SHADER_OPCODE_TXL_LZ,
343b8e80941Smrg   SHADER_OPCODE_TXS,
344b8e80941Smrg   SHADER_OPCODE_TXS_LOGICAL,
345b8e80941Smrg   FS_OPCODE_TXB,
346b8e80941Smrg   FS_OPCODE_TXB_LOGICAL,
347b8e80941Smrg   SHADER_OPCODE_TXF_CMS,
348b8e80941Smrg   SHADER_OPCODE_TXF_CMS_LOGICAL,
349b8e80941Smrg   SHADER_OPCODE_TXF_CMS_W,
350b8e80941Smrg   SHADER_OPCODE_TXF_CMS_W_LOGICAL,
351b8e80941Smrg   SHADER_OPCODE_TXF_UMS,
352b8e80941Smrg   SHADER_OPCODE_TXF_UMS_LOGICAL,
353b8e80941Smrg   SHADER_OPCODE_TXF_MCS,
354b8e80941Smrg   SHADER_OPCODE_TXF_MCS_LOGICAL,
355b8e80941Smrg   SHADER_OPCODE_LOD,
356b8e80941Smrg   SHADER_OPCODE_LOD_LOGICAL,
357b8e80941Smrg   SHADER_OPCODE_TG4,
358b8e80941Smrg   SHADER_OPCODE_TG4_LOGICAL,
359b8e80941Smrg   SHADER_OPCODE_TG4_OFFSET,
360b8e80941Smrg   SHADER_OPCODE_TG4_OFFSET_LOGICAL,
361b8e80941Smrg   SHADER_OPCODE_SAMPLEINFO,
362b8e80941Smrg   SHADER_OPCODE_SAMPLEINFO_LOGICAL,
363b8e80941Smrg
364b8e80941Smrg   SHADER_OPCODE_IMAGE_SIZE_LOGICAL,
365b8e80941Smrg
366b8e80941Smrg   /**
367b8e80941Smrg    * Combines multiple sources of size 1 into a larger virtual GRF.
368b8e80941Smrg    * For example, parameters for a send-from-GRF message.  Or, updating
369b8e80941Smrg    * channels of a size 4 VGRF used to store vec4s such as texturing results.
370b8e80941Smrg    *
371b8e80941Smrg    * This will be lowered into MOVs from each source to consecutive offsets
372b8e80941Smrg    * of the destination VGRF.
373b8e80941Smrg    *
374b8e80941Smrg    * src[0] may be BAD_FILE.  If so, the lowering pass skips emitting the MOV,
375b8e80941Smrg    * but still reserves the first channel of the destination VGRF.  This can be
376b8e80941Smrg    * used to reserve space for, say, a message header set up by the generators.
377b8e80941Smrg    */
378b8e80941Smrg   SHADER_OPCODE_LOAD_PAYLOAD,
379b8e80941Smrg
380b8e80941Smrg   /**
381b8e80941Smrg    * Packs a number of sources into a single value. Unlike LOAD_PAYLOAD, this
382b8e80941Smrg    * acts intra-channel, obtaining the final value for each channel by
383b8e80941Smrg    * combining the sources values for the same channel, the first source
384b8e80941Smrg    * occupying the lowest bits and the last source occupying the highest
385b8e80941Smrg    * bits.
386b8e80941Smrg    */
387b8e80941Smrg   FS_OPCODE_PACK,
388b8e80941Smrg
389b8e80941Smrg   SHADER_OPCODE_SHADER_TIME_ADD,
390b8e80941Smrg
391b8e80941Smrg   /**
392b8e80941Smrg    * Typed and untyped surface access opcodes.
393b8e80941Smrg    *
394b8e80941Smrg    * LOGICAL opcodes are eventually translated to the matching non-LOGICAL
395b8e80941Smrg    * opcode but instead of taking a single payload blob they expect their
396b8e80941Smrg    * arguments separately as individual sources:
397b8e80941Smrg    *
398b8e80941Smrg    * Source 0: [required] Surface coordinates.
399b8e80941Smrg    * Source 1: [optional] Operation source.
400b8e80941Smrg    * Source 2: [required] Surface index.
401b8e80941Smrg    * Source 3: [required] Number of coordinate components (as UD immediate).
402b8e80941Smrg    * Source 4: [required] Opcode-specific control immediate, same as source 2
403b8e80941Smrg    *                      of the matching non-LOGICAL opcode.
404b8e80941Smrg    */
405b8e80941Smrg   VEC4_OPCODE_UNTYPED_ATOMIC,
406b8e80941Smrg   SHADER_OPCODE_UNTYPED_ATOMIC_LOGICAL,
407b8e80941Smrg   SHADER_OPCODE_UNTYPED_ATOMIC_FLOAT_LOGICAL,
408b8e80941Smrg   VEC4_OPCODE_UNTYPED_SURFACE_READ,
409b8e80941Smrg   SHADER_OPCODE_UNTYPED_SURFACE_READ_LOGICAL,
410b8e80941Smrg   VEC4_OPCODE_UNTYPED_SURFACE_WRITE,
411b8e80941Smrg   SHADER_OPCODE_UNTYPED_SURFACE_WRITE_LOGICAL,
412b8e80941Smrg
413b8e80941Smrg   /**
414b8e80941Smrg    * Untyped A64 surface access opcodes.
415b8e80941Smrg    *
416b8e80941Smrg    * Source 0: 64-bit address
417b8e80941Smrg    * Source 1: Operational source
418b8e80941Smrg    * Source 2: [required] Opcode-specific control immediate, same as source 2
419b8e80941Smrg    *                      of the matching non-LOGICAL opcode.
420b8e80941Smrg    */
421b8e80941Smrg   SHADER_OPCODE_A64_UNTYPED_READ_LOGICAL,
422b8e80941Smrg   SHADER_OPCODE_A64_UNTYPED_WRITE_LOGICAL,
423b8e80941Smrg   SHADER_OPCODE_A64_BYTE_SCATTERED_READ_LOGICAL,
424b8e80941Smrg   SHADER_OPCODE_A64_BYTE_SCATTERED_WRITE_LOGICAL,
425b8e80941Smrg   SHADER_OPCODE_A64_UNTYPED_ATOMIC_LOGICAL,
426b8e80941Smrg   SHADER_OPCODE_A64_UNTYPED_ATOMIC_INT64_LOGICAL,
427b8e80941Smrg   SHADER_OPCODE_A64_UNTYPED_ATOMIC_FLOAT_LOGICAL,
428b8e80941Smrg
429b8e80941Smrg   SHADER_OPCODE_TYPED_ATOMIC_LOGICAL,
430b8e80941Smrg   SHADER_OPCODE_TYPED_SURFACE_READ_LOGICAL,
431b8e80941Smrg   SHADER_OPCODE_TYPED_SURFACE_WRITE_LOGICAL,
432b8e80941Smrg
433b8e80941Smrg   SHADER_OPCODE_RND_MODE,
434b8e80941Smrg
435b8e80941Smrg   /**
436b8e80941Smrg    * Byte scattered write/read opcodes.
437b8e80941Smrg    *
438b8e80941Smrg    * LOGICAL opcodes are eventually translated to the matching non-LOGICAL
439b8e80941Smrg    * opcode, but instead of taking a single payload blog they expect their
440b8e80941Smrg    * arguments separately as individual sources, like untyped write/read.
441b8e80941Smrg    */
442b8e80941Smrg   SHADER_OPCODE_BYTE_SCATTERED_READ_LOGICAL,
443b8e80941Smrg   SHADER_OPCODE_BYTE_SCATTERED_WRITE_LOGICAL,
444b8e80941Smrg
445b8e80941Smrg   SHADER_OPCODE_MEMORY_FENCE,
446b8e80941Smrg
447b8e80941Smrg   SHADER_OPCODE_GEN4_SCRATCH_READ,
448b8e80941Smrg   SHADER_OPCODE_GEN4_SCRATCH_WRITE,
449b8e80941Smrg   SHADER_OPCODE_GEN7_SCRATCH_READ,
450b8e80941Smrg
451b8e80941Smrg   /**
452b8e80941Smrg    * Gen8+ SIMD8 URB Read messages.
453b8e80941Smrg    */
454b8e80941Smrg   SHADER_OPCODE_URB_READ_SIMD8,
455b8e80941Smrg   SHADER_OPCODE_URB_READ_SIMD8_PER_SLOT,
456b8e80941Smrg
457b8e80941Smrg   SHADER_OPCODE_URB_WRITE_SIMD8,
458b8e80941Smrg   SHADER_OPCODE_URB_WRITE_SIMD8_PER_SLOT,
459b8e80941Smrg   SHADER_OPCODE_URB_WRITE_SIMD8_MASKED,
460b8e80941Smrg   SHADER_OPCODE_URB_WRITE_SIMD8_MASKED_PER_SLOT,
461b8e80941Smrg
462b8e80941Smrg   /**
463b8e80941Smrg    * Return the index of an arbitrary live channel (i.e. one of the channels
464b8e80941Smrg    * enabled in the current execution mask) and assign it to the first
465b8e80941Smrg    * component of the destination.  Expected to be used as input for the
466b8e80941Smrg    * BROADCAST pseudo-opcode.
467b8e80941Smrg    */
468b8e80941Smrg   SHADER_OPCODE_FIND_LIVE_CHANNEL,
469b8e80941Smrg
470b8e80941Smrg   /**
471b8e80941Smrg    * Pick the channel from its first source register given by the index
472b8e80941Smrg    * specified as second source.  Useful for variable indexing of surfaces.
473b8e80941Smrg    *
474b8e80941Smrg    * Note that because the result of this instruction is by definition
475b8e80941Smrg    * uniform and it can always be splatted to multiple channels using a
476b8e80941Smrg    * scalar regioning mode, only the first channel of the destination region
477b8e80941Smrg    * is guaranteed to be updated, which implies that BROADCAST instructions
478b8e80941Smrg    * should usually be marked force_writemask_all.
479b8e80941Smrg    */
480b8e80941Smrg   SHADER_OPCODE_BROADCAST,
481b8e80941Smrg
482b8e80941Smrg   /* Pick the channel from its first source register given by the index
483b8e80941Smrg    * specified as second source.
484b8e80941Smrg    *
485b8e80941Smrg    * This is similar to the BROADCAST instruction except that it takes a
486b8e80941Smrg    * dynamic index and potentially puts a different value in each output
487b8e80941Smrg    * channel.
488b8e80941Smrg    */
489b8e80941Smrg   SHADER_OPCODE_SHUFFLE,
490b8e80941Smrg
491b8e80941Smrg   /* Select between src0 and src1 based on channel enables.
492b8e80941Smrg    *
493b8e80941Smrg    * This instruction copies src0 into the enabled channels of the
494b8e80941Smrg    * destination and copies src1 into the disabled channels.
495b8e80941Smrg    */
496b8e80941Smrg   SHADER_OPCODE_SEL_EXEC,
497b8e80941Smrg
498b8e80941Smrg   /* This turns into an align16 mov from src0 to dst with a swizzle
499b8e80941Smrg    * provided as an immediate in src1.
500b8e80941Smrg    */
501b8e80941Smrg   SHADER_OPCODE_QUAD_SWIZZLE,
502b8e80941Smrg
503b8e80941Smrg   /* Take every Nth element in src0 and broadcast it to the group of N
504b8e80941Smrg    * channels in which it lives in the destination.  The offset within the
505b8e80941Smrg    * cluster is given by src1 and the cluster size is given by src2.
506b8e80941Smrg    */
507b8e80941Smrg   SHADER_OPCODE_CLUSTER_BROADCAST,
508b8e80941Smrg
509b8e80941Smrg   SHADER_OPCODE_GET_BUFFER_SIZE,
510b8e80941Smrg
511b8e80941Smrg   SHADER_OPCODE_INTERLOCK,
512b8e80941Smrg
513b8e80941Smrg   VEC4_OPCODE_MOV_BYTES,
514b8e80941Smrg   VEC4_OPCODE_PACK_BYTES,
515b8e80941Smrg   VEC4_OPCODE_UNPACK_UNIFORM,
516b8e80941Smrg   VEC4_OPCODE_DOUBLE_TO_F32,
517b8e80941Smrg   VEC4_OPCODE_DOUBLE_TO_D32,
518b8e80941Smrg   VEC4_OPCODE_DOUBLE_TO_U32,
519b8e80941Smrg   VEC4_OPCODE_TO_DOUBLE,
520b8e80941Smrg   VEC4_OPCODE_PICK_LOW_32BIT,
521b8e80941Smrg   VEC4_OPCODE_PICK_HIGH_32BIT,
522b8e80941Smrg   VEC4_OPCODE_SET_LOW_32BIT,
523b8e80941Smrg   VEC4_OPCODE_SET_HIGH_32BIT,
524b8e80941Smrg
525b8e80941Smrg   FS_OPCODE_DDX_COARSE,
526b8e80941Smrg   FS_OPCODE_DDX_FINE,
527b8e80941Smrg   /**
528b8e80941Smrg    * Compute dFdy(), dFdyCoarse(), or dFdyFine().
529b8e80941Smrg    */
530b8e80941Smrg   FS_OPCODE_DDY_COARSE,
531b8e80941Smrg   FS_OPCODE_DDY_FINE,
532b8e80941Smrg   FS_OPCODE_LINTERP,
533b8e80941Smrg   FS_OPCODE_PIXEL_X,
534b8e80941Smrg   FS_OPCODE_PIXEL_Y,
535b8e80941Smrg   FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD,
536b8e80941Smrg   FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD_GEN7,
537b8e80941Smrg   FS_OPCODE_VARYING_PULL_CONSTANT_LOAD_GEN4,
538b8e80941Smrg   FS_OPCODE_VARYING_PULL_CONSTANT_LOAD_LOGICAL,
539b8e80941Smrg   FS_OPCODE_DISCARD_JUMP,
540b8e80941Smrg   FS_OPCODE_SET_SAMPLE_ID,
541b8e80941Smrg   FS_OPCODE_PACK_HALF_2x16_SPLIT,
542b8e80941Smrg   FS_OPCODE_PLACEHOLDER_HALT,
543b8e80941Smrg   FS_OPCODE_INTERPOLATE_AT_SAMPLE,
544b8e80941Smrg   FS_OPCODE_INTERPOLATE_AT_SHARED_OFFSET,
545b8e80941Smrg   FS_OPCODE_INTERPOLATE_AT_PER_SLOT_OFFSET,
546b8e80941Smrg
547b8e80941Smrg   VS_OPCODE_URB_WRITE,
548b8e80941Smrg   VS_OPCODE_PULL_CONSTANT_LOAD,
549b8e80941Smrg   VS_OPCODE_PULL_CONSTANT_LOAD_GEN7,
550b8e80941Smrg   VS_OPCODE_SET_SIMD4X2_HEADER_GEN9,
551b8e80941Smrg
552b8e80941Smrg   VS_OPCODE_UNPACK_FLAGS_SIMD4X2,
553b8e80941Smrg
554b8e80941Smrg   /**
555b8e80941Smrg    * Write geometry shader output data to the URB.
556b8e80941Smrg    *
557b8e80941Smrg    * Unlike VS_OPCODE_URB_WRITE, this opcode doesn't do an implied move from
558b8e80941Smrg    * R0 to the first MRF.  This allows the geometry shader to override the
559b8e80941Smrg    * "Slot {0,1} Offset" fields in the message header.
560b8e80941Smrg    */
561b8e80941Smrg   GS_OPCODE_URB_WRITE,
562b8e80941Smrg
563b8e80941Smrg   /**
564b8e80941Smrg    * Write geometry shader output data to the URB and request a new URB
565b8e80941Smrg    * handle (gen6).
566b8e80941Smrg    *
567b8e80941Smrg    * This opcode doesn't do an implied move from R0 to the first MRF.
568b8e80941Smrg    */
569b8e80941Smrg   GS_OPCODE_URB_WRITE_ALLOCATE,
570b8e80941Smrg
571b8e80941Smrg   /**
572b8e80941Smrg    * Terminate the geometry shader thread by doing an empty URB write.
573b8e80941Smrg    *
574b8e80941Smrg    * This opcode doesn't do an implied move from R0 to the first MRF.  This
575b8e80941Smrg    * allows the geometry shader to override the "GS Number of Output Vertices
576b8e80941Smrg    * for Slot {0,1}" fields in the message header.
577b8e80941Smrg    */
578b8e80941Smrg   GS_OPCODE_THREAD_END,
579b8e80941Smrg
580b8e80941Smrg   /**
581b8e80941Smrg    * Set the "Slot {0,1} Offset" fields of a URB_WRITE message header.
582b8e80941Smrg    *
583b8e80941Smrg    * - dst is the MRF containing the message header.
584b8e80941Smrg    *
585b8e80941Smrg    * - src0.x indicates which portion of the URB should be written to (e.g. a
586b8e80941Smrg    *   vertex number)
587b8e80941Smrg    *
588b8e80941Smrg    * - src1 is an immediate multiplier which will be applied to src0
589b8e80941Smrg    *   (e.g. the size of a single vertex in the URB).
590b8e80941Smrg    *
591b8e80941Smrg    * Note: the hardware will apply this offset *in addition to* the offset in
592b8e80941Smrg    * vec4_instruction::offset.
593b8e80941Smrg    */
594b8e80941Smrg   GS_OPCODE_SET_WRITE_OFFSET,
595b8e80941Smrg
596b8e80941Smrg   /**
597b8e80941Smrg    * Set the "GS Number of Output Vertices for Slot {0,1}" fields of a
598b8e80941Smrg    * URB_WRITE message header.
599b8e80941Smrg    *
600b8e80941Smrg    * - dst is the MRF containing the message header.
601b8e80941Smrg    *
602b8e80941Smrg    * - src0.x is the vertex count.  The upper 16 bits will be ignored.
603b8e80941Smrg    */
604b8e80941Smrg   GS_OPCODE_SET_VERTEX_COUNT,
605b8e80941Smrg
606b8e80941Smrg   /**
607b8e80941Smrg    * Set DWORD 2 of dst to the value in src.
608b8e80941Smrg    */
609b8e80941Smrg   GS_OPCODE_SET_DWORD_2,
610b8e80941Smrg
611b8e80941Smrg   /**
612b8e80941Smrg    * Prepare the dst register for storage in the "Channel Mask" fields of a
613b8e80941Smrg    * URB_WRITE message header.
614b8e80941Smrg    *
615b8e80941Smrg    * DWORD 4 of dst is shifted left by 4 bits, so that later,
616b8e80941Smrg    * GS_OPCODE_SET_CHANNEL_MASKS can OR DWORDs 0 and 4 together to form the
617b8e80941Smrg    * final channel mask.
618b8e80941Smrg    *
619b8e80941Smrg    * Note: since GS_OPCODE_SET_CHANNEL_MASKS ORs DWORDs 0 and 4 together to
620b8e80941Smrg    * form the final channel mask, DWORDs 0 and 4 of the dst register must not
621b8e80941Smrg    * have any extraneous bits set prior to execution of this opcode (that is,
622b8e80941Smrg    * they should be in the range 0x0 to 0xf).
623b8e80941Smrg    */
624b8e80941Smrg   GS_OPCODE_PREPARE_CHANNEL_MASKS,
625b8e80941Smrg
626b8e80941Smrg   /**
627b8e80941Smrg    * Set the "Channel Mask" fields of a URB_WRITE message header.
628b8e80941Smrg    *
629b8e80941Smrg    * - dst is the MRF containing the message header.
630b8e80941Smrg    *
631b8e80941Smrg    * - src.x is the channel mask, as prepared by
632b8e80941Smrg    *   GS_OPCODE_PREPARE_CHANNEL_MASKS.  DWORDs 0 and 4 are OR'ed together to
633b8e80941Smrg    *   form the final channel mask.
634b8e80941Smrg    */
635b8e80941Smrg   GS_OPCODE_SET_CHANNEL_MASKS,
636b8e80941Smrg
637b8e80941Smrg   /**
638b8e80941Smrg    * Get the "Instance ID" fields from the payload.
639b8e80941Smrg    *
640b8e80941Smrg    * - dst is the GRF for gl_InvocationID.
641b8e80941Smrg    */
642b8e80941Smrg   GS_OPCODE_GET_INSTANCE_ID,
643b8e80941Smrg
644b8e80941Smrg   /**
645b8e80941Smrg    * Send a FF_SYNC message to allocate initial URB handles (gen6).
646b8e80941Smrg    *
647b8e80941Smrg    * - dst will be used as the writeback register for the FF_SYNC operation.
648b8e80941Smrg    *
649b8e80941Smrg    * - src0 is the number of primitives written.
650b8e80941Smrg    *
651b8e80941Smrg    * - src1 is the value to hold in M0.0: number of SO vertices to write
652b8e80941Smrg    *   and number of SO primitives needed. Its value will be overwritten
653b8e80941Smrg    *   with the SVBI values if transform feedback is enabled.
654b8e80941Smrg    *
655b8e80941Smrg    * Note: This opcode uses an implicit MRF register for the ff_sync message
656b8e80941Smrg    * header, so the caller is expected to set inst->base_mrf and initialize
657b8e80941Smrg    * that MRF register to r0. This opcode will also write to this MRF register
658b8e80941Smrg    * to include the allocated URB handle so it can then be reused directly as
659b8e80941Smrg    * the header in the URB write operation we are allocating the handle for.
660b8e80941Smrg    */
661b8e80941Smrg   GS_OPCODE_FF_SYNC,
662b8e80941Smrg
663b8e80941Smrg   /**
664b8e80941Smrg    * Move r0.1 (which holds PrimitiveID information in gen6) to a separate
665b8e80941Smrg    * register.
666b8e80941Smrg    *
667b8e80941Smrg    * - dst is the GRF where PrimitiveID information will be moved.
668b8e80941Smrg    */
669b8e80941Smrg   GS_OPCODE_SET_PRIMITIVE_ID,
670b8e80941Smrg
671b8e80941Smrg   /**
672b8e80941Smrg    * Write transform feedback data to the SVB by sending a SVB WRITE message.
673b8e80941Smrg    * Used in gen6.
674b8e80941Smrg    *
675b8e80941Smrg    * - dst is the MRF register containing the message header.
676b8e80941Smrg    *
677b8e80941Smrg    * - src0 is the register where the vertex data is going to be copied from.
678b8e80941Smrg    *
679b8e80941Smrg    * - src1 is the destination register when write commit occurs.
680b8e80941Smrg    */
681b8e80941Smrg   GS_OPCODE_SVB_WRITE,
682b8e80941Smrg
683b8e80941Smrg   /**
684b8e80941Smrg    * Set destination index in the SVB write message payload (M0.5). Used
685b8e80941Smrg    * in gen6 for transform feedback.
686b8e80941Smrg    *
687b8e80941Smrg    * - dst is the header to save the destination indices for SVB WRITE.
688b8e80941Smrg    * - src is the register that holds the destination indices value.
689b8e80941Smrg    */
690b8e80941Smrg   GS_OPCODE_SVB_SET_DST_INDEX,
691b8e80941Smrg
692b8e80941Smrg   /**
693b8e80941Smrg    * Prepare Mx.0 subregister for being used in the FF_SYNC message header.
694b8e80941Smrg    * Used in gen6 for transform feedback.
695b8e80941Smrg    *
696b8e80941Smrg    * - dst will hold the register with the final Mx.0 value.
697b8e80941Smrg    *
698b8e80941Smrg    * - src0 has the number of vertices emitted in SO (NumSOVertsToWrite)
699b8e80941Smrg    *
700b8e80941Smrg    * - src1 has the number of needed primitives for SO (NumSOPrimsNeeded)
701b8e80941Smrg    *
702b8e80941Smrg    * - src2 is the value to hold in M0: number of SO vertices to write
703b8e80941Smrg    *   and number of SO primitives needed.
704b8e80941Smrg    */
705b8e80941Smrg   GS_OPCODE_FF_SYNC_SET_PRIMITIVES,
706b8e80941Smrg
707b8e80941Smrg   /**
708b8e80941Smrg    * Terminate the compute shader.
709b8e80941Smrg    */
710b8e80941Smrg   CS_OPCODE_CS_TERMINATE,
711b8e80941Smrg
712b8e80941Smrg   /**
713b8e80941Smrg    * GLSL barrier()
714b8e80941Smrg    */
715b8e80941Smrg   SHADER_OPCODE_BARRIER,
716b8e80941Smrg
717b8e80941Smrg   /**
718b8e80941Smrg    * Calculate the high 32-bits of a 32x32 multiply.
719b8e80941Smrg    */
720b8e80941Smrg   SHADER_OPCODE_MULH,
721b8e80941Smrg
722b8e80941Smrg   /**
723b8e80941Smrg    * A MOV that uses VxH indirect addressing.
724b8e80941Smrg    *
725b8e80941Smrg    * Source 0: A register to start from (HW_REG).
726b8e80941Smrg    * Source 1: An indirect offset (in bytes, UD GRF).
727b8e80941Smrg    * Source 2: The length of the region that could be accessed (in bytes,
728b8e80941Smrg    *           UD immediate).
729b8e80941Smrg    */
730b8e80941Smrg   SHADER_OPCODE_MOV_INDIRECT,
731b8e80941Smrg
732b8e80941Smrg   VEC4_OPCODE_URB_READ,
733b8e80941Smrg   TCS_OPCODE_GET_INSTANCE_ID,
734b8e80941Smrg   TCS_OPCODE_URB_WRITE,
735b8e80941Smrg   TCS_OPCODE_SET_INPUT_URB_OFFSETS,
736b8e80941Smrg   TCS_OPCODE_SET_OUTPUT_URB_OFFSETS,
737b8e80941Smrg   TCS_OPCODE_GET_PRIMITIVE_ID,
738b8e80941Smrg   TCS_OPCODE_CREATE_BARRIER_HEADER,
739b8e80941Smrg   TCS_OPCODE_SRC0_010_IS_ZERO,
740b8e80941Smrg   TCS_OPCODE_RELEASE_INPUT,
741b8e80941Smrg   TCS_OPCODE_THREAD_END,
742b8e80941Smrg
743b8e80941Smrg   TES_OPCODE_GET_PRIMITIVE_ID,
744b8e80941Smrg   TES_OPCODE_CREATE_INPUT_READ_HEADER,
745b8e80941Smrg   TES_OPCODE_ADD_INDIRECT_URB_OFFSET,
746b8e80941Smrg};
747b8e80941Smrg
748b8e80941Smrgenum brw_urb_write_flags {
749b8e80941Smrg   BRW_URB_WRITE_NO_FLAGS = 0,
750b8e80941Smrg
751b8e80941Smrg   /**
752b8e80941Smrg    * Causes a new URB entry to be allocated, and its address stored in the
753b8e80941Smrg    * destination register (gen < 7).
754b8e80941Smrg    */
755b8e80941Smrg   BRW_URB_WRITE_ALLOCATE = 0x1,
756b8e80941Smrg
757b8e80941Smrg   /**
758b8e80941Smrg    * Causes the current URB entry to be deallocated (gen < 7).
759b8e80941Smrg    */
760b8e80941Smrg   BRW_URB_WRITE_UNUSED = 0x2,
761b8e80941Smrg
762b8e80941Smrg   /**
763b8e80941Smrg    * Causes the thread to terminate.
764b8e80941Smrg    */
765b8e80941Smrg   BRW_URB_WRITE_EOT = 0x4,
766b8e80941Smrg
767b8e80941Smrg   /**
768b8e80941Smrg    * Indicates that the given URB entry is complete, and may be sent further
769b8e80941Smrg    * down the 3D pipeline (gen < 7).
770b8e80941Smrg    */
771b8e80941Smrg   BRW_URB_WRITE_COMPLETE = 0x8,
772b8e80941Smrg
773b8e80941Smrg   /**
774b8e80941Smrg    * Indicates that an additional offset (which may be different for the two
775b8e80941Smrg    * vec4 slots) is stored in the message header (gen == 7).
776b8e80941Smrg    */
777b8e80941Smrg   BRW_URB_WRITE_PER_SLOT_OFFSET = 0x10,
778b8e80941Smrg
779b8e80941Smrg   /**
780b8e80941Smrg    * Indicates that the channel masks in the URB_WRITE message header should
781b8e80941Smrg    * not be overridden to 0xff (gen == 7).
782b8e80941Smrg    */
783b8e80941Smrg   BRW_URB_WRITE_USE_CHANNEL_MASKS = 0x20,
784b8e80941Smrg
785b8e80941Smrg   /**
786b8e80941Smrg    * Indicates that the data should be sent to the URB using the
787b8e80941Smrg    * URB_WRITE_OWORD message rather than URB_WRITE_HWORD (gen == 7).  This
788b8e80941Smrg    * causes offsets to be interpreted as multiples of an OWORD instead of an
789b8e80941Smrg    * HWORD, and only allows one OWORD to be written.
790b8e80941Smrg    */
791b8e80941Smrg   BRW_URB_WRITE_OWORD = 0x40,
792b8e80941Smrg
793b8e80941Smrg   /**
794b8e80941Smrg    * Convenient combination of flags: end the thread while simultaneously
795b8e80941Smrg    * marking the given URB entry as complete.
796b8e80941Smrg    */
797b8e80941Smrg   BRW_URB_WRITE_EOT_COMPLETE = BRW_URB_WRITE_EOT | BRW_URB_WRITE_COMPLETE,
798b8e80941Smrg
799b8e80941Smrg   /**
800b8e80941Smrg    * Convenient combination of flags: mark the given URB entry as complete
801b8e80941Smrg    * and simultaneously allocate a new one.
802b8e80941Smrg    */
803b8e80941Smrg   BRW_URB_WRITE_ALLOCATE_COMPLETE =
804b8e80941Smrg      BRW_URB_WRITE_ALLOCATE | BRW_URB_WRITE_COMPLETE,
805b8e80941Smrg};
806b8e80941Smrg
807b8e80941Smrgenum fb_write_logical_srcs {
808b8e80941Smrg   FB_WRITE_LOGICAL_SRC_COLOR0,      /* REQUIRED */
809b8e80941Smrg   FB_WRITE_LOGICAL_SRC_COLOR1,      /* for dual source blend messages */
810b8e80941Smrg   FB_WRITE_LOGICAL_SRC_SRC0_ALPHA,
811b8e80941Smrg   FB_WRITE_LOGICAL_SRC_SRC_DEPTH,   /* gl_FragDepth */
812b8e80941Smrg   FB_WRITE_LOGICAL_SRC_DST_DEPTH,   /* GEN4-5: passthrough from thread */
813b8e80941Smrg   FB_WRITE_LOGICAL_SRC_SRC_STENCIL, /* gl_FragStencilRefARB */
814b8e80941Smrg   FB_WRITE_LOGICAL_SRC_OMASK,       /* Sample Mask (gl_SampleMask) */
815b8e80941Smrg   FB_WRITE_LOGICAL_SRC_COMPONENTS,  /* REQUIRED */
816b8e80941Smrg   FB_WRITE_LOGICAL_NUM_SRCS
817b8e80941Smrg};
818b8e80941Smrg
819b8e80941Smrgenum tex_logical_srcs {
820b8e80941Smrg   /** Texture coordinates */
821b8e80941Smrg   TEX_LOGICAL_SRC_COORDINATE,
822b8e80941Smrg   /** Shadow comparator */
823b8e80941Smrg   TEX_LOGICAL_SRC_SHADOW_C,
824b8e80941Smrg   /** dPdx if the operation takes explicit derivatives, otherwise LOD value */
825b8e80941Smrg   TEX_LOGICAL_SRC_LOD,
826b8e80941Smrg   /** dPdy if the operation takes explicit derivatives */
827b8e80941Smrg   TEX_LOGICAL_SRC_LOD2,
828b8e80941Smrg   /** Min LOD */
829b8e80941Smrg   TEX_LOGICAL_SRC_MIN_LOD,
830b8e80941Smrg   /** Sample index */
831b8e80941Smrg   TEX_LOGICAL_SRC_SAMPLE_INDEX,
832b8e80941Smrg   /** MCS data */
833b8e80941Smrg   TEX_LOGICAL_SRC_MCS,
834b8e80941Smrg   /** REQUIRED: Texture surface index */
835b8e80941Smrg   TEX_LOGICAL_SRC_SURFACE,
836b8e80941Smrg   /** Texture sampler index */
837b8e80941Smrg   TEX_LOGICAL_SRC_SAMPLER,
838b8e80941Smrg   /** Texture surface bindless handle */
839b8e80941Smrg   TEX_LOGICAL_SRC_SURFACE_HANDLE,
840b8e80941Smrg   /** Texture sampler bindless handle */
841b8e80941Smrg   TEX_LOGICAL_SRC_SAMPLER_HANDLE,
842b8e80941Smrg   /** Texel offset for gathers */
843b8e80941Smrg   TEX_LOGICAL_SRC_TG4_OFFSET,
844b8e80941Smrg   /** REQUIRED: Number of coordinate components (as UD immediate) */
845b8e80941Smrg   TEX_LOGICAL_SRC_COORD_COMPONENTS,
846b8e80941Smrg   /** REQUIRED: Number of derivative components (as UD immediate) */
847b8e80941Smrg   TEX_LOGICAL_SRC_GRAD_COMPONENTS,
848b8e80941Smrg
849b8e80941Smrg   TEX_LOGICAL_NUM_SRCS,
850b8e80941Smrg};
851b8e80941Smrg
852b8e80941Smrgenum surface_logical_srcs {
853b8e80941Smrg   /** Surface binding table index */
854b8e80941Smrg   SURFACE_LOGICAL_SRC_SURFACE,
855b8e80941Smrg   /** Surface bindless handle */
856b8e80941Smrg   SURFACE_LOGICAL_SRC_SURFACE_HANDLE,
857b8e80941Smrg   /** Surface address; could be multi-dimensional for typed opcodes */
858b8e80941Smrg   SURFACE_LOGICAL_SRC_ADDRESS,
859b8e80941Smrg   /** Data to be written or used in an atomic op */
860b8e80941Smrg   SURFACE_LOGICAL_SRC_DATA,
861b8e80941Smrg   /** Surface number of dimensions.  Affects the size of ADDRESS */
862b8e80941Smrg   SURFACE_LOGICAL_SRC_IMM_DIMS,
863b8e80941Smrg   /** Per-opcode immediate argument.  For atomics, this is the atomic opcode */
864b8e80941Smrg   SURFACE_LOGICAL_SRC_IMM_ARG,
865b8e80941Smrg
866b8e80941Smrg   SURFACE_LOGICAL_NUM_SRCS
867b8e80941Smrg};
868b8e80941Smrg
869b8e80941Smrg#ifdef __cplusplus
870b8e80941Smrg/**
871b8e80941Smrg * Allow brw_urb_write_flags enums to be ORed together.
872b8e80941Smrg */
873b8e80941Smrginline brw_urb_write_flags
874b8e80941Smrgoperator|(brw_urb_write_flags x, brw_urb_write_flags y)
875b8e80941Smrg{
876b8e80941Smrg   return static_cast<brw_urb_write_flags>(static_cast<int>(x) |
877b8e80941Smrg                                           static_cast<int>(y));
878b8e80941Smrg}
879b8e80941Smrg#endif
880b8e80941Smrg
881b8e80941Smrgenum PACKED brw_predicate {
882b8e80941Smrg   BRW_PREDICATE_NONE                =  0,
883b8e80941Smrg   BRW_PREDICATE_NORMAL              =  1,
884b8e80941Smrg   BRW_PREDICATE_ALIGN1_ANYV         =  2,
885b8e80941Smrg   BRW_PREDICATE_ALIGN1_ALLV         =  3,
886b8e80941Smrg   BRW_PREDICATE_ALIGN1_ANY2H        =  4,
887b8e80941Smrg   BRW_PREDICATE_ALIGN1_ALL2H        =  5,
888b8e80941Smrg   BRW_PREDICATE_ALIGN1_ANY4H        =  6,
889b8e80941Smrg   BRW_PREDICATE_ALIGN1_ALL4H        =  7,
890b8e80941Smrg   BRW_PREDICATE_ALIGN1_ANY8H        =  8,
891b8e80941Smrg   BRW_PREDICATE_ALIGN1_ALL8H        =  9,
892b8e80941Smrg   BRW_PREDICATE_ALIGN1_ANY16H       = 10,
893b8e80941Smrg   BRW_PREDICATE_ALIGN1_ALL16H       = 11,
894b8e80941Smrg   BRW_PREDICATE_ALIGN1_ANY32H       = 12,
895b8e80941Smrg   BRW_PREDICATE_ALIGN1_ALL32H       = 13,
896b8e80941Smrg   BRW_PREDICATE_ALIGN16_REPLICATE_X =  2,
897b8e80941Smrg   BRW_PREDICATE_ALIGN16_REPLICATE_Y =  3,
898b8e80941Smrg   BRW_PREDICATE_ALIGN16_REPLICATE_Z =  4,
899b8e80941Smrg   BRW_PREDICATE_ALIGN16_REPLICATE_W =  5,
900b8e80941Smrg   BRW_PREDICATE_ALIGN16_ANY4H       =  6,
901b8e80941Smrg   BRW_PREDICATE_ALIGN16_ALL4H       =  7,
902b8e80941Smrg};
903b8e80941Smrg
904b8e80941Smrgenum PACKED brw_reg_file {
905b8e80941Smrg   BRW_ARCHITECTURE_REGISTER_FILE = 0,
906b8e80941Smrg   BRW_GENERAL_REGISTER_FILE      = 1,
907b8e80941Smrg   BRW_MESSAGE_REGISTER_FILE      = 2,
908b8e80941Smrg   BRW_IMMEDIATE_VALUE            = 3,
909b8e80941Smrg
910b8e80941Smrg   ARF = BRW_ARCHITECTURE_REGISTER_FILE,
911b8e80941Smrg   FIXED_GRF = BRW_GENERAL_REGISTER_FILE,
912b8e80941Smrg   MRF = BRW_MESSAGE_REGISTER_FILE,
913b8e80941Smrg   IMM = BRW_IMMEDIATE_VALUE,
914b8e80941Smrg
915b8e80941Smrg   /* These are not hardware values */
916b8e80941Smrg   VGRF,
917b8e80941Smrg   ATTR,
918b8e80941Smrg   UNIFORM, /* prog_data->params[reg] */
919b8e80941Smrg   BAD_FILE,
920b8e80941Smrg};
921b8e80941Smrg
922b8e80941Smrgenum PACKED gen10_align1_3src_reg_file {
923b8e80941Smrg   BRW_ALIGN1_3SRC_GENERAL_REGISTER_FILE = 0,
924b8e80941Smrg   BRW_ALIGN1_3SRC_IMMEDIATE_VALUE       = 1, /* src0, src2 */
925b8e80941Smrg   BRW_ALIGN1_3SRC_ACCUMULATOR           = 1, /* dest, src1 */
926b8e80941Smrg};
927b8e80941Smrg
928b8e80941Smrg/* CNL adds Align1 support for 3-src instructions. Bit 35 of the instruction
929b8e80941Smrg * word is "Execution Datatype" which controls whether the instruction operates
930b8e80941Smrg * on float or integer types. The register arguments have fields that offer
931b8e80941Smrg * more fine control their respective types.
932b8e80941Smrg */
933b8e80941Smrgenum PACKED gen10_align1_3src_exec_type {
934b8e80941Smrg   BRW_ALIGN1_3SRC_EXEC_TYPE_INT   = 0,
935b8e80941Smrg   BRW_ALIGN1_3SRC_EXEC_TYPE_FLOAT = 1,
936b8e80941Smrg};
937b8e80941Smrg
938b8e80941Smrg#define BRW_ARF_NULL                  0x00
939b8e80941Smrg#define BRW_ARF_ADDRESS               0x10
940b8e80941Smrg#define BRW_ARF_ACCUMULATOR           0x20
941b8e80941Smrg#define BRW_ARF_FLAG                  0x30
942b8e80941Smrg#define BRW_ARF_MASK                  0x40
943b8e80941Smrg#define BRW_ARF_MASK_STACK            0x50
944b8e80941Smrg#define BRW_ARF_MASK_STACK_DEPTH      0x60
945b8e80941Smrg#define BRW_ARF_STATE                 0x70
946b8e80941Smrg#define BRW_ARF_CONTROL               0x80
947b8e80941Smrg#define BRW_ARF_NOTIFICATION_COUNT    0x90
948b8e80941Smrg#define BRW_ARF_IP                    0xA0
949b8e80941Smrg#define BRW_ARF_TDR                   0xB0
950b8e80941Smrg#define BRW_ARF_TIMESTAMP             0xC0
951b8e80941Smrg
952b8e80941Smrg#define BRW_MRF_COMPR4			(1 << 7)
953b8e80941Smrg
954b8e80941Smrg#define BRW_AMASK   0
955b8e80941Smrg#define BRW_IMASK   1
956b8e80941Smrg#define BRW_LMASK   2
957b8e80941Smrg#define BRW_CMASK   3
958b8e80941Smrg
959b8e80941Smrg
960b8e80941Smrg
961b8e80941Smrg#define BRW_THREAD_NORMAL     0
962b8e80941Smrg#define BRW_THREAD_ATOMIC     1
963b8e80941Smrg#define BRW_THREAD_SWITCH     2
964b8e80941Smrg
965b8e80941Smrgenum PACKED brw_vertical_stride {
966b8e80941Smrg   BRW_VERTICAL_STRIDE_0               = 0,
967b8e80941Smrg   BRW_VERTICAL_STRIDE_1               = 1,
968b8e80941Smrg   BRW_VERTICAL_STRIDE_2               = 2,
969b8e80941Smrg   BRW_VERTICAL_STRIDE_4               = 3,
970b8e80941Smrg   BRW_VERTICAL_STRIDE_8               = 4,
971b8e80941Smrg   BRW_VERTICAL_STRIDE_16              = 5,
972b8e80941Smrg   BRW_VERTICAL_STRIDE_32              = 6,
973b8e80941Smrg   BRW_VERTICAL_STRIDE_ONE_DIMENSIONAL = 0xF,
974b8e80941Smrg};
975b8e80941Smrg
976b8e80941Smrgenum PACKED gen10_align1_3src_vertical_stride {
977b8e80941Smrg   BRW_ALIGN1_3SRC_VERTICAL_STRIDE_0 = 0,
978b8e80941Smrg   BRW_ALIGN1_3SRC_VERTICAL_STRIDE_2 = 1,
979b8e80941Smrg   BRW_ALIGN1_3SRC_VERTICAL_STRIDE_4 = 2,
980b8e80941Smrg   BRW_ALIGN1_3SRC_VERTICAL_STRIDE_8 = 3,
981b8e80941Smrg};
982b8e80941Smrg
983b8e80941Smrgenum PACKED brw_width {
984b8e80941Smrg   BRW_WIDTH_1  = 0,
985b8e80941Smrg   BRW_WIDTH_2  = 1,
986b8e80941Smrg   BRW_WIDTH_4  = 2,
987b8e80941Smrg   BRW_WIDTH_8  = 3,
988b8e80941Smrg   BRW_WIDTH_16 = 4,
989b8e80941Smrg};
990b8e80941Smrg
991b8e80941Smrg/**
992b8e80941Smrg * Message target: Shared Function ID for where to SEND a message.
993b8e80941Smrg *
994b8e80941Smrg * These are enumerated in the ISA reference under "send - Send Message".
995b8e80941Smrg * In particular, see the following tables:
996b8e80941Smrg * - G45 PRM, Volume 4, Table 14-15 "Message Descriptor Definition"
997b8e80941Smrg * - Sandybridge PRM, Volume 4 Part 2, Table 8-16 "Extended Message Descriptor"
998b8e80941Smrg * - Ivybridge PRM, Volume 1 Part 1, section 3.2.7 "GPE Function IDs"
999b8e80941Smrg */
1000b8e80941Smrgenum brw_message_target {
1001b8e80941Smrg   BRW_SFID_NULL                     = 0,
1002b8e80941Smrg   BRW_SFID_MATH                     = 1, /* Only valid on Gen4-5 */
1003b8e80941Smrg   BRW_SFID_SAMPLER                  = 2,
1004b8e80941Smrg   BRW_SFID_MESSAGE_GATEWAY          = 3,
1005b8e80941Smrg   BRW_SFID_DATAPORT_READ            = 4,
1006b8e80941Smrg   BRW_SFID_DATAPORT_WRITE           = 5,
1007b8e80941Smrg   BRW_SFID_URB                      = 6,
1008b8e80941Smrg   BRW_SFID_THREAD_SPAWNER           = 7,
1009b8e80941Smrg   BRW_SFID_VME                      = 8,
1010b8e80941Smrg
1011b8e80941Smrg   GEN6_SFID_DATAPORT_SAMPLER_CACHE  = 4,
1012b8e80941Smrg   GEN6_SFID_DATAPORT_RENDER_CACHE   = 5,
1013b8e80941Smrg   GEN6_SFID_DATAPORT_CONSTANT_CACHE = 9,
1014b8e80941Smrg
1015b8e80941Smrg   GEN7_SFID_DATAPORT_DATA_CACHE     = 10,
1016b8e80941Smrg   GEN7_SFID_PIXEL_INTERPOLATOR      = 11,
1017b8e80941Smrg   HSW_SFID_DATAPORT_DATA_CACHE_1    = 12,
1018b8e80941Smrg   HSW_SFID_CRE                      = 13,
1019b8e80941Smrg};
1020b8e80941Smrg
1021b8e80941Smrg#define GEN7_MESSAGE_TARGET_DP_DATA_CACHE     10
1022b8e80941Smrg
1023b8e80941Smrg#define BRW_SAMPLER_RETURN_FORMAT_FLOAT32     0
1024b8e80941Smrg#define BRW_SAMPLER_RETURN_FORMAT_UINT32      2
1025b8e80941Smrg#define BRW_SAMPLER_RETURN_FORMAT_SINT32      3
1026b8e80941Smrg
1027b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD8_SAMPLE              0
1028b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE             0
1029b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE_BIAS        0
1030b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD8_KILLPIX             1
1031b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD4X2_SAMPLE_LOD        1
1032b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE_LOD         1
1033b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD4X2_SAMPLE_GRADIENTS  2
1034b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD8_SAMPLE_GRADIENTS    2
1035b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD4X2_SAMPLE_COMPARE    0
1036b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE_COMPARE     2
1037b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD8_SAMPLE_BIAS_COMPARE 0
1038b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD4X2_SAMPLE_LOD_COMPARE 1
1039b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD8_SAMPLE_LOD_COMPARE  1
1040b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD4X2_RESINFO           2
1041b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD16_RESINFO            2
1042b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD4X2_LD                3
1043b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD8_LD                  3
1044b8e80941Smrg#define BRW_SAMPLER_MESSAGE_SIMD16_LD                 3
1045b8e80941Smrg
1046b8e80941Smrg#define GEN5_SAMPLER_MESSAGE_SAMPLE              0
1047b8e80941Smrg#define GEN5_SAMPLER_MESSAGE_SAMPLE_BIAS         1
1048b8e80941Smrg#define GEN5_SAMPLER_MESSAGE_SAMPLE_LOD          2
1049b8e80941Smrg#define GEN5_SAMPLER_MESSAGE_SAMPLE_COMPARE      3
1050b8e80941Smrg#define GEN5_SAMPLER_MESSAGE_SAMPLE_DERIVS       4
1051b8e80941Smrg#define GEN5_SAMPLER_MESSAGE_SAMPLE_BIAS_COMPARE 5
1052b8e80941Smrg#define GEN5_SAMPLER_MESSAGE_SAMPLE_LOD_COMPARE  6
1053b8e80941Smrg#define GEN5_SAMPLER_MESSAGE_SAMPLE_LD           7
1054b8e80941Smrg#define GEN7_SAMPLER_MESSAGE_SAMPLE_GATHER4      8
1055b8e80941Smrg#define GEN5_SAMPLER_MESSAGE_LOD                 9
1056b8e80941Smrg#define GEN5_SAMPLER_MESSAGE_SAMPLE_RESINFO      10
1057b8e80941Smrg#define GEN6_SAMPLER_MESSAGE_SAMPLE_SAMPLEINFO   11
1058b8e80941Smrg#define GEN7_SAMPLER_MESSAGE_SAMPLE_GATHER4_C    16
1059b8e80941Smrg#define GEN7_SAMPLER_MESSAGE_SAMPLE_GATHER4_PO   17
1060b8e80941Smrg#define GEN7_SAMPLER_MESSAGE_SAMPLE_GATHER4_PO_C 18
1061b8e80941Smrg#define HSW_SAMPLER_MESSAGE_SAMPLE_DERIV_COMPARE 20
1062b8e80941Smrg#define GEN9_SAMPLER_MESSAGE_SAMPLE_LZ           24
1063b8e80941Smrg#define GEN9_SAMPLER_MESSAGE_SAMPLE_C_LZ         25
1064b8e80941Smrg#define GEN9_SAMPLER_MESSAGE_SAMPLE_LD_LZ        26
1065b8e80941Smrg#define GEN9_SAMPLER_MESSAGE_SAMPLE_LD2DMS_W     28
1066b8e80941Smrg#define GEN7_SAMPLER_MESSAGE_SAMPLE_LD_MCS       29
1067b8e80941Smrg#define GEN7_SAMPLER_MESSAGE_SAMPLE_LD2DMS       30
1068b8e80941Smrg#define GEN7_SAMPLER_MESSAGE_SAMPLE_LD2DSS       31
1069b8e80941Smrg
1070b8e80941Smrg/* for GEN5 only */
1071b8e80941Smrg#define BRW_SAMPLER_SIMD_MODE_SIMD4X2                   0
1072b8e80941Smrg#define BRW_SAMPLER_SIMD_MODE_SIMD8                     1
1073b8e80941Smrg#define BRW_SAMPLER_SIMD_MODE_SIMD16                    2
1074b8e80941Smrg#define BRW_SAMPLER_SIMD_MODE_SIMD32_64                 3
1075b8e80941Smrg
1076b8e80941Smrg/* GEN9 changes SIMD mode 0 to mean SIMD8D, but lets us get the SIMD4x2
1077b8e80941Smrg * behavior by setting bit 22 of dword 2 in the message header. */
1078b8e80941Smrg#define GEN9_SAMPLER_SIMD_MODE_SIMD8D                   0
1079b8e80941Smrg#define GEN9_SAMPLER_SIMD_MODE_EXTENSION_SIMD4X2        (1 << 22)
1080b8e80941Smrg
1081b8e80941Smrg#define BRW_DATAPORT_OWORD_BLOCK_1_OWORDLOW   0
1082b8e80941Smrg#define BRW_DATAPORT_OWORD_BLOCK_1_OWORDHIGH  1
1083b8e80941Smrg#define BRW_DATAPORT_OWORD_BLOCK_2_OWORDS     2
1084b8e80941Smrg#define BRW_DATAPORT_OWORD_BLOCK_4_OWORDS     3
1085b8e80941Smrg#define BRW_DATAPORT_OWORD_BLOCK_8_OWORDS     4
1086b8e80941Smrg#define BRW_DATAPORT_OWORD_BLOCK_DWORDS(n)              \
1087b8e80941Smrg   ((n) == 4 ? BRW_DATAPORT_OWORD_BLOCK_1_OWORDLOW :    \
1088b8e80941Smrg    (n) == 8 ? BRW_DATAPORT_OWORD_BLOCK_2_OWORDS :      \
1089b8e80941Smrg    (n) == 16 ? BRW_DATAPORT_OWORD_BLOCK_4_OWORDS :     \
1090b8e80941Smrg    (n) == 32 ? BRW_DATAPORT_OWORD_BLOCK_8_OWORDS :     \
1091b8e80941Smrg    (abort(), ~0))
1092b8e80941Smrg
1093b8e80941Smrg#define BRW_DATAPORT_OWORD_DUAL_BLOCK_1OWORD     0
1094b8e80941Smrg#define BRW_DATAPORT_OWORD_DUAL_BLOCK_4OWORDS    2
1095b8e80941Smrg
1096b8e80941Smrg#define BRW_DATAPORT_DWORD_SCATTERED_BLOCK_8DWORDS   2
1097b8e80941Smrg#define BRW_DATAPORT_DWORD_SCATTERED_BLOCK_16DWORDS  3
1098b8e80941Smrg
1099b8e80941Smrg/* This one stays the same across generations. */
1100b8e80941Smrg#define BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ          0
1101b8e80941Smrg/* GEN4 */
1102b8e80941Smrg#define BRW_DATAPORT_READ_MESSAGE_OWORD_DUAL_BLOCK_READ     1
1103b8e80941Smrg#define BRW_DATAPORT_READ_MESSAGE_MEDIA_BLOCK_READ          2
1104b8e80941Smrg#define BRW_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ      3
1105b8e80941Smrg/* G45, GEN5 */
1106b8e80941Smrg#define G45_DATAPORT_READ_MESSAGE_RENDER_UNORM_READ	    1
1107b8e80941Smrg#define G45_DATAPORT_READ_MESSAGE_OWORD_DUAL_BLOCK_READ     2
1108b8e80941Smrg#define G45_DATAPORT_READ_MESSAGE_AVC_LOOP_FILTER_READ	    3
1109b8e80941Smrg#define G45_DATAPORT_READ_MESSAGE_MEDIA_BLOCK_READ          4
1110b8e80941Smrg#define G45_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ      6
1111b8e80941Smrg/* GEN6 */
1112b8e80941Smrg#define GEN6_DATAPORT_READ_MESSAGE_RENDER_UNORM_READ	    1
1113b8e80941Smrg#define GEN6_DATAPORT_READ_MESSAGE_OWORD_DUAL_BLOCK_READ     2
1114b8e80941Smrg#define GEN6_DATAPORT_READ_MESSAGE_MEDIA_BLOCK_READ          4
1115b8e80941Smrg#define GEN6_DATAPORT_READ_MESSAGE_OWORD_UNALIGN_BLOCK_READ  5
1116b8e80941Smrg#define GEN6_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ      6
1117b8e80941Smrg
1118b8e80941Smrg#define BRW_DATAPORT_READ_TARGET_DATA_CACHE      0
1119b8e80941Smrg#define BRW_DATAPORT_READ_TARGET_RENDER_CACHE    1
1120b8e80941Smrg#define BRW_DATAPORT_READ_TARGET_SAMPLER_CACHE   2
1121b8e80941Smrg
1122b8e80941Smrg#define BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD16_SINGLE_SOURCE                0
1123b8e80941Smrg#define BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD16_SINGLE_SOURCE_REPLICATED     1
1124b8e80941Smrg#define BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD8_DUAL_SOURCE_SUBSPAN01         2
1125b8e80941Smrg#define BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD8_DUAL_SOURCE_SUBSPAN23         3
1126b8e80941Smrg#define BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD8_SINGLE_SOURCE_SUBSPAN01       4
1127b8e80941Smrg
1128b8e80941Smrg#define BRW_DATAPORT_WRITE_MESSAGE_OWORD_BLOCK_WRITE                0
1129b8e80941Smrg#define BRW_DATAPORT_WRITE_MESSAGE_OWORD_DUAL_BLOCK_WRITE           1
1130b8e80941Smrg#define BRW_DATAPORT_WRITE_MESSAGE_MEDIA_BLOCK_WRITE                2
1131b8e80941Smrg#define BRW_DATAPORT_WRITE_MESSAGE_DWORD_SCATTERED_WRITE            3
1132b8e80941Smrg#define BRW_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE              4
1133b8e80941Smrg#define BRW_DATAPORT_WRITE_MESSAGE_STREAMED_VERTEX_BUFFER_WRITE     5
1134b8e80941Smrg#define BRW_DATAPORT_WRITE_MESSAGE_FLUSH_RENDER_CACHE               7
1135b8e80941Smrg
1136b8e80941Smrg/* GEN6 */
1137b8e80941Smrg#define GEN6_DATAPORT_WRITE_MESSAGE_DWORD_ATOMIC_WRITE              7
1138b8e80941Smrg#define GEN6_DATAPORT_WRITE_MESSAGE_OWORD_BLOCK_WRITE               8
1139b8e80941Smrg#define GEN6_DATAPORT_WRITE_MESSAGE_OWORD_DUAL_BLOCK_WRITE          9
1140b8e80941Smrg#define GEN6_DATAPORT_WRITE_MESSAGE_MEDIA_BLOCK_WRITE               10
1141b8e80941Smrg#define GEN6_DATAPORT_WRITE_MESSAGE_DWORD_SCATTERED_WRITE           11
1142b8e80941Smrg#define GEN6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE             12
1143b8e80941Smrg#define GEN6_DATAPORT_WRITE_MESSAGE_STREAMED_VB_WRITE               13
1144b8e80941Smrg#define GEN6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_UNORM_WRITE       14
1145b8e80941Smrg
1146b8e80941Smrg/* GEN7 */
1147b8e80941Smrg#define GEN7_DATAPORT_RC_MEDIA_BLOCK_READ                           4
1148b8e80941Smrg#define GEN7_DATAPORT_RC_TYPED_SURFACE_READ                         5
1149b8e80941Smrg#define GEN7_DATAPORT_RC_TYPED_ATOMIC_OP                            6
1150b8e80941Smrg#define GEN7_DATAPORT_RC_MEMORY_FENCE                               7
1151b8e80941Smrg#define GEN7_DATAPORT_RC_MEDIA_BLOCK_WRITE                          10
1152b8e80941Smrg#define GEN7_DATAPORT_RC_RENDER_TARGET_WRITE                        12
1153b8e80941Smrg#define GEN7_DATAPORT_RC_TYPED_SURFACE_WRITE                        13
1154b8e80941Smrg#define GEN7_DATAPORT_DC_OWORD_BLOCK_READ                           0
1155b8e80941Smrg#define GEN7_DATAPORT_DC_UNALIGNED_OWORD_BLOCK_READ                 1
1156b8e80941Smrg#define GEN7_DATAPORT_DC_OWORD_DUAL_BLOCK_READ                      2
1157b8e80941Smrg#define GEN7_DATAPORT_DC_DWORD_SCATTERED_READ                       3
1158b8e80941Smrg#define GEN7_DATAPORT_DC_BYTE_SCATTERED_READ                        4
1159b8e80941Smrg#define GEN7_DATAPORT_DC_UNTYPED_SURFACE_READ                       5
1160b8e80941Smrg#define GEN7_DATAPORT_DC_UNTYPED_ATOMIC_OP                          6
1161b8e80941Smrg#define GEN7_DATAPORT_DC_MEMORY_FENCE                               7
1162b8e80941Smrg#define GEN7_DATAPORT_DC_OWORD_BLOCK_WRITE                          8
1163b8e80941Smrg#define GEN7_DATAPORT_DC_OWORD_DUAL_BLOCK_WRITE                     10
1164b8e80941Smrg#define GEN7_DATAPORT_DC_DWORD_SCATTERED_WRITE                      11
1165b8e80941Smrg#define GEN7_DATAPORT_DC_BYTE_SCATTERED_WRITE                       12
1166b8e80941Smrg#define GEN7_DATAPORT_DC_UNTYPED_SURFACE_WRITE                      13
1167b8e80941Smrg
1168b8e80941Smrg#define GEN7_DATAPORT_SCRATCH_READ                            ((1 << 18) | \
1169b8e80941Smrg                                                               (0 << 17))
1170b8e80941Smrg#define GEN7_DATAPORT_SCRATCH_WRITE                           ((1 << 18) | \
1171b8e80941Smrg                                                               (1 << 17))
1172b8e80941Smrg#define GEN7_DATAPORT_SCRATCH_NUM_REGS_SHIFT                        12
1173b8e80941Smrg
1174b8e80941Smrg#define GEN7_PIXEL_INTERPOLATOR_LOC_SHARED_OFFSET     0
1175b8e80941Smrg#define GEN7_PIXEL_INTERPOLATOR_LOC_SAMPLE            1
1176b8e80941Smrg#define GEN7_PIXEL_INTERPOLATOR_LOC_CENTROID          2
1177b8e80941Smrg#define GEN7_PIXEL_INTERPOLATOR_LOC_PER_SLOT_OFFSET   3
1178b8e80941Smrg
1179b8e80941Smrg/* HSW */
1180b8e80941Smrg#define HSW_DATAPORT_DC_PORT0_OWORD_BLOCK_READ                      0
1181b8e80941Smrg#define HSW_DATAPORT_DC_PORT0_UNALIGNED_OWORD_BLOCK_READ            1
1182b8e80941Smrg#define HSW_DATAPORT_DC_PORT0_OWORD_DUAL_BLOCK_READ                 2
1183b8e80941Smrg#define HSW_DATAPORT_DC_PORT0_DWORD_SCATTERED_READ                  3
1184b8e80941Smrg#define HSW_DATAPORT_DC_PORT0_BYTE_SCATTERED_READ                   4
1185b8e80941Smrg#define HSW_DATAPORT_DC_PORT0_MEMORY_FENCE                          7
1186b8e80941Smrg#define HSW_DATAPORT_DC_PORT0_OWORD_BLOCK_WRITE                     8
1187b8e80941Smrg#define HSW_DATAPORT_DC_PORT0_OWORD_DUAL_BLOCK_WRITE                10
1188b8e80941Smrg#define HSW_DATAPORT_DC_PORT0_DWORD_SCATTERED_WRITE                 11
1189b8e80941Smrg#define HSW_DATAPORT_DC_PORT0_BYTE_SCATTERED_WRITE                  12
1190b8e80941Smrg
1191b8e80941Smrg#define HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_READ                  1
1192b8e80941Smrg#define HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP                     2
1193b8e80941Smrg#define HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP_SIMD4X2             3
1194b8e80941Smrg#define HSW_DATAPORT_DC_PORT1_MEDIA_BLOCK_READ                      4
1195b8e80941Smrg#define HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_READ                    5
1196b8e80941Smrg#define HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP                       6
1197b8e80941Smrg#define HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP_SIMD4X2               7
1198b8e80941Smrg#define HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_WRITE                 9
1199b8e80941Smrg#define HSW_DATAPORT_DC_PORT1_MEDIA_BLOCK_WRITE                     10
1200b8e80941Smrg#define HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP                     11
1201b8e80941Smrg#define HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP_SIMD4X2             12
1202b8e80941Smrg#define HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_WRITE                   13
1203b8e80941Smrg#define GEN9_DATAPORT_DC_PORT1_A64_SCATTERED_READ                   0x10
1204b8e80941Smrg#define GEN8_DATAPORT_DC_PORT1_A64_UNTYPED_SURFACE_READ             0x11
1205b8e80941Smrg#define GEN8_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_OP                0x12
1206b8e80941Smrg#define GEN8_DATAPORT_DC_PORT1_A64_UNTYPED_SURFACE_WRITE            0x19
1207b8e80941Smrg#define GEN8_DATAPORT_DC_PORT1_A64_SCATTERED_WRITE                  0x1a
1208b8e80941Smrg#define GEN9_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_FLOAT_OP              0x1b
1209b8e80941Smrg#define GEN9_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_FLOAT_OP          0x1d
1210b8e80941Smrg
1211b8e80941Smrg/* GEN9 */
1212b8e80941Smrg#define GEN9_DATAPORT_RC_RENDER_TARGET_WRITE                        12
1213b8e80941Smrg#define GEN9_DATAPORT_RC_RENDER_TARGET_READ                         13
1214b8e80941Smrg
1215b8e80941Smrg/* A64 scattered message subtype */
1216b8e80941Smrg#define GEN8_A64_SCATTERED_SUBTYPE_BYTE                             0
1217b8e80941Smrg#define GEN8_A64_SCATTERED_SUBTYPE_DWORD                            1
1218b8e80941Smrg#define GEN8_A64_SCATTERED_SUBTYPE_QWORD                            2
1219b8e80941Smrg#define GEN8_A64_SCATTERED_SUBTYPE_HWORD                            3
1220b8e80941Smrg
1221b8e80941Smrg/* Dataport special binding table indices: */
1222b8e80941Smrg#define BRW_BTI_STATELESS                255
1223b8e80941Smrg#define GEN7_BTI_SLM                     254
1224b8e80941Smrg/* Note that on Gen8+ BTI 255 was redefined to be IA-coherent according to the
1225b8e80941Smrg * hardware spec, however because the DRM sets bit 4 of HDC_CHICKEN0 on BDW,
1226b8e80941Smrg * CHV and at least some pre-production steppings of SKL due to
1227b8e80941Smrg * WaForceEnableNonCoherent, HDC memory access may have been overridden by the
1228b8e80941Smrg * kernel to be non-coherent (matching the behavior of the same BTI on
1229b8e80941Smrg * pre-Gen8 hardware) and BTI 255 may actually be an alias for BTI 253.
1230b8e80941Smrg */
1231b8e80941Smrg#define GEN8_BTI_STATELESS_IA_COHERENT   255
1232b8e80941Smrg#define GEN8_BTI_STATELESS_NON_COHERENT  253
1233b8e80941Smrg#define GEN9_BTI_BINDLESS                252
1234b8e80941Smrg
1235b8e80941Smrg/* Dataport atomic operations for Untyped Atomic Integer Operation message
1236b8e80941Smrg * (and others).
1237b8e80941Smrg */
1238b8e80941Smrg#define BRW_AOP_AND                   1
1239b8e80941Smrg#define BRW_AOP_OR                    2
1240b8e80941Smrg#define BRW_AOP_XOR                   3
1241b8e80941Smrg#define BRW_AOP_MOV                   4
1242b8e80941Smrg#define BRW_AOP_INC                   5
1243b8e80941Smrg#define BRW_AOP_DEC                   6
1244b8e80941Smrg#define BRW_AOP_ADD                   7
1245b8e80941Smrg#define BRW_AOP_SUB                   8
1246b8e80941Smrg#define BRW_AOP_REVSUB                9
1247b8e80941Smrg#define BRW_AOP_IMAX                  10
1248b8e80941Smrg#define BRW_AOP_IMIN                  11
1249b8e80941Smrg#define BRW_AOP_UMAX                  12
1250b8e80941Smrg#define BRW_AOP_UMIN                  13
1251b8e80941Smrg#define BRW_AOP_CMPWR                 14
1252b8e80941Smrg#define BRW_AOP_PREDEC                15
1253b8e80941Smrg
1254b8e80941Smrg/* Dataport atomic operations for Untyped Atomic Float Operation message. */
1255b8e80941Smrg#define BRW_AOP_FMAX                  1
1256b8e80941Smrg#define BRW_AOP_FMIN                  2
1257b8e80941Smrg#define BRW_AOP_FCMPWR                3
1258b8e80941Smrg
1259b8e80941Smrg#define BRW_MATH_FUNCTION_INV                              1
1260b8e80941Smrg#define BRW_MATH_FUNCTION_LOG                              2
1261b8e80941Smrg#define BRW_MATH_FUNCTION_EXP                              3
1262b8e80941Smrg#define BRW_MATH_FUNCTION_SQRT                             4
1263b8e80941Smrg#define BRW_MATH_FUNCTION_RSQ                              5
1264b8e80941Smrg#define BRW_MATH_FUNCTION_SIN                              6
1265b8e80941Smrg#define BRW_MATH_FUNCTION_COS                              7
1266b8e80941Smrg#define BRW_MATH_FUNCTION_SINCOS                           8 /* gen4, gen5 */
1267b8e80941Smrg#define BRW_MATH_FUNCTION_FDIV                             9 /* gen6+ */
1268b8e80941Smrg#define BRW_MATH_FUNCTION_POW                              10
1269b8e80941Smrg#define BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER   11
1270b8e80941Smrg#define BRW_MATH_FUNCTION_INT_DIV_QUOTIENT                 12
1271b8e80941Smrg#define BRW_MATH_FUNCTION_INT_DIV_REMAINDER                13
1272b8e80941Smrg#define GEN8_MATH_FUNCTION_INVM                            14
1273b8e80941Smrg#define GEN8_MATH_FUNCTION_RSQRTM                          15
1274b8e80941Smrg
1275b8e80941Smrg#define BRW_MATH_INTEGER_UNSIGNED     0
1276b8e80941Smrg#define BRW_MATH_INTEGER_SIGNED       1
1277b8e80941Smrg
1278b8e80941Smrg#define BRW_MATH_PRECISION_FULL        0
1279b8e80941Smrg#define BRW_MATH_PRECISION_PARTIAL     1
1280b8e80941Smrg
1281b8e80941Smrg#define BRW_MATH_SATURATE_NONE         0
1282b8e80941Smrg#define BRW_MATH_SATURATE_SATURATE     1
1283b8e80941Smrg
1284b8e80941Smrg#define BRW_MATH_DATA_VECTOR  0
1285b8e80941Smrg#define BRW_MATH_DATA_SCALAR  1
1286b8e80941Smrg
1287b8e80941Smrg#define BRW_URB_OPCODE_WRITE_HWORD  0
1288b8e80941Smrg#define BRW_URB_OPCODE_WRITE_OWORD  1
1289b8e80941Smrg#define BRW_URB_OPCODE_READ_HWORD   2
1290b8e80941Smrg#define BRW_URB_OPCODE_READ_OWORD   3
1291b8e80941Smrg#define GEN7_URB_OPCODE_ATOMIC_MOV  4
1292b8e80941Smrg#define GEN7_URB_OPCODE_ATOMIC_INC  5
1293b8e80941Smrg#define GEN8_URB_OPCODE_ATOMIC_ADD  6
1294b8e80941Smrg#define GEN8_URB_OPCODE_SIMD8_WRITE 7
1295b8e80941Smrg#define GEN8_URB_OPCODE_SIMD8_READ  8
1296b8e80941Smrg
1297b8e80941Smrg#define BRW_URB_SWIZZLE_NONE          0
1298b8e80941Smrg#define BRW_URB_SWIZZLE_INTERLEAVE    1
1299b8e80941Smrg#define BRW_URB_SWIZZLE_TRANSPOSE     2
1300b8e80941Smrg
1301b8e80941Smrg#define BRW_SCRATCH_SPACE_SIZE_1K     0
1302b8e80941Smrg#define BRW_SCRATCH_SPACE_SIZE_2K     1
1303b8e80941Smrg#define BRW_SCRATCH_SPACE_SIZE_4K     2
1304b8e80941Smrg#define BRW_SCRATCH_SPACE_SIZE_8K     3
1305b8e80941Smrg#define BRW_SCRATCH_SPACE_SIZE_16K    4
1306b8e80941Smrg#define BRW_SCRATCH_SPACE_SIZE_32K    5
1307b8e80941Smrg#define BRW_SCRATCH_SPACE_SIZE_64K    6
1308b8e80941Smrg#define BRW_SCRATCH_SPACE_SIZE_128K   7
1309b8e80941Smrg#define BRW_SCRATCH_SPACE_SIZE_256K   8
1310b8e80941Smrg#define BRW_SCRATCH_SPACE_SIZE_512K   9
1311b8e80941Smrg#define BRW_SCRATCH_SPACE_SIZE_1M     10
1312b8e80941Smrg#define BRW_SCRATCH_SPACE_SIZE_2M     11
1313b8e80941Smrg
1314b8e80941Smrg#define BRW_MESSAGE_GATEWAY_SFID_OPEN_GATEWAY         0
1315b8e80941Smrg#define BRW_MESSAGE_GATEWAY_SFID_CLOSE_GATEWAY        1
1316b8e80941Smrg#define BRW_MESSAGE_GATEWAY_SFID_FORWARD_MSG          2
1317b8e80941Smrg#define BRW_MESSAGE_GATEWAY_SFID_GET_TIMESTAMP        3
1318b8e80941Smrg#define BRW_MESSAGE_GATEWAY_SFID_BARRIER_MSG          4
1319b8e80941Smrg#define BRW_MESSAGE_GATEWAY_SFID_UPDATE_GATEWAY_STATE 5
1320b8e80941Smrg#define BRW_MESSAGE_GATEWAY_SFID_MMIO_READ_WRITE      6
1321b8e80941Smrg
1322b8e80941Smrg
1323b8e80941Smrg/* Gen7 "GS URB Entry Allocation Size" is a U9-1 field, so the maximum gs_size
1324b8e80941Smrg * is 2^9, or 512.  It's counted in multiples of 64 bytes.
1325b8e80941Smrg *
1326b8e80941Smrg * Identical for VS, DS, and HS.
1327b8e80941Smrg */
1328b8e80941Smrg#define GEN7_MAX_GS_URB_ENTRY_SIZE_BYTES                (512*64)
1329b8e80941Smrg#define GEN7_MAX_DS_URB_ENTRY_SIZE_BYTES                (512*64)
1330b8e80941Smrg#define GEN7_MAX_HS_URB_ENTRY_SIZE_BYTES                (512*64)
1331b8e80941Smrg#define GEN7_MAX_VS_URB_ENTRY_SIZE_BYTES                (512*64)
1332b8e80941Smrg
1333b8e80941Smrg/* Gen6 "GS URB Entry Allocation Size" is defined as a number of 1024-bit
1334b8e80941Smrg * (128 bytes) URB rows and the maximum allowed value is 5 rows.
1335b8e80941Smrg */
1336b8e80941Smrg#define GEN6_MAX_GS_URB_ENTRY_SIZE_BYTES                (5*128)
1337b8e80941Smrg
1338b8e80941Smrg/* GS Thread Payload
1339b8e80941Smrg */
1340b8e80941Smrg
1341b8e80941Smrg/* 3DSTATE_GS "Output Vertex Size" has an effective maximum of 62. It's
1342b8e80941Smrg * counted in multiples of 16 bytes.
1343b8e80941Smrg */
1344b8e80941Smrg#define GEN7_MAX_GS_OUTPUT_VERTEX_SIZE_BYTES            (62*16)
1345b8e80941Smrg
1346b8e80941Smrg
1347b8e80941Smrg/* R0 */
1348b8e80941Smrg# define GEN7_GS_PAYLOAD_INSTANCE_ID_SHIFT		27
1349b8e80941Smrg
1350b8e80941Smrg/* CR0.0[5:4] Floating-Point Rounding Modes
1351b8e80941Smrg *  Skylake PRM, Volume 7 Part 1, "Control Register", page 756
1352b8e80941Smrg */
1353b8e80941Smrg
1354b8e80941Smrg#define BRW_CR0_RND_MODE_MASK     0x30
1355b8e80941Smrg#define BRW_CR0_RND_MODE_SHIFT    4
1356b8e80941Smrg
1357b8e80941Smrgenum PACKED brw_rnd_mode {
1358b8e80941Smrg   BRW_RND_MODE_RTNE = 0,  /* Round to Nearest or Even */
1359b8e80941Smrg   BRW_RND_MODE_RU = 1,    /* Round Up, toward +inf */
1360b8e80941Smrg   BRW_RND_MODE_RD = 2,    /* Round Down, toward -inf */
1361b8e80941Smrg   BRW_RND_MODE_RTZ = 3,   /* Round Toward Zero */
1362b8e80941Smrg   BRW_RND_MODE_UNSPECIFIED,  /* Unspecified rounding mode */
1363b8e80941Smrg};
1364b8e80941Smrg
1365b8e80941Smrg/* MDC_DS - Data Size Message Descriptor Control Field
1366b8e80941Smrg * Skylake PRM, Volume 2d, page 129
1367b8e80941Smrg *
1368b8e80941Smrg * Specifies the number of Bytes to be read or written per Dword used at
1369b8e80941Smrg * byte_scattered read/write and byte_scaled read/write messages.
1370b8e80941Smrg */
1371b8e80941Smrg#define GEN7_BYTE_SCATTERED_DATA_ELEMENT_BYTE     0
1372b8e80941Smrg#define GEN7_BYTE_SCATTERED_DATA_ELEMENT_WORD     1
1373b8e80941Smrg#define GEN7_BYTE_SCATTERED_DATA_ELEMENT_DWORD    2
1374b8e80941Smrg
1375b8e80941Smrg#endif /* BRW_EU_DEFINES_H */
1376