Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4358 Serge 1
#ifndef __NVFX_SHADER_H__
2
#define __NVFX_SHADER_H__
3
 
4
#include 
5
 
6
#include "pipe/p_compiler.h"
7
 
8
#define NVFX_SWZ_IDENTITY ((3 << 6) | (2 << 4) | (1 << 2) | (0 << 0))
9
 
10
/* this will resolve to either the NV30 or the NV40 version
11
 * depending on the current hardware */
12
/* unusual, but very fast and compact method */
13
#define NVFX_VP(c) ((NV30_VP_##c) + (nv30->is_nv4x & ((NV40_VP_##c) - (NV30_VP_##c))))
14
 
15
#define NVFX_VP_INST_SLOT_VEC 0
16
#define NVFX_VP_INST_SLOT_SCA 1
17
 
18
#define NVFX_VP_INST_IN_POS  0    /* These seem to match the bindings specified in */
19
#define NVFX_VP_INST_IN_WEIGHT  1    /* the ARB_v_p spec (2.14.3.1) */
20
#define NVFX_VP_INST_IN_NORMAL  2
21
#define NVFX_VP_INST_IN_COL0  3    /* Should probably confirm them all though */
22
#define NVFX_VP_INST_IN_COL1  4
23
#define NVFX_VP_INST_IN_FOGC  5
24
#define NVFX_VP_INST_IN_TC0  8
25
#define NVFX_VP_INST_IN_TC(n)  (8+n)
26
 
27
#define NVFX_VP_INST_SCA_OP_NOP 0x00
28
#define NVFX_VP_INST_SCA_OP_MOV 0x01
29
#define NVFX_VP_INST_SCA_OP_RCP 0x02
30
#define NVFX_VP_INST_SCA_OP_RCC 0x03
31
#define NVFX_VP_INST_SCA_OP_RSQ 0x04
32
#define NVFX_VP_INST_SCA_OP_EXP 0x05
33
#define NVFX_VP_INST_SCA_OP_LOG 0x06
34
#define NVFX_VP_INST_SCA_OP_LIT 0x07
35
#define NVFX_VP_INST_SCA_OP_BRA 0x09
36
#define NVFX_VP_INST_SCA_OP_CAL 0x0B
37
#define NVFX_VP_INST_SCA_OP_RET 0x0C
38
#define NVFX_VP_INST_SCA_OP_LG2 0x0D
39
#define NVFX_VP_INST_SCA_OP_EX2 0x0E
40
#define NVFX_VP_INST_SCA_OP_SIN 0x0F
41
#define NVFX_VP_INST_SCA_OP_COS 0x10
42
 
43
#define NV40_VP_INST_SCA_OP_PUSHA 0x13
44
#define NV40_VP_INST_SCA_OP_POPA 0x14
45
 
46
#define NVFX_VP_INST_VEC_OP_NOP 0x00
47
#define NVFX_VP_INST_VEC_OP_MOV 0x01
48
#define NVFX_VP_INST_VEC_OP_MUL 0x02
49
#define NVFX_VP_INST_VEC_OP_ADD 0x03
50
#define NVFX_VP_INST_VEC_OP_MAD 0x04
51
#define NVFX_VP_INST_VEC_OP_DP3 0x05
52
#define NVFX_VP_INST_VEC_OP_DPH 0x06
53
#define NVFX_VP_INST_VEC_OP_DP4 0x07
54
#define NVFX_VP_INST_VEC_OP_DST 0x08
55
#define NVFX_VP_INST_VEC_OP_MIN 0x09
56
#define NVFX_VP_INST_VEC_OP_MAX 0x0A
57
#define NVFX_VP_INST_VEC_OP_SLT 0x0B
58
#define NVFX_VP_INST_VEC_OP_SGE 0x0C
59
#define NVFX_VP_INST_VEC_OP_ARL 0x0D
60
#define NVFX_VP_INST_VEC_OP_FRC 0x0E
61
#define NVFX_VP_INST_VEC_OP_FLR 0x0F
62
#define NVFX_VP_INST_VEC_OP_SEQ 0x10
63
#define NVFX_VP_INST_VEC_OP_SFL 0x11
64
#define NVFX_VP_INST_VEC_OP_SGT 0x12
65
#define NVFX_VP_INST_VEC_OP_SLE 0x13
66
#define NVFX_VP_INST_VEC_OP_SNE 0x14
67
#define NVFX_VP_INST_VEC_OP_STR 0x15
68
#define NVFX_VP_INST_VEC_OP_SSG 0x16
69
#define NVFX_VP_INST_VEC_OP_ARR 0x17
70
#define NVFX_VP_INST_VEC_OP_ARA 0x18
71
 
72
#define NV40_VP_INST_VEC_OP_TXL 0x19
73
 
74
/* DWORD 3 */
75
#define NVFX_VP_INST_LAST                           (1 << 0)
76
 
77
/*
78
 * Each fragment program opcode appears to be comprised of 4 32-bit values.
79
 *
80
 * 0: OPDEST
81
 * 	0: program end
82
 * 	1-6: destination register
83
 * 	7: destination register is fp16?? (use for outputs)
84
 * 	8: set condition code
85
 * 	9: writemask x
86
 *  	10: writemask y
87
 *  	11: writemask z
88
 *  	12: writemask w
89
 *  	13-16: source attribute register number (e.g. COL0)
90
 *  	17-20: texture unit number
91
 *  	21: expand value on texture operation (x -> 2x - 1)
92
 *  	22-23: precision 0 = fp32, 1 = fp16, 2 = s1.10 fixed, 3 = s0.8 fixed (nv40-only))
93
 * 	24-29: opcode
94
 * 	30: no destination
95
 * 	31: saturate
96
 * 1 - SRC0
97
 * 	0-17: see common source fields
98
 * 	18: execute if condition code less
99
 * 	19: execute if condition code equal
100
 * 	20: execute if condition code greater
101
 * 	21-22: condition code swizzle x source component
102
 * 	23-24: condition code swizzle y source component
103
 * 	25-26: condition code swizzle z source component
104
 * 	27-28: condition code swizzle w source component
105
 * 	29: source 0 absolute
106
 * 	30: always 0 in renouveau tests
107
 * 	31: always 0 in renouveau tests
108
 * 2 - SRC1
109
 * 	0-17: see common source fields
110
 * 	18: source 1 absolute
111
 * 	19-20: input precision 0 = fp32, 1 = fp16, 2 = s1.10 fixed, 3 = ???
112
 * 	21-27: always 0 in renouveau tests
113
 * 	28-30: scale (0 = 1x, 1 = 2x, 2 = 4x, 3 = 8x, 4 = ???, 5, = 1/2, 6 = 1/4, 7 = 1/8)
114
 * 	31: opcode is branch
115
 * 3 - SRC2
116
 * 	0-17: see common source fields
117
 * 	18: source 2 absolute
118
 * 	19-29: address register displacement
119
 * 	30: use index register
120
 * 	31: disable perspective-correct interpolation?
121
 *
122
* Common fields of 0, 1, 2 - SRC
123
 * 	0-1: source register type (0 = temp, 1 = input, 2 = immediate, 3 = ???)
124
 * 	2-7: source temp register index
125
 * 	8: source register is fp16??
126
 * 	9-10: source swizzle x source component
127
 * 	11-12: source swizzle y source component
128
 * 	13-14: source swizzle z source component
129
 * 	15-16: source swizzle w source component
130
 *	17: negate
131
 
132
 * There appears to be no special difference between result regs and temp regs.
133
 *     result.color == R0.xyzw
134
 *     result.depth == R1.z
135
 * When the fragprog contains instructions to write depth, NV30_TCL_PRIMITIVE_3D_UNK1D78=0
136
 * otherwise it is set to 1.
137
 *
138
 * Constants are inserted directly after the instruction that uses them.
139
 *
140
 * It appears that it's not possible to use two input registers in one
141
 * instruction as the input sourcing is done in the instruction dword
142
 * and not the source selection dwords.  As such instructions such as:
143
 *
144
 *     ADD result.color, fragment.color, fragment.texcoord[0];
145
 *
146
 * must be split into two MOV's and then an ADD (nvidia does this) but
147
 * I'm not sure why it's not just one MOV and then source the second input
148
 * in the ADD instruction..
149
 *
150
 * Negation of the full source is done with NV30_FP_REG_NEGATE, arbitrary
151
 * negation requires multiplication with a const.
152
 *
153
 * Arbitrary swizzling is supported with the exception of SWIZZLE_ZERO/SWIZZLE_ONE
154
 * The temp/result regs appear to be initialised to (0.0, 0.0, 0.0, 0.0) as SWIZZLE_ZERO
155
 * is implemented simply by not writing to the relevant components of the destination.
156
 *
157
 * Conditional execution
158
 *   TODO
159
 *
160
 * Non-native instructions:
161
 *   LIT
162
 *   LRP - MAD+MAD
163
 *   SUB - ADD, negate second source
164
 *   RSQ - LG2 + EX2
165
 *   POW - LG2 + MUL + EX2
166
 *   SCS - COS + SIN
167
 *   XPD
168
 *
169
 * NV40 Looping
170
 *   Loops appear to be fairly expensive on NV40 at least, the proprietary
171
 *   driver goes to a lot of effort to avoid using the native looping
172
 *   instructions.  If the total number of *executed* instructions between
173
 *   REP/ENDREP or LOOP/ENDLOOP is <=500, the driver will unroll the loop.
174
 *   The maximum loop count is 255.
175
 *
176
 */
177
 
178
//== Opcode / Destination selection ==
179
#define NVFX_FP_OP_PROGRAM_END          (1 << 0)
180
#define NVFX_FP_OP_OUT_REG_SHIFT        1
181
#define NV30_FP_OP_OUT_REG_MASK          (31 << 1)  /* uncertain */
182
#define NV40_FP_OP_OUT_REG_MASK          (63 << 1)
183
/* Needs to be set when writing outputs to get expected result.. */
184
#define NVFX_FP_OP_OUT_REG_HALF          (1 << 7)
185
#define NVFX_FP_OP_COND_WRITE_ENABLE        (1 << 8)
186
#define NVFX_FP_OP_OUTMASK_SHIFT        9
187
#define NVFX_FP_OP_OUTMASK_MASK          (0xF << 9)
188
#  define NVFX_FP_OP_OUT_X  (1<<9)
189
#  define NVFX_FP_OP_OUT_Y  (1<<10)
190
#  define NVFX_FP_OP_OUT_Z  (1<<11)
191
#  define NVFX_FP_OP_OUT_W  (1<<12)
192
/* Uncertain about these, especially the input_src values.. it's possible that
193
 * they can be dynamically changed.
194
 */
195
#define NVFX_FP_OP_INPUT_SRC_SHIFT        13
196
#define NVFX_FP_OP_INPUT_SRC_MASK        (15 << 13)
197
#  define NVFX_FP_OP_INPUT_SRC_POSITION  0x0
198
#  define NVFX_FP_OP_INPUT_SRC_COL0  0x1
199
#  define NVFX_FP_OP_INPUT_SRC_COL1  0x2
200
#  define NVFX_FP_OP_INPUT_SRC_FOGC  0x3
201
#  define NVFX_FP_OP_INPUT_SRC_TC0    0x4
202
#  define NVFX_FP_OP_INPUT_SRC_TC(n)  (0x4 + n)
203
#  define NV40_FP_OP_INPUT_SRC_FACING  0xE
204
#define NVFX_FP_OP_TEX_UNIT_SHIFT        17
205
#define NVFX_FP_OP_TEX_UNIT_MASK        (0xF << 17) /* guess */
206
#define NVFX_FP_OP_PRECISION_SHIFT        22
207
#define NVFX_FP_OP_PRECISION_MASK        (3 << 22)
208
#   define NVFX_FP_PRECISION_FP32  0
209
#   define NVFX_FP_PRECISION_FP16  1
210
#   define NVFX_FP_PRECISION_FX12  2
211
#define NVFX_FP_OP_OPCODE_SHIFT          24
212
#define NVFX_FP_OP_OPCODE_MASK          (0x3F << 24)
213
/* NV30/NV40 fragment program opcodes */
214
#define NVFX_FP_OP_OPCODE_NOP 0x00
215
#define NVFX_FP_OP_OPCODE_MOV 0x01
216
#define NVFX_FP_OP_OPCODE_MUL 0x02
217
#define NVFX_FP_OP_OPCODE_ADD 0x03
218
#define NVFX_FP_OP_OPCODE_MAD 0x04
219
#define NVFX_FP_OP_OPCODE_DP3 0x05
220
#define NVFX_FP_OP_OPCODE_DP4 0x06
221
#define NVFX_FP_OP_OPCODE_DST 0x07
222
#define NVFX_FP_OP_OPCODE_MIN 0x08
223
#define NVFX_FP_OP_OPCODE_MAX 0x09
224
#define NVFX_FP_OP_OPCODE_SLT 0x0A
225
#define NVFX_FP_OP_OPCODE_SGE 0x0B
226
#define NVFX_FP_OP_OPCODE_SLE 0x0C
227
#define NVFX_FP_OP_OPCODE_SGT 0x0D
228
#define NVFX_FP_OP_OPCODE_SNE 0x0E
229
#define NVFX_FP_OP_OPCODE_SEQ 0x0F
230
#define NVFX_FP_OP_OPCODE_FRC 0x10
231
#define NVFX_FP_OP_OPCODE_FLR 0x11
232
#define NVFX_FP_OP_OPCODE_KIL 0x12
233
#define NVFX_FP_OP_OPCODE_PK4B 0x13
234
#define NVFX_FP_OP_OPCODE_UP4B 0x14
235
#define NVFX_FP_OP_OPCODE_DDX 0x15 /* can only write XY */
236
#define NVFX_FP_OP_OPCODE_DDY 0x16 /* can only write XY */
237
#define NVFX_FP_OP_OPCODE_TEX 0x17
238
#define NVFX_FP_OP_OPCODE_TXP 0x18
239
#define NVFX_FP_OP_OPCODE_TXD 0x19
240
#define NVFX_FP_OP_OPCODE_RCP 0x1A
241
#define NVFX_FP_OP_OPCODE_EX2 0x1C
242
#define NVFX_FP_OP_OPCODE_LG2 0x1D
243
#define NVFX_FP_OP_OPCODE_STR 0x20
244
#define NVFX_FP_OP_OPCODE_SFL 0x21
245
#define NVFX_FP_OP_OPCODE_COS 0x22
246
#define NVFX_FP_OP_OPCODE_SIN 0x23
247
#define NVFX_FP_OP_OPCODE_PK2H 0x24
248
#define NVFX_FP_OP_OPCODE_UP2H 0x25
249
#define NVFX_FP_OP_OPCODE_PK4UB 0x27
250
#define NVFX_FP_OP_OPCODE_UP4UB 0x28
251
#define NVFX_FP_OP_OPCODE_PK2US 0x29
252
#define NVFX_FP_OP_OPCODE_UP2US 0x2A
253
#define NVFX_FP_OP_OPCODE_DP2A 0x2E
254
#define NVFX_FP_OP_OPCODE_TXB 0x31
255
#define NVFX_FP_OP_OPCODE_DIV 0x3A
256
 
257
/* NV30 only fragment program opcodes */
258
#define NVFX_FP_OP_OPCODE_RSQ_NV30 0x1B
259
#define NVFX_FP_OP_OPCODE_LIT_NV30 0x1E
260
#define NVFX_FP_OP_OPCODE_LRP_NV30 0x1F
261
#define NVFX_FP_OP_OPCODE_POW_NV30 0x26
262
#define NVFX_FP_OP_OPCODE_RFL_NV30 0x36
263
 
264
/* NV40 only fragment program opcodes */
265
#define NVFX_FP_OP_OPCODE_TXL_NV40 0x2F
266
#define NVFX_FP_OP_OPCODE_LITEX2_NV40 0x3C
267
 
268
/* The use of these instructions appears to be indicated by bit 31 of DWORD 2.*/
269
#define NV40_FP_OP_BRA_OPCODE_BRK                                    0x0
270
#define NV40_FP_OP_BRA_OPCODE_CAL                                    0x1
271
#define NV40_FP_OP_BRA_OPCODE_IF                                     0x2
272
#define NV40_FP_OP_BRA_OPCODE_LOOP                                   0x3
273
#define NV40_FP_OP_BRA_OPCODE_REP                                    0x4
274
#define NV40_FP_OP_BRA_OPCODE_RET                                    0x5
275
 
276
#define NV40_FP_OP_OUT_NONE         (1 << 30)
277
#define NVFX_FP_OP_OUT_SAT          (1 << 31)
278
 
279
/* high order bits of SRC0 */
280
#define NVFX_FP_OP_SRC0_ABS          (1 << 29)
281
#define NVFX_FP_OP_COND_SWZ_W_SHIFT        27
282
#define NVFX_FP_OP_COND_SWZ_W_MASK        (3 << 27)
283
#define NVFX_FP_OP_COND_SWZ_Z_SHIFT        25
284
#define NVFX_FP_OP_COND_SWZ_Z_MASK        (3 << 25)
285
#define NVFX_FP_OP_COND_SWZ_Y_SHIFT        23
286
#define NVFX_FP_OP_COND_SWZ_Y_MASK        (3 << 23)
287
#define NVFX_FP_OP_COND_SWZ_X_SHIFT        21
288
#define NVFX_FP_OP_COND_SWZ_X_MASK        (3 << 21)
289
#define NVFX_FP_OP_COND_SWZ_ALL_SHIFT        21
290
#define NVFX_FP_OP_COND_SWZ_ALL_MASK        (0xFF << 21)
291
#define NVFX_FP_OP_COND_SHIFT          18
292
#define NVFX_FP_OP_COND_MASK          (0x07 << 18)
293
#  define NVFX_FP_OP_COND_FL  0
294
#  define NVFX_FP_OP_COND_LT  1
295
#  define NVFX_FP_OP_COND_EQ  2
296
#  define NVFX_FP_OP_COND_LE  3
297
#  define NVFX_FP_OP_COND_GT  4
298
#  define NVFX_FP_OP_COND_NE  5
299
#  define NVFX_FP_OP_COND_GE  6
300
#  define NVFX_FP_OP_COND_TR  7
301
 
302
/* high order bits of SRC1 */
303
#define NV40_FP_OP_OPCODE_IS_BRANCH                                      (1<<31)
304
#define NVFX_FP_OP_DST_SCALE_SHIFT        28
305
#define NVFX_FP_OP_DST_SCALE_MASK        (3 << 28)
306
#define NVFX_FP_OP_DST_SCALE_1X                                                0
307
#define NVFX_FP_OP_DST_SCALE_2X                                                1
308
#define NVFX_FP_OP_DST_SCALE_4X                                                2
309
#define NVFX_FP_OP_DST_SCALE_8X                                                3
310
#define NVFX_FP_OP_DST_SCALE_INV_2X                                            5
311
#define NVFX_FP_OP_DST_SCALE_INV_4X                                            6
312
#define NVFX_FP_OP_DST_SCALE_INV_8X                                            7
313
#define NVFX_FP_OP_SRC1_ABS          (1 << 18)
314
 
315
/* SRC1 LOOP */
316
#define NV40_FP_OP_LOOP_INCR_SHIFT                                            19
317
#define NV40_FP_OP_LOOP_INCR_MASK                                   (0xFF << 19)
318
#define NV40_FP_OP_LOOP_INDEX_SHIFT                                           10
319
#define NV40_FP_OP_LOOP_INDEX_MASK                                  (0xFF << 10)
320
#define NV40_FP_OP_LOOP_COUNT_SHIFT                                            2
321
#define NV40_FP_OP_LOOP_COUNT_MASK                                   (0xFF << 2)
322
 
323
/* SRC1 IF: absolute offset in dwords */
324
#define NV40_FP_OP_ELSE_OFFSET_SHIFT                                           0
325
#define NV40_FP_OP_ELSE_OFFSET_MASK                             (0x7FFFFFFF << 0)
326
 
327
/* SRC1 CAL */
328
#define NV40_FP_OP_SUB_OFFSET_SHIFT                                                 0
329
#define NV40_FP_OP_SUB_OFFSET_MASK                                   (0x7FFFFFFF << 0)
330
 
331
/* SRC1 REP
332
 *   I have no idea why there are 3 count values here..  but they
333
 *   have always been filled with the same value in my tests so
334
 *   far..
335
 */
336
#define NV40_FP_OP_REP_COUNT1_SHIFT                                            2
337
#define NV40_FP_OP_REP_COUNT1_MASK                                   (0xFF << 2)
338
#define NV40_FP_OP_REP_COUNT2_SHIFT                                           10
339
#define NV40_FP_OP_REP_COUNT2_MASK                                  (0xFF << 10)
340
#define NV40_FP_OP_REP_COUNT3_SHIFT                                           19
341
#define NV40_FP_OP_REP_COUNT3_MASK                                  (0xFF << 19)
342
 
343
/* SRC2 REP/IF: absolute offset in dwords */
344
#define NV40_FP_OP_END_OFFSET_SHIFT                                            0
345
#define NV40_FP_OP_END_OFFSET_MASK                              (0x7FFFFFFF << 0)
346
 
347
/* high order bits of SRC2 */
348
#define NVFX_FP_OP_INDEX_INPUT          (1 << 30)
349
#define NV40_FP_OP_ADDR_INDEX_SHIFT        19
350
#define NV40_FP_OP_ADDR_INDEX_MASK        (0xF << 19)
351
 
352
//== Register selection ==
353
#define NVFX_FP_REG_TYPE_SHIFT           0
354
#define NVFX_FP_REG_TYPE_MASK           (3 << 0)
355
#  define NVFX_FP_REG_TYPE_TEMP   0
356
#  define NVFX_FP_REG_TYPE_INPUT  1
357
#  define NVFX_FP_REG_TYPE_CONST  2
358
#define NVFX_FP_REG_SRC_SHIFT            2
359
#define NV30_FP_REG_SRC_MASK              (31 << 2)
360
#define NV40_FP_REG_SRC_MASK              (63 << 2)
361
#define NVFX_FP_REG_SRC_HALF            (1 << 8)
362
#define NVFX_FP_REG_SWZ_ALL_SHIFT        9
363
#define NVFX_FP_REG_SWZ_ALL_MASK        (255 << 9)
364
#define NVFX_FP_REG_SWZ_X_SHIFT          9
365
#define NVFX_FP_REG_SWZ_X_MASK          (3 << 9)
366
#define NVFX_FP_REG_SWZ_Y_SHIFT          11
367
#define NVFX_FP_REG_SWZ_Y_MASK          (3 << 11)
368
#define NVFX_FP_REG_SWZ_Z_SHIFT          13
369
#define NVFX_FP_REG_SWZ_Z_MASK          (3 << 13)
370
#define NVFX_FP_REG_SWZ_W_SHIFT          15
371
#define NVFX_FP_REG_SWZ_W_MASK          (3 << 15)
372
#  define NVFX_FP_SWIZZLE_X  0
373
#  define NVFX_FP_SWIZZLE_Y  1
374
#  define NVFX_FP_SWIZZLE_Z  2
375
#  define NVFX_FP_SWIZZLE_W  3
376
#define NVFX_FP_REG_NEGATE          (1 << 17)
377
 
378
#define NVFXSR_NONE	0
379
#define NVFXSR_OUTPUT	1
380
#define NVFXSR_INPUT	2
381
#define NVFXSR_TEMP	3
382
#define NVFXSR_CONST	5
383
#define NVFXSR_IMM	6
384
 
385
#define NVFX_COND_FL  0
386
#define NVFX_COND_LT  1
387
#define NVFX_COND_EQ  2
388
#define NVFX_COND_LE  3
389
#define NVFX_COND_GT  4
390
#define NVFX_COND_NE  5
391
#define NVFX_COND_GE  6
392
#define NVFX_COND_TR  7
393
 
394
/* Yes, this are ordered differently... */
395
 
396
#define NVFX_VP_MASK_X 8
397
#define NVFX_VP_MASK_Y 4
398
#define NVFX_VP_MASK_Z 2
399
#define NVFX_VP_MASK_W 1
400
#define NVFX_VP_MASK_ALL 0xf
401
 
402
#define NVFX_FP_MASK_X 1
403
#define NVFX_FP_MASK_Y 2
404
#define NVFX_FP_MASK_Z 4
405
#define NVFX_FP_MASK_W 8
406
#define NVFX_FP_MASK_ALL 0xf
407
 
408
#define NVFX_SWZ_X 0
409
#define NVFX_SWZ_Y 1
410
#define NVFX_SWZ_Z 2
411
#define NVFX_SWZ_W 3
412
 
413
#define swz(s,x,y,z,w) nvfx_src_swz((s), NVFX_SWZ_##x, NVFX_SWZ_##y, NVFX_SWZ_##z, NVFX_SWZ_##w)
414
#define neg(s) nvfx_src_neg((s))
415
#define abs(s) nvfx_src_abs((s))
416
 
417
struct nvfx_reg {
418
	int8_t type;
419
	int32_t index;
420
};
421
 
422
struct nvfx_src {
423
	struct nvfx_reg reg;
424
 
425
	uint8_t indirect : 1;
426
	uint8_t indirect_reg : 1;
427
	uint8_t indirect_swz : 2;
428
	uint8_t negate : 1;
429
	uint8_t abs : 1;
430
	uint8_t swz[4];
431
};
432
 
433
struct nvfx_insn
434
{
435
	uint8_t op;
436
	char scale;
437
	int8_t unit;
438
	uint8_t mask;
439
	uint8_t cc_swz[4];
440
 
441
	uint8_t sat : 1;
442
	uint8_t cc_update : 1;
443
	uint8_t cc_update_reg : 1;
444
	uint8_t cc_test : 3;
445
	uint8_t cc_test_reg : 1;
446
 
447
	struct nvfx_reg dst;
448
	struct nvfx_src src[3];
449
};
450
 
451
static INLINE struct nvfx_insn
452
nvfx_insn(boolean sat, unsigned op, int unit, struct nvfx_reg dst, unsigned mask, struct nvfx_src s0, struct nvfx_src s1, struct nvfx_src s2)
453
{
454
	struct nvfx_insn insn = {
455
		.op = op,
456
		.scale = 0,
457
		.unit = unit,
458
		.sat = sat,
459
		.mask = mask,
460
		.cc_update = 0,
461
		.cc_update_reg = 0,
462
		.cc_test = NVFX_COND_TR,
463
		.cc_test_reg = 0,
464
		.cc_swz = { 0, 1, 2, 3 },
465
		.dst = dst,
466
		.src = {s0, s1, s2}
467
	};
468
	return insn;
469
}
470
 
471
static INLINE struct nvfx_reg
472
nvfx_reg(int type, int index)
473
{
474
	struct nvfx_reg temp = {
475
		.type = type,
476
		.index = index,
477
	};
478
	return temp;
479
}
480
 
481
static INLINE struct nvfx_src
482
nvfx_src(struct nvfx_reg reg)
483
{
484
	struct nvfx_src temp = {
485
		.reg = reg,
486
		.abs = 0,
487
		.negate = 0,
488
		.swz = { 0, 1, 2, 3 },
489
		.indirect = 0,
490
	};
491
	return temp;
492
}
493
 
494
static INLINE struct nvfx_src
495
nvfx_src_swz(struct nvfx_src src, int x, int y, int z, int w)
496
{
497
	struct nvfx_src dst = src;
498
 
499
	dst.swz[NVFX_SWZ_X] = src.swz[x];
500
	dst.swz[NVFX_SWZ_Y] = src.swz[y];
501
	dst.swz[NVFX_SWZ_Z] = src.swz[z];
502
	dst.swz[NVFX_SWZ_W] = src.swz[w];
503
	return dst;
504
}
505
 
506
static INLINE struct nvfx_src
507
nvfx_src_neg(struct nvfx_src src)
508
{
509
	src.negate = !src.negate;
510
	return src;
511
}
512
 
513
static INLINE struct nvfx_src
514
nvfx_src_abs(struct nvfx_src src)
515
{
516
	src.abs = 1;
517
	return src;
518
}
519
 
520
struct nvfx_relocation {
521
        unsigned location;
522
        unsigned target;
523
};
524
 
525
#endif