Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
5564 serge 1
#ifndef __NV30_SHADER_H__
2
#define __NV30_SHADER_H__
3
 
4
/* Vertex programs instruction set
5
 *
6
 * 128bit opcodes, split into 4 32-bit ones for ease of use.
7
 *
8
 * Non-native instructions
9
 *   ABS - MOV + NV40_VP_INST0_DEST_ABS
10
 *   POW - EX2 + MUL + LG2
11
 *   SUB - ADD, second source negated
12
 *   SWZ - MOV
13
 *   XPD -
14
 *
15
 * Register access
16
 *   - Only one INPUT can be accessed per-instruction (move extras into TEMPs)
17
 *   - Only one CONST can be accessed per-instruction (move extras into TEMPs)
18
 *
19
 * Relative Addressing
20
 *   According to the value returned for
21
 *   MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB
22
 *
23
 *   there are only two address registers available.  The destination in the
24
 *   ARL instruction is set to TEMP  (The temp isn't actually written).
25
 *
26
 *   When using vanilla ARB_v_p, the proprietary driver will squish both the
27
 *   available ADDRESS regs into the first hardware reg in the X and Y
28
 *   components.
29
 *
30
 *   To use an address reg as an index into consts, the CONST_SRC is set to
31
 *   (const_base + offset) and INDEX_CONST is set.
32
 *
33
 *   To access the second address reg use ADDR_REG_SELECT_1. A particular
34
 *   component of the address regs is selected with ADDR_SWZ.
35
 *
36
 *   Only one address register can be accessed per instruction.
37
 *
38
 * Conditional execution (see NV_vertex_program{2,3} for details) Conditional
39
 * execution of an instruction is enabled by setting COND_TEST_ENABLE, and
40
 * selecting the condition which will allow the test to pass with
41
 * COND_{FL,LT,...}.  It is possible to swizzle the values in the condition
42
 * register, which allows for testing against an individual component.
43
 *
44
 * Branching:
45
 *
46
 *   The BRA/CAL instructions seem to follow a slightly different opcode
47
 *   layout.  The destination instruction ID (IADDR) overlaps a source field.
48
 *   Instruction ID's seem to be numbered based on the UPLOAD_FROM_ID FIFO
49
 *   command, and is incremented automatically on each UPLOAD_INST FIFO
50
 *   command.
51
 *
52
 *   Conditional branching is achieved by using the condition tests described
53
 *   above.  There doesn't appear to be dedicated looping instructions, but
54
 *   this can be done using a temp reg + conditional branching.
55
 *
56
 *   Subroutines may be uploaded before the main program itself, but the first
57
 *   executed instruction is determined by the PROGRAM_START_ID FIFO command.
58
 *
59
 */
60
 
61
/* DWORD 0 */
62
 
63
/* guess that this is the same as nv40 */
64
#define NV30_VP_INST_INDEX_INPUT                                        (1 << 27)
65
 
66
#define NV30_VP_INST_ADDR_REG_SELECT_1        (1 << 24)
67
#define NV30_VP_INST_SRC2_ABS           (1 << 23) /* guess */
68
#define NV30_VP_INST_SRC1_ABS           (1 << 22) /* guess */
69
#define NV30_VP_INST_SRC0_ABS           (1 << 21) /* guess */
70
#define NV30_VP_INST_VEC_RESULT         (1 << 20)
71
#define NV30_VP_INST_DEST_TEMP_ID_SHIFT        16
72
#define NV30_VP_INST_DEST_TEMP_ID_MASK        (0x0F << 16)
73
#define NV30_VP_INST_COND_UPDATE_ENABLE        (1<<15)
74
#define NV30_VP_INST_VEC_DEST_TEMP_MASK      (0x1F << 16)
75
#define NV30_VP_INST_COND_TEST_ENABLE        (1<<14)
76
#define NV30_VP_INST_COND_SHIFT          11
77
#define NV30_VP_INST_COND_MASK          (0x07 << 11)
78
#define NV30_VP_INST_COND_SWZ_X_SHIFT        9
79
#define NV30_VP_INST_COND_SWZ_X_MASK        (0x03 <<  9)
80
#define NV30_VP_INST_COND_SWZ_Y_SHIFT        7
81
#define NV30_VP_INST_COND_SWZ_Y_MASK        (0x03 <<  7)
82
#define NV30_VP_INST_COND_SWZ_Z_SHIFT        5
83
#define NV30_VP_INST_COND_SWZ_Z_MASK        (0x03 <<  5)
84
#define NV30_VP_INST_COND_SWZ_W_SHIFT        3
85
#define NV30_VP_INST_COND_SWZ_W_MASK        (0x03 <<  3)
86
#define NV30_VP_INST_COND_SWZ_ALL_SHIFT        3
87
#define NV30_VP_INST_COND_SWZ_ALL_MASK        (0xFF <<  3)
88
#define NV30_VP_INST_ADDR_SWZ_SHIFT        1
89
#define NV30_VP_INST_ADDR_SWZ_MASK        (0x03 <<  1)
90
#define NV30_VP_INST_SCA_OPCODEH_SHIFT        0
91
#define NV30_VP_INST_SCA_OPCODEH_MASK        (0x01 <<  0)
92
 
93
/* DWORD 1 */
94
#define NV30_VP_INST_SCA_OPCODEL_SHIFT        28
95
#define NV30_VP_INST_SCA_OPCODEL_MASK        (0x0F << 28)
96
#define NV30_VP_INST_VEC_OPCODE_SHIFT        23
97
#define NV30_VP_INST_VEC_OPCODE_MASK        (0x1F << 23)
98
#define NV30_VP_INST_CONST_SRC_SHIFT        14
99
#define NV30_VP_INST_CONST_SRC_MASK        (0xFF << 14)
100
#define NV30_VP_INST_INPUT_SRC_SHIFT        9    /*NV20*/
101
#define NV30_VP_INST_INPUT_SRC_MASK        (0x0F <<  9)  /*NV20*/
102
#define NV30_VP_INST_SRC0H_SHIFT        0    /*NV20*/
103
#define NV30_VP_INST_SRC0H_MASK          (0x1FF << 0)  /*NV20*/
104
 
105
/* Please note: the IADDR fields overlap other fields because they are used
106
 * only for branch instructions.  See Branching: label above
107
 *
108
 * DWORD 2
109
 */
110
#define NV30_VP_INST_SRC0L_SHIFT        26    /*NV20*/
111
#define NV30_VP_INST_SRC0L_MASK         (0x3F  <<26)  /* NV30_VP_SRC0_LOW_MASK << 26 */
112
#define NV30_VP_INST_SRC1_SHIFT         11    /*NV20*/
113
#define NV30_VP_INST_SRC1_MASK          (0x7FFF<<11)  /*NV20*/
114
#define NV30_VP_INST_SRC2H_SHIFT        0    /*NV20*/
115
#define NV30_VP_INST_SRC2H_MASK          (0x7FF << 0)  /* NV30_VP_SRC2_HIGH_MASK >> 4*/
116
#define NV30_VP_INST_IADDR_SHIFT        2
117
#define NV30_VP_INST_IADDR_MASK          (0x1FF <<  2)   /* NV30_VP_SRC2_LOW_MASK << 28 */
118
 
119
/* DWORD 3 */
120
#define NV30_VP_INST_SRC2L_SHIFT        28    /*NV20*/
121
#define NV30_VP_INST_SRC2L_MASK          (0x0F  <<28)  /*NV20*/
122
#define NV30_VP_INST_STEMP_WRITEMASK_SHIFT      24
123
#define NV30_VP_INST_STEMP_WRITEMASK_MASK      (0x0F << 24)
124
#define NV30_VP_INST_VTEMP_WRITEMASK_SHIFT      20
125
#define NV30_VP_INST_VTEMP_WRITEMASK_MASK      (0x0F << 20)
126
#define NV30_VP_INST_SDEST_WRITEMASK_SHIFT      16
127
#define NV30_VP_INST_SDEST_WRITEMASK_MASK      (0x0F << 16)
128
#define NV30_VP_INST_VDEST_WRITEMASK_SHIFT      12    /*NV20*/
129
#define NV30_VP_INST_VDEST_WRITEMASK_MASK      (0x0F << 12)  /*NV20*/
130
#define NV30_VP_INST_DEST_SHIFT        2
131
#define NV30_VP_INST_DEST_MASK        (0x1F <<  2)
132
#  define NV30_VP_INST_DEST_POS  0
133
#  define NV30_VP_INST_DEST_BFC0  1
134
#  define NV30_VP_INST_DEST_BFC1  2
135
#  define NV30_VP_INST_DEST_COL0  3
136
#  define NV30_VP_INST_DEST_COL1  4
137
#  define NV30_VP_INST_DEST_FOGC  5
138
#  define NV30_VP_INST_DEST_PSZ   6
139
#  define NV30_VP_INST_DEST_TC(n)  (8+(n))
140
#  define NV30_VP_INST_DEST_CLP(n) (17 + (n))
141
 
142
/* guess that this is the same as nv40 */
143
#define NV30_VP_INST_INDEX_CONST                                        (1 << 1)
144
 
145
/* Useful to split the source selection regs into their pieces */
146
#define NV30_VP_SRC0_HIGH_SHIFT                                                6
147
#define NV30_VP_SRC0_HIGH_MASK                                        0x00007FC0
148
#define NV30_VP_SRC0_LOW_MASK                                         0x0000003F
149
#define NV30_VP_SRC2_HIGH_SHIFT                                                4
150
#define NV30_VP_SRC2_HIGH_MASK                                        0x00007FF0
151
#define NV30_VP_SRC2_LOW_MASK                                         0x0000000F
152
 
153
 
154
/* Source-register definition - matches NV20 exactly */
155
#define NV30_VP_SRC_NEGATE          (1<<14)
156
#define NV30_VP_SRC_SWZ_X_SHIFT        12
157
#define NV30_VP_SRC_REG_SWZ_X_MASK        (0x03  <<12)
158
#define NV30_VP_SRC_SWZ_Y_SHIFT        10
159
#define NV30_VP_SRC_REG_SWZ_Y_MASK        (0x03  <<10)
160
#define NV30_VP_SRC_SWZ_Z_SHIFT        8
161
#define NV30_VP_SRC_REG_SWZ_Z_MASK        (0x03  << 8)
162
#define NV30_VP_SRC_SWZ_W_SHIFT        6
163
#define NV30_VP_SRC_REG_SWZ_W_MASK        (0x03  << 6)
164
#define NV30_VP_SRC_REG_SWZ_ALL_SHIFT        6
165
#define NV30_VP_SRC_REG_SWZ_ALL_MASK        (0xFF  << 6)
166
#define NV30_VP_SRC_TEMP_SRC_SHIFT        2
167
#define NV30_VP_SRC_REG_TEMP_ID_MASK        (0x0F  << 0)
168
#define NV30_VP_SRC_REG_TYPE_SHIFT        0
169
#define NV30_VP_SRC_REG_TYPE_MASK        (0x03  << 0)
170
#define NV30_VP_SRC_REG_TYPE_TEMP  1
171
#define NV30_VP_SRC_REG_TYPE_INPUT  2
172
#define NV30_VP_SRC_REG_TYPE_CONST  3 /* guess */
173
 
174
#include "nv30/nvfx_shader.h"
175
 
176
#endif