Subversion Repositories Kolibri OS

Rev

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

  1. #ifndef __NV40_SHADER_H__
  2. #define __NV40_SHADER_H__
  3.  
  4. /* Vertex programs instruction set
  5.  *
  6.  * The NV40 instruction set is very similar to NV30.  Most fields are in
  7.  * a slightly different position in the instruction however.
  8.  *
  9.  * Merged instructions
  10.  *     In some cases it is possible to put two instructions into one opcode
  11.  *     slot.  The rules for when this is OK is not entirely clear to me yet.
  12.  *
  13.  *     There are separate writemasks and dest temp register fields for each
  14.  *     grouping of instructions.  There is however only one field with the
  15.  *     ID of a result register.  Writing to temp/result regs is selected by
  16.  *     setting VEC_RESULT/SCA_RESULT.
  17.  *
  18.  * Temporary registers
  19.  *     The source/dest temp register fields have been extended by 1 bit, to
  20.  *     give a total of 32 temporary registers.
  21.  *
  22.  * Relative Addressing
  23.  *     NV40 can use an address register to index into vertex attribute regs.
  24.  *     This is done by putting the offset value into INPUT_SRC and setting
  25.  *     the INDEX_INPUT flag.
  26.  *
  27.  * Conditional execution (see NV_vertex_program{2,3} for details)
  28.  *     There is a second condition code register on NV40, it's use is enabled
  29.  *     by setting the COND_REG_SELECT_1 flag.
  30.  *
  31.  * Texture lookup
  32.  *     TODO
  33.  */
  34.  
  35. /* ---- OPCODE BITS 127:96 / data DWORD 0 --- */
  36. #define NV40_VP_INST_VEC_RESULT                                        (1 << 30)
  37. /* uncertain.. */
  38. #define NV40_VP_INST_COND_UPDATE_ENABLE                        ((1 << 14)|1<<29)
  39. /* use address reg as index into attribs */
  40. #define NV40_VP_INST_INDEX_INPUT                                       (1 << 27)
  41. #define NV40_VP_INST_SATURATE                                          (1 << 26)
  42. #define NV40_VP_INST_COND_REG_SELECT_1                                 (1 << 25)
  43. #define NV40_VP_INST_ADDR_REG_SELECT_1                                 (1 << 24)
  44. #define NV40_VP_INST_SRC2_ABS                                          (1 << 23)
  45. #define NV40_VP_INST_SRC1_ABS                                          (1 << 22)
  46. #define NV40_VP_INST_SRC0_ABS                                          (1 << 21)
  47. #define NV40_VP_INST_VEC_DEST_TEMP_SHIFT                                      15
  48. #define NV40_VP_INST_VEC_DEST_TEMP_MASK                             (0x3F << 15)
  49. #define NV40_VP_INST_COND_TEST_ENABLE                                  (1 << 13)
  50. #define NV40_VP_INST_COND_SHIFT                                               10
  51. #define NV40_VP_INST_COND_MASK                                       (0x7 << 10)
  52. #define NV40_VP_INST_COND_SWZ_X_SHIFT                                          8
  53. #define NV40_VP_INST_COND_SWZ_X_MASK                                    (3 << 8)
  54. #define NV40_VP_INST_COND_SWZ_Y_SHIFT                                          6
  55. #define NV40_VP_INST_COND_SWZ_Y_MASK                                    (3 << 6)
  56. #define NV40_VP_INST_COND_SWZ_Z_SHIFT                                          4
  57. #define NV40_VP_INST_COND_SWZ_Z_MASK                                    (3 << 4)
  58. #define NV40_VP_INST_COND_SWZ_W_SHIFT                                          2
  59. #define NV40_VP_INST_COND_SWZ_W_MASK                                    (3 << 2)
  60. #define NV40_VP_INST_COND_SWZ_ALL_SHIFT                                        2
  61. #define NV40_VP_INST_COND_SWZ_ALL_MASK                               (0xFF << 2)
  62. #define NV40_VP_INST_ADDR_SWZ_SHIFT                                            0
  63. #define NV40_VP_INST_ADDR_SWZ_MASK                                   (0x03 << 0)
  64. #define NV40_VP_INST0_KNOWN ( \
  65.                 NV40_VP_INST_INDEX_INPUT | \
  66.                 NV40_VP_INST_COND_REG_SELECT_1 | \
  67.                 NV40_VP_INST_ADDR_REG_SELECT_1 | \
  68.                 NV40_VP_INST_SRC2_ABS | \
  69.                 NV40_VP_INST_SRC1_ABS | \
  70.                 NV40_VP_INST_SRC0_ABS | \
  71.                 NV40_VP_INST_VEC_DEST_TEMP_MASK | \
  72.                 NV40_VP_INST_COND_TEST_ENABLE | \
  73.                 NV40_VP_INST_COND_MASK | \
  74.                 NV40_VP_INST_COND_SWZ_ALL_MASK | \
  75.                 NV40_VP_INST_ADDR_SWZ_MASK)
  76.  
  77. /* ---- OPCODE BITS 95:64 / data DWORD 1 --- */
  78. #define NV40_VP_INST_VEC_OPCODE_SHIFT                                         22
  79. #define NV40_VP_INST_VEC_OPCODE_MASK                                (0x1F << 22)
  80. #define NV40_VP_INST_SCA_OPCODE_SHIFT                                         27
  81. #define NV40_VP_INST_SCA_OPCODE_MASK                                (0x1F << 27)
  82. #define NV40_VP_INST_CONST_SRC_SHIFT                                          12
  83. #define NV40_VP_INST_CONST_SRC_MASK                                 (0xFF << 12)
  84. #define NV40_VP_INST_INPUT_SRC_SHIFT                                           8
  85. #define NV40_VP_INST_INPUT_SRC_MASK                                  (0x0F << 8)
  86. #define NV40_VP_INST_SRC0H_SHIFT                                               0
  87. #define NV40_VP_INST_SRC0H_MASK                                      (0xFF << 0)
  88. #define NV40_VP_INST1_KNOWN ( \
  89.                 NV40_VP_INST_VEC_OPCODE_MASK | \
  90.                 NV40_VP_INST_SCA_OPCODE_MASK | \
  91.                 NV40_VP_INST_CONST_SRC_MASK  | \
  92.                 NV40_VP_INST_INPUT_SRC_MASK  | \
  93.                 NV40_VP_INST_SRC0H_MASK \
  94.                 )
  95.  
  96. /* ---- OPCODE BITS 63:32 / data DWORD 2 --- */
  97. #define NV40_VP_INST_SRC0L_SHIFT                                              23
  98. #define NV40_VP_INST_SRC0L_MASK                                    (0x1FF << 23)
  99. #define NV40_VP_INST_SRC1_SHIFT                                                6
  100. #define NV40_VP_INST_SRC1_MASK                                    (0x1FFFF << 6)
  101. #define NV40_VP_INST_SRC2H_SHIFT                                               0
  102. #define NV40_VP_INST_SRC2H_MASK                                      (0x3F << 0)
  103. #define NV40_VP_INST_IADDRH_SHIFT                                              0
  104. #define NV40_VP_INST_IADDRH_MASK                                     (0x3F << 0)
  105.  
  106. /* ---- OPCODE BITS 31:0 / data DWORD 3 --- */
  107. #define NV40_VP_INST_IADDRL_SHIFT                                             29
  108. #define NV40_VP_INST_IADDRL_MASK                                       (7 << 29)
  109. #define NV40_VP_INST_SRC2L_SHIFT                                              21
  110. #define NV40_VP_INST_SRC2L_MASK                                    (0x7FF << 21)
  111. #define NV40_VP_INST_SCA_WRITEMASK_SHIFT                                      17
  112. #define NV40_VP_INST_SCA_WRITEMASK_MASK                              (0xF << 17)
  113. #    define NV40_VP_INST_SCA_WRITEMASK_X                               (1 << 20)
  114. #    define NV40_VP_INST_SCA_WRITEMASK_Y                               (1 << 19)
  115. #    define NV40_VP_INST_SCA_WRITEMASK_Z                               (1 << 18)
  116. #    define NV40_VP_INST_SCA_WRITEMASK_W                               (1 << 17)
  117. #define NV40_VP_INST_VEC_WRITEMASK_SHIFT                                      13
  118. #define NV40_VP_INST_VEC_WRITEMASK_MASK                              (0xF << 13)
  119. #    define NV40_VP_INST_VEC_WRITEMASK_X                               (1 << 16)
  120. #    define NV40_VP_INST_VEC_WRITEMASK_Y                               (1 << 15)
  121. #    define NV40_VP_INST_VEC_WRITEMASK_Z                               (1 << 14)
  122. #    define NV40_VP_INST_VEC_WRITEMASK_W                               (1 << 13)
  123. #define NV40_VP_INST_SCA_RESULT                                        (1 << 12)
  124. #define NV40_VP_INST_SCA_DEST_TEMP_SHIFT                                       7
  125. #define NV40_VP_INST_SCA_DEST_TEMP_MASK                              (0x1F << 7)
  126. #define NV40_VP_INST_DEST_SHIFT                                                2
  127. #define NV40_VP_INST_DEST_MASK                                         (31 << 2)
  128. #    define NV40_VP_INST_DEST_POS                                              0
  129. #    define NV40_VP_INST_DEST_COL0                                             1
  130. #    define NV40_VP_INST_DEST_COL1                                             2
  131. #    define NV40_VP_INST_DEST_BFC0                                             3
  132. #    define NV40_VP_INST_DEST_BFC1                                             4
  133. #    define NV40_VP_INST_DEST_FOGC                                             5
  134. #    define NV40_VP_INST_DEST_PSZ                                              6
  135. #    define NV40_VP_INST_DEST_TC0                                              7
  136. #    define NV40_VP_INST_DEST_TC(n)                                        (7+n)
  137. #    define NV40_VP_INST_DEST_TEMP                                          0x1F
  138. #define NV40_VP_INST_INDEX_CONST                                        (1 << 1)
  139. #define NV40_VP_INST3_KNOWN ( \
  140.                 NV40_VP_INST_SRC2L_MASK |\
  141.                 NV40_VP_INST_SCA_WRITEMASK_MASK |\
  142.                 NV40_VP_INST_VEC_WRITEMASK_MASK |\
  143.                 NV40_VP_INST_SCA_DEST_TEMP_MASK |\
  144.                 NV40_VP_INST_DEST_MASK |\
  145.                 NV40_VP_INST_INDEX_CONST)
  146.  
  147. /* Useful to split the source selection regs into their pieces */
  148. #define NV40_VP_SRC0_HIGH_SHIFT                                                9
  149. #define NV40_VP_SRC0_HIGH_MASK                                        0x0001FE00
  150. #define NV40_VP_SRC0_LOW_MASK                                         0x000001FF
  151. #define NV40_VP_SRC2_HIGH_SHIFT                                               11
  152. #define NV40_VP_SRC2_HIGH_MASK                                        0x0001F800
  153. #define NV40_VP_SRC2_LOW_MASK                                         0x000007FF
  154.  
  155. /* Source selection - these are the bits you fill NV40_VP_INST_SRCn with */
  156. #define NV40_VP_SRC_NEGATE                                             (1 << 16)
  157. #define NV40_VP_SRC_SWZ_X_SHIFT                                               14
  158. #define NV40_VP_SRC_SWZ_X_MASK                                         (3 << 14)
  159. #define NV40_VP_SRC_SWZ_Y_SHIFT                                               12
  160. #define NV40_VP_SRC_SWZ_Y_MASK                                         (3 << 12)
  161. #define NV40_VP_SRC_SWZ_Z_SHIFT                                               10
  162. #define NV40_VP_SRC_SWZ_Z_MASK                                         (3 << 10)
  163. #define NV40_VP_SRC_SWZ_W_SHIFT                                                8
  164. #define NV40_VP_SRC_SWZ_W_MASK                                          (3 << 8)
  165. #define NV40_VP_SRC_SWZ_ALL_SHIFT                                              8
  166. #define NV40_VP_SRC_SWZ_ALL_MASK                                     (0xFF << 8)
  167. #define NV40_VP_SRC_TEMP_SRC_SHIFT                                             2
  168. #define NV40_VP_SRC_TEMP_SRC_MASK                                    (0x1F << 2)
  169. #define NV40_VP_SRC_REG_TYPE_SHIFT                                             0
  170. #define NV40_VP_SRC_REG_TYPE_MASK                                       (3 << 0)
  171. #    define NV40_VP_SRC_REG_TYPE_UNK0                                          0
  172. #    define NV40_VP_SRC_REG_TYPE_TEMP                                          1
  173. #    define NV40_VP_SRC_REG_TYPE_INPUT                                         2
  174. #    define NV40_VP_SRC_REG_TYPE_CONST                                         3
  175.  
  176. #include "nvfx_shader.h"
  177.  
  178. #endif
  179.