r300_reg.h 78 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782
  1. /*
  2. * Copyright 2005 Nicolai Haehnle et al.
  3. * Copyright 2008 Advanced Micro Devices, Inc.
  4. * Copyright 2009 Jerome Glisse.
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a
  7. * copy of this software and associated documentation files (the "Software"),
  8. * to deal in the Software without restriction, including without limitation
  9. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10. * and/or sell copies of the Software, and to permit persons to whom the
  11. * Software is furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  20. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  21. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  22. * OTHER DEALINGS IN THE SOFTWARE.
  23. *
  24. * Authors: Nicolai Haehnle
  25. * Jerome Glisse
  26. */
  27. #ifndef _R300_REG_H_
  28. #define _R300_REG_H_
  29. #define R300_MC_INIT_MISC_LAT_TIMER 0x180
  30. # define R300_MC_MISC__MC_CPR_INIT_LAT_SHIFT 0
  31. # define R300_MC_MISC__MC_VF_INIT_LAT_SHIFT 4
  32. # define R300_MC_MISC__MC_DISP0R_INIT_LAT_SHIFT 8
  33. # define R300_MC_MISC__MC_DISP1R_INIT_LAT_SHIFT 12
  34. # define R300_MC_MISC__MC_FIXED_INIT_LAT_SHIFT 16
  35. # define R300_MC_MISC__MC_E2R_INIT_LAT_SHIFT 20
  36. # define R300_MC_MISC__MC_SAME_PAGE_PRIO_SHIFT 24
  37. # define R300_MC_MISC__MC_GLOBW_INIT_LAT_SHIFT 28
  38. #define R300_MC_INIT_GFX_LAT_TIMER 0x154
  39. # define R300_MC_MISC__MC_G3D0R_INIT_LAT_SHIFT 0
  40. # define R300_MC_MISC__MC_G3D1R_INIT_LAT_SHIFT 4
  41. # define R300_MC_MISC__MC_G3D2R_INIT_LAT_SHIFT 8
  42. # define R300_MC_MISC__MC_G3D3R_INIT_LAT_SHIFT 12
  43. # define R300_MC_MISC__MC_TX0R_INIT_LAT_SHIFT 16
  44. # define R300_MC_MISC__MC_TX1R_INIT_LAT_SHIFT 20
  45. # define R300_MC_MISC__MC_GLOBR_INIT_LAT_SHIFT 24
  46. # define R300_MC_MISC__MC_GLOBW_FULL_LAT_SHIFT 28
  47. /*
  48. * This file contains registers and constants for the R300. They have been
  49. * found mostly by examining command buffers captured using glxtest, as well
  50. * as by extrapolating some known registers and constants from the R200.
  51. * I am fairly certain that they are correct unless stated otherwise
  52. * in comments.
  53. */
  54. #define R300_SE_VPORT_XSCALE 0x1D98
  55. #define R300_SE_VPORT_XOFFSET 0x1D9C
  56. #define R300_SE_VPORT_YSCALE 0x1DA0
  57. #define R300_SE_VPORT_YOFFSET 0x1DA4
  58. #define R300_SE_VPORT_ZSCALE 0x1DA8
  59. #define R300_SE_VPORT_ZOFFSET 0x1DAC
  60. /*
  61. * Vertex Array Processing (VAP) Control
  62. * Stolen from r200 code from Christoph Brill (It's a guess!)
  63. */
  64. #define R300_VAP_CNTL 0x2080
  65. /* This register is written directly and also starts data section
  66. * in many 3d CP_PACKET3's
  67. */
  68. #define R300_VAP_VF_CNTL 0x2084
  69. # define R300_VAP_VF_CNTL__PRIM_TYPE__SHIFT 0
  70. # define R300_VAP_VF_CNTL__PRIM_NONE (0<<0)
  71. # define R300_VAP_VF_CNTL__PRIM_POINTS (1<<0)
  72. # define R300_VAP_VF_CNTL__PRIM_LINES (2<<0)
  73. # define R300_VAP_VF_CNTL__PRIM_LINE_STRIP (3<<0)
  74. # define R300_VAP_VF_CNTL__PRIM_TRIANGLES (4<<0)
  75. # define R300_VAP_VF_CNTL__PRIM_TRIANGLE_FAN (5<<0)
  76. # define R300_VAP_VF_CNTL__PRIM_TRIANGLE_STRIP (6<<0)
  77. # define R300_VAP_VF_CNTL__PRIM_LINE_LOOP (12<<0)
  78. # define R300_VAP_VF_CNTL__PRIM_QUADS (13<<0)
  79. # define R300_VAP_VF_CNTL__PRIM_QUAD_STRIP (14<<0)
  80. # define R300_VAP_VF_CNTL__PRIM_POLYGON (15<<0)
  81. # define R300_VAP_VF_CNTL__PRIM_WALK__SHIFT 4
  82. /* State based - direct writes to registers trigger vertex
  83. generation */
  84. # define R300_VAP_VF_CNTL__PRIM_WALK_STATE_BASED (0<<4)
  85. # define R300_VAP_VF_CNTL__PRIM_WALK_INDICES (1<<4)
  86. # define R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST (2<<4)
  87. # define R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_EMBEDDED (3<<4)
  88. /* I don't think I saw these three used.. */
  89. # define R300_VAP_VF_CNTL__COLOR_ORDER__SHIFT 6
  90. # define R300_VAP_VF_CNTL__TCL_OUTPUT_CTL_ENA__SHIFT 9
  91. # define R300_VAP_VF_CNTL__PROG_STREAM_ENA__SHIFT 10
  92. /* index size - when not set the indices are assumed to be 16 bit */
  93. # define R300_VAP_VF_CNTL__INDEX_SIZE_32bit (1<<11)
  94. /* number of vertices */
  95. # define R300_VAP_VF_CNTL__NUM_VERTICES__SHIFT 16
  96. /* BEGIN: Wild guesses */
  97. #define R300_VAP_OUTPUT_VTX_FMT_0 0x2090
  98. # define R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT (1<<0)
  99. # define R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT (1<<1)
  100. # define R300_VAP_OUTPUT_VTX_FMT_0__COLOR_1_PRESENT (1<<2) /* GUESS */
  101. # define R300_VAP_OUTPUT_VTX_FMT_0__COLOR_2_PRESENT (1<<3) /* GUESS */
  102. # define R300_VAP_OUTPUT_VTX_FMT_0__COLOR_3_PRESENT (1<<4) /* GUESS */
  103. # define R300_VAP_OUTPUT_VTX_FMT_0__PT_SIZE_PRESENT (1<<16) /* GUESS */
  104. #define R300_VAP_OUTPUT_VTX_FMT_1 0x2094
  105. /* each of the following is 3 bits wide, specifies number
  106. of components */
  107. # define R300_VAP_OUTPUT_VTX_FMT_1__TEX_0_COMP_CNT_SHIFT 0
  108. # define R300_VAP_OUTPUT_VTX_FMT_1__TEX_1_COMP_CNT_SHIFT 3
  109. # define R300_VAP_OUTPUT_VTX_FMT_1__TEX_2_COMP_CNT_SHIFT 6
  110. # define R300_VAP_OUTPUT_VTX_FMT_1__TEX_3_COMP_CNT_SHIFT 9
  111. # define R300_VAP_OUTPUT_VTX_FMT_1__TEX_4_COMP_CNT_SHIFT 12
  112. # define R300_VAP_OUTPUT_VTX_FMT_1__TEX_5_COMP_CNT_SHIFT 15
  113. # define R300_VAP_OUTPUT_VTX_FMT_1__TEX_6_COMP_CNT_SHIFT 18
  114. # define R300_VAP_OUTPUT_VTX_FMT_1__TEX_7_COMP_CNT_SHIFT 21
  115. /* END: Wild guesses */
  116. #define R300_SE_VTE_CNTL 0x20b0
  117. # define R300_VPORT_X_SCALE_ENA 0x00000001
  118. # define R300_VPORT_X_OFFSET_ENA 0x00000002
  119. # define R300_VPORT_Y_SCALE_ENA 0x00000004
  120. # define R300_VPORT_Y_OFFSET_ENA 0x00000008
  121. # define R300_VPORT_Z_SCALE_ENA 0x00000010
  122. # define R300_VPORT_Z_OFFSET_ENA 0x00000020
  123. # define R300_VTX_XY_FMT 0x00000100
  124. # define R300_VTX_Z_FMT 0x00000200
  125. # define R300_VTX_W0_FMT 0x00000400
  126. # define R300_VTX_W0_NORMALIZE 0x00000800
  127. # define R300_VTX_ST_DENORMALIZED 0x00001000
  128. /* BEGIN: Vertex data assembly - lots of uncertainties */
  129. /* gap */
  130. #define R300_VAP_CNTL_STATUS 0x2140
  131. # define R300_VC_NO_SWAP (0 << 0)
  132. # define R300_VC_16BIT_SWAP (1 << 0)
  133. # define R300_VC_32BIT_SWAP (2 << 0)
  134. # define R300_VAP_TCL_BYPASS (1 << 8)
  135. /* gap */
  136. /* Where do we get our vertex data?
  137. *
  138. * Vertex data either comes either from immediate mode registers or from
  139. * vertex arrays.
  140. * There appears to be no mixed mode (though we can force the pitch of
  141. * vertex arrays to 0, effectively reusing the same element over and over
  142. * again).
  143. *
  144. * Immediate mode is controlled by the INPUT_CNTL registers. I am not sure
  145. * if these registers influence vertex array processing.
  146. *
  147. * Vertex arrays are controlled via the 3D_LOAD_VBPNTR packet3.
  148. *
  149. * In both cases, vertex attributes are then passed through INPUT_ROUTE.
  150. *
  151. * Beginning with INPUT_ROUTE_0_0 is a list of WORDs that route vertex data
  152. * into the vertex processor's input registers.
  153. * The first word routes the first input, the second word the second, etc.
  154. * The corresponding input is routed into the register with the given index.
  155. * The list is ended by a word with INPUT_ROUTE_END set.
  156. *
  157. * Always set COMPONENTS_4 in immediate mode.
  158. */
  159. #define R300_VAP_INPUT_ROUTE_0_0 0x2150
  160. # define R300_INPUT_ROUTE_COMPONENTS_1 (0 << 0)
  161. # define R300_INPUT_ROUTE_COMPONENTS_2 (1 << 0)
  162. # define R300_INPUT_ROUTE_COMPONENTS_3 (2 << 0)
  163. # define R300_INPUT_ROUTE_COMPONENTS_4 (3 << 0)
  164. # define R300_INPUT_ROUTE_COMPONENTS_RGBA (4 << 0) /* GUESS */
  165. # define R300_VAP_INPUT_ROUTE_IDX_SHIFT 8
  166. # define R300_VAP_INPUT_ROUTE_IDX_MASK (31 << 8) /* GUESS */
  167. # define R300_VAP_INPUT_ROUTE_END (1 << 13)
  168. # define R300_INPUT_ROUTE_IMMEDIATE_MODE (0 << 14) /* GUESS */
  169. # define R300_INPUT_ROUTE_FLOAT (1 << 14) /* GUESS */
  170. # define R300_INPUT_ROUTE_UNSIGNED_BYTE (2 << 14) /* GUESS */
  171. # define R300_INPUT_ROUTE_FLOAT_COLOR (3 << 14) /* GUESS */
  172. #define R300_VAP_INPUT_ROUTE_0_1 0x2154
  173. #define R300_VAP_INPUT_ROUTE_0_2 0x2158
  174. #define R300_VAP_INPUT_ROUTE_0_3 0x215C
  175. #define R300_VAP_INPUT_ROUTE_0_4 0x2160
  176. #define R300_VAP_INPUT_ROUTE_0_5 0x2164
  177. #define R300_VAP_INPUT_ROUTE_0_6 0x2168
  178. #define R300_VAP_INPUT_ROUTE_0_7 0x216C
  179. /* gap */
  180. /* Notes:
  181. * - always set up to produce at least two attributes:
  182. * if vertex program uses only position, fglrx will set normal, too
  183. * - INPUT_CNTL_0_COLOR and INPUT_CNTL_COLOR bits are always equal.
  184. */
  185. #define R300_VAP_INPUT_CNTL_0 0x2180
  186. # define R300_INPUT_CNTL_0_COLOR 0x00000001
  187. #define R300_VAP_INPUT_CNTL_1 0x2184
  188. # define R300_INPUT_CNTL_POS 0x00000001
  189. # define R300_INPUT_CNTL_NORMAL 0x00000002
  190. # define R300_INPUT_CNTL_COLOR 0x00000004
  191. # define R300_INPUT_CNTL_TC0 0x00000400
  192. # define R300_INPUT_CNTL_TC1 0x00000800
  193. # define R300_INPUT_CNTL_TC2 0x00001000 /* GUESS */
  194. # define R300_INPUT_CNTL_TC3 0x00002000 /* GUESS */
  195. # define R300_INPUT_CNTL_TC4 0x00004000 /* GUESS */
  196. # define R300_INPUT_CNTL_TC5 0x00008000 /* GUESS */
  197. # define R300_INPUT_CNTL_TC6 0x00010000 /* GUESS */
  198. # define R300_INPUT_CNTL_TC7 0x00020000 /* GUESS */
  199. /* gap */
  200. /* Words parallel to INPUT_ROUTE_0; All words that are active in INPUT_ROUTE_0
  201. * are set to a swizzling bit pattern, other words are 0.
  202. *
  203. * In immediate mode, the pattern is always set to xyzw. In vertex array
  204. * mode, the swizzling pattern is e.g. used to set zw components in texture
  205. * coordinates with only tweo components.
  206. */
  207. #define R300_VAP_INPUT_ROUTE_1_0 0x21E0
  208. # define R300_INPUT_ROUTE_SELECT_X 0
  209. # define R300_INPUT_ROUTE_SELECT_Y 1
  210. # define R300_INPUT_ROUTE_SELECT_Z 2
  211. # define R300_INPUT_ROUTE_SELECT_W 3
  212. # define R300_INPUT_ROUTE_SELECT_ZERO 4
  213. # define R300_INPUT_ROUTE_SELECT_ONE 5
  214. # define R300_INPUT_ROUTE_SELECT_MASK 7
  215. # define R300_INPUT_ROUTE_X_SHIFT 0
  216. # define R300_INPUT_ROUTE_Y_SHIFT 3
  217. # define R300_INPUT_ROUTE_Z_SHIFT 6
  218. # define R300_INPUT_ROUTE_W_SHIFT 9
  219. # define R300_INPUT_ROUTE_ENABLE (15 << 12)
  220. #define R300_VAP_INPUT_ROUTE_1_1 0x21E4
  221. #define R300_VAP_INPUT_ROUTE_1_2 0x21E8
  222. #define R300_VAP_INPUT_ROUTE_1_3 0x21EC
  223. #define R300_VAP_INPUT_ROUTE_1_4 0x21F0
  224. #define R300_VAP_INPUT_ROUTE_1_5 0x21F4
  225. #define R300_VAP_INPUT_ROUTE_1_6 0x21F8
  226. #define R300_VAP_INPUT_ROUTE_1_7 0x21FC
  227. /* END: Vertex data assembly */
  228. /* gap */
  229. /* BEGIN: Upload vertex program and data */
  230. /*
  231. * The programmable vertex shader unit has a memory bank of unknown size
  232. * that can be written to in 16 byte units by writing the address into
  233. * UPLOAD_ADDRESS, followed by data in UPLOAD_DATA (multiples of 4 DWORDs).
  234. *
  235. * Pointers into the memory bank are always in multiples of 16 bytes.
  236. *
  237. * The memory bank is divided into areas with fixed meaning.
  238. *
  239. * Starting at address UPLOAD_PROGRAM: Vertex program instructions.
  240. * Native limits reported by drivers from ATI suggest size 256 (i.e. 4KB),
  241. * whereas the difference between known addresses suggests size 512.
  242. *
  243. * Starting at address UPLOAD_PARAMETERS: Vertex program parameters.
  244. * Native reported limits and the VPI layout suggest size 256, whereas
  245. * difference between known addresses suggests size 512.
  246. *
  247. * At address UPLOAD_POINTSIZE is a vector (0, 0, ps, 0), where ps is the
  248. * floating point pointsize. The exact purpose of this state is uncertain,
  249. * as there is also the R300_RE_POINTSIZE register.
  250. *
  251. * Multiple vertex programs and parameter sets can be loaded at once,
  252. * which could explain the size discrepancy.
  253. */
  254. #define R300_VAP_PVS_UPLOAD_ADDRESS 0x2200
  255. # define R300_PVS_UPLOAD_PROGRAM 0x00000000
  256. # define R300_PVS_UPLOAD_PARAMETERS 0x00000200
  257. # define R300_PVS_UPLOAD_POINTSIZE 0x00000406
  258. /* gap */
  259. #define R300_VAP_PVS_UPLOAD_DATA 0x2208
  260. /* END: Upload vertex program and data */
  261. /* gap */
  262. /* I do not know the purpose of this register. However, I do know that
  263. * it is set to 221C_CLEAR for clear operations and to 221C_NORMAL
  264. * for normal rendering.
  265. */
  266. #define R300_VAP_UNKNOWN_221C 0x221C
  267. # define R300_221C_NORMAL 0x00000000
  268. # define R300_221C_CLEAR 0x0001C000
  269. /* These seem to be per-pixel and per-vertex X and Y clipping planes. The first
  270. * plane is per-pixel and the second plane is per-vertex.
  271. *
  272. * This was determined by experimentation alone but I believe it is correct.
  273. *
  274. * These registers are called X_QUAD0_1_FL to X_QUAD0_4_FL by glxtest.
  275. */
  276. #define R300_VAP_CLIP_X_0 0x2220
  277. #define R300_VAP_CLIP_X_1 0x2224
  278. #define R300_VAP_CLIP_Y_0 0x2228
  279. #define R300_VAP_CLIP_Y_1 0x2230
  280. /* gap */
  281. /* Sometimes, END_OF_PKT and 0x2284=0 are the only commands sent between
  282. * rendering commands and overwriting vertex program parameters.
  283. * Therefore, I suspect writing zero to 0x2284 synchronizes the engine and
  284. * avoids bugs caused by still running shaders reading bad data from memory.
  285. */
  286. #define R300_VAP_PVS_STATE_FLUSH_REG 0x2284
  287. /* Absolutely no clue what this register is about. */
  288. #define R300_VAP_UNKNOWN_2288 0x2288
  289. # define R300_2288_R300 0x00750000 /* -- nh */
  290. # define R300_2288_RV350 0x0000FFFF /* -- Vladimir */
  291. /* gap */
  292. /* Addresses are relative to the vertex program instruction area of the
  293. * memory bank. PROGRAM_END points to the last instruction of the active
  294. * program
  295. *
  296. * The meaning of the two UNKNOWN fields is obviously not known. However,
  297. * experiments so far have shown that both *must* point to an instruction
  298. * inside the vertex program, otherwise the GPU locks up.
  299. *
  300. * fglrx usually sets CNTL_3_UNKNOWN to the end of the program and
  301. * R300_PVS_CNTL_1_POS_END_SHIFT points to instruction where last write to
  302. * position takes place.
  303. *
  304. * Most likely this is used to ignore rest of the program in cases
  305. * where group of verts arent visible. For some reason this "section"
  306. * is sometimes accepted other instruction that have no relationship with
  307. * position calculations.
  308. */
  309. #define R300_VAP_PVS_CNTL_1 0x22D0
  310. # define R300_PVS_CNTL_1_PROGRAM_START_SHIFT 0
  311. # define R300_PVS_CNTL_1_POS_END_SHIFT 10
  312. # define R300_PVS_CNTL_1_PROGRAM_END_SHIFT 20
  313. /* Addresses are relative the the vertex program parameters area. */
  314. #define R300_VAP_PVS_CNTL_2 0x22D4
  315. # define R300_PVS_CNTL_2_PARAM_OFFSET_SHIFT 0
  316. # define R300_PVS_CNTL_2_PARAM_COUNT_SHIFT 16
  317. #define R300_VAP_PVS_CNTL_3 0x22D8
  318. # define R300_PVS_CNTL_3_PROGRAM_UNKNOWN_SHIFT 10
  319. # define R300_PVS_CNTL_3_PROGRAM_UNKNOWN2_SHIFT 0
  320. /* The entire range from 0x2300 to 0x2AC inclusive seems to be used for
  321. * immediate vertices
  322. */
  323. #define R300_VAP_VTX_COLOR_R 0x2464
  324. #define R300_VAP_VTX_COLOR_G 0x2468
  325. #define R300_VAP_VTX_COLOR_B 0x246C
  326. #define R300_VAP_VTX_POS_0_X_1 0x2490 /* used for glVertex2*() */
  327. #define R300_VAP_VTX_POS_0_Y_1 0x2494
  328. #define R300_VAP_VTX_COLOR_PKD 0x249C /* RGBA */
  329. #define R300_VAP_VTX_POS_0_X_2 0x24A0 /* used for glVertex3*() */
  330. #define R300_VAP_VTX_POS_0_Y_2 0x24A4
  331. #define R300_VAP_VTX_POS_0_Z_2 0x24A8
  332. /* write 0 to indicate end of packet? */
  333. #define R300_VAP_VTX_END_OF_PKT 0x24AC
  334. /* gap */
  335. /* These are values from r300_reg/r300_reg.h - they are known to be correct
  336. * and are here so we can use one register file instead of several
  337. * - Vladimir
  338. */
  339. #define R300_GB_VAP_RASTER_VTX_FMT_0 0x4000
  340. # define R300_GB_VAP_RASTER_VTX_FMT_0__POS_PRESENT (1<<0)
  341. # define R300_GB_VAP_RASTER_VTX_FMT_0__COLOR_0_PRESENT (1<<1)
  342. # define R300_GB_VAP_RASTER_VTX_FMT_0__COLOR_1_PRESENT (1<<2)
  343. # define R300_GB_VAP_RASTER_VTX_FMT_0__COLOR_2_PRESENT (1<<3)
  344. # define R300_GB_VAP_RASTER_VTX_FMT_0__COLOR_3_PRESENT (1<<4)
  345. # define R300_GB_VAP_RASTER_VTX_FMT_0__COLOR_SPACE (0xf<<5)
  346. # define R300_GB_VAP_RASTER_VTX_FMT_0__PT_SIZE_PRESENT (0x1<<16)
  347. #define R300_GB_VAP_RASTER_VTX_FMT_1 0x4004
  348. /* each of the following is 3 bits wide, specifies number
  349. of components */
  350. # define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_0_COMP_CNT_SHIFT 0
  351. # define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_1_COMP_CNT_SHIFT 3
  352. # define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_2_COMP_CNT_SHIFT 6
  353. # define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_3_COMP_CNT_SHIFT 9
  354. # define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_4_COMP_CNT_SHIFT 12
  355. # define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_5_COMP_CNT_SHIFT 15
  356. # define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_6_COMP_CNT_SHIFT 18
  357. # define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_7_COMP_CNT_SHIFT 21
  358. /* UNK30 seems to enables point to quad transformation on textures
  359. * (or something closely related to that).
  360. * This bit is rather fatal at the time being due to lackings at pixel
  361. * shader side
  362. */
  363. #define R300_GB_ENABLE 0x4008
  364. # define R300_GB_POINT_STUFF_ENABLE (1<<0)
  365. # define R300_GB_LINE_STUFF_ENABLE (1<<1)
  366. # define R300_GB_TRIANGLE_STUFF_ENABLE (1<<2)
  367. # define R300_GB_STENCIL_AUTO_ENABLE (1<<4)
  368. # define R300_GB_UNK31 (1<<31)
  369. /* each of the following is 2 bits wide */
  370. #define R300_GB_TEX_REPLICATE 0
  371. #define R300_GB_TEX_ST 1
  372. #define R300_GB_TEX_STR 2
  373. # define R300_GB_TEX0_SOURCE_SHIFT 16
  374. # define R300_GB_TEX1_SOURCE_SHIFT 18
  375. # define R300_GB_TEX2_SOURCE_SHIFT 20
  376. # define R300_GB_TEX3_SOURCE_SHIFT 22
  377. # define R300_GB_TEX4_SOURCE_SHIFT 24
  378. # define R300_GB_TEX5_SOURCE_SHIFT 26
  379. # define R300_GB_TEX6_SOURCE_SHIFT 28
  380. # define R300_GB_TEX7_SOURCE_SHIFT 30
  381. /* MSPOS - positions for multisample antialiasing (?) */
  382. #define R300_GB_MSPOS0 0x4010
  383. /* shifts - each of the fields is 4 bits */
  384. # define R300_GB_MSPOS0__MS_X0_SHIFT 0
  385. # define R300_GB_MSPOS0__MS_Y0_SHIFT 4
  386. # define R300_GB_MSPOS0__MS_X1_SHIFT 8
  387. # define R300_GB_MSPOS0__MS_Y1_SHIFT 12
  388. # define R300_GB_MSPOS0__MS_X2_SHIFT 16
  389. # define R300_GB_MSPOS0__MS_Y2_SHIFT 20
  390. # define R300_GB_MSPOS0__MSBD0_Y 24
  391. # define R300_GB_MSPOS0__MSBD0_X 28
  392. #define R300_GB_MSPOS1 0x4014
  393. # define R300_GB_MSPOS1__MS_X3_SHIFT 0
  394. # define R300_GB_MSPOS1__MS_Y3_SHIFT 4
  395. # define R300_GB_MSPOS1__MS_X4_SHIFT 8
  396. # define R300_GB_MSPOS1__MS_Y4_SHIFT 12
  397. # define R300_GB_MSPOS1__MS_X5_SHIFT 16
  398. # define R300_GB_MSPOS1__MS_Y5_SHIFT 20
  399. # define R300_GB_MSPOS1__MSBD1 24
  400. #define R300_GB_TILE_CONFIG 0x4018
  401. # define R300_GB_TILE_ENABLE (1<<0)
  402. # define R300_GB_TILE_PIPE_COUNT_RV300 0
  403. # define R300_GB_TILE_PIPE_COUNT_R300 (3<<1)
  404. # define R300_GB_TILE_PIPE_COUNT_R420 (7<<1)
  405. # define R300_GB_TILE_PIPE_COUNT_RV410 (3<<1)
  406. # define R300_GB_TILE_SIZE_8 0
  407. # define R300_GB_TILE_SIZE_16 (1<<4)
  408. # define R300_GB_TILE_SIZE_32 (2<<4)
  409. # define R300_GB_SUPER_SIZE_1 (0<<6)
  410. # define R300_GB_SUPER_SIZE_2 (1<<6)
  411. # define R300_GB_SUPER_SIZE_4 (2<<6)
  412. # define R300_GB_SUPER_SIZE_8 (3<<6)
  413. # define R300_GB_SUPER_SIZE_16 (4<<6)
  414. # define R300_GB_SUPER_SIZE_32 (5<<6)
  415. # define R300_GB_SUPER_SIZE_64 (6<<6)
  416. # define R300_GB_SUPER_SIZE_128 (7<<6)
  417. # define R300_GB_SUPER_X_SHIFT 9 /* 3 bits wide */
  418. # define R300_GB_SUPER_Y_SHIFT 12 /* 3 bits wide */
  419. # define R300_GB_SUPER_TILE_A 0
  420. # define R300_GB_SUPER_TILE_B (1<<15)
  421. # define R300_GB_SUBPIXEL_1_12 0
  422. # define R300_GB_SUBPIXEL_1_16 (1<<16)
  423. #define R300_GB_FIFO_SIZE 0x4024
  424. /* each of the following is 2 bits wide */
  425. #define R300_GB_FIFO_SIZE_32 0
  426. #define R300_GB_FIFO_SIZE_64 1
  427. #define R300_GB_FIFO_SIZE_128 2
  428. #define R300_GB_FIFO_SIZE_256 3
  429. # define R300_SC_IFIFO_SIZE_SHIFT 0
  430. # define R300_SC_TZFIFO_SIZE_SHIFT 2
  431. # define R300_SC_BFIFO_SIZE_SHIFT 4
  432. # define R300_US_OFIFO_SIZE_SHIFT 12
  433. # define R300_US_WFIFO_SIZE_SHIFT 14
  434. /* the following use the same constants as above, but meaning is
  435. is times 2 (i.e. instead of 32 words it means 64 */
  436. # define R300_RS_TFIFO_SIZE_SHIFT 6
  437. # define R300_RS_CFIFO_SIZE_SHIFT 8
  438. # define R300_US_RAM_SIZE_SHIFT 10
  439. /* watermarks, 3 bits wide */
  440. # define R300_RS_HIGHWATER_COL_SHIFT 16
  441. # define R300_RS_HIGHWATER_TEX_SHIFT 19
  442. # define R300_OFIFO_HIGHWATER_SHIFT 22 /* two bits only */
  443. # define R300_CUBE_FIFO_HIGHWATER_COL_SHIFT 24
  444. #define R300_GB_SELECT 0x401C
  445. # define R300_GB_FOG_SELECT_C0A 0
  446. # define R300_GB_FOG_SELECT_C1A 1
  447. # define R300_GB_FOG_SELECT_C2A 2
  448. # define R300_GB_FOG_SELECT_C3A 3
  449. # define R300_GB_FOG_SELECT_1_1_W 4
  450. # define R300_GB_FOG_SELECT_Z 5
  451. # define R300_GB_DEPTH_SELECT_Z 0
  452. # define R300_GB_DEPTH_SELECT_1_1_W (1<<3)
  453. # define R300_GB_W_SELECT_1_W 0
  454. # define R300_GB_W_SELECT_1 (1<<4)
  455. #define R300_GB_AA_CONFIG 0x4020
  456. # define R300_AA_DISABLE 0x00
  457. # define R300_AA_ENABLE 0x01
  458. # define R300_AA_SUBSAMPLES_2 0
  459. # define R300_AA_SUBSAMPLES_3 (1<<1)
  460. # define R300_AA_SUBSAMPLES_4 (2<<1)
  461. # define R300_AA_SUBSAMPLES_6 (3<<1)
  462. /* gap */
  463. /* Zero to flush caches. */
  464. #define R300_TX_INVALTAGS 0x4100
  465. #define R300_TX_FLUSH 0x0
  466. /* The upper enable bits are guessed, based on fglrx reported limits. */
  467. #define R300_TX_ENABLE 0x4104
  468. # define R300_TX_ENABLE_0 (1 << 0)
  469. # define R300_TX_ENABLE_1 (1 << 1)
  470. # define R300_TX_ENABLE_2 (1 << 2)
  471. # define R300_TX_ENABLE_3 (1 << 3)
  472. # define R300_TX_ENABLE_4 (1 << 4)
  473. # define R300_TX_ENABLE_5 (1 << 5)
  474. # define R300_TX_ENABLE_6 (1 << 6)
  475. # define R300_TX_ENABLE_7 (1 << 7)
  476. # define R300_TX_ENABLE_8 (1 << 8)
  477. # define R300_TX_ENABLE_9 (1 << 9)
  478. # define R300_TX_ENABLE_10 (1 << 10)
  479. # define R300_TX_ENABLE_11 (1 << 11)
  480. # define R300_TX_ENABLE_12 (1 << 12)
  481. # define R300_TX_ENABLE_13 (1 << 13)
  482. # define R300_TX_ENABLE_14 (1 << 14)
  483. # define R300_TX_ENABLE_15 (1 << 15)
  484. /* The pointsize is given in multiples of 6. The pointsize can be
  485. * enormous: Clear() renders a single point that fills the entire
  486. * framebuffer.
  487. */
  488. #define R300_RE_POINTSIZE 0x421C
  489. # define R300_POINTSIZE_Y_SHIFT 0
  490. # define R300_POINTSIZE_Y_MASK (0xFFFF << 0) /* GUESS */
  491. # define R300_POINTSIZE_X_SHIFT 16
  492. # define R300_POINTSIZE_X_MASK (0xFFFF << 16) /* GUESS */
  493. # define R300_POINTSIZE_MAX (R300_POINTSIZE_Y_MASK / 6)
  494. /* The line width is given in multiples of 6.
  495. * In default mode lines are classified as vertical lines.
  496. * HO: horizontal
  497. * VE: vertical or horizontal
  498. * HO & VE: no classification
  499. */
  500. #define R300_RE_LINE_CNT 0x4234
  501. # define R300_LINESIZE_SHIFT 0
  502. # define R300_LINESIZE_MASK (0xFFFF << 0) /* GUESS */
  503. # define R300_LINESIZE_MAX (R300_LINESIZE_MASK / 6)
  504. # define R300_LINE_CNT_HO (1 << 16)
  505. # define R300_LINE_CNT_VE (1 << 17)
  506. /* Some sort of scale or clamp value for texcoordless textures. */
  507. #define R300_RE_UNK4238 0x4238
  508. /* Something shade related */
  509. #define R300_RE_SHADE 0x4274
  510. #define R300_RE_SHADE_MODEL 0x4278
  511. # define R300_RE_SHADE_MODEL_SMOOTH 0x3aaaa
  512. # define R300_RE_SHADE_MODEL_FLAT 0x39595
  513. /* Dangerous */
  514. #define R300_RE_POLYGON_MODE 0x4288
  515. # define R300_PM_ENABLED (1 << 0)
  516. # define R300_PM_FRONT_POINT (0 << 0)
  517. # define R300_PM_BACK_POINT (0 << 0)
  518. # define R300_PM_FRONT_LINE (1 << 4)
  519. # define R300_PM_FRONT_FILL (1 << 5)
  520. # define R300_PM_BACK_LINE (1 << 7)
  521. # define R300_PM_BACK_FILL (1 << 8)
  522. /* Fog parameters */
  523. #define R300_RE_FOG_SCALE 0x4294
  524. #define R300_RE_FOG_START 0x4298
  525. /* Not sure why there are duplicate of factor and constant values.
  526. * My best guess so far is that there are separate zbiases for test and write.
  527. * Ordering might be wrong.
  528. * Some of the tests indicate that fgl has a fallback implementation of zbias
  529. * via pixel shaders.
  530. */
  531. #define R300_RE_ZBIAS_CNTL 0x42A0 /* GUESS */
  532. #define R300_RE_ZBIAS_T_FACTOR 0x42A4
  533. #define R300_RE_ZBIAS_T_CONSTANT 0x42A8
  534. #define R300_RE_ZBIAS_W_FACTOR 0x42AC
  535. #define R300_RE_ZBIAS_W_CONSTANT 0x42B0
  536. /* This register needs to be set to (1<<1) for RV350 to correctly
  537. * perform depth test (see --vb-triangles in r300_demo)
  538. * Don't know about other chips. - Vladimir
  539. * This is set to 3 when GL_POLYGON_OFFSET_FILL is on.
  540. * My guess is that there are two bits for each zbias primitive
  541. * (FILL, LINE, POINT).
  542. * One to enable depth test and one for depth write.
  543. * Yet this doesnt explain why depth writes work ...
  544. */
  545. #define R300_RE_OCCLUSION_CNTL 0x42B4
  546. # define R300_OCCLUSION_ON (1<<1)
  547. #define R300_RE_CULL_CNTL 0x42B8
  548. # define R300_CULL_FRONT (1 << 0)
  549. # define R300_CULL_BACK (1 << 1)
  550. # define R300_FRONT_FACE_CCW (0 << 2)
  551. # define R300_FRONT_FACE_CW (1 << 2)
  552. /* BEGIN: Rasterization / Interpolators - many guesses */
  553. /* 0_UNKNOWN_18 has always been set except for clear operations.
  554. * TC_CNT is the number of incoming texture coordinate sets (i.e. it depends
  555. * on the vertex program, *not* the fragment program)
  556. */
  557. #define R300_RS_CNTL_0 0x4300
  558. # define R300_RS_CNTL_TC_CNT_SHIFT 2
  559. # define R300_RS_CNTL_TC_CNT_MASK (7 << 2)
  560. /* number of color interpolators used */
  561. # define R300_RS_CNTL_CI_CNT_SHIFT 7
  562. # define R300_RS_CNTL_0_UNKNOWN_18 (1 << 18)
  563. /* Guess: RS_CNTL_1 holds the index of the highest used RS_ROUTE_n
  564. register. */
  565. #define R300_RS_CNTL_1 0x4304
  566. /* gap */
  567. /* Only used for texture coordinates.
  568. * Use the source field to route texture coordinate input from the
  569. * vertex program to the desired interpolator. Note that the source
  570. * field is relative to the outputs the vertex program *actually*
  571. * writes. If a vertex program only writes texcoord[1], this will
  572. * be source index 0.
  573. * Set INTERP_USED on all interpolators that produce data used by
  574. * the fragment program. INTERP_USED looks like a swizzling mask,
  575. * but I haven't seen it used that way.
  576. *
  577. * Note: The _UNKNOWN constants are always set in their respective
  578. * register. I don't know if this is necessary.
  579. */
  580. #define R300_RS_INTERP_0 0x4310
  581. #define R300_RS_INTERP_1 0x4314
  582. # define R300_RS_INTERP_1_UNKNOWN 0x40
  583. #define R300_RS_INTERP_2 0x4318
  584. # define R300_RS_INTERP_2_UNKNOWN 0x80
  585. #define R300_RS_INTERP_3 0x431C
  586. # define R300_RS_INTERP_3_UNKNOWN 0xC0
  587. #define R300_RS_INTERP_4 0x4320
  588. #define R300_RS_INTERP_5 0x4324
  589. #define R300_RS_INTERP_6 0x4328
  590. #define R300_RS_INTERP_7 0x432C
  591. # define R300_RS_INTERP_SRC_SHIFT 2
  592. # define R300_RS_INTERP_SRC_MASK (7 << 2)
  593. # define R300_RS_INTERP_USED 0x00D10000
  594. /* These DWORDs control how vertex data is routed into fragment program
  595. * registers, after interpolators.
  596. */
  597. #define R300_RS_ROUTE_0 0x4330
  598. #define R300_RS_ROUTE_1 0x4334
  599. #define R300_RS_ROUTE_2 0x4338
  600. #define R300_RS_ROUTE_3 0x433C /* GUESS */
  601. #define R300_RS_ROUTE_4 0x4340 /* GUESS */
  602. #define R300_RS_ROUTE_5 0x4344 /* GUESS */
  603. #define R300_RS_ROUTE_6 0x4348 /* GUESS */
  604. #define R300_RS_ROUTE_7 0x434C /* GUESS */
  605. # define R300_RS_ROUTE_SOURCE_INTERP_0 0
  606. # define R300_RS_ROUTE_SOURCE_INTERP_1 1
  607. # define R300_RS_ROUTE_SOURCE_INTERP_2 2
  608. # define R300_RS_ROUTE_SOURCE_INTERP_3 3
  609. # define R300_RS_ROUTE_SOURCE_INTERP_4 4
  610. # define R300_RS_ROUTE_SOURCE_INTERP_5 5 /* GUESS */
  611. # define R300_RS_ROUTE_SOURCE_INTERP_6 6 /* GUESS */
  612. # define R300_RS_ROUTE_SOURCE_INTERP_7 7 /* GUESS */
  613. # define R300_RS_ROUTE_ENABLE (1 << 3) /* GUESS */
  614. # define R300_RS_ROUTE_DEST_SHIFT 6
  615. # define R300_RS_ROUTE_DEST_MASK (31 << 6) /* GUESS */
  616. /* Special handling for color: When the fragment program uses color,
  617. * the ROUTE_0_COLOR bit is set and ROUTE_0_COLOR_DEST contains the
  618. * color register index.
  619. *
  620. * Apperently you may set the R300_RS_ROUTE_0_COLOR bit, but not provide any
  621. * R300_RS_ROUTE_0_COLOR_DEST value; this setup is used for clearing the state.
  622. * See r300_ioctl.c:r300EmitClearState. I'm not sure if this setup is strictly
  623. * correct or not. - Oliver.
  624. */
  625. # define R300_RS_ROUTE_0_COLOR (1 << 14)
  626. # define R300_RS_ROUTE_0_COLOR_DEST_SHIFT 17
  627. # define R300_RS_ROUTE_0_COLOR_DEST_MASK (31 << 17) /* GUESS */
  628. /* As above, but for secondary color */
  629. # define R300_RS_ROUTE_1_COLOR1 (1 << 14)
  630. # define R300_RS_ROUTE_1_COLOR1_DEST_SHIFT 17
  631. # define R300_RS_ROUTE_1_COLOR1_DEST_MASK (31 << 17)
  632. # define R300_RS_ROUTE_1_UNKNOWN11 (1 << 11)
  633. /* END: Rasterization / Interpolators - many guesses */
  634. /* Hierarchical Z Enable */
  635. #define R300_SC_HYPERZ 0x43a4
  636. # define R300_SC_HYPERZ_DISABLE (0 << 0)
  637. # define R300_SC_HYPERZ_ENABLE (1 << 0)
  638. # define R300_SC_HYPERZ_MIN (0 << 1)
  639. # define R300_SC_HYPERZ_MAX (1 << 1)
  640. # define R300_SC_HYPERZ_ADJ_256 (0 << 2)
  641. # define R300_SC_HYPERZ_ADJ_128 (1 << 2)
  642. # define R300_SC_HYPERZ_ADJ_64 (2 << 2)
  643. # define R300_SC_HYPERZ_ADJ_32 (3 << 2)
  644. # define R300_SC_HYPERZ_ADJ_16 (4 << 2)
  645. # define R300_SC_HYPERZ_ADJ_8 (5 << 2)
  646. # define R300_SC_HYPERZ_ADJ_4 (6 << 2)
  647. # define R300_SC_HYPERZ_ADJ_2 (7 << 2)
  648. # define R300_SC_HYPERZ_HZ_Z0MIN_NO (0 << 5)
  649. # define R300_SC_HYPERZ_HZ_Z0MIN (1 << 5)
  650. # define R300_SC_HYPERZ_HZ_Z0MAX_NO (0 << 6)
  651. # define R300_SC_HYPERZ_HZ_Z0MAX (1 << 6)
  652. #define R300_SC_EDGERULE 0x43a8
  653. /* BEGIN: Scissors and cliprects */
  654. /* There are four clipping rectangles. Their corner coordinates are inclusive.
  655. * Every pixel is assigned a number from 0 and 15 by setting bits 0-3 depending
  656. * on whether the pixel is inside cliprects 0-3, respectively. For example,
  657. * if a pixel is inside cliprects 0 and 1, but outside 2 and 3, it is assigned
  658. * the number 3 (binary 0011).
  659. * Iff the bit corresponding to the pixel's number in RE_CLIPRECT_CNTL is set,
  660. * the pixel is rasterized.
  661. *
  662. * In addition to this, there is a scissors rectangle. Only pixels inside the
  663. * scissors rectangle are drawn. (coordinates are inclusive)
  664. *
  665. * For some reason, the top-left corner of the framebuffer is at (1440, 1440)
  666. * for the purpose of clipping and scissors.
  667. */
  668. #define R300_RE_CLIPRECT_TL_0 0x43B0
  669. #define R300_RE_CLIPRECT_BR_0 0x43B4
  670. #define R300_RE_CLIPRECT_TL_1 0x43B8
  671. #define R300_RE_CLIPRECT_BR_1 0x43BC
  672. #define R300_RE_CLIPRECT_TL_2 0x43C0
  673. #define R300_RE_CLIPRECT_BR_2 0x43C4
  674. #define R300_RE_CLIPRECT_TL_3 0x43C8
  675. #define R300_RE_CLIPRECT_BR_3 0x43CC
  676. # define R300_CLIPRECT_OFFSET 1440
  677. # define R300_CLIPRECT_MASK 0x1FFF
  678. # define R300_CLIPRECT_X_SHIFT 0
  679. # define R300_CLIPRECT_X_MASK (0x1FFF << 0)
  680. # define R300_CLIPRECT_Y_SHIFT 13
  681. # define R300_CLIPRECT_Y_MASK (0x1FFF << 13)
  682. #define R300_RE_CLIPRECT_CNTL 0x43D0
  683. # define R300_CLIP_OUT (1 << 0)
  684. # define R300_CLIP_0 (1 << 1)
  685. # define R300_CLIP_1 (1 << 2)
  686. # define R300_CLIP_10 (1 << 3)
  687. # define R300_CLIP_2 (1 << 4)
  688. # define R300_CLIP_20 (1 << 5)
  689. # define R300_CLIP_21 (1 << 6)
  690. # define R300_CLIP_210 (1 << 7)
  691. # define R300_CLIP_3 (1 << 8)
  692. # define R300_CLIP_30 (1 << 9)
  693. # define R300_CLIP_31 (1 << 10)
  694. # define R300_CLIP_310 (1 << 11)
  695. # define R300_CLIP_32 (1 << 12)
  696. # define R300_CLIP_320 (1 << 13)
  697. # define R300_CLIP_321 (1 << 14)
  698. # define R300_CLIP_3210 (1 << 15)
  699. /* gap */
  700. #define R300_RE_SCISSORS_TL 0x43E0
  701. #define R300_RE_SCISSORS_BR 0x43E4
  702. # define R300_SCISSORS_OFFSET 1440
  703. # define R300_SCISSORS_X_SHIFT 0
  704. # define R300_SCISSORS_X_MASK (0x1FFF << 0)
  705. # define R300_SCISSORS_Y_SHIFT 13
  706. # define R300_SCISSORS_Y_MASK (0x1FFF << 13)
  707. /* END: Scissors and cliprects */
  708. /* BEGIN: Texture specification */
  709. /*
  710. * The texture specification dwords are grouped by meaning and not by texture
  711. * unit. This means that e.g. the offset for texture image unit N is found in
  712. * register TX_OFFSET_0 + (4*N)
  713. */
  714. #define R300_TX_FILTER_0 0x4400
  715. # define R300_TX_REPEAT 0
  716. # define R300_TX_MIRRORED 1
  717. # define R300_TX_CLAMP 4
  718. # define R300_TX_CLAMP_TO_EDGE 2
  719. # define R300_TX_CLAMP_TO_BORDER 6
  720. # define R300_TX_WRAP_S_SHIFT 0
  721. # define R300_TX_WRAP_S_MASK (7 << 0)
  722. # define R300_TX_WRAP_T_SHIFT 3
  723. # define R300_TX_WRAP_T_MASK (7 << 3)
  724. # define R300_TX_WRAP_Q_SHIFT 6
  725. # define R300_TX_WRAP_Q_MASK (7 << 6)
  726. # define R300_TX_MAG_FILTER_NEAREST (1 << 9)
  727. # define R300_TX_MAG_FILTER_LINEAR (2 << 9)
  728. # define R300_TX_MAG_FILTER_MASK (3 << 9)
  729. # define R300_TX_MIN_FILTER_NEAREST (1 << 11)
  730. # define R300_TX_MIN_FILTER_LINEAR (2 << 11)
  731. # define R300_TX_MIN_FILTER_NEAREST_MIP_NEAREST (5 << 11)
  732. # define R300_TX_MIN_FILTER_NEAREST_MIP_LINEAR (9 << 11)
  733. # define R300_TX_MIN_FILTER_LINEAR_MIP_NEAREST (6 << 11)
  734. # define R300_TX_MIN_FILTER_LINEAR_MIP_LINEAR (10 << 11)
  735. /* NOTE: NEAREST doesnt seem to exist.
  736. * Im not seting MAG_FILTER_MASK and (3 << 11) on for all
  737. * anisotropy modes because that would void selected mag filter
  738. */
  739. # define R300_TX_MIN_FILTER_ANISO_NEAREST (0 << 13)
  740. # define R300_TX_MIN_FILTER_ANISO_LINEAR (0 << 13)
  741. # define R300_TX_MIN_FILTER_ANISO_NEAREST_MIP_NEAREST (1 << 13)
  742. # define R300_TX_MIN_FILTER_ANISO_NEAREST_MIP_LINEAR (2 << 13)
  743. # define R300_TX_MIN_FILTER_MASK ( (15 << 11) | (3 << 13) )
  744. # define R300_TX_MAX_ANISO_1_TO_1 (0 << 21)
  745. # define R300_TX_MAX_ANISO_2_TO_1 (2 << 21)
  746. # define R300_TX_MAX_ANISO_4_TO_1 (4 << 21)
  747. # define R300_TX_MAX_ANISO_8_TO_1 (6 << 21)
  748. # define R300_TX_MAX_ANISO_16_TO_1 (8 << 21)
  749. # define R300_TX_MAX_ANISO_MASK (14 << 21)
  750. #define R300_TX_FILTER1_0 0x4440
  751. # define R300_CHROMA_KEY_MODE_DISABLE 0
  752. # define R300_CHROMA_KEY_FORCE 1
  753. # define R300_CHROMA_KEY_BLEND 2
  754. # define R300_MC_ROUND_NORMAL (0<<2)
  755. # define R300_MC_ROUND_MPEG4 (1<<2)
  756. # define R300_LOD_BIAS_MASK 0x1fff
  757. # define R300_EDGE_ANISO_EDGE_DIAG (0<<13)
  758. # define R300_EDGE_ANISO_EDGE_ONLY (1<<13)
  759. # define R300_MC_COORD_TRUNCATE_DISABLE (0<<14)
  760. # define R300_MC_COORD_TRUNCATE_MPEG (1<<14)
  761. # define R300_TX_TRI_PERF_0_8 (0<<15)
  762. # define R300_TX_TRI_PERF_1_8 (1<<15)
  763. # define R300_TX_TRI_PERF_1_4 (2<<15)
  764. # define R300_TX_TRI_PERF_3_8 (3<<15)
  765. # define R300_ANISO_THRESHOLD_MASK (7<<17)
  766. #define R300_TX_SIZE_0 0x4480
  767. # define R300_TX_WIDTHMASK_SHIFT 0
  768. # define R300_TX_WIDTHMASK_MASK (2047 << 0)
  769. # define R300_TX_HEIGHTMASK_SHIFT 11
  770. # define R300_TX_HEIGHTMASK_MASK (2047 << 11)
  771. # define R300_TX_UNK23 (1 << 23)
  772. # define R300_TX_MAX_MIP_LEVEL_SHIFT 26
  773. # define R300_TX_MAX_MIP_LEVEL_MASK (0xf << 26)
  774. # define R300_TX_SIZE_PROJECTED (1<<30)
  775. # define R300_TX_SIZE_TXPITCH_EN (1<<31)
  776. #define R300_TX_FORMAT_0 0x44C0
  777. /* The interpretation of the format word by Wladimir van der Laan */
  778. /* The X, Y, Z and W refer to the layout of the components.
  779. They are given meanings as R, G, B and Alpha by the swizzle
  780. specification */
  781. # define R300_TX_FORMAT_X8 0x0
  782. # define R300_TX_FORMAT_X16 0x1
  783. # define R300_TX_FORMAT_Y4X4 0x2
  784. # define R300_TX_FORMAT_Y8X8 0x3
  785. # define R300_TX_FORMAT_Y16X16 0x4
  786. # define R300_TX_FORMAT_Z3Y3X2 0x5
  787. # define R300_TX_FORMAT_Z5Y6X5 0x6
  788. # define R300_TX_FORMAT_Z6Y5X5 0x7
  789. # define R300_TX_FORMAT_Z11Y11X10 0x8
  790. # define R300_TX_FORMAT_Z10Y11X11 0x9
  791. # define R300_TX_FORMAT_W4Z4Y4X4 0xA
  792. # define R300_TX_FORMAT_W1Z5Y5X5 0xB
  793. # define R300_TX_FORMAT_W8Z8Y8X8 0xC
  794. # define R300_TX_FORMAT_W2Z10Y10X10 0xD
  795. # define R300_TX_FORMAT_W16Z16Y16X16 0xE
  796. # define R300_TX_FORMAT_DXT1 0xF
  797. # define R300_TX_FORMAT_DXT3 0x10
  798. # define R300_TX_FORMAT_DXT5 0x11
  799. # define R300_TX_FORMAT_D3DMFT_CxV8U8 0x12 /* no swizzle */
  800. # define R300_TX_FORMAT_A8R8G8B8 0x13 /* no swizzle */
  801. # define R300_TX_FORMAT_B8G8_B8G8 0x14 /* no swizzle */
  802. # define R300_TX_FORMAT_G8R8_G8B8 0x15 /* no swizzle */
  803. /* 0x16 - some 16 bit green format.. ?? */
  804. # define R300_TX_FORMAT_UNK25 (1 << 25) /* no swizzle */
  805. # define R300_TX_FORMAT_CUBIC_MAP (1 << 26)
  806. /* gap */
  807. /* Floating point formats */
  808. /* Note - hardware supports both 16 and 32 bit floating point */
  809. # define R300_TX_FORMAT_FL_I16 0x18
  810. # define R300_TX_FORMAT_FL_I16A16 0x19
  811. # define R300_TX_FORMAT_FL_R16G16B16A16 0x1A
  812. # define R300_TX_FORMAT_FL_I32 0x1B
  813. # define R300_TX_FORMAT_FL_I32A32 0x1C
  814. # define R300_TX_FORMAT_FL_R32G32B32A32 0x1D
  815. /* alpha modes, convenience mostly */
  816. /* if you have alpha, pick constant appropriate to the
  817. number of channels (1 for I8, 2 for I8A8, 4 for R8G8B8A8, etc */
  818. # define R300_TX_FORMAT_ALPHA_1CH 0x000
  819. # define R300_TX_FORMAT_ALPHA_2CH 0x200
  820. # define R300_TX_FORMAT_ALPHA_4CH 0x600
  821. # define R300_TX_FORMAT_ALPHA_NONE 0xA00
  822. /* Swizzling */
  823. /* constants */
  824. # define R300_TX_FORMAT_X 0
  825. # define R300_TX_FORMAT_Y 1
  826. # define R300_TX_FORMAT_Z 2
  827. # define R300_TX_FORMAT_W 3
  828. # define R300_TX_FORMAT_ZERO 4
  829. # define R300_TX_FORMAT_ONE 5
  830. /* 2.0*Z, everything above 1.0 is set to 0.0 */
  831. # define R300_TX_FORMAT_CUT_Z 6
  832. /* 2.0*W, everything above 1.0 is set to 0.0 */
  833. # define R300_TX_FORMAT_CUT_W 7
  834. # define R300_TX_FORMAT_B_SHIFT 18
  835. # define R300_TX_FORMAT_G_SHIFT 15
  836. # define R300_TX_FORMAT_R_SHIFT 12
  837. # define R300_TX_FORMAT_A_SHIFT 9
  838. /* Convenience macro to take care of layout and swizzling */
  839. # define R300_EASY_TX_FORMAT(B, G, R, A, FMT) ( \
  840. ((R300_TX_FORMAT_##B)<<R300_TX_FORMAT_B_SHIFT) \
  841. | ((R300_TX_FORMAT_##G)<<R300_TX_FORMAT_G_SHIFT) \
  842. | ((R300_TX_FORMAT_##R)<<R300_TX_FORMAT_R_SHIFT) \
  843. | ((R300_TX_FORMAT_##A)<<R300_TX_FORMAT_A_SHIFT) \
  844. | (R300_TX_FORMAT_##FMT) \
  845. )
  846. /* These can be ORed with result of R300_EASY_TX_FORMAT()
  847. We don't really know what they do. Take values from a
  848. constant color ? */
  849. # define R300_TX_FORMAT_CONST_X (1<<5)
  850. # define R300_TX_FORMAT_CONST_Y (2<<5)
  851. # define R300_TX_FORMAT_CONST_Z (4<<5)
  852. # define R300_TX_FORMAT_CONST_W (8<<5)
  853. # define R300_TX_FORMAT_YUV_MODE 0x00800000
  854. #define R300_TX_PITCH_0 0x4500 /* obvious missing in gap */
  855. #define R300_TX_OFFSET_0 0x4540
  856. /* BEGIN: Guess from R200 */
  857. # define R300_TXO_ENDIAN_NO_SWAP (0 << 0)
  858. # define R300_TXO_ENDIAN_BYTE_SWAP (1 << 0)
  859. # define R300_TXO_ENDIAN_WORD_SWAP (2 << 0)
  860. # define R300_TXO_ENDIAN_HALFDW_SWAP (3 << 0)
  861. # define R300_TXO_MACRO_TILE (1 << 2)
  862. # define R300_TXO_MICRO_TILE (1 << 3)
  863. # define R300_TXO_OFFSET_MASK 0xffffffe0
  864. # define R300_TXO_OFFSET_SHIFT 5
  865. /* END: Guess from R200 */
  866. /* 32 bit chroma key */
  867. #define R300_TX_CHROMA_KEY_0 0x4580
  868. /* ff00ff00 == { 0, 1.0, 0, 1.0 } */
  869. #define R300_TX_BORDER_COLOR_0 0x45C0
  870. /* END: Texture specification */
  871. /* BEGIN: Fragment program instruction set */
  872. /* Fragment programs are written directly into register space.
  873. * There are separate instruction streams for texture instructions and ALU
  874. * instructions.
  875. * In order to synchronize these streams, the program is divided into up
  876. * to 4 nodes. Each node begins with a number of TEX operations, followed
  877. * by a number of ALU operations.
  878. * The first node can have zero TEX ops, all subsequent nodes must have at
  879. * least
  880. * one TEX ops.
  881. * All nodes must have at least one ALU op.
  882. *
  883. * The index of the last node is stored in PFS_CNTL_0: A value of 0 means
  884. * 1 node, a value of 3 means 4 nodes.
  885. * The total amount of instructions is defined in PFS_CNTL_2. The offsets are
  886. * offsets into the respective instruction streams, while *_END points to the
  887. * last instruction relative to this offset.
  888. */
  889. #define R300_PFS_CNTL_0 0x4600
  890. # define R300_PFS_CNTL_LAST_NODES_SHIFT 0
  891. # define R300_PFS_CNTL_LAST_NODES_MASK (3 << 0)
  892. # define R300_PFS_CNTL_FIRST_NODE_HAS_TEX (1 << 3)
  893. #define R300_PFS_CNTL_1 0x4604
  894. /* There is an unshifted value here which has so far always been equal to the
  895. * index of the highest used temporary register.
  896. */
  897. #define R300_PFS_CNTL_2 0x4608
  898. # define R300_PFS_CNTL_ALU_OFFSET_SHIFT 0
  899. # define R300_PFS_CNTL_ALU_OFFSET_MASK (63 << 0)
  900. # define R300_PFS_CNTL_ALU_END_SHIFT 6
  901. # define R300_PFS_CNTL_ALU_END_MASK (63 << 6)
  902. # define R300_PFS_CNTL_TEX_OFFSET_SHIFT 12
  903. # define R300_PFS_CNTL_TEX_OFFSET_MASK (31 << 12) /* GUESS */
  904. # define R300_PFS_CNTL_TEX_END_SHIFT 18
  905. # define R300_PFS_CNTL_TEX_END_MASK (31 << 18) /* GUESS */
  906. /* gap */
  907. /* Nodes are stored backwards. The last active node is always stored in
  908. * PFS_NODE_3.
  909. * Example: In a 2-node program, NODE_0 and NODE_1 are set to 0. The
  910. * first node is stored in NODE_2, the second node is stored in NODE_3.
  911. *
  912. * Offsets are relative to the master offset from PFS_CNTL_2.
  913. */
  914. #define R300_PFS_NODE_0 0x4610
  915. #define R300_PFS_NODE_1 0x4614
  916. #define R300_PFS_NODE_2 0x4618
  917. #define R300_PFS_NODE_3 0x461C
  918. # define R300_PFS_NODE_ALU_OFFSET_SHIFT 0
  919. # define R300_PFS_NODE_ALU_OFFSET_MASK (63 << 0)
  920. # define R300_PFS_NODE_ALU_END_SHIFT 6
  921. # define R300_PFS_NODE_ALU_END_MASK (63 << 6)
  922. # define R300_PFS_NODE_TEX_OFFSET_SHIFT 12
  923. # define R300_PFS_NODE_TEX_OFFSET_MASK (31 << 12)
  924. # define R300_PFS_NODE_TEX_END_SHIFT 17
  925. # define R300_PFS_NODE_TEX_END_MASK (31 << 17)
  926. # define R300_PFS_NODE_OUTPUT_COLOR (1 << 22)
  927. # define R300_PFS_NODE_OUTPUT_DEPTH (1 << 23)
  928. /* TEX
  929. * As far as I can tell, texture instructions cannot write into output
  930. * registers directly. A subsequent ALU instruction is always necessary,
  931. * even if it's just MAD o0, r0, 1, 0
  932. */
  933. #define R300_PFS_TEXI_0 0x4620
  934. # define R300_FPITX_SRC_SHIFT 0
  935. # define R300_FPITX_SRC_MASK (31 << 0)
  936. /* GUESS */
  937. # define R300_FPITX_SRC_CONST (1 << 5)
  938. # define R300_FPITX_DST_SHIFT 6
  939. # define R300_FPITX_DST_MASK (31 << 6)
  940. # define R300_FPITX_IMAGE_SHIFT 11
  941. /* GUESS based on layout and native limits */
  942. # define R300_FPITX_IMAGE_MASK (15 << 11)
  943. /* Unsure if these are opcodes, or some kind of bitfield, but this is how
  944. * they were set when I checked
  945. */
  946. # define R300_FPITX_OPCODE_SHIFT 15
  947. # define R300_FPITX_OP_TEX 1
  948. # define R300_FPITX_OP_KIL 2
  949. # define R300_FPITX_OP_TXP 3
  950. # define R300_FPITX_OP_TXB 4
  951. # define R300_FPITX_OPCODE_MASK (7 << 15)
  952. /* ALU
  953. * The ALU instructions register blocks are enumerated according to the order
  954. * in which fglrx. I assume there is space for 64 instructions, since
  955. * each block has space for a maximum of 64 DWORDs, and this matches reported
  956. * native limits.
  957. *
  958. * The basic functional block seems to be one MAD for each color and alpha,
  959. * and an adder that adds all components after the MUL.
  960. * - ADD, MUL, MAD etc.: use MAD with appropriate neutral operands
  961. * - DP4: Use OUTC_DP4, OUTA_DP4
  962. * - DP3: Use OUTC_DP3, OUTA_DP4, appropriate alpha operands
  963. * - DPH: Use OUTC_DP4, OUTA_DP4, appropriate alpha operands
  964. * - CMPH: If ARG2 > 0.5, return ARG0, else return ARG1
  965. * - CMP: If ARG2 < 0, return ARG1, else return ARG0
  966. * - FLR: use FRC+MAD
  967. * - XPD: use MAD+MAD
  968. * - SGE, SLT: use MAD+CMP
  969. * - RSQ: use ABS modifier for argument
  970. * - Use OUTC_REPL_ALPHA to write results of an alpha-only operation
  971. * (e.g. RCP) into color register
  972. * - apparently, there's no quick DST operation
  973. * - fglrx set FPI2_UNKNOWN_31 on a "MAD fragment.color, tmp0, tmp1, tmp2"
  974. * - fglrx set FPI2_UNKNOWN_31 on a "MAX r2, r1, c0"
  975. * - fglrx once set FPI0_UNKNOWN_31 on a "FRC r1, r1"
  976. *
  977. * Operand selection
  978. * First stage selects three sources from the available registers and
  979. * constant parameters. This is defined in INSTR1 (color) and INSTR3 (alpha).
  980. * fglrx sorts the three source fields: Registers before constants,
  981. * lower indices before higher indices; I do not know whether this is
  982. * necessary.
  983. *
  984. * fglrx fills unused sources with "read constant 0"
  985. * According to specs, you cannot select more than two different constants.
  986. *
  987. * Second stage selects the operands from the sources. This is defined in
  988. * INSTR0 (color) and INSTR2 (alpha). You can also select the special constants
  989. * zero and one.
  990. * Swizzling and negation happens in this stage, as well.
  991. *
  992. * Important: Color and alpha seem to be mostly separate, i.e. their sources
  993. * selection appears to be fully independent (the register storage is probably
  994. * physically split into a color and an alpha section).
  995. * However (because of the apparent physical split), there is some interaction
  996. * WRT swizzling. If, for example, you want to load an R component into an
  997. * Alpha operand, this R component is taken from a *color* source, not from
  998. * an alpha source. The corresponding register doesn't even have to appear in
  999. * the alpha sources list. (I hope this all makes sense to you)
  1000. *
  1001. * Destination selection
  1002. * The destination register index is in FPI1 (color) and FPI3 (alpha)
  1003. * together with enable bits.
  1004. * There are separate enable bits for writing into temporary registers
  1005. * (DSTC_REG_* /DSTA_REG) and and program output registers (DSTC_OUTPUT_*
  1006. * /DSTA_OUTPUT). You can write to both at once, or not write at all (the
  1007. * same index must be used for both).
  1008. *
  1009. * Note: There is a special form for LRP
  1010. * - Argument order is the same as in ARB_fragment_program.
  1011. * - Operation is MAD
  1012. * - ARG1 is set to ARGC_SRC1C_LRP/ARGC_SRC1A_LRP
  1013. * - Set FPI0/FPI2_SPECIAL_LRP
  1014. * Arbitrary LRP (including support for swizzling) requires vanilla MAD+MAD
  1015. */
  1016. #define R300_PFS_INSTR1_0 0x46C0
  1017. # define R300_FPI1_SRC0C_SHIFT 0
  1018. # define R300_FPI1_SRC0C_MASK (31 << 0)
  1019. # define R300_FPI1_SRC0C_CONST (1 << 5)
  1020. # define R300_FPI1_SRC1C_SHIFT 6
  1021. # define R300_FPI1_SRC1C_MASK (31 << 6)
  1022. # define R300_FPI1_SRC1C_CONST (1 << 11)
  1023. # define R300_FPI1_SRC2C_SHIFT 12
  1024. # define R300_FPI1_SRC2C_MASK (31 << 12)
  1025. # define R300_FPI1_SRC2C_CONST (1 << 17)
  1026. # define R300_FPI1_SRC_MASK 0x0003ffff
  1027. # define R300_FPI1_DSTC_SHIFT 18
  1028. # define R300_FPI1_DSTC_MASK (31 << 18)
  1029. # define R300_FPI1_DSTC_REG_MASK_SHIFT 23
  1030. # define R300_FPI1_DSTC_REG_X (1 << 23)
  1031. # define R300_FPI1_DSTC_REG_Y (1 << 24)
  1032. # define R300_FPI1_DSTC_REG_Z (1 << 25)
  1033. # define R300_FPI1_DSTC_OUTPUT_MASK_SHIFT 26
  1034. # define R300_FPI1_DSTC_OUTPUT_X (1 << 26)
  1035. # define R300_FPI1_DSTC_OUTPUT_Y (1 << 27)
  1036. # define R300_FPI1_DSTC_OUTPUT_Z (1 << 28)
  1037. #define R300_PFS_INSTR3_0 0x47C0
  1038. # define R300_FPI3_SRC0A_SHIFT 0
  1039. # define R300_FPI3_SRC0A_MASK (31 << 0)
  1040. # define R300_FPI3_SRC0A_CONST (1 << 5)
  1041. # define R300_FPI3_SRC1A_SHIFT 6
  1042. # define R300_FPI3_SRC1A_MASK (31 << 6)
  1043. # define R300_FPI3_SRC1A_CONST (1 << 11)
  1044. # define R300_FPI3_SRC2A_SHIFT 12
  1045. # define R300_FPI3_SRC2A_MASK (31 << 12)
  1046. # define R300_FPI3_SRC2A_CONST (1 << 17)
  1047. # define R300_FPI3_SRC_MASK 0x0003ffff
  1048. # define R300_FPI3_DSTA_SHIFT 18
  1049. # define R300_FPI3_DSTA_MASK (31 << 18)
  1050. # define R300_FPI3_DSTA_REG (1 << 23)
  1051. # define R300_FPI3_DSTA_OUTPUT (1 << 24)
  1052. # define R300_FPI3_DSTA_DEPTH (1 << 27)
  1053. #define R300_PFS_INSTR0_0 0x48C0
  1054. # define R300_FPI0_ARGC_SRC0C_XYZ 0
  1055. # define R300_FPI0_ARGC_SRC0C_XXX 1
  1056. # define R300_FPI0_ARGC_SRC0C_YYY 2
  1057. # define R300_FPI0_ARGC_SRC0C_ZZZ 3
  1058. # define R300_FPI0_ARGC_SRC1C_XYZ 4
  1059. # define R300_FPI0_ARGC_SRC1C_XXX 5
  1060. # define R300_FPI0_ARGC_SRC1C_YYY 6
  1061. # define R300_FPI0_ARGC_SRC1C_ZZZ 7
  1062. # define R300_FPI0_ARGC_SRC2C_XYZ 8
  1063. # define R300_FPI0_ARGC_SRC2C_XXX 9
  1064. # define R300_FPI0_ARGC_SRC2C_YYY 10
  1065. # define R300_FPI0_ARGC_SRC2C_ZZZ 11
  1066. # define R300_FPI0_ARGC_SRC0A 12
  1067. # define R300_FPI0_ARGC_SRC1A 13
  1068. # define R300_FPI0_ARGC_SRC2A 14
  1069. # define R300_FPI0_ARGC_SRC1C_LRP 15
  1070. # define R300_FPI0_ARGC_ZERO 20
  1071. # define R300_FPI0_ARGC_ONE 21
  1072. /* GUESS */
  1073. # define R300_FPI0_ARGC_HALF 22
  1074. # define R300_FPI0_ARGC_SRC0C_YZX 23
  1075. # define R300_FPI0_ARGC_SRC1C_YZX 24
  1076. # define R300_FPI0_ARGC_SRC2C_YZX 25
  1077. # define R300_FPI0_ARGC_SRC0C_ZXY 26
  1078. # define R300_FPI0_ARGC_SRC1C_ZXY 27
  1079. # define R300_FPI0_ARGC_SRC2C_ZXY 28
  1080. # define R300_FPI0_ARGC_SRC0CA_WZY 29
  1081. # define R300_FPI0_ARGC_SRC1CA_WZY 30
  1082. # define R300_FPI0_ARGC_SRC2CA_WZY 31
  1083. # define R300_FPI0_ARG0C_SHIFT 0
  1084. # define R300_FPI0_ARG0C_MASK (31 << 0)
  1085. # define R300_FPI0_ARG0C_NEG (1 << 5)
  1086. # define R300_FPI0_ARG0C_ABS (1 << 6)
  1087. # define R300_FPI0_ARG1C_SHIFT 7
  1088. # define R300_FPI0_ARG1C_MASK (31 << 7)
  1089. # define R300_FPI0_ARG1C_NEG (1 << 12)
  1090. # define R300_FPI0_ARG1C_ABS (1 << 13)
  1091. # define R300_FPI0_ARG2C_SHIFT 14
  1092. # define R300_FPI0_ARG2C_MASK (31 << 14)
  1093. # define R300_FPI0_ARG2C_NEG (1 << 19)
  1094. # define R300_FPI0_ARG2C_ABS (1 << 20)
  1095. # define R300_FPI0_SPECIAL_LRP (1 << 21)
  1096. # define R300_FPI0_OUTC_MAD (0 << 23)
  1097. # define R300_FPI0_OUTC_DP3 (1 << 23)
  1098. # define R300_FPI0_OUTC_DP4 (2 << 23)
  1099. # define R300_FPI0_OUTC_MIN (4 << 23)
  1100. # define R300_FPI0_OUTC_MAX (5 << 23)
  1101. # define R300_FPI0_OUTC_CMPH (7 << 23)
  1102. # define R300_FPI0_OUTC_CMP (8 << 23)
  1103. # define R300_FPI0_OUTC_FRC (9 << 23)
  1104. # define R300_FPI0_OUTC_REPL_ALPHA (10 << 23)
  1105. # define R300_FPI0_OUTC_SAT (1 << 30)
  1106. # define R300_FPI0_INSERT_NOP (1 << 31)
  1107. #define R300_PFS_INSTR2_0 0x49C0
  1108. # define R300_FPI2_ARGA_SRC0C_X 0
  1109. # define R300_FPI2_ARGA_SRC0C_Y 1
  1110. # define R300_FPI2_ARGA_SRC0C_Z 2
  1111. # define R300_FPI2_ARGA_SRC1C_X 3
  1112. # define R300_FPI2_ARGA_SRC1C_Y 4
  1113. # define R300_FPI2_ARGA_SRC1C_Z 5
  1114. # define R300_FPI2_ARGA_SRC2C_X 6
  1115. # define R300_FPI2_ARGA_SRC2C_Y 7
  1116. # define R300_FPI2_ARGA_SRC2C_Z 8
  1117. # define R300_FPI2_ARGA_SRC0A 9
  1118. # define R300_FPI2_ARGA_SRC1A 10
  1119. # define R300_FPI2_ARGA_SRC2A 11
  1120. # define R300_FPI2_ARGA_SRC1A_LRP 15
  1121. # define R300_FPI2_ARGA_ZERO 16
  1122. # define R300_FPI2_ARGA_ONE 17
  1123. /* GUESS */
  1124. # define R300_FPI2_ARGA_HALF 18
  1125. # define R300_FPI2_ARG0A_SHIFT 0
  1126. # define R300_FPI2_ARG0A_MASK (31 << 0)
  1127. # define R300_FPI2_ARG0A_NEG (1 << 5)
  1128. /* GUESS */
  1129. # define R300_FPI2_ARG0A_ABS (1 << 6)
  1130. # define R300_FPI2_ARG1A_SHIFT 7
  1131. # define R300_FPI2_ARG1A_MASK (31 << 7)
  1132. # define R300_FPI2_ARG1A_NEG (1 << 12)
  1133. /* GUESS */
  1134. # define R300_FPI2_ARG1A_ABS (1 << 13)
  1135. # define R300_FPI2_ARG2A_SHIFT 14
  1136. # define R300_FPI2_ARG2A_MASK (31 << 14)
  1137. # define R300_FPI2_ARG2A_NEG (1 << 19)
  1138. /* GUESS */
  1139. # define R300_FPI2_ARG2A_ABS (1 << 20)
  1140. # define R300_FPI2_SPECIAL_LRP (1 << 21)
  1141. # define R300_FPI2_OUTA_MAD (0 << 23)
  1142. # define R300_FPI2_OUTA_DP4 (1 << 23)
  1143. # define R300_FPI2_OUTA_MIN (2 << 23)
  1144. # define R300_FPI2_OUTA_MAX (3 << 23)
  1145. # define R300_FPI2_OUTA_CMP (6 << 23)
  1146. # define R300_FPI2_OUTA_FRC (7 << 23)
  1147. # define R300_FPI2_OUTA_EX2 (8 << 23)
  1148. # define R300_FPI2_OUTA_LG2 (9 << 23)
  1149. # define R300_FPI2_OUTA_RCP (10 << 23)
  1150. # define R300_FPI2_OUTA_RSQ (11 << 23)
  1151. # define R300_FPI2_OUTA_SAT (1 << 30)
  1152. # define R300_FPI2_UNKNOWN_31 (1 << 31)
  1153. /* END: Fragment program instruction set */
  1154. /* Fog state and color */
  1155. #define R300_RE_FOG_STATE 0x4BC0
  1156. # define R300_FOG_ENABLE (1 << 0)
  1157. # define R300_FOG_MODE_LINEAR (0 << 1)
  1158. # define R300_FOG_MODE_EXP (1 << 1)
  1159. # define R300_FOG_MODE_EXP2 (2 << 1)
  1160. # define R300_FOG_MODE_MASK (3 << 1)
  1161. #define R300_FOG_COLOR_R 0x4BC8
  1162. #define R300_FOG_COLOR_G 0x4BCC
  1163. #define R300_FOG_COLOR_B 0x4BD0
  1164. #define R300_PP_ALPHA_TEST 0x4BD4
  1165. # define R300_REF_ALPHA_MASK 0x000000ff
  1166. # define R300_ALPHA_TEST_FAIL (0 << 8)
  1167. # define R300_ALPHA_TEST_LESS (1 << 8)
  1168. # define R300_ALPHA_TEST_LEQUAL (3 << 8)
  1169. # define R300_ALPHA_TEST_EQUAL (2 << 8)
  1170. # define R300_ALPHA_TEST_GEQUAL (6 << 8)
  1171. # define R300_ALPHA_TEST_GREATER (4 << 8)
  1172. # define R300_ALPHA_TEST_NEQUAL (5 << 8)
  1173. # define R300_ALPHA_TEST_PASS (7 << 8)
  1174. # define R300_ALPHA_TEST_OP_MASK (7 << 8)
  1175. # define R300_ALPHA_TEST_ENABLE (1 << 11)
  1176. /* gap */
  1177. /* Fragment program parameters in 7.16 floating point */
  1178. #define R300_PFS_PARAM_0_X 0x4C00
  1179. #define R300_PFS_PARAM_0_Y 0x4C04
  1180. #define R300_PFS_PARAM_0_Z 0x4C08
  1181. #define R300_PFS_PARAM_0_W 0x4C0C
  1182. /* GUESS: PARAM_31 is last, based on native limits reported by fglrx */
  1183. #define R300_PFS_PARAM_31_X 0x4DF0
  1184. #define R300_PFS_PARAM_31_Y 0x4DF4
  1185. #define R300_PFS_PARAM_31_Z 0x4DF8
  1186. #define R300_PFS_PARAM_31_W 0x4DFC
  1187. /* Notes:
  1188. * - AFAIK fglrx always sets BLEND_UNKNOWN when blending is used in
  1189. * the application
  1190. * - AFAIK fglrx always sets BLEND_NO_SEPARATE when CBLEND and ABLEND
  1191. * are set to the same
  1192. * function (both registers are always set up completely in any case)
  1193. * - Most blend flags are simply copied from R200 and not tested yet
  1194. */
  1195. #define R300_RB3D_CBLEND 0x4E04
  1196. #define R300_RB3D_ABLEND 0x4E08
  1197. /* the following only appear in CBLEND */
  1198. # define R300_BLEND_ENABLE (1 << 0)
  1199. # define R300_BLEND_UNKNOWN (3 << 1)
  1200. # define R300_BLEND_NO_SEPARATE (1 << 3)
  1201. /* the following are shared between CBLEND and ABLEND */
  1202. # define R300_FCN_MASK (3 << 12)
  1203. # define R300_COMB_FCN_ADD_CLAMP (0 << 12)
  1204. # define R300_COMB_FCN_ADD_NOCLAMP (1 << 12)
  1205. # define R300_COMB_FCN_SUB_CLAMP (2 << 12)
  1206. # define R300_COMB_FCN_SUB_NOCLAMP (3 << 12)
  1207. # define R300_COMB_FCN_MIN (4 << 12)
  1208. # define R300_COMB_FCN_MAX (5 << 12)
  1209. # define R300_COMB_FCN_RSUB_CLAMP (6 << 12)
  1210. # define R300_COMB_FCN_RSUB_NOCLAMP (7 << 12)
  1211. # define R300_BLEND_GL_ZERO (32)
  1212. # define R300_BLEND_GL_ONE (33)
  1213. # define R300_BLEND_GL_SRC_COLOR (34)
  1214. # define R300_BLEND_GL_ONE_MINUS_SRC_COLOR (35)
  1215. # define R300_BLEND_GL_DST_COLOR (36)
  1216. # define R300_BLEND_GL_ONE_MINUS_DST_COLOR (37)
  1217. # define R300_BLEND_GL_SRC_ALPHA (38)
  1218. # define R300_BLEND_GL_ONE_MINUS_SRC_ALPHA (39)
  1219. # define R300_BLEND_GL_DST_ALPHA (40)
  1220. # define R300_BLEND_GL_ONE_MINUS_DST_ALPHA (41)
  1221. # define R300_BLEND_GL_SRC_ALPHA_SATURATE (42)
  1222. # define R300_BLEND_GL_CONST_COLOR (43)
  1223. # define R300_BLEND_GL_ONE_MINUS_CONST_COLOR (44)
  1224. # define R300_BLEND_GL_CONST_ALPHA (45)
  1225. # define R300_BLEND_GL_ONE_MINUS_CONST_ALPHA (46)
  1226. # define R300_BLEND_MASK (63)
  1227. # define R300_SRC_BLEND_SHIFT (16)
  1228. # define R300_DST_BLEND_SHIFT (24)
  1229. #define R300_RB3D_BLEND_COLOR 0x4E10
  1230. #define R300_RB3D_COLORMASK 0x4E0C
  1231. # define R300_COLORMASK0_B (1<<0)
  1232. # define R300_COLORMASK0_G (1<<1)
  1233. # define R300_COLORMASK0_R (1<<2)
  1234. # define R300_COLORMASK0_A (1<<3)
  1235. /* gap */
  1236. #define R300_RB3D_COLOROFFSET0 0x4E28
  1237. # define R300_COLOROFFSET_MASK 0xFFFFFFF0 /* GUESS */
  1238. #define R300_RB3D_COLOROFFSET1 0x4E2C /* GUESS */
  1239. #define R300_RB3D_COLOROFFSET2 0x4E30 /* GUESS */
  1240. #define R300_RB3D_COLOROFFSET3 0x4E34 /* GUESS */
  1241. /* gap */
  1242. /* Bit 16: Larger tiles
  1243. * Bit 17: 4x2 tiles
  1244. * Bit 18: Extremely weird tile like, but some pixels duplicated?
  1245. */
  1246. #define R300_RB3D_COLORPITCH0 0x4E38
  1247. # define R300_COLORPITCH_MASK 0x00001FF8 /* GUESS */
  1248. # define R300_COLOR_TILE_ENABLE (1 << 16) /* GUESS */
  1249. # define R300_COLOR_MICROTILE_ENABLE (1 << 17) /* GUESS */
  1250. # define R300_COLOR_ENDIAN_NO_SWAP (0 << 18) /* GUESS */
  1251. # define R300_COLOR_ENDIAN_WORD_SWAP (1 << 18) /* GUESS */
  1252. # define R300_COLOR_ENDIAN_DWORD_SWAP (2 << 18) /* GUESS */
  1253. # define R300_COLOR_FORMAT_RGB565 (2 << 22)
  1254. # define R300_COLOR_FORMAT_ARGB8888 (3 << 22)
  1255. #define R300_RB3D_COLORPITCH1 0x4E3C /* GUESS */
  1256. #define R300_RB3D_COLORPITCH2 0x4E40 /* GUESS */
  1257. #define R300_RB3D_COLORPITCH3 0x4E44 /* GUESS */
  1258. #define R300_RB3D_AARESOLVE_CTL 0x4E88
  1259. /* gap */
  1260. /* Guess by Vladimir.
  1261. * Set to 0A before 3D operations, set to 02 afterwards.
  1262. */
  1263. /*#define R300_RB3D_DSTCACHE_CTLSTAT 0x4E4C*/
  1264. # define R300_RB3D_DSTCACHE_UNKNOWN_02 0x00000002
  1265. # define R300_RB3D_DSTCACHE_UNKNOWN_0A 0x0000000A
  1266. /* gap */
  1267. /* There seems to be no "write only" setting, so use Z-test = ALWAYS
  1268. * for this.
  1269. * Bit (1<<8) is the "test" bit. so plain write is 6 - vd
  1270. */
  1271. #define R300_ZB_CNTL 0x4F00
  1272. # define R300_STENCIL_ENABLE (1 << 0)
  1273. # define R300_Z_ENABLE (1 << 1)
  1274. # define R300_Z_WRITE_ENABLE (1 << 2)
  1275. # define R300_Z_SIGNED_COMPARE (1 << 3)
  1276. # define R300_STENCIL_FRONT_BACK (1 << 4)
  1277. #define R300_ZB_ZSTENCILCNTL 0x4f04
  1278. /* functions */
  1279. # define R300_ZS_NEVER 0
  1280. # define R300_ZS_LESS 1
  1281. # define R300_ZS_LEQUAL 2
  1282. # define R300_ZS_EQUAL 3
  1283. # define R300_ZS_GEQUAL 4
  1284. # define R300_ZS_GREATER 5
  1285. # define R300_ZS_NOTEQUAL 6
  1286. # define R300_ZS_ALWAYS 7
  1287. # define R300_ZS_MASK 7
  1288. /* operations */
  1289. # define R300_ZS_KEEP 0
  1290. # define R300_ZS_ZERO 1
  1291. # define R300_ZS_REPLACE 2
  1292. # define R300_ZS_INCR 3
  1293. # define R300_ZS_DECR 4
  1294. # define R300_ZS_INVERT 5
  1295. # define R300_ZS_INCR_WRAP 6
  1296. # define R300_ZS_DECR_WRAP 7
  1297. # define R300_Z_FUNC_SHIFT 0
  1298. /* front and back refer to operations done for front
  1299. and back faces, i.e. separate stencil function support */
  1300. # define R300_S_FRONT_FUNC_SHIFT 3
  1301. # define R300_S_FRONT_SFAIL_OP_SHIFT 6
  1302. # define R300_S_FRONT_ZPASS_OP_SHIFT 9
  1303. # define R300_S_FRONT_ZFAIL_OP_SHIFT 12
  1304. # define R300_S_BACK_FUNC_SHIFT 15
  1305. # define R300_S_BACK_SFAIL_OP_SHIFT 18
  1306. # define R300_S_BACK_ZPASS_OP_SHIFT 21
  1307. # define R300_S_BACK_ZFAIL_OP_SHIFT 24
  1308. #define R300_ZB_STENCILREFMASK 0x4f08
  1309. # define R300_STENCILREF_SHIFT 0
  1310. # define R300_STENCILREF_MASK 0x000000ff
  1311. # define R300_STENCILMASK_SHIFT 8
  1312. # define R300_STENCILMASK_MASK 0x0000ff00
  1313. # define R300_STENCILWRITEMASK_SHIFT 16
  1314. # define R300_STENCILWRITEMASK_MASK 0x00ff0000
  1315. /* gap */
  1316. #define R300_ZB_FORMAT 0x4f10
  1317. # define R300_DEPTHFORMAT_16BIT_INT_Z (0 << 0)
  1318. # define R300_DEPTHFORMAT_16BIT_13E3 (1 << 0)
  1319. # define R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL (2 << 0)
  1320. /* reserved up to (15 << 0) */
  1321. # define R300_INVERT_13E3_LEADING_ONES (0 << 4)
  1322. # define R300_INVERT_13E3_LEADING_ZEROS (1 << 4)
  1323. #define R300_ZB_ZTOP 0x4F14
  1324. # define R300_ZTOP_DISABLE (0 << 0)
  1325. # define R300_ZTOP_ENABLE (1 << 0)
  1326. /* gap */
  1327. #define R300_ZB_ZCACHE_CTLSTAT 0x4f18
  1328. # define R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_NO_EFFECT (0 << 0)
  1329. # define R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE (1 << 0)
  1330. # define R300_ZB_ZCACHE_CTLSTAT_ZC_FREE_NO_EFFECT (0 << 1)
  1331. # define R300_ZB_ZCACHE_CTLSTAT_ZC_FREE_FREE (1 << 1)
  1332. # define R300_ZB_ZCACHE_CTLSTAT_ZC_BUSY_IDLE (0 << 31)
  1333. # define R300_ZB_ZCACHE_CTLSTAT_ZC_BUSY_BUSY (1 << 31)
  1334. #define R300_ZB_BW_CNTL 0x4f1c
  1335. # define R300_HIZ_DISABLE (0 << 0)
  1336. # define R300_HIZ_ENABLE (1 << 0)
  1337. # define R300_HIZ_MIN (0 << 1)
  1338. # define R300_HIZ_MAX (1 << 1)
  1339. # define R300_FAST_FILL_DISABLE (0 << 2)
  1340. # define R300_FAST_FILL_ENABLE (1 << 2)
  1341. # define R300_RD_COMP_DISABLE (0 << 3)
  1342. # define R300_RD_COMP_ENABLE (1 << 3)
  1343. # define R300_WR_COMP_DISABLE (0 << 4)
  1344. # define R300_WR_COMP_ENABLE (1 << 4)
  1345. # define R300_ZB_CB_CLEAR_RMW (0 << 5)
  1346. # define R300_ZB_CB_CLEAR_CACHE_LINEAR (1 << 5)
  1347. # define R300_FORCE_COMPRESSED_STENCIL_VALUE_DISABLE (0 << 6)
  1348. # define R300_FORCE_COMPRESSED_STENCIL_VALUE_ENABLE (1 << 6)
  1349. # define R500_ZEQUAL_OPTIMIZE_ENABLE (0 << 7)
  1350. # define R500_ZEQUAL_OPTIMIZE_DISABLE (1 << 7)
  1351. # define R500_SEQUAL_OPTIMIZE_ENABLE (0 << 8)
  1352. # define R500_SEQUAL_OPTIMIZE_DISABLE (1 << 8)
  1353. # define R500_BMASK_ENABLE (0 << 10)
  1354. # define R500_BMASK_DISABLE (1 << 10)
  1355. # define R500_HIZ_EQUAL_REJECT_DISABLE (0 << 11)
  1356. # define R500_HIZ_EQUAL_REJECT_ENABLE (1 << 11)
  1357. # define R500_HIZ_FP_EXP_BITS_DISABLE (0 << 12)
  1358. # define R500_HIZ_FP_EXP_BITS_1 (1 << 12)
  1359. # define R500_HIZ_FP_EXP_BITS_2 (2 << 12)
  1360. # define R500_HIZ_FP_EXP_BITS_3 (3 << 12)
  1361. # define R500_HIZ_FP_EXP_BITS_4 (4 << 12)
  1362. # define R500_HIZ_FP_EXP_BITS_5 (5 << 12)
  1363. # define R500_HIZ_FP_INVERT_LEADING_ONES (0 << 15)
  1364. # define R500_HIZ_FP_INVERT_LEADING_ZEROS (1 << 15)
  1365. # define R500_TILE_OVERWRITE_RECOMPRESSION_ENABLE (0 << 16)
  1366. # define R500_TILE_OVERWRITE_RECOMPRESSION_DISABLE (1 << 16)
  1367. # define R500_CONTIGUOUS_6XAA_SAMPLES_ENABLE (0 << 17)
  1368. # define R500_CONTIGUOUS_6XAA_SAMPLES_DISABLE (1 << 17)
  1369. # define R500_PEQ_PACKING_DISABLE (0 << 18)
  1370. # define R500_PEQ_PACKING_ENABLE (1 << 18)
  1371. # define R500_COVERED_PTR_MASKING_DISABLE (0 << 18)
  1372. # define R500_COVERED_PTR_MASKING_ENABLE (1 << 18)
  1373. /* gap */
  1374. /* Z Buffer Address Offset.
  1375. * Bits 31 to 5 are used for aligned Z buffer address offset for macro tiles.
  1376. */
  1377. #define R300_ZB_DEPTHOFFSET 0x4f20
  1378. /* Z Buffer Pitch and Endian Control */
  1379. #define R300_ZB_DEPTHPITCH 0x4f24
  1380. # define R300_DEPTHPITCH_MASK 0x00003FFC
  1381. # define R300_DEPTHMACROTILE_DISABLE (0 << 16)
  1382. # define R300_DEPTHMACROTILE_ENABLE (1 << 16)
  1383. # define R300_DEPTHMICROTILE_LINEAR (0 << 17)
  1384. # define R300_DEPTHMICROTILE_TILED (1 << 17)
  1385. # define R300_DEPTHMICROTILE_TILED_SQUARE (2 << 17)
  1386. # define R300_DEPTHENDIAN_NO_SWAP (0 << 18)
  1387. # define R300_DEPTHENDIAN_WORD_SWAP (1 << 18)
  1388. # define R300_DEPTHENDIAN_DWORD_SWAP (2 << 18)
  1389. # define R300_DEPTHENDIAN_HALF_DWORD_SWAP (3 << 18)
  1390. /* Z Buffer Clear Value */
  1391. #define R300_ZB_DEPTHCLEARVALUE 0x4f28
  1392. #define R300_ZB_ZMASK_OFFSET 0x4f30
  1393. #define R300_ZB_ZMASK_PITCH 0x4f34
  1394. #define R300_ZB_ZMASK_WRINDEX 0x4f38
  1395. #define R300_ZB_ZMASK_DWORD 0x4f3c
  1396. #define R300_ZB_ZMASK_RDINDEX 0x4f40
  1397. /* Hierarchical Z Memory Offset */
  1398. #define R300_ZB_HIZ_OFFSET 0x4f44
  1399. /* Hierarchical Z Write Index */
  1400. #define R300_ZB_HIZ_WRINDEX 0x4f48
  1401. /* Hierarchical Z Data */
  1402. #define R300_ZB_HIZ_DWORD 0x4f4c
  1403. /* Hierarchical Z Read Index */
  1404. #define R300_ZB_HIZ_RDINDEX 0x4f50
  1405. /* Hierarchical Z Pitch */
  1406. #define R300_ZB_HIZ_PITCH 0x4f54
  1407. /* Z Buffer Z Pass Counter Data */
  1408. #define R300_ZB_ZPASS_DATA 0x4f58
  1409. /* Z Buffer Z Pass Counter Address */
  1410. #define R300_ZB_ZPASS_ADDR 0x4f5c
  1411. /* Depth buffer X and Y coordinate offset */
  1412. #define R300_ZB_DEPTHXY_OFFSET 0x4f60
  1413. # define R300_DEPTHX_OFFSET_SHIFT 1
  1414. # define R300_DEPTHX_OFFSET_MASK 0x000007FE
  1415. # define R300_DEPTHY_OFFSET_SHIFT 17
  1416. # define R300_DEPTHY_OFFSET_MASK 0x07FE0000
  1417. /* Sets the fifo sizes */
  1418. #define R500_ZB_FIFO_SIZE 0x4fd0
  1419. # define R500_OP_FIFO_SIZE_FULL (0 << 0)
  1420. # define R500_OP_FIFO_SIZE_HALF (1 << 0)
  1421. # define R500_OP_FIFO_SIZE_QUATER (2 << 0)
  1422. # define R500_OP_FIFO_SIZE_EIGTHS (4 << 0)
  1423. /* Stencil Reference Value and Mask for backfacing quads */
  1424. /* R300_ZB_STENCILREFMASK handles front face */
  1425. #define R500_ZB_STENCILREFMASK_BF 0x4fd4
  1426. # define R500_STENCILREF_SHIFT 0
  1427. # define R500_STENCILREF_MASK 0x000000ff
  1428. # define R500_STENCILMASK_SHIFT 8
  1429. # define R500_STENCILMASK_MASK 0x0000ff00
  1430. # define R500_STENCILWRITEMASK_SHIFT 16
  1431. # define R500_STENCILWRITEMASK_MASK 0x00ff0000
  1432. /* BEGIN: Vertex program instruction set */
  1433. /* Every instruction is four dwords long:
  1434. * DWORD 0: output and opcode
  1435. * DWORD 1: first argument
  1436. * DWORD 2: second argument
  1437. * DWORD 3: third argument
  1438. *
  1439. * Notes:
  1440. * - ABS r, a is implemented as MAX r, a, -a
  1441. * - MOV is implemented as ADD to zero
  1442. * - XPD is implemented as MUL + MAD
  1443. * - FLR is implemented as FRC + ADD
  1444. * - apparently, fglrx tries to schedule instructions so that there is at
  1445. * least one instruction between the write to a temporary and the first
  1446. * read from said temporary; however, violations of this scheduling are
  1447. * allowed
  1448. * - register indices seem to be unrelated with OpenGL aliasing to
  1449. * conventional state
  1450. * - only one attribute and one parameter can be loaded at a time; however,
  1451. * the same attribute/parameter can be used for more than one argument
  1452. * - the second software argument for POW is the third hardware argument
  1453. * (no idea why)
  1454. * - MAD with only temporaries as input seems to use VPI_OUT_SELECT_MAD_2
  1455. *
  1456. * There is some magic surrounding LIT:
  1457. * The single argument is replicated across all three inputs, but swizzled:
  1458. * First argument: xyzy
  1459. * Second argument: xyzx
  1460. * Third argument: xyzw
  1461. * Whenever the result is used later in the fragment program, fglrx forces
  1462. * x and w to be 1.0 in the input selection; I don't know whether this is
  1463. * strictly necessary
  1464. */
  1465. #define R300_VPI_OUT_OP_DOT (1 << 0)
  1466. #define R300_VPI_OUT_OP_MUL (2 << 0)
  1467. #define R300_VPI_OUT_OP_ADD (3 << 0)
  1468. #define R300_VPI_OUT_OP_MAD (4 << 0)
  1469. #define R300_VPI_OUT_OP_DST (5 << 0)
  1470. #define R300_VPI_OUT_OP_FRC (6 << 0)
  1471. #define R300_VPI_OUT_OP_MAX (7 << 0)
  1472. #define R300_VPI_OUT_OP_MIN (8 << 0)
  1473. #define R300_VPI_OUT_OP_SGE (9 << 0)
  1474. #define R300_VPI_OUT_OP_SLT (10 << 0)
  1475. /* Used in GL_POINT_DISTANCE_ATTENUATION_ARB, vector(scalar, vector) */
  1476. #define R300_VPI_OUT_OP_UNK12 (12 << 0)
  1477. #define R300_VPI_OUT_OP_ARL (13 << 0)
  1478. #define R300_VPI_OUT_OP_EXP (65 << 0)
  1479. #define R300_VPI_OUT_OP_LOG (66 << 0)
  1480. /* Used in fog computations, scalar(scalar) */
  1481. #define R300_VPI_OUT_OP_UNK67 (67 << 0)
  1482. #define R300_VPI_OUT_OP_LIT (68 << 0)
  1483. #define R300_VPI_OUT_OP_POW (69 << 0)
  1484. #define R300_VPI_OUT_OP_RCP (70 << 0)
  1485. #define R300_VPI_OUT_OP_RSQ (72 << 0)
  1486. /* Used in GL_POINT_DISTANCE_ATTENUATION_ARB, scalar(scalar) */
  1487. #define R300_VPI_OUT_OP_UNK73 (73 << 0)
  1488. #define R300_VPI_OUT_OP_EX2 (75 << 0)
  1489. #define R300_VPI_OUT_OP_LG2 (76 << 0)
  1490. #define R300_VPI_OUT_OP_MAD_2 (128 << 0)
  1491. /* all temps, vector(scalar, vector, vector) */
  1492. #define R300_VPI_OUT_OP_UNK129 (129 << 0)
  1493. #define R300_VPI_OUT_REG_CLASS_TEMPORARY (0 << 8)
  1494. #define R300_VPI_OUT_REG_CLASS_ADDR (1 << 8)
  1495. #define R300_VPI_OUT_REG_CLASS_RESULT (2 << 8)
  1496. #define R300_VPI_OUT_REG_CLASS_MASK (31 << 8)
  1497. #define R300_VPI_OUT_REG_INDEX_SHIFT 13
  1498. /* GUESS based on fglrx native limits */
  1499. #define R300_VPI_OUT_REG_INDEX_MASK (31 << 13)
  1500. #define R300_VPI_OUT_WRITE_X (1 << 20)
  1501. #define R300_VPI_OUT_WRITE_Y (1 << 21)
  1502. #define R300_VPI_OUT_WRITE_Z (1 << 22)
  1503. #define R300_VPI_OUT_WRITE_W (1 << 23)
  1504. #define R300_VPI_IN_REG_CLASS_TEMPORARY (0 << 0)
  1505. #define R300_VPI_IN_REG_CLASS_ATTRIBUTE (1 << 0)
  1506. #define R300_VPI_IN_REG_CLASS_PARAMETER (2 << 0)
  1507. #define R300_VPI_IN_REG_CLASS_NONE (9 << 0)
  1508. #define R300_VPI_IN_REG_CLASS_MASK (31 << 0)
  1509. #define R300_VPI_IN_REG_INDEX_SHIFT 5
  1510. /* GUESS based on fglrx native limits */
  1511. #define R300_VPI_IN_REG_INDEX_MASK (255 << 5)
  1512. /* The R300 can select components from the input register arbitrarily.
  1513. * Use the following constants, shifted by the component shift you
  1514. * want to select
  1515. */
  1516. #define R300_VPI_IN_SELECT_X 0
  1517. #define R300_VPI_IN_SELECT_Y 1
  1518. #define R300_VPI_IN_SELECT_Z 2
  1519. #define R300_VPI_IN_SELECT_W 3
  1520. #define R300_VPI_IN_SELECT_ZERO 4
  1521. #define R300_VPI_IN_SELECT_ONE 5
  1522. #define R300_VPI_IN_SELECT_MASK 7
  1523. #define R300_VPI_IN_X_SHIFT 13
  1524. #define R300_VPI_IN_Y_SHIFT 16
  1525. #define R300_VPI_IN_Z_SHIFT 19
  1526. #define R300_VPI_IN_W_SHIFT 22
  1527. #define R300_VPI_IN_NEG_X (1 << 25)
  1528. #define R300_VPI_IN_NEG_Y (1 << 26)
  1529. #define R300_VPI_IN_NEG_Z (1 << 27)
  1530. #define R300_VPI_IN_NEG_W (1 << 28)
  1531. /* END: Vertex program instruction set */
  1532. /* BEGIN: Packet 3 commands */
  1533. /* A primitive emission dword. */
  1534. #define R300_PRIM_TYPE_NONE (0 << 0)
  1535. #define R300_PRIM_TYPE_POINT (1 << 0)
  1536. #define R300_PRIM_TYPE_LINE (2 << 0)
  1537. #define R300_PRIM_TYPE_LINE_STRIP (3 << 0)
  1538. #define R300_PRIM_TYPE_TRI_LIST (4 << 0)
  1539. #define R300_PRIM_TYPE_TRI_FAN (5 << 0)
  1540. #define R300_PRIM_TYPE_TRI_STRIP (6 << 0)
  1541. #define R300_PRIM_TYPE_TRI_TYPE2 (7 << 0)
  1542. #define R300_PRIM_TYPE_RECT_LIST (8 << 0)
  1543. #define R300_PRIM_TYPE_3VRT_POINT_LIST (9 << 0)
  1544. #define R300_PRIM_TYPE_3VRT_LINE_LIST (10 << 0)
  1545. /* GUESS (based on r200) */
  1546. #define R300_PRIM_TYPE_POINT_SPRITES (11 << 0)
  1547. #define R300_PRIM_TYPE_LINE_LOOP (12 << 0)
  1548. #define R300_PRIM_TYPE_QUADS (13 << 0)
  1549. #define R300_PRIM_TYPE_QUAD_STRIP (14 << 0)
  1550. #define R300_PRIM_TYPE_POLYGON (15 << 0)
  1551. #define R300_PRIM_TYPE_MASK 0xF
  1552. #define R300_PRIM_WALK_IND (1 << 4)
  1553. #define R300_PRIM_WALK_LIST (2 << 4)
  1554. #define R300_PRIM_WALK_RING (3 << 4)
  1555. #define R300_PRIM_WALK_MASK (3 << 4)
  1556. /* GUESS (based on r200) */
  1557. #define R300_PRIM_COLOR_ORDER_BGRA (0 << 6)
  1558. #define R300_PRIM_COLOR_ORDER_RGBA (1 << 6)
  1559. #define R300_PRIM_NUM_VERTICES_SHIFT 16
  1560. #define R300_PRIM_NUM_VERTICES_MASK 0xffff
  1561. /* Draw a primitive from vertex data in arrays loaded via 3D_LOAD_VBPNTR.
  1562. * Two parameter dwords:
  1563. * 0. The first parameter appears to be always 0
  1564. * 1. The second parameter is a standard primitive emission dword.
  1565. */
  1566. #define R300_PACKET3_3D_DRAW_VBUF 0x00002800
  1567. /* Specify the full set of vertex arrays as (address, stride).
  1568. * The first parameter is the number of vertex arrays specified.
  1569. * The rest of the command is a variable length list of blocks, where
  1570. * each block is three dwords long and specifies two arrays.
  1571. * The first dword of a block is split into two words, the lower significant
  1572. * word refers to the first array, the more significant word to the second
  1573. * array in the block.
  1574. * The low byte of each word contains the size of an array entry in dwords,
  1575. * the high byte contains the stride of the array.
  1576. * The second dword of a block contains the pointer to the first array,
  1577. * the third dword of a block contains the pointer to the second array.
  1578. * Note that if the total number of arrays is odd, the third dword of
  1579. * the last block is omitted.
  1580. */
  1581. #define R300_PACKET3_3D_LOAD_VBPNTR 0x00002F00
  1582. #define R300_PACKET3_INDX_BUFFER 0x00003300
  1583. # define R300_EB_UNK1_SHIFT 24
  1584. # define R300_EB_UNK1 (0x80<<24)
  1585. # define R300_EB_UNK2 0x0810
  1586. #define R300_PACKET3_3D_DRAW_VBUF_2 0x00003400
  1587. #define R300_PACKET3_3D_DRAW_INDX_2 0x00003600
  1588. /* END: Packet 3 commands */
  1589. /* Color formats for 2d packets
  1590. */
  1591. #define R300_CP_COLOR_FORMAT_CI8 2
  1592. #define R300_CP_COLOR_FORMAT_ARGB1555 3
  1593. #define R300_CP_COLOR_FORMAT_RGB565 4
  1594. #define R300_CP_COLOR_FORMAT_ARGB8888 6
  1595. #define R300_CP_COLOR_FORMAT_RGB332 7
  1596. #define R300_CP_COLOR_FORMAT_RGB8 9
  1597. #define R300_CP_COLOR_FORMAT_ARGB4444 15
  1598. /*
  1599. * CP type-3 packets
  1600. */
  1601. #define R300_CP_CMD_BITBLT_MULTI 0xC0009B00
  1602. #define R500_VAP_INDEX_OFFSET 0x208c
  1603. #define R500_GA_US_VECTOR_INDEX 0x4250
  1604. #define R500_GA_US_VECTOR_DATA 0x4254
  1605. #define R500_RS_IP_0 0x4074
  1606. #define R500_RS_INST_0 0x4320
  1607. #define R500_US_CONFIG 0x4600
  1608. #define R500_US_FC_CTRL 0x4624
  1609. #define R500_US_CODE_ADDR 0x4630
  1610. #define R500_RB3D_COLOR_CLEAR_VALUE_AR 0x46c0
  1611. #define R500_RB3D_CONSTANT_COLOR_AR 0x4ef8
  1612. #define R300_SU_REG_DEST 0x42c8
  1613. #define RV530_FG_ZBREG_DEST 0x4be8
  1614. #define R300_ZB_ZPASS_DATA 0x4f58
  1615. #define R300_ZB_ZPASS_ADDR 0x4f5c
  1616. #endif /* _R300_REG_H */