Clone of mesa.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

evergreen_state.c 87KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495
  1. /*
  2. * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * on the rights to use, copy, modify, merge, publish, distribute, sub
  8. * license, and/or sell copies of the Software, and to permit persons to whom
  9. * the Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice (including the next
  12. * paragraph) shall be included in all copies or substantial portions of the
  13. * Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
  18. * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
  19. * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  20. * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  21. * USE OR OTHER DEALINGS IN THE SOFTWARE.
  22. */
  23. /* TODO:
  24. * - fix mask for depth control & cull for query
  25. */
  26. #include <stdio.h>
  27. #include <errno.h>
  28. #include "pipe/p_defines.h"
  29. #include "pipe/p_state.h"
  30. #include "pipe/p_context.h"
  31. #include "tgsi/tgsi_scan.h"
  32. #include "tgsi/tgsi_parse.h"
  33. #include "tgsi/tgsi_util.h"
  34. #include "util/u_blitter.h"
  35. #include "util/u_double_list.h"
  36. #include "util/u_transfer.h"
  37. #include "util/u_surface.h"
  38. #include "util/u_pack_color.h"
  39. #include "util/u_memory.h"
  40. #include "util/u_inlines.h"
  41. #include "util/u_framebuffer.h"
  42. #include "pipebuffer/pb_buffer.h"
  43. #include "r600.h"
  44. #include "evergreend.h"
  45. #include "r600_resource.h"
  46. #include "r600_shader.h"
  47. #include "r600_pipe.h"
  48. #include "r600_formats.h"
  49. static uint32_t r600_translate_blend_function(int blend_func)
  50. {
  51. switch (blend_func) {
  52. case PIPE_BLEND_ADD:
  53. return V_028780_COMB_DST_PLUS_SRC;
  54. case PIPE_BLEND_SUBTRACT:
  55. return V_028780_COMB_SRC_MINUS_DST;
  56. case PIPE_BLEND_REVERSE_SUBTRACT:
  57. return V_028780_COMB_DST_MINUS_SRC;
  58. case PIPE_BLEND_MIN:
  59. return V_028780_COMB_MIN_DST_SRC;
  60. case PIPE_BLEND_MAX:
  61. return V_028780_COMB_MAX_DST_SRC;
  62. default:
  63. R600_ERR("Unknown blend function %d\n", blend_func);
  64. assert(0);
  65. break;
  66. }
  67. return 0;
  68. }
  69. static uint32_t r600_translate_blend_factor(int blend_fact)
  70. {
  71. switch (blend_fact) {
  72. case PIPE_BLENDFACTOR_ONE:
  73. return V_028780_BLEND_ONE;
  74. case PIPE_BLENDFACTOR_SRC_COLOR:
  75. return V_028780_BLEND_SRC_COLOR;
  76. case PIPE_BLENDFACTOR_SRC_ALPHA:
  77. return V_028780_BLEND_SRC_ALPHA;
  78. case PIPE_BLENDFACTOR_DST_ALPHA:
  79. return V_028780_BLEND_DST_ALPHA;
  80. case PIPE_BLENDFACTOR_DST_COLOR:
  81. return V_028780_BLEND_DST_COLOR;
  82. case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
  83. return V_028780_BLEND_SRC_ALPHA_SATURATE;
  84. case PIPE_BLENDFACTOR_CONST_COLOR:
  85. return V_028780_BLEND_CONST_COLOR;
  86. case PIPE_BLENDFACTOR_CONST_ALPHA:
  87. return V_028780_BLEND_CONST_ALPHA;
  88. case PIPE_BLENDFACTOR_ZERO:
  89. return V_028780_BLEND_ZERO;
  90. case PIPE_BLENDFACTOR_INV_SRC_COLOR:
  91. return V_028780_BLEND_ONE_MINUS_SRC_COLOR;
  92. case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
  93. return V_028780_BLEND_ONE_MINUS_SRC_ALPHA;
  94. case PIPE_BLENDFACTOR_INV_DST_ALPHA:
  95. return V_028780_BLEND_ONE_MINUS_DST_ALPHA;
  96. case PIPE_BLENDFACTOR_INV_DST_COLOR:
  97. return V_028780_BLEND_ONE_MINUS_DST_COLOR;
  98. case PIPE_BLENDFACTOR_INV_CONST_COLOR:
  99. return V_028780_BLEND_ONE_MINUS_CONST_COLOR;
  100. case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
  101. return V_028780_BLEND_ONE_MINUS_CONST_ALPHA;
  102. case PIPE_BLENDFACTOR_SRC1_COLOR:
  103. return V_028780_BLEND_SRC1_COLOR;
  104. case PIPE_BLENDFACTOR_SRC1_ALPHA:
  105. return V_028780_BLEND_SRC1_ALPHA;
  106. case PIPE_BLENDFACTOR_INV_SRC1_COLOR:
  107. return V_028780_BLEND_INV_SRC1_COLOR;
  108. case PIPE_BLENDFACTOR_INV_SRC1_ALPHA:
  109. return V_028780_BLEND_INV_SRC1_ALPHA;
  110. default:
  111. R600_ERR("Bad blend factor %d not supported!\n", blend_fact);
  112. assert(0);
  113. break;
  114. }
  115. return 0;
  116. }
  117. static uint32_t r600_translate_stencil_op(int s_op)
  118. {
  119. switch (s_op) {
  120. case PIPE_STENCIL_OP_KEEP:
  121. return V_028800_STENCIL_KEEP;
  122. case PIPE_STENCIL_OP_ZERO:
  123. return V_028800_STENCIL_ZERO;
  124. case PIPE_STENCIL_OP_REPLACE:
  125. return V_028800_STENCIL_REPLACE;
  126. case PIPE_STENCIL_OP_INCR:
  127. return V_028800_STENCIL_INCR;
  128. case PIPE_STENCIL_OP_DECR:
  129. return V_028800_STENCIL_DECR;
  130. case PIPE_STENCIL_OP_INCR_WRAP:
  131. return V_028800_STENCIL_INCR_WRAP;
  132. case PIPE_STENCIL_OP_DECR_WRAP:
  133. return V_028800_STENCIL_DECR_WRAP;
  134. case PIPE_STENCIL_OP_INVERT:
  135. return V_028800_STENCIL_INVERT;
  136. default:
  137. R600_ERR("Unknown stencil op %d", s_op);
  138. assert(0);
  139. break;
  140. }
  141. return 0;
  142. }
  143. static uint32_t r600_translate_fill(uint32_t func)
  144. {
  145. switch(func) {
  146. case PIPE_POLYGON_MODE_FILL:
  147. return 2;
  148. case PIPE_POLYGON_MODE_LINE:
  149. return 1;
  150. case PIPE_POLYGON_MODE_POINT:
  151. return 0;
  152. default:
  153. assert(0);
  154. return 0;
  155. }
  156. }
  157. /* translates straight */
  158. static uint32_t r600_translate_ds_func(int func)
  159. {
  160. return func;
  161. }
  162. static unsigned r600_tex_wrap(unsigned wrap)
  163. {
  164. switch (wrap) {
  165. default:
  166. case PIPE_TEX_WRAP_REPEAT:
  167. return V_03C000_SQ_TEX_WRAP;
  168. case PIPE_TEX_WRAP_CLAMP:
  169. return V_03C000_SQ_TEX_CLAMP_HALF_BORDER;
  170. case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
  171. return V_03C000_SQ_TEX_CLAMP_LAST_TEXEL;
  172. case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
  173. return V_03C000_SQ_TEX_CLAMP_BORDER;
  174. case PIPE_TEX_WRAP_MIRROR_REPEAT:
  175. return V_03C000_SQ_TEX_MIRROR;
  176. case PIPE_TEX_WRAP_MIRROR_CLAMP:
  177. return V_03C000_SQ_TEX_MIRROR_ONCE_HALF_BORDER;
  178. case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
  179. return V_03C000_SQ_TEX_MIRROR_ONCE_LAST_TEXEL;
  180. case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
  181. return V_03C000_SQ_TEX_MIRROR_ONCE_BORDER;
  182. }
  183. }
  184. static unsigned r600_tex_filter(unsigned filter)
  185. {
  186. switch (filter) {
  187. default:
  188. case PIPE_TEX_FILTER_NEAREST:
  189. return V_03C000_SQ_TEX_XY_FILTER_POINT;
  190. case PIPE_TEX_FILTER_LINEAR:
  191. return V_03C000_SQ_TEX_XY_FILTER_BILINEAR;
  192. }
  193. }
  194. static unsigned r600_tex_mipfilter(unsigned filter)
  195. {
  196. switch (filter) {
  197. case PIPE_TEX_MIPFILTER_NEAREST:
  198. return V_03C000_SQ_TEX_Z_FILTER_POINT;
  199. case PIPE_TEX_MIPFILTER_LINEAR:
  200. return V_03C000_SQ_TEX_Z_FILTER_LINEAR;
  201. default:
  202. case PIPE_TEX_MIPFILTER_NONE:
  203. return V_03C000_SQ_TEX_Z_FILTER_NONE;
  204. }
  205. }
  206. static unsigned r600_tex_compare(unsigned compare)
  207. {
  208. switch (compare) {
  209. default:
  210. case PIPE_FUNC_NEVER:
  211. return V_03C000_SQ_TEX_DEPTH_COMPARE_NEVER;
  212. case PIPE_FUNC_LESS:
  213. return V_03C000_SQ_TEX_DEPTH_COMPARE_LESS;
  214. case PIPE_FUNC_EQUAL:
  215. return V_03C000_SQ_TEX_DEPTH_COMPARE_EQUAL;
  216. case PIPE_FUNC_LEQUAL:
  217. return V_03C000_SQ_TEX_DEPTH_COMPARE_LESSEQUAL;
  218. case PIPE_FUNC_GREATER:
  219. return V_03C000_SQ_TEX_DEPTH_COMPARE_GREATER;
  220. case PIPE_FUNC_NOTEQUAL:
  221. return V_03C000_SQ_TEX_DEPTH_COMPARE_NOTEQUAL;
  222. case PIPE_FUNC_GEQUAL:
  223. return V_03C000_SQ_TEX_DEPTH_COMPARE_GREATEREQUAL;
  224. case PIPE_FUNC_ALWAYS:
  225. return V_03C000_SQ_TEX_DEPTH_COMPARE_ALWAYS;
  226. }
  227. }
  228. static unsigned r600_tex_dim(unsigned dim)
  229. {
  230. switch (dim) {
  231. default:
  232. case PIPE_TEXTURE_1D:
  233. return V_030000_SQ_TEX_DIM_1D;
  234. case PIPE_TEXTURE_1D_ARRAY:
  235. return V_030000_SQ_TEX_DIM_1D_ARRAY;
  236. case PIPE_TEXTURE_2D:
  237. case PIPE_TEXTURE_RECT:
  238. return V_030000_SQ_TEX_DIM_2D;
  239. case PIPE_TEXTURE_2D_ARRAY:
  240. return V_030000_SQ_TEX_DIM_2D_ARRAY;
  241. case PIPE_TEXTURE_3D:
  242. return V_030000_SQ_TEX_DIM_3D;
  243. case PIPE_TEXTURE_CUBE:
  244. return V_030000_SQ_TEX_DIM_CUBEMAP;
  245. }
  246. }
  247. static uint32_t r600_translate_dbformat(enum pipe_format format)
  248. {
  249. switch (format) {
  250. case PIPE_FORMAT_Z16_UNORM:
  251. return V_028040_Z_16;
  252. case PIPE_FORMAT_Z24X8_UNORM:
  253. case PIPE_FORMAT_Z24_UNORM_S8_UINT:
  254. return V_028040_Z_24;
  255. case PIPE_FORMAT_Z32_FLOAT:
  256. case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
  257. return V_028040_Z_32_FLOAT;
  258. default:
  259. return ~0U;
  260. }
  261. }
  262. static uint32_t r600_translate_colorswap(enum pipe_format format)
  263. {
  264. switch (format) {
  265. /* 8-bit buffers. */
  266. case PIPE_FORMAT_L4A4_UNORM:
  267. case PIPE_FORMAT_A4R4_UNORM:
  268. return V_028C70_SWAP_ALT;
  269. case PIPE_FORMAT_A8_UNORM:
  270. case PIPE_FORMAT_A8_UINT:
  271. case PIPE_FORMAT_A8_SINT:
  272. case PIPE_FORMAT_R4A4_UNORM:
  273. return V_028C70_SWAP_ALT_REV;
  274. case PIPE_FORMAT_I8_UNORM:
  275. case PIPE_FORMAT_L8_UNORM:
  276. case PIPE_FORMAT_I8_UINT:
  277. case PIPE_FORMAT_I8_SINT:
  278. case PIPE_FORMAT_L8_UINT:
  279. case PIPE_FORMAT_L8_SINT:
  280. case PIPE_FORMAT_L8_SRGB:
  281. case PIPE_FORMAT_R8_UNORM:
  282. case PIPE_FORMAT_R8_SNORM:
  283. return V_028C70_SWAP_STD;
  284. /* 16-bit buffers. */
  285. case PIPE_FORMAT_B5G6R5_UNORM:
  286. return V_028C70_SWAP_STD_REV;
  287. case PIPE_FORMAT_B5G5R5A1_UNORM:
  288. case PIPE_FORMAT_B5G5R5X1_UNORM:
  289. return V_028C70_SWAP_ALT;
  290. case PIPE_FORMAT_B4G4R4A4_UNORM:
  291. case PIPE_FORMAT_B4G4R4X4_UNORM:
  292. return V_028C70_SWAP_ALT;
  293. case PIPE_FORMAT_Z16_UNORM:
  294. return V_028C70_SWAP_STD;
  295. case PIPE_FORMAT_L8A8_UNORM:
  296. case PIPE_FORMAT_L8A8_UINT:
  297. case PIPE_FORMAT_L8A8_SINT:
  298. case PIPE_FORMAT_L8A8_SRGB:
  299. return V_028C70_SWAP_ALT;
  300. case PIPE_FORMAT_R8G8_UNORM:
  301. case PIPE_FORMAT_R8G8_UINT:
  302. case PIPE_FORMAT_R8G8_SINT:
  303. return V_028C70_SWAP_STD;
  304. case PIPE_FORMAT_R16_UNORM:
  305. case PIPE_FORMAT_R16_UINT:
  306. case PIPE_FORMAT_R16_SINT:
  307. case PIPE_FORMAT_R16_FLOAT:
  308. return V_028C70_SWAP_STD;
  309. /* 32-bit buffers. */
  310. case PIPE_FORMAT_A8B8G8R8_SRGB:
  311. return V_028C70_SWAP_STD_REV;
  312. case PIPE_FORMAT_B8G8R8A8_SRGB:
  313. return V_028C70_SWAP_ALT;
  314. case PIPE_FORMAT_B8G8R8A8_UNORM:
  315. case PIPE_FORMAT_B8G8R8X8_UNORM:
  316. return V_028C70_SWAP_ALT;
  317. case PIPE_FORMAT_A8R8G8B8_UNORM:
  318. case PIPE_FORMAT_X8R8G8B8_UNORM:
  319. return V_028C70_SWAP_ALT_REV;
  320. case PIPE_FORMAT_R8G8B8A8_SNORM:
  321. case PIPE_FORMAT_R8G8B8A8_UNORM:
  322. case PIPE_FORMAT_R8G8B8A8_SSCALED:
  323. case PIPE_FORMAT_R8G8B8A8_USCALED:
  324. case PIPE_FORMAT_R8G8B8A8_SINT:
  325. case PIPE_FORMAT_R8G8B8A8_UINT:
  326. case PIPE_FORMAT_R8G8B8X8_UNORM:
  327. return V_028C70_SWAP_STD;
  328. case PIPE_FORMAT_A8B8G8R8_UNORM:
  329. case PIPE_FORMAT_X8B8G8R8_UNORM:
  330. /* case PIPE_FORMAT_R8SG8SB8UX8U_NORM: */
  331. return V_028C70_SWAP_STD_REV;
  332. case PIPE_FORMAT_Z24X8_UNORM:
  333. case PIPE_FORMAT_Z24_UNORM_S8_UINT:
  334. return V_028C70_SWAP_STD;
  335. case PIPE_FORMAT_X8Z24_UNORM:
  336. case PIPE_FORMAT_S8_UINT_Z24_UNORM:
  337. return V_028C70_SWAP_STD;
  338. case PIPE_FORMAT_R10G10B10A2_UNORM:
  339. case PIPE_FORMAT_R10G10B10X2_SNORM:
  340. case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
  341. return V_028C70_SWAP_STD;
  342. case PIPE_FORMAT_B10G10R10A2_UNORM:
  343. return V_028C70_SWAP_ALT;
  344. case PIPE_FORMAT_R11G11B10_FLOAT:
  345. case PIPE_FORMAT_R32_FLOAT:
  346. case PIPE_FORMAT_R32_UINT:
  347. case PIPE_FORMAT_R32_SINT:
  348. case PIPE_FORMAT_Z32_FLOAT:
  349. case PIPE_FORMAT_R16G16_FLOAT:
  350. case PIPE_FORMAT_R16G16_UNORM:
  351. case PIPE_FORMAT_R16G16_UINT:
  352. case PIPE_FORMAT_R16G16_SINT:
  353. return V_028C70_SWAP_STD;
  354. /* 64-bit buffers. */
  355. case PIPE_FORMAT_R32G32_FLOAT:
  356. case PIPE_FORMAT_R32G32_UINT:
  357. case PIPE_FORMAT_R32G32_SINT:
  358. case PIPE_FORMAT_R16G16B16A16_UNORM:
  359. case PIPE_FORMAT_R16G16B16A16_SNORM:
  360. case PIPE_FORMAT_R16G16B16A16_USCALED:
  361. case PIPE_FORMAT_R16G16B16A16_SSCALED:
  362. case PIPE_FORMAT_R16G16B16A16_UINT:
  363. case PIPE_FORMAT_R16G16B16A16_SINT:
  364. case PIPE_FORMAT_R16G16B16A16_FLOAT:
  365. case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
  366. /* 128-bit buffers. */
  367. case PIPE_FORMAT_R32G32B32A32_FLOAT:
  368. case PIPE_FORMAT_R32G32B32A32_SNORM:
  369. case PIPE_FORMAT_R32G32B32A32_UNORM:
  370. case PIPE_FORMAT_R32G32B32A32_SSCALED:
  371. case PIPE_FORMAT_R32G32B32A32_USCALED:
  372. case PIPE_FORMAT_R32G32B32A32_SINT:
  373. case PIPE_FORMAT_R32G32B32A32_UINT:
  374. return V_028C70_SWAP_STD;
  375. default:
  376. R600_ERR("unsupported colorswap format %d\n", format);
  377. return ~0U;
  378. }
  379. return ~0U;
  380. }
  381. static uint32_t r600_translate_colorformat(enum pipe_format format)
  382. {
  383. switch (format) {
  384. /* 8-bit buffers. */
  385. case PIPE_FORMAT_L4A4_UNORM:
  386. case PIPE_FORMAT_R4A4_UNORM:
  387. case PIPE_FORMAT_A4R4_UNORM:
  388. return V_028C70_COLOR_4_4;
  389. case PIPE_FORMAT_A8_UNORM:
  390. case PIPE_FORMAT_A8_UINT:
  391. case PIPE_FORMAT_A8_SINT:
  392. case PIPE_FORMAT_I8_UNORM:
  393. case PIPE_FORMAT_I8_UINT:
  394. case PIPE_FORMAT_I8_SINT:
  395. case PIPE_FORMAT_L8_UNORM:
  396. case PIPE_FORMAT_L8_UINT:
  397. case PIPE_FORMAT_L8_SINT:
  398. case PIPE_FORMAT_L8_SRGB:
  399. case PIPE_FORMAT_R8_UNORM:
  400. case PIPE_FORMAT_R8_SNORM:
  401. case PIPE_FORMAT_R8_UINT:
  402. case PIPE_FORMAT_R8_SINT:
  403. return V_028C70_COLOR_8;
  404. /* 16-bit buffers. */
  405. case PIPE_FORMAT_B5G6R5_UNORM:
  406. return V_028C70_COLOR_5_6_5;
  407. case PIPE_FORMAT_B5G5R5A1_UNORM:
  408. case PIPE_FORMAT_B5G5R5X1_UNORM:
  409. return V_028C70_COLOR_1_5_5_5;
  410. case PIPE_FORMAT_B4G4R4A4_UNORM:
  411. case PIPE_FORMAT_B4G4R4X4_UNORM:
  412. return V_028C70_COLOR_4_4_4_4;
  413. case PIPE_FORMAT_Z16_UNORM:
  414. return V_028C70_COLOR_16;
  415. case PIPE_FORMAT_L8A8_UNORM:
  416. case PIPE_FORMAT_L8A8_UINT:
  417. case PIPE_FORMAT_L8A8_SINT:
  418. case PIPE_FORMAT_L8A8_SRGB:
  419. case PIPE_FORMAT_R8G8_UNORM:
  420. case PIPE_FORMAT_R8G8_UINT:
  421. case PIPE_FORMAT_R8G8_SINT:
  422. return V_028C70_COLOR_8_8;
  423. case PIPE_FORMAT_R16_UNORM:
  424. case PIPE_FORMAT_R16_UINT:
  425. case PIPE_FORMAT_R16_SINT:
  426. return V_028C70_COLOR_16;
  427. case PIPE_FORMAT_R16_FLOAT:
  428. return V_028C70_COLOR_16_FLOAT;
  429. /* 32-bit buffers. */
  430. case PIPE_FORMAT_A8B8G8R8_SRGB:
  431. case PIPE_FORMAT_A8B8G8R8_UNORM:
  432. case PIPE_FORMAT_A8R8G8B8_UNORM:
  433. case PIPE_FORMAT_B8G8R8A8_SRGB:
  434. case PIPE_FORMAT_B8G8R8A8_UNORM:
  435. case PIPE_FORMAT_B8G8R8X8_UNORM:
  436. case PIPE_FORMAT_R8G8B8A8_SNORM:
  437. case PIPE_FORMAT_R8G8B8A8_UNORM:
  438. case PIPE_FORMAT_R8G8B8X8_UNORM:
  439. case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
  440. case PIPE_FORMAT_X8B8G8R8_UNORM:
  441. case PIPE_FORMAT_X8R8G8B8_UNORM:
  442. case PIPE_FORMAT_R8G8B8_UNORM:
  443. case PIPE_FORMAT_R8G8B8A8_SSCALED:
  444. case PIPE_FORMAT_R8G8B8A8_USCALED:
  445. case PIPE_FORMAT_R8G8B8A8_SINT:
  446. case PIPE_FORMAT_R8G8B8A8_UINT:
  447. return V_028C70_COLOR_8_8_8_8;
  448. case PIPE_FORMAT_R10G10B10A2_UNORM:
  449. case PIPE_FORMAT_R10G10B10X2_SNORM:
  450. case PIPE_FORMAT_B10G10R10A2_UNORM:
  451. case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
  452. return V_028C70_COLOR_2_10_10_10;
  453. case PIPE_FORMAT_Z24X8_UNORM:
  454. case PIPE_FORMAT_Z24_UNORM_S8_UINT:
  455. return V_028C70_COLOR_8_24;
  456. case PIPE_FORMAT_X8Z24_UNORM:
  457. case PIPE_FORMAT_S8_UINT_Z24_UNORM:
  458. return V_028C70_COLOR_24_8;
  459. case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
  460. return V_028C70_COLOR_X24_8_32_FLOAT;
  461. case PIPE_FORMAT_R32_FLOAT:
  462. case PIPE_FORMAT_Z32_FLOAT:
  463. return V_028C70_COLOR_32_FLOAT;
  464. case PIPE_FORMAT_R16G16_FLOAT:
  465. return V_028C70_COLOR_16_16_FLOAT;
  466. case PIPE_FORMAT_R16G16_SSCALED:
  467. case PIPE_FORMAT_R16G16_UNORM:
  468. case PIPE_FORMAT_R16G16_UINT:
  469. case PIPE_FORMAT_R16G16_SINT:
  470. return V_028C70_COLOR_16_16;
  471. case PIPE_FORMAT_R11G11B10_FLOAT:
  472. return V_028C70_COLOR_10_11_11_FLOAT;
  473. /* 64-bit buffers. */
  474. case PIPE_FORMAT_R16G16B16_USCALED:
  475. case PIPE_FORMAT_R16G16B16_SSCALED:
  476. case PIPE_FORMAT_R16G16B16A16_UINT:
  477. case PIPE_FORMAT_R16G16B16A16_SINT:
  478. case PIPE_FORMAT_R16G16B16A16_USCALED:
  479. case PIPE_FORMAT_R16G16B16A16_SSCALED:
  480. case PIPE_FORMAT_R16G16B16A16_UNORM:
  481. case PIPE_FORMAT_R16G16B16A16_SNORM:
  482. return V_028C70_COLOR_16_16_16_16;
  483. case PIPE_FORMAT_R16G16B16_FLOAT:
  484. case PIPE_FORMAT_R16G16B16A16_FLOAT:
  485. return V_028C70_COLOR_16_16_16_16_FLOAT;
  486. case PIPE_FORMAT_R32G32_FLOAT:
  487. return V_028C70_COLOR_32_32_FLOAT;
  488. case PIPE_FORMAT_R32G32_USCALED:
  489. case PIPE_FORMAT_R32G32_SSCALED:
  490. case PIPE_FORMAT_R32G32_SINT:
  491. case PIPE_FORMAT_R32G32_UINT:
  492. return V_028C70_COLOR_32_32;
  493. /* 96-bit buffers. */
  494. case PIPE_FORMAT_R32G32B32_FLOAT:
  495. return V_028C70_COLOR_32_32_32_FLOAT;
  496. /* 128-bit buffers. */
  497. case PIPE_FORMAT_R32G32B32A32_SNORM:
  498. case PIPE_FORMAT_R32G32B32A32_UNORM:
  499. case PIPE_FORMAT_R32G32B32A32_SSCALED:
  500. case PIPE_FORMAT_R32G32B32A32_USCALED:
  501. case PIPE_FORMAT_R32G32B32A32_SINT:
  502. case PIPE_FORMAT_R32G32B32A32_UINT:
  503. return V_028C70_COLOR_32_32_32_32;
  504. case PIPE_FORMAT_R32G32B32A32_FLOAT:
  505. return V_028C70_COLOR_32_32_32_32_FLOAT;
  506. /* YUV buffers. */
  507. case PIPE_FORMAT_UYVY:
  508. case PIPE_FORMAT_YUYV:
  509. default:
  510. return ~0U; /* Unsupported. */
  511. }
  512. }
  513. static uint32_t r600_colorformat_endian_swap(uint32_t colorformat)
  514. {
  515. if (R600_BIG_ENDIAN) {
  516. switch(colorformat) {
  517. case V_028C70_COLOR_4_4:
  518. return ENDIAN_NONE;
  519. /* 8-bit buffers. */
  520. case V_028C70_COLOR_8:
  521. return ENDIAN_NONE;
  522. /* 16-bit buffers. */
  523. case V_028C70_COLOR_5_6_5:
  524. case V_028C70_COLOR_1_5_5_5:
  525. case V_028C70_COLOR_4_4_4_4:
  526. case V_028C70_COLOR_16:
  527. case V_028C70_COLOR_8_8:
  528. return ENDIAN_8IN16;
  529. /* 32-bit buffers. */
  530. case V_028C70_COLOR_8_8_8_8:
  531. case V_028C70_COLOR_2_10_10_10:
  532. case V_028C70_COLOR_8_24:
  533. case V_028C70_COLOR_24_8:
  534. case V_028C70_COLOR_32_FLOAT:
  535. case V_028C70_COLOR_16_16_FLOAT:
  536. case V_028C70_COLOR_16_16:
  537. return ENDIAN_8IN32;
  538. /* 64-bit buffers. */
  539. case V_028C70_COLOR_16_16_16_16:
  540. case V_028C70_COLOR_16_16_16_16_FLOAT:
  541. return ENDIAN_8IN16;
  542. case V_028C70_COLOR_32_32_FLOAT:
  543. case V_028C70_COLOR_32_32:
  544. case V_028C70_COLOR_X24_8_32_FLOAT:
  545. return ENDIAN_8IN32;
  546. /* 96-bit buffers. */
  547. case V_028C70_COLOR_32_32_32_FLOAT:
  548. /* 128-bit buffers. */
  549. case V_028C70_COLOR_32_32_32_32_FLOAT:
  550. case V_028C70_COLOR_32_32_32_32:
  551. return ENDIAN_8IN32;
  552. default:
  553. return ENDIAN_NONE; /* Unsupported. */
  554. }
  555. } else {
  556. return ENDIAN_NONE;
  557. }
  558. }
  559. static bool r600_is_sampler_format_supported(struct pipe_screen *screen, enum pipe_format format)
  560. {
  561. return r600_translate_texformat(screen, format, NULL, NULL, NULL) != ~0U;
  562. }
  563. static bool r600_is_colorbuffer_format_supported(enum pipe_format format)
  564. {
  565. return r600_translate_colorformat(format) != ~0U &&
  566. r600_translate_colorswap(format) != ~0U;
  567. }
  568. static bool r600_is_zs_format_supported(enum pipe_format format)
  569. {
  570. return r600_translate_dbformat(format) != ~0U;
  571. }
  572. boolean evergreen_is_format_supported(struct pipe_screen *screen,
  573. enum pipe_format format,
  574. enum pipe_texture_target target,
  575. unsigned sample_count,
  576. unsigned usage)
  577. {
  578. unsigned retval = 0;
  579. if (target >= PIPE_MAX_TEXTURE_TYPES) {
  580. R600_ERR("r600: unsupported texture type %d\n", target);
  581. return FALSE;
  582. }
  583. if (!util_format_is_supported(format, usage))
  584. return FALSE;
  585. /* Multisample */
  586. if (sample_count > 1)
  587. return FALSE;
  588. if ((usage & PIPE_BIND_SAMPLER_VIEW) &&
  589. r600_is_sampler_format_supported(screen, format)) {
  590. retval |= PIPE_BIND_SAMPLER_VIEW;
  591. }
  592. if ((usage & (PIPE_BIND_RENDER_TARGET |
  593. PIPE_BIND_DISPLAY_TARGET |
  594. PIPE_BIND_SCANOUT |
  595. PIPE_BIND_SHARED)) &&
  596. r600_is_colorbuffer_format_supported(format)) {
  597. retval |= usage &
  598. (PIPE_BIND_RENDER_TARGET |
  599. PIPE_BIND_DISPLAY_TARGET |
  600. PIPE_BIND_SCANOUT |
  601. PIPE_BIND_SHARED);
  602. }
  603. if ((usage & PIPE_BIND_DEPTH_STENCIL) &&
  604. r600_is_zs_format_supported(format)) {
  605. retval |= PIPE_BIND_DEPTH_STENCIL;
  606. }
  607. if ((usage & PIPE_BIND_VERTEX_BUFFER) &&
  608. r600_is_vertex_format_supported(format)) {
  609. retval |= PIPE_BIND_VERTEX_BUFFER;
  610. }
  611. if (usage & PIPE_BIND_TRANSFER_READ)
  612. retval |= PIPE_BIND_TRANSFER_READ;
  613. if (usage & PIPE_BIND_TRANSFER_WRITE)
  614. retval |= PIPE_BIND_TRANSFER_WRITE;
  615. return retval == usage;
  616. }
  617. static void evergreen_set_blend_color(struct pipe_context *ctx,
  618. const struct pipe_blend_color *state)
  619. {
  620. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  621. struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
  622. if (rstate == NULL)
  623. return;
  624. rstate->id = R600_PIPE_STATE_BLEND_COLOR;
  625. r600_pipe_state_add_reg(rstate, R_028414_CB_BLEND_RED, fui(state->color[0]), 0xFFFFFFFF, NULL, 0);
  626. r600_pipe_state_add_reg(rstate, R_028418_CB_BLEND_GREEN, fui(state->color[1]), 0xFFFFFFFF, NULL, 0);
  627. r600_pipe_state_add_reg(rstate, R_02841C_CB_BLEND_BLUE, fui(state->color[2]), 0xFFFFFFFF, NULL, 0);
  628. r600_pipe_state_add_reg(rstate, R_028420_CB_BLEND_ALPHA, fui(state->color[3]), 0xFFFFFFFF, NULL, 0);
  629. free(rctx->states[R600_PIPE_STATE_BLEND_COLOR]);
  630. rctx->states[R600_PIPE_STATE_BLEND_COLOR] = rstate;
  631. r600_context_pipe_state_set(&rctx->ctx, rstate);
  632. }
  633. static void *evergreen_create_blend_state(struct pipe_context *ctx,
  634. const struct pipe_blend_state *state)
  635. {
  636. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  637. struct r600_pipe_blend *blend = CALLOC_STRUCT(r600_pipe_blend);
  638. struct r600_pipe_state *rstate;
  639. u32 color_control, target_mask;
  640. /* FIXME there is more then 8 framebuffer */
  641. unsigned blend_cntl[8];
  642. if (blend == NULL) {
  643. return NULL;
  644. }
  645. rstate = &blend->rstate;
  646. rstate->id = R600_PIPE_STATE_BLEND;
  647. target_mask = 0;
  648. color_control = S_028808_MODE(1);
  649. if (state->logicop_enable) {
  650. color_control |= (state->logicop_func << 16) | (state->logicop_func << 20);
  651. } else {
  652. color_control |= (0xcc << 16);
  653. }
  654. /* we pretend 8 buffer are used, CB_SHADER_MASK will disable unused one */
  655. if (state->independent_blend_enable) {
  656. for (int i = 0; i < 8; i++) {
  657. target_mask |= (state->rt[i].colormask << (4 * i));
  658. }
  659. } else {
  660. for (int i = 0; i < 8; i++) {
  661. target_mask |= (state->rt[0].colormask << (4 * i));
  662. }
  663. }
  664. blend->cb_target_mask = target_mask;
  665. r600_pipe_state_add_reg(rstate, R_028808_CB_COLOR_CONTROL,
  666. color_control, 0xFFFFFFFD, NULL, 0);
  667. if (rctx->chip_class != CAYMAN)
  668. r600_pipe_state_add_reg(rstate, R_028C3C_PA_SC_AA_MASK, 0xFFFFFFFF, 0xFFFFFFFF, NULL, 0);
  669. else {
  670. r600_pipe_state_add_reg(rstate, CM_R_028C38_PA_SC_AA_MASK_X0Y0_X1Y0, 0xFFFFFFFF, 0xFFFFFFFF, NULL, 0);
  671. r600_pipe_state_add_reg(rstate, CM_R_028C3C_PA_SC_AA_MASK_X0Y1_X1Y1, 0xFFFFFFFF, 0xFFFFFFFF, NULL, 0);
  672. }
  673. for (int i = 0; i < 8; i++) {
  674. /* state->rt entries > 0 only written if independent blending */
  675. const int j = state->independent_blend_enable ? i : 0;
  676. unsigned eqRGB = state->rt[j].rgb_func;
  677. unsigned srcRGB = state->rt[j].rgb_src_factor;
  678. unsigned dstRGB = state->rt[j].rgb_dst_factor;
  679. unsigned eqA = state->rt[j].alpha_func;
  680. unsigned srcA = state->rt[j].alpha_src_factor;
  681. unsigned dstA = state->rt[j].alpha_dst_factor;
  682. blend_cntl[i] = 0;
  683. if (!state->rt[j].blend_enable)
  684. continue;
  685. blend_cntl[i] |= S_028780_BLEND_CONTROL_ENABLE(1);
  686. blend_cntl[i] |= S_028780_COLOR_COMB_FCN(r600_translate_blend_function(eqRGB));
  687. blend_cntl[i] |= S_028780_COLOR_SRCBLEND(r600_translate_blend_factor(srcRGB));
  688. blend_cntl[i] |= S_028780_COLOR_DESTBLEND(r600_translate_blend_factor(dstRGB));
  689. if (srcA != srcRGB || dstA != dstRGB || eqA != eqRGB) {
  690. blend_cntl[i] |= S_028780_SEPARATE_ALPHA_BLEND(1);
  691. blend_cntl[i] |= S_028780_ALPHA_COMB_FCN(r600_translate_blend_function(eqA));
  692. blend_cntl[i] |= S_028780_ALPHA_SRCBLEND(r600_translate_blend_factor(srcA));
  693. blend_cntl[i] |= S_028780_ALPHA_DESTBLEND(r600_translate_blend_factor(dstA));
  694. }
  695. }
  696. for (int i = 0; i < 8; i++) {
  697. r600_pipe_state_add_reg(rstate, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl[i], 0xFFFFFFFF, NULL, 0);
  698. }
  699. return rstate;
  700. }
  701. static void *evergreen_create_dsa_state(struct pipe_context *ctx,
  702. const struct pipe_depth_stencil_alpha_state *state)
  703. {
  704. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  705. struct r600_pipe_dsa *dsa = CALLOC_STRUCT(r600_pipe_dsa);
  706. unsigned db_depth_control, alpha_test_control, alpha_ref, db_shader_control;
  707. unsigned stencil_ref_mask, stencil_ref_mask_bf, db_render_override, db_render_control;
  708. struct r600_pipe_state *rstate;
  709. if (dsa == NULL) {
  710. return NULL;
  711. }
  712. rstate = &dsa->rstate;
  713. rstate->id = R600_PIPE_STATE_DSA;
  714. /* depth TODO some of those db_shader_control field depend on shader adjust mask & add it to shader */
  715. db_shader_control = S_02880C_Z_ORDER(V_02880C_EARLY_Z_THEN_LATE_Z);
  716. stencil_ref_mask = 0;
  717. stencil_ref_mask_bf = 0;
  718. db_depth_control = S_028800_Z_ENABLE(state->depth.enabled) |
  719. S_028800_Z_WRITE_ENABLE(state->depth.writemask) |
  720. S_028800_ZFUNC(state->depth.func);
  721. /* stencil */
  722. if (state->stencil[0].enabled) {
  723. db_depth_control |= S_028800_STENCIL_ENABLE(1);
  724. db_depth_control |= S_028800_STENCILFUNC(r600_translate_ds_func(state->stencil[0].func));
  725. db_depth_control |= S_028800_STENCILFAIL(r600_translate_stencil_op(state->stencil[0].fail_op));
  726. db_depth_control |= S_028800_STENCILZPASS(r600_translate_stencil_op(state->stencil[0].zpass_op));
  727. db_depth_control |= S_028800_STENCILZFAIL(r600_translate_stencil_op(state->stencil[0].zfail_op));
  728. stencil_ref_mask = S_028430_STENCILMASK(state->stencil[0].valuemask) |
  729. S_028430_STENCILWRITEMASK(state->stencil[0].writemask);
  730. if (state->stencil[1].enabled) {
  731. db_depth_control |= S_028800_BACKFACE_ENABLE(1);
  732. db_depth_control |= S_028800_STENCILFUNC_BF(r600_translate_ds_func(state->stencil[1].func));
  733. db_depth_control |= S_028800_STENCILFAIL_BF(r600_translate_stencil_op(state->stencil[1].fail_op));
  734. db_depth_control |= S_028800_STENCILZPASS_BF(r600_translate_stencil_op(state->stencil[1].zpass_op));
  735. db_depth_control |= S_028800_STENCILZFAIL_BF(r600_translate_stencil_op(state->stencil[1].zfail_op));
  736. stencil_ref_mask_bf = S_028434_STENCILMASK_BF(state->stencil[1].valuemask) |
  737. S_028434_STENCILWRITEMASK_BF(state->stencil[1].writemask);
  738. }
  739. }
  740. /* alpha */
  741. alpha_test_control = 0;
  742. alpha_ref = 0;
  743. if (state->alpha.enabled) {
  744. alpha_test_control = S_028410_ALPHA_FUNC(state->alpha.func);
  745. alpha_test_control |= S_028410_ALPHA_TEST_ENABLE(1);
  746. alpha_ref = fui(state->alpha.ref_value);
  747. }
  748. dsa->alpha_ref = alpha_ref;
  749. /* misc */
  750. db_render_control = 0;
  751. db_render_override = S_02800C_FORCE_HIZ_ENABLE(V_02800C_FORCE_DISABLE) |
  752. S_02800C_FORCE_HIS_ENABLE0(V_02800C_FORCE_DISABLE) |
  753. S_02800C_FORCE_HIS_ENABLE1(V_02800C_FORCE_DISABLE);
  754. /* TODO db_render_override depends on query */
  755. r600_pipe_state_add_reg(rstate, R_028028_DB_STENCIL_CLEAR, 0x00000000, 0xFFFFFFFF, NULL, 0);
  756. r600_pipe_state_add_reg(rstate, R_02802C_DB_DEPTH_CLEAR, 0x3F800000, 0xFFFFFFFF, NULL, 0);
  757. r600_pipe_state_add_reg(rstate, R_028410_SX_ALPHA_TEST_CONTROL, alpha_test_control, 0xFFFFFFFF, NULL, 0);
  758. r600_pipe_state_add_reg(rstate,
  759. R_028430_DB_STENCILREFMASK, stencil_ref_mask,
  760. 0xFFFFFFFF & C_028430_STENCILREF, NULL, 0);
  761. r600_pipe_state_add_reg(rstate,
  762. R_028434_DB_STENCILREFMASK_BF, stencil_ref_mask_bf,
  763. 0xFFFFFFFF & C_028434_STENCILREF_BF, NULL, 0);
  764. r600_pipe_state_add_reg(rstate, R_0286DC_SPI_FOG_CNTL, 0x00000000, 0xFFFFFFFF, NULL, 0);
  765. r600_pipe_state_add_reg(rstate, R_028800_DB_DEPTH_CONTROL, db_depth_control, 0xFFFFFFFF, NULL, 0);
  766. /* The DB_SHADER_CONTROL mask is 0xFFFFFFBC since Z_EXPORT_ENABLE,
  767. * STENCIL_EXPORT_ENABLE and KILL_ENABLE are controlled by
  768. * evergreen_pipe_shader_ps().*/
  769. r600_pipe_state_add_reg(rstate, R_02880C_DB_SHADER_CONTROL, db_shader_control, 0xFFFFFFBC, NULL, 0);
  770. r600_pipe_state_add_reg(rstate, R_028000_DB_RENDER_CONTROL, db_render_control, 0xFFFFFFFF, NULL, 0);
  771. r600_pipe_state_add_reg(rstate, R_02800C_DB_RENDER_OVERRIDE, db_render_override, 0xFFFFFFFF, NULL, 0);
  772. r600_pipe_state_add_reg(rstate, R_028AC0_DB_SRESULTS_COMPARE_STATE0, 0x0, 0xFFFFFFFF, NULL, 0);
  773. r600_pipe_state_add_reg(rstate, R_028AC4_DB_SRESULTS_COMPARE_STATE1, 0x0, 0xFFFFFFFF, NULL, 0);
  774. r600_pipe_state_add_reg(rstate, R_028AC8_DB_PRELOAD_CONTROL, 0x0, 0xFFFFFFFF, NULL, 0);
  775. r600_pipe_state_add_reg(rstate, R_028B70_DB_ALPHA_TO_MASK, 0x0000AA00, 0xFFFFFFFF, NULL, 0);
  776. return rstate;
  777. }
  778. static void *evergreen_create_rs_state(struct pipe_context *ctx,
  779. const struct pipe_rasterizer_state *state)
  780. {
  781. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  782. struct r600_pipe_rasterizer *rs = CALLOC_STRUCT(r600_pipe_rasterizer);
  783. struct r600_pipe_state *rstate;
  784. unsigned tmp;
  785. unsigned prov_vtx = 1, polygon_dual_mode;
  786. unsigned clip_rule;
  787. if (rs == NULL) {
  788. return NULL;
  789. }
  790. rstate = &rs->rstate;
  791. rs->clamp_vertex_color = state->clamp_vertex_color;
  792. rs->clamp_fragment_color = state->clamp_fragment_color;
  793. rs->flatshade = state->flatshade;
  794. rs->sprite_coord_enable = state->sprite_coord_enable;
  795. clip_rule = state->scissor ? 0xAAAA : 0xFFFF;
  796. /* offset */
  797. rs->offset_units = state->offset_units;
  798. rs->offset_scale = state->offset_scale * 12.0f;
  799. rstate->id = R600_PIPE_STATE_RASTERIZER;
  800. if (state->flatshade_first)
  801. prov_vtx = 0;
  802. tmp = S_0286D4_FLAT_SHADE_ENA(1);
  803. if (state->sprite_coord_enable) {
  804. tmp |= S_0286D4_PNT_SPRITE_ENA(1) |
  805. S_0286D4_PNT_SPRITE_OVRD_X(2) |
  806. S_0286D4_PNT_SPRITE_OVRD_Y(3) |
  807. S_0286D4_PNT_SPRITE_OVRD_Z(0) |
  808. S_0286D4_PNT_SPRITE_OVRD_W(1);
  809. if (state->sprite_coord_mode != PIPE_SPRITE_COORD_UPPER_LEFT) {
  810. tmp |= S_0286D4_PNT_SPRITE_TOP_1(1);
  811. }
  812. }
  813. r600_pipe_state_add_reg(rstate, R_0286D4_SPI_INTERP_CONTROL_0, tmp, 0xFFFFFFFF, NULL, 0);
  814. polygon_dual_mode = (state->fill_front != PIPE_POLYGON_MODE_FILL ||
  815. state->fill_back != PIPE_POLYGON_MODE_FILL);
  816. r600_pipe_state_add_reg(rstate, R_028814_PA_SU_SC_MODE_CNTL,
  817. S_028814_PROVOKING_VTX_LAST(prov_vtx) |
  818. S_028814_CULL_FRONT((state->cull_face & PIPE_FACE_FRONT) ? 1 : 0) |
  819. S_028814_CULL_BACK((state->cull_face & PIPE_FACE_BACK) ? 1 : 0) |
  820. S_028814_FACE(!state->front_ccw) |
  821. S_028814_POLY_OFFSET_FRONT_ENABLE(state->offset_tri) |
  822. S_028814_POLY_OFFSET_BACK_ENABLE(state->offset_tri) |
  823. S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_tri) |
  824. S_028814_POLY_MODE(polygon_dual_mode) |
  825. S_028814_POLYMODE_FRONT_PTYPE(r600_translate_fill(state->fill_front)) |
  826. S_028814_POLYMODE_BACK_PTYPE(r600_translate_fill(state->fill_back)), 0xFFFFFFFF, NULL, 0);
  827. r600_pipe_state_add_reg(rstate, R_02881C_PA_CL_VS_OUT_CNTL,
  828. S_02881C_USE_VTX_POINT_SIZE(state->point_size_per_vertex) |
  829. S_02881C_VS_OUT_MISC_VEC_ENA(state->point_size_per_vertex), 0xFFFFFFFF, NULL, 0);
  830. r600_pipe_state_add_reg(rstate, R_028820_PA_CL_NANINF_CNTL, 0x00000000, 0xFFFFFFFF, NULL, 0);
  831. /* point size 12.4 fixed point */
  832. tmp = (unsigned)(state->point_size * 8.0);
  833. r600_pipe_state_add_reg(rstate, R_028A00_PA_SU_POINT_SIZE, S_028A00_HEIGHT(tmp) | S_028A00_WIDTH(tmp), 0xFFFFFFFF, NULL, 0);
  834. r600_pipe_state_add_reg(rstate, R_028A04_PA_SU_POINT_MINMAX, 0x80000000, 0xFFFFFFFF, NULL, 0);
  835. tmp = (unsigned)state->line_width * 8;
  836. r600_pipe_state_add_reg(rstate, R_028A08_PA_SU_LINE_CNTL, S_028A08_WIDTH(tmp), 0xFFFFFFFF, NULL, 0);
  837. if (rctx->chip_class == CAYMAN) {
  838. r600_pipe_state_add_reg(rstate, CM_R_028BDC_PA_SC_LINE_CNTL, 0x00000400, 0xFFFFFFFF, NULL, 0);
  839. r600_pipe_state_add_reg(rstate, CM_R_028BE4_PA_SU_VTX_CNTL,
  840. S_028C08_PIX_CENTER_HALF(state->gl_rasterization_rules),
  841. 0xFFFFFFFF, NULL, 0);
  842. r600_pipe_state_add_reg(rstate, CM_R_028BE8_PA_CL_GB_VERT_CLIP_ADJ, 0x3F800000, 0xFFFFFFFF, NULL, 0);
  843. r600_pipe_state_add_reg(rstate, CM_R_028BEC_PA_CL_GB_VERT_DISC_ADJ, 0x3F800000, 0xFFFFFFFF, NULL, 0);
  844. r600_pipe_state_add_reg(rstate, CM_R_028BF0_PA_CL_GB_HORZ_CLIP_ADJ, 0x3F800000, 0xFFFFFFFF, NULL, 0);
  845. r600_pipe_state_add_reg(rstate, CM_R_028BF4_PA_CL_GB_HORZ_DISC_ADJ, 0x3F800000, 0xFFFFFFFF, NULL, 0);
  846. } else {
  847. r600_pipe_state_add_reg(rstate, R_028C00_PA_SC_LINE_CNTL, 0x00000400, 0xFFFFFFFF, NULL, 0);
  848. r600_pipe_state_add_reg(rstate, R_028C0C_PA_CL_GB_VERT_CLIP_ADJ, 0x3F800000, 0xFFFFFFFF, NULL, 0);
  849. r600_pipe_state_add_reg(rstate, R_028C10_PA_CL_GB_VERT_DISC_ADJ, 0x3F800000, 0xFFFFFFFF, NULL, 0);
  850. r600_pipe_state_add_reg(rstate, R_028C14_PA_CL_GB_HORZ_CLIP_ADJ, 0x3F800000, 0xFFFFFFFF, NULL, 0);
  851. r600_pipe_state_add_reg(rstate, R_028C18_PA_CL_GB_HORZ_DISC_ADJ, 0x3F800000, 0xFFFFFFFF, NULL, 0);
  852. r600_pipe_state_add_reg(rstate, R_028C08_PA_SU_VTX_CNTL,
  853. S_028C08_PIX_CENTER_HALF(state->gl_rasterization_rules),
  854. 0xFFFFFFFF, NULL, 0);
  855. }
  856. r600_pipe_state_add_reg(rstate, R_028B7C_PA_SU_POLY_OFFSET_CLAMP, fui(state->offset_clamp), 0xFFFFFFFF, NULL, 0);
  857. r600_pipe_state_add_reg(rstate, R_02820C_PA_SC_CLIPRECT_RULE, clip_rule, 0xFFFFFFFF, NULL, 0);
  858. return rstate;
  859. }
  860. static void *evergreen_create_sampler_state(struct pipe_context *ctx,
  861. const struct pipe_sampler_state *state)
  862. {
  863. struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
  864. union util_color uc;
  865. unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 2 : 0;
  866. if (rstate == NULL) {
  867. return NULL;
  868. }
  869. rstate->id = R600_PIPE_STATE_SAMPLER;
  870. util_pack_color(state->border_color.f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
  871. r600_pipe_state_add_reg_noblock(rstate, R_03C000_SQ_TEX_SAMPLER_WORD0_0,
  872. S_03C000_CLAMP_X(r600_tex_wrap(state->wrap_s)) |
  873. S_03C000_CLAMP_Y(r600_tex_wrap(state->wrap_t)) |
  874. S_03C000_CLAMP_Z(r600_tex_wrap(state->wrap_r)) |
  875. S_03C000_XY_MAG_FILTER(r600_tex_filter(state->mag_img_filter) | aniso_flag_offset) |
  876. S_03C000_XY_MIN_FILTER(r600_tex_filter(state->min_img_filter) | aniso_flag_offset) |
  877. S_03C000_MIP_FILTER(r600_tex_mipfilter(state->min_mip_filter)) |
  878. S_03C000_MAX_ANISO(r600_tex_aniso_filter(state->max_anisotropy)) |
  879. S_03C000_DEPTH_COMPARE_FUNCTION(r600_tex_compare(state->compare_func)) |
  880. S_03C000_BORDER_COLOR_TYPE(uc.ui ? V_03C000_SQ_TEX_BORDER_COLOR_REGISTER : 0), 0xFFFFFFFF, NULL, 0);
  881. r600_pipe_state_add_reg_noblock(rstate, R_03C004_SQ_TEX_SAMPLER_WORD1_0,
  882. S_03C004_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 8)) |
  883. S_03C004_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 8)),
  884. 0xFFFFFFFF, NULL, 0);
  885. r600_pipe_state_add_reg_noblock(rstate, R_03C008_SQ_TEX_SAMPLER_WORD2_0,
  886. S_03C008_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 8)) |
  887. (state->seamless_cube_map ? 0 : S_03C008_DISABLE_CUBE_WRAP(1)) |
  888. S_03C008_TYPE(1),
  889. 0xFFFFFFFF, NULL, 0);
  890. if (uc.ui) {
  891. r600_pipe_state_add_reg_noblock(rstate, R_00A404_TD_PS_SAMPLER0_BORDER_RED, fui(state->border_color.f[0]), 0xFFFFFFFF, NULL, 0);
  892. r600_pipe_state_add_reg_noblock(rstate, R_00A408_TD_PS_SAMPLER0_BORDER_GREEN, fui(state->border_color.f[1]), 0xFFFFFFFF, NULL, 0);
  893. r600_pipe_state_add_reg_noblock(rstate, R_00A40C_TD_PS_SAMPLER0_BORDER_BLUE, fui(state->border_color.f[2]), 0xFFFFFFFF, NULL, 0);
  894. r600_pipe_state_add_reg_noblock(rstate, R_00A410_TD_PS_SAMPLER0_BORDER_ALPHA, fui(state->border_color.f[3]), 0xFFFFFFFF, NULL, 0);
  895. }
  896. return rstate;
  897. }
  898. static struct pipe_sampler_view *evergreen_create_sampler_view(struct pipe_context *ctx,
  899. struct pipe_resource *texture,
  900. const struct pipe_sampler_view *state)
  901. {
  902. struct r600_pipe_sampler_view *view = CALLOC_STRUCT(r600_pipe_sampler_view);
  903. struct r600_pipe_resource_state *rstate;
  904. struct r600_resource_texture *tmp = (struct r600_resource_texture*)texture;
  905. unsigned format, endian;
  906. uint32_t word4 = 0, yuv_format = 0, pitch = 0;
  907. unsigned char swizzle[4], array_mode = 0, tile_type = 0;
  908. unsigned height, depth;
  909. if (view == NULL)
  910. return NULL;
  911. rstate = &view->state;
  912. /* initialize base object */
  913. view->base = *state;
  914. view->base.texture = NULL;
  915. pipe_reference(NULL, &texture->reference);
  916. view->base.texture = texture;
  917. view->base.reference.count = 1;
  918. view->base.context = ctx;
  919. swizzle[0] = state->swizzle_r;
  920. swizzle[1] = state->swizzle_g;
  921. swizzle[2] = state->swizzle_b;
  922. swizzle[3] = state->swizzle_a;
  923. format = r600_translate_texformat(ctx->screen, state->format,
  924. swizzle,
  925. &word4, &yuv_format);
  926. if (format == ~0) {
  927. format = 0;
  928. }
  929. if (tmp->depth && !tmp->is_flushing_texture) {
  930. r600_texture_depth_flush(ctx, texture, TRUE);
  931. tmp = tmp->flushed_depth_texture;
  932. }
  933. endian = r600_colorformat_endian_swap(format);
  934. height = texture->height0;
  935. depth = texture->depth0;
  936. pitch = align(tmp->pitch_in_blocks[0] *
  937. util_format_get_blockwidth(state->format), 8);
  938. array_mode = tmp->array_mode[0];
  939. tile_type = tmp->tile_type;
  940. if (texture->target == PIPE_TEXTURE_1D_ARRAY) {
  941. height = 1;
  942. depth = texture->array_size;
  943. } else if (texture->target == PIPE_TEXTURE_2D_ARRAY) {
  944. depth = texture->array_size;
  945. }
  946. rstate->bo[0] = &tmp->resource;
  947. rstate->bo[1] = &tmp->resource;
  948. rstate->bo_usage[0] = RADEON_USAGE_READ;
  949. rstate->bo_usage[1] = RADEON_USAGE_READ;
  950. rstate->val[0] = (S_030000_DIM(r600_tex_dim(texture->target)) |
  951. S_030000_PITCH((pitch / 8) - 1) |
  952. S_030000_NON_DISP_TILING_ORDER(tile_type) |
  953. S_030000_TEX_WIDTH(texture->width0 - 1));
  954. rstate->val[1] = (S_030004_TEX_HEIGHT(height - 1) |
  955. S_030004_TEX_DEPTH(depth - 1) |
  956. S_030004_ARRAY_MODE(array_mode));
  957. rstate->val[2] = tmp->offset[0] >> 8;
  958. rstate->val[3] = tmp->offset[1] >> 8;
  959. rstate->val[4] = (word4 |
  960. S_030010_SRF_MODE_ALL(V_030010_SRF_MODE_ZERO_CLAMP_MINUS_ONE) |
  961. S_030010_ENDIAN_SWAP(endian) |
  962. S_030010_BASE_LEVEL(state->u.tex.first_level));
  963. rstate->val[5] = (S_030014_LAST_LEVEL(state->u.tex.last_level) |
  964. S_030014_BASE_ARRAY(state->u.tex.first_layer) |
  965. S_030014_LAST_ARRAY(state->u.tex.last_layer));
  966. rstate->val[6] = (S_030018_MAX_ANISO(4 /* max 16 samples */));
  967. rstate->val[7] = (S_03001C_DATA_FORMAT(format) |
  968. S_03001C_TYPE(V_03001C_SQ_TEX_VTX_VALID_TEXTURE));
  969. return &view->base;
  970. }
  971. static void evergreen_set_vs_sampler_view(struct pipe_context *ctx, unsigned count,
  972. struct pipe_sampler_view **views)
  973. {
  974. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  975. struct r600_pipe_sampler_view **resource = (struct r600_pipe_sampler_view **)views;
  976. for (int i = 0; i < count; i++) {
  977. if (resource[i]) {
  978. evergreen_context_pipe_state_set_vs_resource(&rctx->ctx, &resource[i]->state,
  979. i + R600_MAX_CONST_BUFFERS);
  980. }
  981. }
  982. }
  983. static void evergreen_set_ps_sampler_view(struct pipe_context *ctx, unsigned count,
  984. struct pipe_sampler_view **views)
  985. {
  986. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  987. struct r600_pipe_sampler_view **resource = (struct r600_pipe_sampler_view **)views;
  988. int i;
  989. int has_depth = 0;
  990. for (i = 0; i < count; i++) {
  991. if (&rctx->ps_samplers.views[i]->base != views[i]) {
  992. if (resource[i]) {
  993. if (((struct r600_resource_texture *)resource[i]->base.texture)->depth)
  994. has_depth = 1;
  995. evergreen_context_pipe_state_set_ps_resource(&rctx->ctx, &resource[i]->state,
  996. i + R600_MAX_CONST_BUFFERS);
  997. } else
  998. evergreen_context_pipe_state_set_ps_resource(&rctx->ctx, NULL,
  999. i + R600_MAX_CONST_BUFFERS);
  1000. pipe_sampler_view_reference(
  1001. (struct pipe_sampler_view **)&rctx->ps_samplers.views[i],
  1002. views[i]);
  1003. } else {
  1004. if (resource[i]) {
  1005. if (((struct r600_resource_texture *)resource[i]->base.texture)->depth)
  1006. has_depth = 1;
  1007. }
  1008. }
  1009. }
  1010. for (i = count; i < NUM_TEX_UNITS; i++) {
  1011. if (rctx->ps_samplers.views[i]) {
  1012. evergreen_context_pipe_state_set_ps_resource(&rctx->ctx, NULL,
  1013. i + R600_MAX_CONST_BUFFERS);
  1014. pipe_sampler_view_reference((struct pipe_sampler_view **)&rctx->ps_samplers.views[i], NULL);
  1015. }
  1016. }
  1017. rctx->have_depth_texture = has_depth;
  1018. rctx->ps_samplers.n_views = count;
  1019. }
  1020. static void evergreen_bind_ps_sampler(struct pipe_context *ctx, unsigned count, void **states)
  1021. {
  1022. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  1023. struct r600_pipe_state **rstates = (struct r600_pipe_state **)states;
  1024. memcpy(rctx->ps_samplers.samplers, states, sizeof(void*) * count);
  1025. rctx->ps_samplers.n_samplers = count;
  1026. for (int i = 0; i < count; i++) {
  1027. evergreen_context_pipe_state_set_ps_sampler(&rctx->ctx, rstates[i], i);
  1028. }
  1029. }
  1030. static void evergreen_bind_vs_sampler(struct pipe_context *ctx, unsigned count, void **states)
  1031. {
  1032. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  1033. struct r600_pipe_state **rstates = (struct r600_pipe_state **)states;
  1034. for (int i = 0; i < count; i++) {
  1035. evergreen_context_pipe_state_set_vs_sampler(&rctx->ctx, rstates[i], i);
  1036. }
  1037. }
  1038. static void evergreen_set_clip_state(struct pipe_context *ctx,
  1039. const struct pipe_clip_state *state)
  1040. {
  1041. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  1042. struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
  1043. if (rstate == NULL)
  1044. return;
  1045. rctx->clip = *state;
  1046. rstate->id = R600_PIPE_STATE_CLIP;
  1047. for (int i = 0; i < state->nr; i++) {
  1048. r600_pipe_state_add_reg(rstate,
  1049. R_0285BC_PA_CL_UCP0_X + i * 16,
  1050. fui(state->ucp[i][0]), 0xFFFFFFFF, NULL, 0);
  1051. r600_pipe_state_add_reg(rstate,
  1052. R_0285C0_PA_CL_UCP0_Y + i * 16,
  1053. fui(state->ucp[i][1]) , 0xFFFFFFFF, NULL, 0);
  1054. r600_pipe_state_add_reg(rstate,
  1055. R_0285C4_PA_CL_UCP0_Z + i * 16,
  1056. fui(state->ucp[i][2]), 0xFFFFFFFF, NULL, 0);
  1057. r600_pipe_state_add_reg(rstate,
  1058. R_0285C8_PA_CL_UCP0_W + i * 16,
  1059. fui(state->ucp[i][3]), 0xFFFFFFFF, NULL, 0);
  1060. }
  1061. r600_pipe_state_add_reg(rstate, R_028810_PA_CL_CLIP_CNTL,
  1062. S_028810_PS_UCP_MODE(3) | ((1 << state->nr) - 1) |
  1063. S_028810_ZCLIP_NEAR_DISABLE(state->depth_clamp) |
  1064. S_028810_ZCLIP_FAR_DISABLE(state->depth_clamp), 0xFFFFFFFF, NULL, 0);
  1065. free(rctx->states[R600_PIPE_STATE_CLIP]);
  1066. rctx->states[R600_PIPE_STATE_CLIP] = rstate;
  1067. r600_context_pipe_state_set(&rctx->ctx, rstate);
  1068. }
  1069. static void evergreen_set_polygon_stipple(struct pipe_context *ctx,
  1070. const struct pipe_poly_stipple *state)
  1071. {
  1072. }
  1073. static void evergreen_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask)
  1074. {
  1075. }
  1076. static void evergreen_set_scissor_state(struct pipe_context *ctx,
  1077. const struct pipe_scissor_state *state)
  1078. {
  1079. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  1080. struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
  1081. u32 tl, br;
  1082. if (rstate == NULL)
  1083. return;
  1084. rstate->id = R600_PIPE_STATE_SCISSOR;
  1085. tl = S_028240_TL_X(state->minx) | S_028240_TL_Y(state->miny);
  1086. br = S_028244_BR_X(state->maxx) | S_028244_BR_Y(state->maxy);
  1087. r600_pipe_state_add_reg(rstate,
  1088. R_028210_PA_SC_CLIPRECT_0_TL, tl,
  1089. 0xFFFFFFFF, NULL, 0);
  1090. r600_pipe_state_add_reg(rstate,
  1091. R_028214_PA_SC_CLIPRECT_0_BR, br,
  1092. 0xFFFFFFFF, NULL, 0);
  1093. r600_pipe_state_add_reg(rstate,
  1094. R_028218_PA_SC_CLIPRECT_1_TL, tl,
  1095. 0xFFFFFFFF, NULL, 0);
  1096. r600_pipe_state_add_reg(rstate,
  1097. R_02821C_PA_SC_CLIPRECT_1_BR, br,
  1098. 0xFFFFFFFF, NULL, 0);
  1099. r600_pipe_state_add_reg(rstate,
  1100. R_028220_PA_SC_CLIPRECT_2_TL, tl,
  1101. 0xFFFFFFFF, NULL, 0);
  1102. r600_pipe_state_add_reg(rstate,
  1103. R_028224_PA_SC_CLIPRECT_2_BR, br,
  1104. 0xFFFFFFFF, NULL, 0);
  1105. r600_pipe_state_add_reg(rstate,
  1106. R_028228_PA_SC_CLIPRECT_3_TL, tl,
  1107. 0xFFFFFFFF, NULL, 0);
  1108. r600_pipe_state_add_reg(rstate,
  1109. R_02822C_PA_SC_CLIPRECT_3_BR, br,
  1110. 0xFFFFFFFF, NULL, 0);
  1111. free(rctx->states[R600_PIPE_STATE_SCISSOR]);
  1112. rctx->states[R600_PIPE_STATE_SCISSOR] = rstate;
  1113. r600_context_pipe_state_set(&rctx->ctx, rstate);
  1114. }
  1115. static void evergreen_set_stencil_ref(struct pipe_context *ctx,
  1116. const struct pipe_stencil_ref *state)
  1117. {
  1118. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  1119. struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
  1120. u32 tmp;
  1121. if (rstate == NULL)
  1122. return;
  1123. rctx->stencil_ref = *state;
  1124. rstate->id = R600_PIPE_STATE_STENCIL_REF;
  1125. tmp = S_028430_STENCILREF(state->ref_value[0]);
  1126. r600_pipe_state_add_reg(rstate,
  1127. R_028430_DB_STENCILREFMASK, tmp,
  1128. ~C_028430_STENCILREF, NULL, 0);
  1129. tmp = S_028434_STENCILREF_BF(state->ref_value[1]);
  1130. r600_pipe_state_add_reg(rstate,
  1131. R_028434_DB_STENCILREFMASK_BF, tmp,
  1132. ~C_028434_STENCILREF_BF, NULL, 0);
  1133. free(rctx->states[R600_PIPE_STATE_STENCIL_REF]);
  1134. rctx->states[R600_PIPE_STATE_STENCIL_REF] = rstate;
  1135. r600_context_pipe_state_set(&rctx->ctx, rstate);
  1136. }
  1137. static void evergreen_set_viewport_state(struct pipe_context *ctx,
  1138. const struct pipe_viewport_state *state)
  1139. {
  1140. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  1141. struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
  1142. if (rstate == NULL)
  1143. return;
  1144. rctx->viewport = *state;
  1145. rstate->id = R600_PIPE_STATE_VIEWPORT;
  1146. r600_pipe_state_add_reg(rstate, R_0282D0_PA_SC_VPORT_ZMIN_0, 0x00000000, 0xFFFFFFFF, NULL, 0);
  1147. r600_pipe_state_add_reg(rstate, R_0282D4_PA_SC_VPORT_ZMAX_0, 0x3F800000, 0xFFFFFFFF, NULL, 0);
  1148. r600_pipe_state_add_reg(rstate, R_02843C_PA_CL_VPORT_XSCALE_0, fui(state->scale[0]), 0xFFFFFFFF, NULL, 0);
  1149. r600_pipe_state_add_reg(rstate, R_028444_PA_CL_VPORT_YSCALE_0, fui(state->scale[1]), 0xFFFFFFFF, NULL, 0);
  1150. r600_pipe_state_add_reg(rstate, R_02844C_PA_CL_VPORT_ZSCALE_0, fui(state->scale[2]), 0xFFFFFFFF, NULL, 0);
  1151. r600_pipe_state_add_reg(rstate, R_028440_PA_CL_VPORT_XOFFSET_0, fui(state->translate[0]), 0xFFFFFFFF, NULL, 0);
  1152. r600_pipe_state_add_reg(rstate, R_028448_PA_CL_VPORT_YOFFSET_0, fui(state->translate[1]), 0xFFFFFFFF, NULL, 0);
  1153. r600_pipe_state_add_reg(rstate, R_028450_PA_CL_VPORT_ZOFFSET_0, fui(state->translate[2]), 0xFFFFFFFF, NULL, 0);
  1154. r600_pipe_state_add_reg(rstate, R_028818_PA_CL_VTE_CNTL, 0x0000043F, 0xFFFFFFFF, NULL, 0);
  1155. free(rctx->states[R600_PIPE_STATE_VIEWPORT]);
  1156. rctx->states[R600_PIPE_STATE_VIEWPORT] = rstate;
  1157. r600_context_pipe_state_set(&rctx->ctx, rstate);
  1158. }
  1159. static void evergreen_cb(struct r600_pipe_context *rctx, struct r600_pipe_state *rstate,
  1160. const struct pipe_framebuffer_state *state, int cb)
  1161. {
  1162. struct r600_resource_texture *rtex;
  1163. struct r600_surface *surf;
  1164. unsigned level = state->cbufs[cb]->u.tex.level;
  1165. unsigned pitch, slice;
  1166. unsigned color_info;
  1167. unsigned format, swap, ntype, endian;
  1168. unsigned offset;
  1169. unsigned tile_type;
  1170. const struct util_format_description *desc;
  1171. int i;
  1172. unsigned blend_clamp = 0, blend_bypass = 0;
  1173. surf = (struct r600_surface *)state->cbufs[cb];
  1174. rtex = (struct r600_resource_texture*)state->cbufs[cb]->texture;
  1175. if (rtex->depth)
  1176. rctx->have_depth_fb = TRUE;
  1177. if (rtex->depth && !rtex->is_flushing_texture) {
  1178. r600_texture_depth_flush(&rctx->context, state->cbufs[cb]->texture, TRUE);
  1179. rtex = rtex->flushed_depth_texture;
  1180. }
  1181. /* XXX quite sure for dx10+ hw don't need any offset hacks */
  1182. offset = r600_texture_get_offset((struct r600_resource_texture *)state->cbufs[cb]->texture,
  1183. level, state->cbufs[cb]->u.tex.first_layer);
  1184. pitch = rtex->pitch_in_blocks[level] / 8 - 1;
  1185. slice = rtex->pitch_in_blocks[level] * surf->aligned_height / 64 - 1;
  1186. desc = util_format_description(surf->base.format);
  1187. for (i = 0; i < 4; i++) {
  1188. if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
  1189. break;
  1190. }
  1191. }
  1192. ntype = V_028C70_NUMBER_UNORM;
  1193. if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
  1194. ntype = V_028C70_NUMBER_SRGB;
  1195. else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
  1196. if (desc->channel[i].normalized)
  1197. ntype = V_028C70_NUMBER_SNORM;
  1198. else if (desc->channel[i].pure_integer)
  1199. ntype = V_028C70_NUMBER_SINT;
  1200. } else if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) {
  1201. if (desc->channel[i].normalized)
  1202. ntype = V_028C70_NUMBER_UNORM;
  1203. else if (desc->channel[i].pure_integer)
  1204. ntype = V_028C70_NUMBER_UINT;
  1205. }
  1206. format = r600_translate_colorformat(surf->base.format);
  1207. swap = r600_translate_colorswap(surf->base.format);
  1208. if (rtex->resource.b.b.b.usage == PIPE_USAGE_STAGING) {
  1209. endian = ENDIAN_NONE;
  1210. } else {
  1211. endian = r600_colorformat_endian_swap(format);
  1212. }
  1213. /* blend clamp should be set for all NORM/SRGB types */
  1214. if (ntype == V_028C70_NUMBER_UNORM || ntype == V_028C70_NUMBER_SNORM ||
  1215. ntype == V_028C70_NUMBER_SRGB)
  1216. blend_clamp = 1;
  1217. /* set blend bypass according to docs if SINT/UINT or
  1218. 8/24 COLOR variants */
  1219. if (ntype == V_028C70_NUMBER_UINT || ntype == V_028C70_NUMBER_SINT ||
  1220. format == V_028C70_COLOR_8_24 || format == V_028C70_COLOR_24_8 ||
  1221. format == V_028C70_COLOR_X24_8_32_FLOAT) {
  1222. blend_clamp = 0;
  1223. blend_bypass = 1;
  1224. }
  1225. color_info = S_028C70_FORMAT(format) |
  1226. S_028C70_COMP_SWAP(swap) |
  1227. S_028C70_ARRAY_MODE(rtex->array_mode[level]) |
  1228. S_028C70_BLEND_CLAMP(blend_clamp) |
  1229. S_028C70_BLEND_BYPASS(blend_bypass) |
  1230. S_028C70_NUMBER_TYPE(ntype) |
  1231. S_028C70_ENDIAN(endian);
  1232. /* EXPORT_NORM is an optimzation that can be enabled for better
  1233. * performance in certain cases.
  1234. * EXPORT_NORM can be enabled if:
  1235. * - 11-bit or smaller UNORM/SNORM/SRGB
  1236. * - 16-bit or smaller FLOAT
  1237. */
  1238. /* FIXME: This should probably be the same for all CBs if we want
  1239. * useful alpha tests. */
  1240. if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS &&
  1241. ((desc->channel[i].size < 12 &&
  1242. desc->channel[i].type != UTIL_FORMAT_TYPE_FLOAT &&
  1243. ntype != V_028C70_NUMBER_UINT && ntype != V_028C70_NUMBER_SINT) ||
  1244. (desc->channel[i].size < 17 &&
  1245. desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT))) {
  1246. color_info |= S_028C70_SOURCE_FORMAT(V_028C70_EXPORT_4C_16BPC);
  1247. rctx->export_16bpc = true;
  1248. } else {
  1249. rctx->export_16bpc = false;
  1250. }
  1251. rctx->alpha_ref_dirty = true;
  1252. if (rtex->array_mode[level] > V_028C70_ARRAY_LINEAR_ALIGNED) {
  1253. tile_type = rtex->tile_type;
  1254. } else /* workaround for linear buffers */
  1255. tile_type = 1;
  1256. /* FIXME handle enabling of CB beyond BASE8 which has different offset */
  1257. r600_pipe_state_add_reg(rstate,
  1258. R_028C60_CB_COLOR0_BASE + cb * 0x3C,
  1259. offset >> 8, 0xFFFFFFFF, &rtex->resource, RADEON_USAGE_READWRITE);
  1260. r600_pipe_state_add_reg(rstate,
  1261. R_028C78_CB_COLOR0_DIM + cb * 0x3C,
  1262. 0x0, 0xFFFFFFFF, NULL, 0);
  1263. r600_pipe_state_add_reg(rstate,
  1264. R_028C70_CB_COLOR0_INFO + cb * 0x3C,
  1265. color_info, 0xFFFFFFFF, &rtex->resource, RADEON_USAGE_READWRITE);
  1266. r600_pipe_state_add_reg(rstate,
  1267. R_028C64_CB_COLOR0_PITCH + cb * 0x3C,
  1268. S_028C64_PITCH_TILE_MAX(pitch),
  1269. 0xFFFFFFFF, NULL, 0);
  1270. r600_pipe_state_add_reg(rstate,
  1271. R_028C68_CB_COLOR0_SLICE + cb * 0x3C,
  1272. S_028C68_SLICE_TILE_MAX(slice),
  1273. 0xFFFFFFFF, NULL, 0);
  1274. r600_pipe_state_add_reg(rstate,
  1275. R_028C6C_CB_COLOR0_VIEW + cb * 0x3C,
  1276. 0x00000000, 0xFFFFFFFF, NULL, 0);
  1277. r600_pipe_state_add_reg(rstate,
  1278. R_028C74_CB_COLOR0_ATTRIB + cb * 0x3C,
  1279. S_028C74_NON_DISP_TILING_ORDER(tile_type),
  1280. 0xFFFFFFFF, &rtex->resource, RADEON_USAGE_READWRITE);
  1281. }
  1282. static void evergreen_db(struct r600_pipe_context *rctx, struct r600_pipe_state *rstate,
  1283. const struct pipe_framebuffer_state *state)
  1284. {
  1285. struct r600_resource_texture *rtex;
  1286. struct r600_surface *surf;
  1287. unsigned level, first_layer, pitch, slice, format, offset, array_mode;
  1288. if (state->zsbuf == NULL)
  1289. return;
  1290. surf = (struct r600_surface *)state->zsbuf;
  1291. level = surf->base.u.tex.level;
  1292. rtex = (struct r600_resource_texture*)surf->base.texture;
  1293. /* XXX remove this once tiling is properly supported */
  1294. array_mode = rtex->array_mode[level] ? rtex->array_mode[level] :
  1295. V_028C70_ARRAY_1D_TILED_THIN1;
  1296. first_layer = surf->base.u.tex.first_layer;
  1297. offset = r600_texture_get_offset(rtex, level, first_layer);
  1298. pitch = rtex->pitch_in_blocks[level] / 8 - 1;
  1299. slice = rtex->pitch_in_blocks[level] * surf->aligned_height / 64 - 1;
  1300. format = r600_translate_dbformat(rtex->real_format);
  1301. r600_pipe_state_add_reg(rstate, R_028048_DB_Z_READ_BASE,
  1302. offset >> 8, 0xFFFFFFFF, &rtex->resource, RADEON_USAGE_READWRITE);
  1303. r600_pipe_state_add_reg(rstate, R_028050_DB_Z_WRITE_BASE,
  1304. offset >> 8, 0xFFFFFFFF, &rtex->resource, RADEON_USAGE_READWRITE);
  1305. r600_pipe_state_add_reg(rstate, R_028008_DB_DEPTH_VIEW, 0x00000000, 0xFFFFFFFF, NULL, 0);
  1306. if (rtex->stencil) {
  1307. uint32_t stencil_offset =
  1308. r600_texture_get_offset(rtex->stencil, level, first_layer);
  1309. r600_pipe_state_add_reg(rstate, R_02804C_DB_STENCIL_READ_BASE,
  1310. stencil_offset >> 8, 0xFFFFFFFF, &rtex->stencil->resource, RADEON_USAGE_READWRITE);
  1311. r600_pipe_state_add_reg(rstate, R_028054_DB_STENCIL_WRITE_BASE,
  1312. stencil_offset >> 8, 0xFFFFFFFF, &rtex->stencil->resource, RADEON_USAGE_READWRITE);
  1313. r600_pipe_state_add_reg(rstate, R_028044_DB_STENCIL_INFO,
  1314. 1, 0xFFFFFFFF, &rtex->stencil->resource, RADEON_USAGE_READWRITE);
  1315. } else {
  1316. r600_pipe_state_add_reg(rstate, R_028044_DB_STENCIL_INFO,
  1317. 0, 0xFFFFFFFF, NULL, RADEON_USAGE_READWRITE);
  1318. }
  1319. r600_pipe_state_add_reg(rstate, R_028040_DB_Z_INFO,
  1320. S_028040_ARRAY_MODE(array_mode) | S_028040_FORMAT(format),
  1321. 0xFFFFFFFF, &rtex->resource, RADEON_USAGE_READWRITE);
  1322. r600_pipe_state_add_reg(rstate, R_028058_DB_DEPTH_SIZE,
  1323. S_028058_PITCH_TILE_MAX(pitch),
  1324. 0xFFFFFFFF, NULL, 0);
  1325. r600_pipe_state_add_reg(rstate, R_02805C_DB_DEPTH_SLICE,
  1326. S_02805C_SLICE_TILE_MAX(slice),
  1327. 0xFFFFFFFF, NULL, 0);
  1328. }
  1329. static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
  1330. const struct pipe_framebuffer_state *state)
  1331. {
  1332. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  1333. struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
  1334. u32 shader_mask, tl, br, target_mask;
  1335. int tl_x, tl_y, br_x, br_y;
  1336. if (rstate == NULL)
  1337. return;
  1338. evergreen_context_flush_dest_caches(&rctx->ctx);
  1339. rctx->ctx.num_dest_buffers = state->nr_cbufs;
  1340. /* unreference old buffer and reference new one */
  1341. rstate->id = R600_PIPE_STATE_FRAMEBUFFER;
  1342. util_copy_framebuffer_state(&rctx->framebuffer, state);
  1343. /* build states */
  1344. rctx->have_depth_fb = 0;
  1345. rctx->nr_cbufs = state->nr_cbufs;
  1346. for (int i = 0; i < state->nr_cbufs; i++) {
  1347. evergreen_cb(rctx, rstate, state, i);
  1348. }
  1349. if (state->zsbuf) {
  1350. evergreen_db(rctx, rstate, state);
  1351. rctx->ctx.num_dest_buffers++;
  1352. }
  1353. target_mask = 0x00000000;
  1354. target_mask = 0xFFFFFFFF;
  1355. shader_mask = 0;
  1356. for (int i = 0; i < state->nr_cbufs; i++) {
  1357. target_mask ^= 0xf << (i * 4);
  1358. shader_mask |= 0xf << (i * 4);
  1359. }
  1360. tl_x = 0;
  1361. tl_y = 0;
  1362. br_x = state->width;
  1363. br_y = state->height;
  1364. /* EG hw workaround */
  1365. if (br_x == 0)
  1366. tl_x = 1;
  1367. if (br_y == 0)
  1368. tl_y = 1;
  1369. /* cayman hw workaround */
  1370. if (rctx->chip_class == CAYMAN) {
  1371. if (br_x == 1 && br_y == 1)
  1372. br_x = 2;
  1373. }
  1374. tl = S_028240_TL_X(tl_x) | S_028240_TL_Y(tl_y);
  1375. br = S_028244_BR_X(br_x) | S_028244_BR_Y(br_y);
  1376. r600_pipe_state_add_reg(rstate,
  1377. R_028240_PA_SC_GENERIC_SCISSOR_TL, tl,
  1378. 0xFFFFFFFF, NULL, 0);
  1379. r600_pipe_state_add_reg(rstate,
  1380. R_028244_PA_SC_GENERIC_SCISSOR_BR, br,
  1381. 0xFFFFFFFF, NULL, 0);
  1382. r600_pipe_state_add_reg(rstate,
  1383. R_028250_PA_SC_VPORT_SCISSOR_0_TL, tl,
  1384. 0xFFFFFFFF, NULL, 0);
  1385. r600_pipe_state_add_reg(rstate,
  1386. R_028254_PA_SC_VPORT_SCISSOR_0_BR, br,
  1387. 0xFFFFFFFF, NULL, 0);
  1388. r600_pipe_state_add_reg(rstate,
  1389. R_028030_PA_SC_SCREEN_SCISSOR_TL, tl,
  1390. 0xFFFFFFFF, NULL, 0);
  1391. r600_pipe_state_add_reg(rstate,
  1392. R_028034_PA_SC_SCREEN_SCISSOR_BR, br,
  1393. 0xFFFFFFFF, NULL, 0);
  1394. r600_pipe_state_add_reg(rstate,
  1395. R_028204_PA_SC_WINDOW_SCISSOR_TL, tl,
  1396. 0xFFFFFFFF, NULL, 0);
  1397. r600_pipe_state_add_reg(rstate,
  1398. R_028208_PA_SC_WINDOW_SCISSOR_BR, br,
  1399. 0xFFFFFFFF, NULL, 0);
  1400. r600_pipe_state_add_reg(rstate,
  1401. R_028200_PA_SC_WINDOW_OFFSET, 0x00000000,
  1402. 0xFFFFFFFF, NULL, 0);
  1403. r600_pipe_state_add_reg(rstate,
  1404. R_028230_PA_SC_EDGERULE, 0xAAAAAAAA,
  1405. 0xFFFFFFFF, NULL, 0);
  1406. r600_pipe_state_add_reg(rstate, R_028238_CB_TARGET_MASK,
  1407. 0x00000000, target_mask, NULL, 0);
  1408. r600_pipe_state_add_reg(rstate, R_02823C_CB_SHADER_MASK,
  1409. shader_mask, 0xFFFFFFFF, NULL, 0);
  1410. if (rctx->chip_class == CAYMAN) {
  1411. r600_pipe_state_add_reg(rstate, CM_R_028BE0_PA_SC_AA_CONFIG,
  1412. 0x00000000, 0xFFFFFFFF, NULL, 0);
  1413. } else {
  1414. r600_pipe_state_add_reg(rstate, R_028C04_PA_SC_AA_CONFIG,
  1415. 0x00000000, 0xFFFFFFFF, NULL, 0);
  1416. r600_pipe_state_add_reg(rstate, R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX,
  1417. 0x00000000, 0xFFFFFFFF, NULL, 0);
  1418. }
  1419. free(rctx->states[R600_PIPE_STATE_FRAMEBUFFER]);
  1420. rctx->states[R600_PIPE_STATE_FRAMEBUFFER] = rstate;
  1421. r600_context_pipe_state_set(&rctx->ctx, rstate);
  1422. if (state->zsbuf) {
  1423. evergreen_polygon_offset_update(rctx);
  1424. }
  1425. }
  1426. static void evergreen_texture_barrier(struct pipe_context *ctx)
  1427. {
  1428. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  1429. r600_context_flush_all(&rctx->ctx, S_0085F0_TC_ACTION_ENA(1) | S_0085F0_CB_ACTION_ENA(1) |
  1430. S_0085F0_CB0_DEST_BASE_ENA(1) | S_0085F0_CB1_DEST_BASE_ENA(1) |
  1431. S_0085F0_CB2_DEST_BASE_ENA(1) | S_0085F0_CB3_DEST_BASE_ENA(1) |
  1432. S_0085F0_CB4_DEST_BASE_ENA(1) | S_0085F0_CB5_DEST_BASE_ENA(1) |
  1433. S_0085F0_CB6_DEST_BASE_ENA(1) | S_0085F0_CB7_DEST_BASE_ENA(1) |
  1434. S_0085F0_CB8_DEST_BASE_ENA(1) | S_0085F0_CB9_DEST_BASE_ENA(1) |
  1435. S_0085F0_CB10_DEST_BASE_ENA(1) | S_0085F0_CB11_DEST_BASE_ENA(1));
  1436. }
  1437. void evergreen_init_state_functions(struct r600_pipe_context *rctx)
  1438. {
  1439. rctx->context.create_blend_state = evergreen_create_blend_state;
  1440. rctx->context.create_depth_stencil_alpha_state = evergreen_create_dsa_state;
  1441. rctx->context.create_fs_state = r600_create_shader_state;
  1442. rctx->context.create_rasterizer_state = evergreen_create_rs_state;
  1443. rctx->context.create_sampler_state = evergreen_create_sampler_state;
  1444. rctx->context.create_sampler_view = evergreen_create_sampler_view;
  1445. rctx->context.create_vertex_elements_state = r600_create_vertex_elements;
  1446. rctx->context.create_vs_state = r600_create_shader_state;
  1447. rctx->context.bind_blend_state = r600_bind_blend_state;
  1448. rctx->context.bind_depth_stencil_alpha_state = r600_bind_dsa_state;
  1449. rctx->context.bind_fragment_sampler_states = evergreen_bind_ps_sampler;
  1450. rctx->context.bind_fs_state = r600_bind_ps_shader;
  1451. rctx->context.bind_rasterizer_state = r600_bind_rs_state;
  1452. rctx->context.bind_vertex_elements_state = r600_bind_vertex_elements;
  1453. rctx->context.bind_vertex_sampler_states = evergreen_bind_vs_sampler;
  1454. rctx->context.bind_vs_state = r600_bind_vs_shader;
  1455. rctx->context.delete_blend_state = r600_delete_state;
  1456. rctx->context.delete_depth_stencil_alpha_state = r600_delete_state;
  1457. rctx->context.delete_fs_state = r600_delete_ps_shader;
  1458. rctx->context.delete_rasterizer_state = r600_delete_rs_state;
  1459. rctx->context.delete_sampler_state = r600_delete_state;
  1460. rctx->context.delete_vertex_elements_state = r600_delete_vertex_element;
  1461. rctx->context.delete_vs_state = r600_delete_vs_shader;
  1462. rctx->context.set_blend_color = evergreen_set_blend_color;
  1463. rctx->context.set_clip_state = evergreen_set_clip_state;
  1464. rctx->context.set_constant_buffer = r600_set_constant_buffer;
  1465. rctx->context.set_fragment_sampler_views = evergreen_set_ps_sampler_view;
  1466. rctx->context.set_framebuffer_state = evergreen_set_framebuffer_state;
  1467. rctx->context.set_polygon_stipple = evergreen_set_polygon_stipple;
  1468. rctx->context.set_sample_mask = evergreen_set_sample_mask;
  1469. rctx->context.set_scissor_state = evergreen_set_scissor_state;
  1470. rctx->context.set_stencil_ref = evergreen_set_stencil_ref;
  1471. rctx->context.set_vertex_buffers = r600_set_vertex_buffers;
  1472. rctx->context.set_index_buffer = r600_set_index_buffer;
  1473. rctx->context.set_vertex_sampler_views = evergreen_set_vs_sampler_view;
  1474. rctx->context.set_viewport_state = evergreen_set_viewport_state;
  1475. rctx->context.sampler_view_destroy = r600_sampler_view_destroy;
  1476. rctx->context.redefine_user_buffer = u_default_redefine_user_buffer;
  1477. rctx->context.texture_barrier = evergreen_texture_barrier;
  1478. }
  1479. static void cayman_init_config(struct r600_pipe_context *rctx)
  1480. {
  1481. struct r600_pipe_state *rstate = &rctx->config;
  1482. unsigned tmp;
  1483. tmp = 0x00000000;
  1484. tmp |= S_008C00_EXPORT_SRC_C(1);
  1485. r600_pipe_state_add_reg(rstate, R_008C00_SQ_CONFIG, tmp, 0xFFFFFFFF, NULL, 0);
  1486. /* always set the temp clauses */
  1487. r600_pipe_state_add_reg(rstate, R_008C04_SQ_GPR_RESOURCE_MGMT_1, S_008C04_NUM_CLAUSE_TEMP_GPRS(4), 0xFFFFFFFF, NULL, 0);
  1488. r600_pipe_state_add_reg(rstate, R_008C10_SQ_GLOBAL_GPR_RESOURCE_MGMT_1, 0, 0xFFFFFFFF, NULL, 0);
  1489. r600_pipe_state_add_reg(rstate, R_008C14_SQ_GLOBAL_GPR_RESOURCE_MGMT_2, 0, 0xFFFFFFFF, NULL, 0);
  1490. r600_pipe_state_add_reg(rstate, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, (1 << 8), 0xFFFFFFFF, NULL, 0);
  1491. r600_pipe_state_add_reg(rstate, R_028A48_PA_SC_MODE_CNTL_0, 0x0, 0xFFFFFFFF, NULL, 0);
  1492. r600_pipe_state_add_reg(rstate, R_028A4C_PA_SC_MODE_CNTL_1, 0x0, 0xFFFFFFFF, NULL, 0);
  1493. r600_pipe_state_add_reg(rstate, R_028A10_VGT_OUTPUT_PATH_CNTL, 0x0, 0xFFFFFFFF, NULL, 0);
  1494. r600_pipe_state_add_reg(rstate, R_028A14_VGT_HOS_CNTL, 0x0, 0xFFFFFFFF, NULL, 0);
  1495. r600_pipe_state_add_reg(rstate, R_028A18_VGT_HOS_MAX_TESS_LEVEL, 0x0, 0xFFFFFFFF, NULL, 0);
  1496. r600_pipe_state_add_reg(rstate, R_028A1C_VGT_HOS_MIN_TESS_LEVEL, 0x0, 0xFFFFFFFF, NULL, 0);
  1497. r600_pipe_state_add_reg(rstate, R_028A20_VGT_HOS_REUSE_DEPTH, 0x0, 0xFFFFFFFF, NULL, 0);
  1498. r600_pipe_state_add_reg(rstate, R_028A24_VGT_GROUP_PRIM_TYPE, 0x0, 0xFFFFFFFF, NULL, 0);
  1499. r600_pipe_state_add_reg(rstate, R_028A28_VGT_GROUP_FIRST_DECR, 0x0, 0xFFFFFFFF, NULL, 0);
  1500. r600_pipe_state_add_reg(rstate, R_028A2C_VGT_GROUP_DECR, 0x0, 0xFFFFFFFF, NULL, 0);
  1501. r600_pipe_state_add_reg(rstate, R_028A30_VGT_GROUP_VECT_0_CNTL, 0x0, 0xFFFFFFFF, NULL, 0);
  1502. r600_pipe_state_add_reg(rstate, R_028A34_VGT_GROUP_VECT_1_CNTL, 0x0, 0xFFFFFFFF, NULL, 0);
  1503. r600_pipe_state_add_reg(rstate, R_028A38_VGT_GROUP_VECT_0_FMT_CNTL, 0x0, 0xFFFFFFFF, NULL, 0);
  1504. r600_pipe_state_add_reg(rstate, R_028A3C_VGT_GROUP_VECT_1_FMT_CNTL, 0x0, 0xFFFFFFFF, NULL, 0);
  1505. r600_pipe_state_add_reg(rstate, R_028A40_VGT_GS_MODE, 0x0, 0xFFFFFFFF, NULL, 0);
  1506. r600_pipe_state_add_reg(rstate, R_028B94_VGT_STRMOUT_CONFIG, 0x0, 0xFFFFFFFF, NULL, 0);
  1507. r600_pipe_state_add_reg(rstate, R_028B98_VGT_STRMOUT_BUFFER_CONFIG, 0x0, 0xFFFFFFFF, NULL, 0);
  1508. r600_pipe_state_add_reg(rstate, R_028AA8_IA_MULTI_VGT_PARAM, S_028AA8_SWITCH_ON_EOP(1) | S_028AA8_PARTIAL_VS_WAVE_ON(1) | S_028AA8_PRIMGROUP_SIZE(63), 0xFFFFFFFF, NULL, 0);
  1509. r600_pipe_state_add_reg(rstate, R_028AB4_VGT_REUSE_OFF, 0x00000000, 0xFFFFFFFF, NULL, 0);
  1510. r600_pipe_state_add_reg(rstate, R_028AB8_VGT_VTX_CNT_EN, 0x0, 0xFFFFFFFF, NULL, 0);
  1511. r600_pipe_state_add_reg(rstate, R_008A14_PA_CL_ENHANCE, (3 << 1) | 1, 0xFFFFFFFF, NULL, 0);
  1512. r600_pipe_state_add_reg(rstate, R_028380_SQ_VTX_SEMANTIC_0, 0x0, 0xFFFFFFFF, NULL, 0);
  1513. r600_pipe_state_add_reg(rstate, R_028384_SQ_VTX_SEMANTIC_1, 0x0, 0xFFFFFFFF, NULL, 0);
  1514. r600_pipe_state_add_reg(rstate, R_028388_SQ_VTX_SEMANTIC_2, 0x0, 0xFFFFFFFF, NULL, 0);
  1515. r600_pipe_state_add_reg(rstate, R_02838C_SQ_VTX_SEMANTIC_3, 0x0, 0xFFFFFFFF, NULL, 0);
  1516. r600_pipe_state_add_reg(rstate, R_028390_SQ_VTX_SEMANTIC_4, 0x0, 0xFFFFFFFF, NULL, 0);
  1517. r600_pipe_state_add_reg(rstate, R_028394_SQ_VTX_SEMANTIC_5, 0x0, 0xFFFFFFFF, NULL, 0);
  1518. r600_pipe_state_add_reg(rstate, R_028398_SQ_VTX_SEMANTIC_6, 0x0, 0xFFFFFFFF, NULL, 0);
  1519. r600_pipe_state_add_reg(rstate, R_02839C_SQ_VTX_SEMANTIC_7, 0x0, 0xFFFFFFFF, NULL, 0);
  1520. r600_pipe_state_add_reg(rstate, R_0283A0_SQ_VTX_SEMANTIC_8, 0x0, 0xFFFFFFFF, NULL, 0);
  1521. r600_pipe_state_add_reg(rstate, R_0283A4_SQ_VTX_SEMANTIC_9, 0x0, 0xFFFFFFFF, NULL, 0);
  1522. r600_pipe_state_add_reg(rstate, R_0283A8_SQ_VTX_SEMANTIC_10, 0x0, 0xFFFFFFFF, NULL, 0);
  1523. r600_pipe_state_add_reg(rstate, R_0283AC_SQ_VTX_SEMANTIC_11, 0x0, 0xFFFFFFFF, NULL, 0);
  1524. r600_pipe_state_add_reg(rstate, R_0283B0_SQ_VTX_SEMANTIC_12, 0x0, 0xFFFFFFFF, NULL, 0);
  1525. r600_pipe_state_add_reg(rstate, R_0283B4_SQ_VTX_SEMANTIC_13, 0x0, 0xFFFFFFFF, NULL, 0);
  1526. r600_pipe_state_add_reg(rstate, R_0283B8_SQ_VTX_SEMANTIC_14, 0x0, 0xFFFFFFFF, NULL, 0);
  1527. r600_pipe_state_add_reg(rstate, R_0283BC_SQ_VTX_SEMANTIC_15, 0x0, 0xFFFFFFFF, NULL, 0);
  1528. r600_pipe_state_add_reg(rstate, R_0283C0_SQ_VTX_SEMANTIC_16, 0x0, 0xFFFFFFFF, NULL, 0);
  1529. r600_pipe_state_add_reg(rstate, R_0283C4_SQ_VTX_SEMANTIC_17, 0x0, 0xFFFFFFFF, NULL, 0);
  1530. r600_pipe_state_add_reg(rstate, R_0283C8_SQ_VTX_SEMANTIC_18, 0x0, 0xFFFFFFFF, NULL, 0);
  1531. r600_pipe_state_add_reg(rstate, R_0283CC_SQ_VTX_SEMANTIC_19, 0x0, 0xFFFFFFFF, NULL, 0);
  1532. r600_pipe_state_add_reg(rstate, R_0283D0_SQ_VTX_SEMANTIC_20, 0x0, 0xFFFFFFFF, NULL, 0);
  1533. r600_pipe_state_add_reg(rstate, R_0283D4_SQ_VTX_SEMANTIC_21, 0x0, 0xFFFFFFFF, NULL, 0);
  1534. r600_pipe_state_add_reg(rstate, R_0283D8_SQ_VTX_SEMANTIC_22, 0x0, 0xFFFFFFFF, NULL, 0);
  1535. r600_pipe_state_add_reg(rstate, R_0283DC_SQ_VTX_SEMANTIC_23, 0x0, 0xFFFFFFFF, NULL, 0);
  1536. r600_pipe_state_add_reg(rstate, R_0283E0_SQ_VTX_SEMANTIC_24, 0x0, 0xFFFFFFFF, NULL, 0);
  1537. r600_pipe_state_add_reg(rstate, R_0283E4_SQ_VTX_SEMANTIC_25, 0x0, 0xFFFFFFFF, NULL, 0);
  1538. r600_pipe_state_add_reg(rstate, R_0283E8_SQ_VTX_SEMANTIC_26, 0x0, 0xFFFFFFFF, NULL, 0);
  1539. r600_pipe_state_add_reg(rstate, R_0283EC_SQ_VTX_SEMANTIC_27, 0x0, 0xFFFFFFFF, NULL, 0);
  1540. r600_pipe_state_add_reg(rstate, R_0283F0_SQ_VTX_SEMANTIC_28, 0x0, 0xFFFFFFFF, NULL, 0);
  1541. r600_pipe_state_add_reg(rstate, R_0283F4_SQ_VTX_SEMANTIC_29, 0x0, 0xFFFFFFFF, NULL, 0);
  1542. r600_pipe_state_add_reg(rstate, R_0283F8_SQ_VTX_SEMANTIC_30, 0x0, 0xFFFFFFFF, NULL, 0);
  1543. r600_pipe_state_add_reg(rstate, R_0283FC_SQ_VTX_SEMANTIC_31, 0x0, 0xFFFFFFFF, NULL, 0);
  1544. r600_pipe_state_add_reg(rstate, R_028810_PA_CL_CLIP_CNTL, 0x0, 0xFFFFFFFF, NULL, 0);
  1545. r600_pipe_state_add_reg(rstate, CM_R_028BD4_PA_SC_CENTROID_PRIORITY_0, 0x76543210, 0xffffffff, NULL, 0);
  1546. r600_pipe_state_add_reg(rstate, CM_R_028BD8_PA_SC_CENTROID_PRIORITY_1, 0xfedcba98, 0xffffffff, NULL, 0);
  1547. r600_pipe_state_add_reg(rstate, CM_R_0288E8_SQ_LDS_ALLOC, 0, 0xFFFFFFFF, NULL, 0);
  1548. r600_pipe_state_add_reg(rstate, R_0288EC_SQ_LDS_ALLOC_PS, 0, 0xFFFFFFFF, NULL, 0);
  1549. r600_pipe_state_add_reg(rstate, CM_R_028804_DB_EQAA, 0x110000, 0xFFFFFFFF, NULL, 0);
  1550. r600_context_pipe_state_set(&rctx->ctx, rstate);
  1551. }
  1552. void evergreen_init_config(struct r600_pipe_context *rctx)
  1553. {
  1554. struct r600_pipe_state *rstate = &rctx->config;
  1555. int ps_prio;
  1556. int vs_prio;
  1557. int gs_prio;
  1558. int es_prio;
  1559. int hs_prio, cs_prio, ls_prio;
  1560. int num_ps_gprs;
  1561. int num_vs_gprs;
  1562. int num_gs_gprs;
  1563. int num_es_gprs;
  1564. int num_hs_gprs;
  1565. int num_ls_gprs;
  1566. int num_temp_gprs;
  1567. int num_ps_threads;
  1568. int num_vs_threads;
  1569. int num_gs_threads;
  1570. int num_es_threads;
  1571. int num_hs_threads;
  1572. int num_ls_threads;
  1573. int num_ps_stack_entries;
  1574. int num_vs_stack_entries;
  1575. int num_gs_stack_entries;
  1576. int num_es_stack_entries;
  1577. int num_hs_stack_entries;
  1578. int num_ls_stack_entries;
  1579. enum radeon_family family;
  1580. unsigned tmp;
  1581. family = rctx->family;
  1582. if (rctx->chip_class == CAYMAN) {
  1583. cayman_init_config(rctx);
  1584. return;
  1585. }
  1586. ps_prio = 0;
  1587. vs_prio = 1;
  1588. gs_prio = 2;
  1589. es_prio = 3;
  1590. hs_prio = 0;
  1591. ls_prio = 0;
  1592. cs_prio = 0;
  1593. switch (family) {
  1594. case CHIP_CEDAR:
  1595. default:
  1596. num_ps_gprs = 93;
  1597. num_vs_gprs = 46;
  1598. num_temp_gprs = 4;
  1599. num_gs_gprs = 31;
  1600. num_es_gprs = 31;
  1601. num_hs_gprs = 23;
  1602. num_ls_gprs = 23;
  1603. num_ps_threads = 96;
  1604. num_vs_threads = 16;
  1605. num_gs_threads = 16;
  1606. num_es_threads = 16;
  1607. num_hs_threads = 16;
  1608. num_ls_threads = 16;
  1609. num_ps_stack_entries = 42;
  1610. num_vs_stack_entries = 42;
  1611. num_gs_stack_entries = 42;
  1612. num_es_stack_entries = 42;
  1613. num_hs_stack_entries = 42;
  1614. num_ls_stack_entries = 42;
  1615. break;
  1616. case CHIP_REDWOOD:
  1617. num_ps_gprs = 93;
  1618. num_vs_gprs = 46;
  1619. num_temp_gprs = 4;
  1620. num_gs_gprs = 31;
  1621. num_es_gprs = 31;
  1622. num_hs_gprs = 23;
  1623. num_ls_gprs = 23;
  1624. num_ps_threads = 128;
  1625. num_vs_threads = 20;
  1626. num_gs_threads = 20;
  1627. num_es_threads = 20;
  1628. num_hs_threads = 20;
  1629. num_ls_threads = 20;
  1630. num_ps_stack_entries = 42;
  1631. num_vs_stack_entries = 42;
  1632. num_gs_stack_entries = 42;
  1633. num_es_stack_entries = 42;
  1634. num_hs_stack_entries = 42;
  1635. num_ls_stack_entries = 42;
  1636. break;
  1637. case CHIP_JUNIPER:
  1638. num_ps_gprs = 93;
  1639. num_vs_gprs = 46;
  1640. num_temp_gprs = 4;
  1641. num_gs_gprs = 31;
  1642. num_es_gprs = 31;
  1643. num_hs_gprs = 23;
  1644. num_ls_gprs = 23;
  1645. num_ps_threads = 128;
  1646. num_vs_threads = 20;
  1647. num_gs_threads = 20;
  1648. num_es_threads = 20;
  1649. num_hs_threads = 20;
  1650. num_ls_threads = 20;
  1651. num_ps_stack_entries = 85;
  1652. num_vs_stack_entries = 85;
  1653. num_gs_stack_entries = 85;
  1654. num_es_stack_entries = 85;
  1655. num_hs_stack_entries = 85;
  1656. num_ls_stack_entries = 85;
  1657. break;
  1658. case CHIP_CYPRESS:
  1659. case CHIP_HEMLOCK:
  1660. num_ps_gprs = 93;
  1661. num_vs_gprs = 46;
  1662. num_temp_gprs = 4;
  1663. num_gs_gprs = 31;
  1664. num_es_gprs = 31;
  1665. num_hs_gprs = 23;
  1666. num_ls_gprs = 23;
  1667. num_ps_threads = 128;
  1668. num_vs_threads = 20;
  1669. num_gs_threads = 20;
  1670. num_es_threads = 20;
  1671. num_hs_threads = 20;
  1672. num_ls_threads = 20;
  1673. num_ps_stack_entries = 85;
  1674. num_vs_stack_entries = 85;
  1675. num_gs_stack_entries = 85;
  1676. num_es_stack_entries = 85;
  1677. num_hs_stack_entries = 85;
  1678. num_ls_stack_entries = 85;
  1679. break;
  1680. case CHIP_PALM:
  1681. num_ps_gprs = 93;
  1682. num_vs_gprs = 46;
  1683. num_temp_gprs = 4;
  1684. num_gs_gprs = 31;
  1685. num_es_gprs = 31;
  1686. num_hs_gprs = 23;
  1687. num_ls_gprs = 23;
  1688. num_ps_threads = 96;
  1689. num_vs_threads = 16;
  1690. num_gs_threads = 16;
  1691. num_es_threads = 16;
  1692. num_hs_threads = 16;
  1693. num_ls_threads = 16;
  1694. num_ps_stack_entries = 42;
  1695. num_vs_stack_entries = 42;
  1696. num_gs_stack_entries = 42;
  1697. num_es_stack_entries = 42;
  1698. num_hs_stack_entries = 42;
  1699. num_ls_stack_entries = 42;
  1700. break;
  1701. case CHIP_SUMO:
  1702. num_ps_gprs = 93;
  1703. num_vs_gprs = 46;
  1704. num_temp_gprs = 4;
  1705. num_gs_gprs = 31;
  1706. num_es_gprs = 31;
  1707. num_hs_gprs = 23;
  1708. num_ls_gprs = 23;
  1709. num_ps_threads = 96;
  1710. num_vs_threads = 25;
  1711. num_gs_threads = 25;
  1712. num_es_threads = 25;
  1713. num_hs_threads = 25;
  1714. num_ls_threads = 25;
  1715. num_ps_stack_entries = 42;
  1716. num_vs_stack_entries = 42;
  1717. num_gs_stack_entries = 42;
  1718. num_es_stack_entries = 42;
  1719. num_hs_stack_entries = 42;
  1720. num_ls_stack_entries = 42;
  1721. break;
  1722. case CHIP_SUMO2:
  1723. num_ps_gprs = 93;
  1724. num_vs_gprs = 46;
  1725. num_temp_gprs = 4;
  1726. num_gs_gprs = 31;
  1727. num_es_gprs = 31;
  1728. num_hs_gprs = 23;
  1729. num_ls_gprs = 23;
  1730. num_ps_threads = 96;
  1731. num_vs_threads = 25;
  1732. num_gs_threads = 25;
  1733. num_es_threads = 25;
  1734. num_hs_threads = 25;
  1735. num_ls_threads = 25;
  1736. num_ps_stack_entries = 85;
  1737. num_vs_stack_entries = 85;
  1738. num_gs_stack_entries = 85;
  1739. num_es_stack_entries = 85;
  1740. num_hs_stack_entries = 85;
  1741. num_ls_stack_entries = 85;
  1742. break;
  1743. case CHIP_BARTS:
  1744. num_ps_gprs = 93;
  1745. num_vs_gprs = 46;
  1746. num_temp_gprs = 4;
  1747. num_gs_gprs = 31;
  1748. num_es_gprs = 31;
  1749. num_hs_gprs = 23;
  1750. num_ls_gprs = 23;
  1751. num_ps_threads = 128;
  1752. num_vs_threads = 20;
  1753. num_gs_threads = 20;
  1754. num_es_threads = 20;
  1755. num_hs_threads = 20;
  1756. num_ls_threads = 20;
  1757. num_ps_stack_entries = 85;
  1758. num_vs_stack_entries = 85;
  1759. num_gs_stack_entries = 85;
  1760. num_es_stack_entries = 85;
  1761. num_hs_stack_entries = 85;
  1762. num_ls_stack_entries = 85;
  1763. break;
  1764. case CHIP_TURKS:
  1765. num_ps_gprs = 93;
  1766. num_vs_gprs = 46;
  1767. num_temp_gprs = 4;
  1768. num_gs_gprs = 31;
  1769. num_es_gprs = 31;
  1770. num_hs_gprs = 23;
  1771. num_ls_gprs = 23;
  1772. num_ps_threads = 128;
  1773. num_vs_threads = 20;
  1774. num_gs_threads = 20;
  1775. num_es_threads = 20;
  1776. num_hs_threads = 20;
  1777. num_ls_threads = 20;
  1778. num_ps_stack_entries = 42;
  1779. num_vs_stack_entries = 42;
  1780. num_gs_stack_entries = 42;
  1781. num_es_stack_entries = 42;
  1782. num_hs_stack_entries = 42;
  1783. num_ls_stack_entries = 42;
  1784. break;
  1785. case CHIP_CAICOS:
  1786. num_ps_gprs = 93;
  1787. num_vs_gprs = 46;
  1788. num_temp_gprs = 4;
  1789. num_gs_gprs = 31;
  1790. num_es_gprs = 31;
  1791. num_hs_gprs = 23;
  1792. num_ls_gprs = 23;
  1793. num_ps_threads = 128;
  1794. num_vs_threads = 10;
  1795. num_gs_threads = 10;
  1796. num_es_threads = 10;
  1797. num_hs_threads = 10;
  1798. num_ls_threads = 10;
  1799. num_ps_stack_entries = 42;
  1800. num_vs_stack_entries = 42;
  1801. num_gs_stack_entries = 42;
  1802. num_es_stack_entries = 42;
  1803. num_hs_stack_entries = 42;
  1804. num_ls_stack_entries = 42;
  1805. break;
  1806. }
  1807. tmp = 0x00000000;
  1808. switch (family) {
  1809. case CHIP_CEDAR:
  1810. case CHIP_PALM:
  1811. case CHIP_SUMO:
  1812. case CHIP_SUMO2:
  1813. case CHIP_CAICOS:
  1814. break;
  1815. default:
  1816. tmp |= S_008C00_VC_ENABLE(1);
  1817. break;
  1818. }
  1819. tmp |= S_008C00_EXPORT_SRC_C(1);
  1820. tmp |= S_008C00_CS_PRIO(cs_prio);
  1821. tmp |= S_008C00_LS_PRIO(ls_prio);
  1822. tmp |= S_008C00_HS_PRIO(hs_prio);
  1823. tmp |= S_008C00_PS_PRIO(ps_prio);
  1824. tmp |= S_008C00_VS_PRIO(vs_prio);
  1825. tmp |= S_008C00_GS_PRIO(gs_prio);
  1826. tmp |= S_008C00_ES_PRIO(es_prio);
  1827. r600_pipe_state_add_reg(rstate, R_008C00_SQ_CONFIG, tmp, 0xFFFFFFFF, NULL, 0);
  1828. /* enable dynamic GPR resource management */
  1829. if (rctx->screen->info.drm_minor >= 7) {
  1830. /* always set temp clauses */
  1831. r600_pipe_state_add_reg(rstate, R_008C04_SQ_GPR_RESOURCE_MGMT_1,
  1832. S_008C04_NUM_CLAUSE_TEMP_GPRS(num_temp_gprs), 0xFFFFFFFF, NULL, 0);
  1833. r600_pipe_state_add_reg(rstate, R_008C10_SQ_GLOBAL_GPR_RESOURCE_MGMT_1, 0, 0xFFFFFFFF, NULL, 0);
  1834. r600_pipe_state_add_reg(rstate, R_008C14_SQ_GLOBAL_GPR_RESOURCE_MGMT_2, 0, 0xFFFFFFFF, NULL, 0);
  1835. r600_pipe_state_add_reg(rstate, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, (1 << 8), 0xFFFFFFFF, NULL, 0);
  1836. r600_pipe_state_add_reg(rstate, R_028838_SQ_DYN_GPR_RESOURCE_LIMIT_1,
  1837. S_028838_PS_GPRS(0x1e) |
  1838. S_028838_VS_GPRS(0x1e) |
  1839. S_028838_GS_GPRS(0x1e) |
  1840. S_028838_ES_GPRS(0x1e) |
  1841. S_028838_HS_GPRS(0x1e) |
  1842. S_028838_LS_GPRS(0x1e), 0xFFFFFFFF, NULL, 0); /* workaround for hw issues with dyn gpr - must set all limits to 240 instead of 0, 0x1e == 240 / 8*/
  1843. } else {
  1844. tmp = 0;
  1845. tmp |= S_008C04_NUM_PS_GPRS(num_ps_gprs);
  1846. tmp |= S_008C04_NUM_VS_GPRS(num_vs_gprs);
  1847. tmp |= S_008C04_NUM_CLAUSE_TEMP_GPRS(num_temp_gprs);
  1848. r600_pipe_state_add_reg(rstate, R_008C04_SQ_GPR_RESOURCE_MGMT_1, tmp, 0xFFFFFFFF, NULL, 0);
  1849. tmp = 0;
  1850. tmp |= S_008C08_NUM_GS_GPRS(num_gs_gprs);
  1851. tmp |= S_008C08_NUM_ES_GPRS(num_es_gprs);
  1852. r600_pipe_state_add_reg(rstate, R_008C08_SQ_GPR_RESOURCE_MGMT_2, tmp, 0xFFFFFFFF, NULL, 0);
  1853. tmp = 0;
  1854. tmp |= S_008C0C_NUM_HS_GPRS(num_hs_gprs);
  1855. tmp |= S_008C0C_NUM_HS_GPRS(num_ls_gprs);
  1856. r600_pipe_state_add_reg(rstate, R_008C0C_SQ_GPR_RESOURCE_MGMT_3, tmp, 0xFFFFFFFF, NULL, 0);
  1857. }
  1858. tmp = 0;
  1859. tmp |= S_008C18_NUM_PS_THREADS(num_ps_threads);
  1860. tmp |= S_008C18_NUM_VS_THREADS(num_vs_threads);
  1861. tmp |= S_008C18_NUM_GS_THREADS(num_gs_threads);
  1862. tmp |= S_008C18_NUM_ES_THREADS(num_es_threads);
  1863. r600_pipe_state_add_reg(rstate, R_008C18_SQ_THREAD_RESOURCE_MGMT_1, tmp, 0xFFFFFFFF, NULL, 0);
  1864. tmp = 0;
  1865. tmp |= S_008C1C_NUM_HS_THREADS(num_hs_threads);
  1866. tmp |= S_008C1C_NUM_LS_THREADS(num_ls_threads);
  1867. r600_pipe_state_add_reg(rstate, R_008C1C_SQ_THREAD_RESOURCE_MGMT_2, tmp, 0xFFFFFFFF, NULL, 0);
  1868. tmp = 0;
  1869. tmp |= S_008C20_NUM_PS_STACK_ENTRIES(num_ps_stack_entries);
  1870. tmp |= S_008C20_NUM_VS_STACK_ENTRIES(num_vs_stack_entries);
  1871. r600_pipe_state_add_reg(rstate, R_008C20_SQ_STACK_RESOURCE_MGMT_1, tmp, 0xFFFFFFFF, NULL, 0);
  1872. tmp = 0;
  1873. tmp |= S_008C24_NUM_GS_STACK_ENTRIES(num_gs_stack_entries);
  1874. tmp |= S_008C24_NUM_ES_STACK_ENTRIES(num_es_stack_entries);
  1875. r600_pipe_state_add_reg(rstate, R_008C24_SQ_STACK_RESOURCE_MGMT_2, tmp, 0xFFFFFFFF, NULL, 0);
  1876. tmp = 0;
  1877. tmp |= S_008C28_NUM_HS_STACK_ENTRIES(num_hs_stack_entries);
  1878. tmp |= S_008C28_NUM_LS_STACK_ENTRIES(num_ls_stack_entries);
  1879. r600_pipe_state_add_reg(rstate, R_008C28_SQ_STACK_RESOURCE_MGMT_3, tmp, 0xFFFFFFFF, NULL, 0);
  1880. tmp = 0;
  1881. tmp |= S_008E2C_NUM_PS_LDS(0x1000);
  1882. tmp |= S_008E2C_NUM_LS_LDS(0x1000);
  1883. r600_pipe_state_add_reg(rstate, R_008E2C_SQ_LDS_RESOURCE_MGMT, tmp, 0xFFFFFFFF, NULL, 0);
  1884. r600_pipe_state_add_reg(rstate, R_009100_SPI_CONFIG_CNTL, 0x0, 0xFFFFFFFF, NULL, 0);
  1885. r600_pipe_state_add_reg(rstate, R_00913C_SPI_CONFIG_CNTL_1, S_00913C_VTX_DONE_DELAY(4), 0xFFFFFFFF, NULL, 0);
  1886. #if 0
  1887. r600_pipe_state_add_reg(rstate, R_028350_SX_MISC, 0x0, 0xFFFFFFFF, NULL, 0);
  1888. r600_pipe_state_add_reg(rstate, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0x0, 0xFFFFFFFF, NULL, 0);
  1889. #endif
  1890. r600_pipe_state_add_reg(rstate, R_028A48_PA_SC_MODE_CNTL_0, 0x0, 0xFFFFFFFF, NULL, 0);
  1891. r600_pipe_state_add_reg(rstate, R_028A4C_PA_SC_MODE_CNTL_1, 0x0, 0xFFFFFFFF, NULL, 0);
  1892. r600_pipe_state_add_reg(rstate, R_028900_SQ_ESGS_RING_ITEMSIZE, 0x0, 0xFFFFFFFF, NULL, 0);
  1893. r600_pipe_state_add_reg(rstate, R_028904_SQ_GSVS_RING_ITEMSIZE, 0x0, 0xFFFFFFFF, NULL, 0);
  1894. r600_pipe_state_add_reg(rstate, R_028908_SQ_ESTMP_RING_ITEMSIZE, 0x0, 0xFFFFFFFF, NULL, 0);
  1895. r600_pipe_state_add_reg(rstate, R_02890C_SQ_GSTMP_RING_ITEMSIZE, 0x0, 0xFFFFFFFF, NULL, 0);
  1896. r600_pipe_state_add_reg(rstate, R_028910_SQ_VSTMP_RING_ITEMSIZE, 0x0, 0xFFFFFFFF, NULL, 0);
  1897. r600_pipe_state_add_reg(rstate, R_028914_SQ_PSTMP_RING_ITEMSIZE, 0x0, 0xFFFFFFFF, NULL, 0);
  1898. r600_pipe_state_add_reg(rstate, R_02891C_SQ_GS_VERT_ITEMSIZE, 0x0, 0xFFFFFFFF, NULL, 0);
  1899. r600_pipe_state_add_reg(rstate, R_028920_SQ_GS_VERT_ITEMSIZE_1, 0x0, 0xFFFFFFFF, NULL, 0);
  1900. r600_pipe_state_add_reg(rstate, R_028924_SQ_GS_VERT_ITEMSIZE_2, 0x0, 0xFFFFFFFF, NULL, 0);
  1901. r600_pipe_state_add_reg(rstate, R_028928_SQ_GS_VERT_ITEMSIZE_3, 0x0, 0xFFFFFFFF, NULL, 0);
  1902. r600_pipe_state_add_reg(rstate, R_028A10_VGT_OUTPUT_PATH_CNTL, 0x0, 0xFFFFFFFF, NULL, 0);
  1903. r600_pipe_state_add_reg(rstate, R_028A14_VGT_HOS_CNTL, 0x0, 0xFFFFFFFF, NULL, 0);
  1904. r600_pipe_state_add_reg(rstate, R_028A18_VGT_HOS_MAX_TESS_LEVEL, 0x0, 0xFFFFFFFF, NULL, 0);
  1905. r600_pipe_state_add_reg(rstate, R_028A1C_VGT_HOS_MIN_TESS_LEVEL, 0x0, 0xFFFFFFFF, NULL, 0);
  1906. r600_pipe_state_add_reg(rstate, R_028A20_VGT_HOS_REUSE_DEPTH, 0x0, 0xFFFFFFFF, NULL, 0);
  1907. r600_pipe_state_add_reg(rstate, R_028A24_VGT_GROUP_PRIM_TYPE, 0x0, 0xFFFFFFFF, NULL, 0);
  1908. r600_pipe_state_add_reg(rstate, R_028A28_VGT_GROUP_FIRST_DECR, 0x0, 0xFFFFFFFF, NULL, 0);
  1909. r600_pipe_state_add_reg(rstate, R_028A2C_VGT_GROUP_DECR, 0x0, 0xFFFFFFFF, NULL, 0);
  1910. r600_pipe_state_add_reg(rstate, R_028A30_VGT_GROUP_VECT_0_CNTL, 0x0, 0xFFFFFFFF, NULL, 0);
  1911. r600_pipe_state_add_reg(rstate, R_028A34_VGT_GROUP_VECT_1_CNTL, 0x0, 0xFFFFFFFF, NULL, 0);
  1912. r600_pipe_state_add_reg(rstate, R_028A38_VGT_GROUP_VECT_0_FMT_CNTL, 0x0, 0xFFFFFFFF, NULL, 0);
  1913. r600_pipe_state_add_reg(rstate, R_028A3C_VGT_GROUP_VECT_1_FMT_CNTL, 0x0, 0xFFFFFFFF, NULL, 0);
  1914. r600_pipe_state_add_reg(rstate, R_028A40_VGT_GS_MODE, 0x0, 0xFFFFFFFF, NULL, 0);
  1915. r600_pipe_state_add_reg(rstate, R_028B94_VGT_STRMOUT_CONFIG, 0x0, 0xFFFFFFFF, NULL, 0);
  1916. r600_pipe_state_add_reg(rstate, R_028B98_VGT_STRMOUT_BUFFER_CONFIG, 0x0, 0xFFFFFFFF, NULL, 0);
  1917. r600_pipe_state_add_reg(rstate, R_028AB4_VGT_REUSE_OFF, 0x00000000, 0xFFFFFFFF, NULL, 0);
  1918. r600_pipe_state_add_reg(rstate, R_028AB8_VGT_VTX_CNT_EN, 0x0, 0xFFFFFFFF, NULL, 0);
  1919. r600_pipe_state_add_reg(rstate, R_008A14_PA_CL_ENHANCE, (3 << 1) | 1, 0xFFFFFFFF, NULL, 0);
  1920. r600_pipe_state_add_reg(rstate, R_028380_SQ_VTX_SEMANTIC_0, 0x0, 0xFFFFFFFF, NULL, 0);
  1921. r600_pipe_state_add_reg(rstate, R_028384_SQ_VTX_SEMANTIC_1, 0x0, 0xFFFFFFFF, NULL, 0);
  1922. r600_pipe_state_add_reg(rstate, R_028388_SQ_VTX_SEMANTIC_2, 0x0, 0xFFFFFFFF, NULL, 0);
  1923. r600_pipe_state_add_reg(rstate, R_02838C_SQ_VTX_SEMANTIC_3, 0x0, 0xFFFFFFFF, NULL, 0);
  1924. r600_pipe_state_add_reg(rstate, R_028390_SQ_VTX_SEMANTIC_4, 0x0, 0xFFFFFFFF, NULL, 0);
  1925. r600_pipe_state_add_reg(rstate, R_028394_SQ_VTX_SEMANTIC_5, 0x0, 0xFFFFFFFF, NULL, 0);
  1926. r600_pipe_state_add_reg(rstate, R_028398_SQ_VTX_SEMANTIC_6, 0x0, 0xFFFFFFFF, NULL, 0);
  1927. r600_pipe_state_add_reg(rstate, R_02839C_SQ_VTX_SEMANTIC_7, 0x0, 0xFFFFFFFF, NULL, 0);
  1928. r600_pipe_state_add_reg(rstate, R_0283A0_SQ_VTX_SEMANTIC_8, 0x0, 0xFFFFFFFF, NULL, 0);
  1929. r600_pipe_state_add_reg(rstate, R_0283A4_SQ_VTX_SEMANTIC_9, 0x0, 0xFFFFFFFF, NULL, 0);
  1930. r600_pipe_state_add_reg(rstate, R_0283A8_SQ_VTX_SEMANTIC_10, 0x0, 0xFFFFFFFF, NULL, 0);
  1931. r600_pipe_state_add_reg(rstate, R_0283AC_SQ_VTX_SEMANTIC_11, 0x0, 0xFFFFFFFF, NULL, 0);
  1932. r600_pipe_state_add_reg(rstate, R_0283B0_SQ_VTX_SEMANTIC_12, 0x0, 0xFFFFFFFF, NULL, 0);
  1933. r600_pipe_state_add_reg(rstate, R_0283B4_SQ_VTX_SEMANTIC_13, 0x0, 0xFFFFFFFF, NULL, 0);
  1934. r600_pipe_state_add_reg(rstate, R_0283B8_SQ_VTX_SEMANTIC_14, 0x0, 0xFFFFFFFF, NULL, 0);
  1935. r600_pipe_state_add_reg(rstate, R_0283BC_SQ_VTX_SEMANTIC_15, 0x0, 0xFFFFFFFF, NULL, 0);
  1936. r600_pipe_state_add_reg(rstate, R_0283C0_SQ_VTX_SEMANTIC_16, 0x0, 0xFFFFFFFF, NULL, 0);
  1937. r600_pipe_state_add_reg(rstate, R_0283C4_SQ_VTX_SEMANTIC_17, 0x0, 0xFFFFFFFF, NULL, 0);
  1938. r600_pipe_state_add_reg(rstate, R_0283C8_SQ_VTX_SEMANTIC_18, 0x0, 0xFFFFFFFF, NULL, 0);
  1939. r600_pipe_state_add_reg(rstate, R_0283CC_SQ_VTX_SEMANTIC_19, 0x0, 0xFFFFFFFF, NULL, 0);
  1940. r600_pipe_state_add_reg(rstate, R_0283D0_SQ_VTX_SEMANTIC_20, 0x0, 0xFFFFFFFF, NULL, 0);
  1941. r600_pipe_state_add_reg(rstate, R_0283D4_SQ_VTX_SEMANTIC_21, 0x0, 0xFFFFFFFF, NULL, 0);
  1942. r600_pipe_state_add_reg(rstate, R_0283D8_SQ_VTX_SEMANTIC_22, 0x0, 0xFFFFFFFF, NULL, 0);
  1943. r600_pipe_state_add_reg(rstate, R_0283DC_SQ_VTX_SEMANTIC_23, 0x0, 0xFFFFFFFF, NULL, 0);
  1944. r600_pipe_state_add_reg(rstate, R_0283E0_SQ_VTX_SEMANTIC_24, 0x0, 0xFFFFFFFF, NULL, 0);
  1945. r600_pipe_state_add_reg(rstate, R_0283E4_SQ_VTX_SEMANTIC_25, 0x0, 0xFFFFFFFF, NULL, 0);
  1946. r600_pipe_state_add_reg(rstate, R_0283E8_SQ_VTX_SEMANTIC_26, 0x0, 0xFFFFFFFF, NULL, 0);
  1947. r600_pipe_state_add_reg(rstate, R_0283EC_SQ_VTX_SEMANTIC_27, 0x0, 0xFFFFFFFF, NULL, 0);
  1948. r600_pipe_state_add_reg(rstate, R_0283F0_SQ_VTX_SEMANTIC_28, 0x0, 0xFFFFFFFF, NULL, 0);
  1949. r600_pipe_state_add_reg(rstate, R_0283F4_SQ_VTX_SEMANTIC_29, 0x0, 0xFFFFFFFF, NULL, 0);
  1950. r600_pipe_state_add_reg(rstate, R_0283F8_SQ_VTX_SEMANTIC_30, 0x0, 0xFFFFFFFF, NULL, 0);
  1951. r600_pipe_state_add_reg(rstate, R_0283FC_SQ_VTX_SEMANTIC_31, 0x0, 0xFFFFFFFF, NULL, 0);
  1952. r600_pipe_state_add_reg(rstate, R_028810_PA_CL_CLIP_CNTL, 0x0, 0xFFFFFFFF, NULL, 0);
  1953. r600_context_pipe_state_set(&rctx->ctx, rstate);
  1954. }
  1955. void evergreen_polygon_offset_update(struct r600_pipe_context *rctx)
  1956. {
  1957. struct r600_pipe_state state;
  1958. state.id = R600_PIPE_STATE_POLYGON_OFFSET;
  1959. state.nregs = 0;
  1960. if (rctx->rasterizer && rctx->framebuffer.zsbuf) {
  1961. float offset_units = rctx->rasterizer->offset_units;
  1962. unsigned offset_db_fmt_cntl = 0, depth;
  1963. switch (rctx->framebuffer.zsbuf->texture->format) {
  1964. case PIPE_FORMAT_Z24X8_UNORM:
  1965. case PIPE_FORMAT_Z24_UNORM_S8_UINT:
  1966. depth = -24;
  1967. offset_units *= 2.0f;
  1968. break;
  1969. case PIPE_FORMAT_Z32_FLOAT:
  1970. case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
  1971. depth = -23;
  1972. offset_units *= 1.0f;
  1973. offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_DB_IS_FLOAT_FMT(1);
  1974. break;
  1975. case PIPE_FORMAT_Z16_UNORM:
  1976. depth = -16;
  1977. offset_units *= 4.0f;
  1978. break;
  1979. default:
  1980. return;
  1981. }
  1982. /* FIXME some of those reg can be computed with cso */
  1983. offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_NEG_NUM_DB_BITS(depth);
  1984. r600_pipe_state_add_reg(&state,
  1985. R_028B80_PA_SU_POLY_OFFSET_FRONT_SCALE,
  1986. fui(rctx->rasterizer->offset_scale), 0xFFFFFFFF, NULL, 0);
  1987. r600_pipe_state_add_reg(&state,
  1988. R_028B84_PA_SU_POLY_OFFSET_FRONT_OFFSET,
  1989. fui(offset_units), 0xFFFFFFFF, NULL, 0);
  1990. r600_pipe_state_add_reg(&state,
  1991. R_028B88_PA_SU_POLY_OFFSET_BACK_SCALE,
  1992. fui(rctx->rasterizer->offset_scale), 0xFFFFFFFF, NULL, 0);
  1993. r600_pipe_state_add_reg(&state,
  1994. R_028B8C_PA_SU_POLY_OFFSET_BACK_OFFSET,
  1995. fui(offset_units), 0xFFFFFFFF, NULL, 0);
  1996. r600_pipe_state_add_reg(&state,
  1997. R_028B78_PA_SU_POLY_OFFSET_DB_FMT_CNTL,
  1998. offset_db_fmt_cntl, 0xFFFFFFFF, NULL, 0);
  1999. r600_context_pipe_state_set(&rctx->ctx, &state);
  2000. }
  2001. }
  2002. void evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader)
  2003. {
  2004. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  2005. struct r600_pipe_state *rstate = &shader->rstate;
  2006. struct r600_shader *rshader = &shader->shader;
  2007. unsigned i, exports_ps, num_cout, spi_ps_in_control_0, spi_input_z, spi_ps_in_control_1, db_shader_control;
  2008. int pos_index = -1, face_index = -1;
  2009. int ninterp = 0;
  2010. boolean have_linear = FALSE, have_centroid = FALSE, have_perspective = FALSE;
  2011. unsigned spi_baryc_cntl;
  2012. rstate->nregs = 0;
  2013. db_shader_control = 0;
  2014. for (i = 0; i < rshader->ninput; i++) {
  2015. /* evergreen NUM_INTERP only contains values interpolated into the LDS,
  2016. POSITION goes via GPRs from the SC so isn't counted */
  2017. if (rshader->input[i].name == TGSI_SEMANTIC_POSITION)
  2018. pos_index = i;
  2019. else if (rshader->input[i].name == TGSI_SEMANTIC_FACE)
  2020. face_index = i;
  2021. else {
  2022. ninterp++;
  2023. if (rshader->input[i].interpolate == TGSI_INTERPOLATE_LINEAR)
  2024. have_linear = TRUE;
  2025. if (rshader->input[i].interpolate == TGSI_INTERPOLATE_PERSPECTIVE)
  2026. have_perspective = TRUE;
  2027. if (rshader->input[i].centroid)
  2028. have_centroid = TRUE;
  2029. }
  2030. }
  2031. for (i = 0; i < rshader->noutput; i++) {
  2032. if (rshader->output[i].name == TGSI_SEMANTIC_POSITION)
  2033. db_shader_control |= S_02880C_Z_EXPORT_ENABLE(1);
  2034. if (rshader->output[i].name == TGSI_SEMANTIC_STENCIL)
  2035. db_shader_control |= S_02880C_STENCIL_EXPORT_ENABLE(1);
  2036. }
  2037. if (rshader->uses_kill)
  2038. db_shader_control |= S_02880C_KILL_ENABLE(1);
  2039. exports_ps = 0;
  2040. num_cout = 0;
  2041. for (i = 0; i < rshader->noutput; i++) {
  2042. if (rshader->output[i].name == TGSI_SEMANTIC_POSITION ||
  2043. rshader->output[i].name == TGSI_SEMANTIC_STENCIL)
  2044. exports_ps |= 1;
  2045. else if (rshader->output[i].name == TGSI_SEMANTIC_COLOR) {
  2046. if (rshader->fs_write_all)
  2047. num_cout = rshader->nr_cbufs;
  2048. else
  2049. num_cout++;
  2050. }
  2051. }
  2052. exports_ps |= S_02884C_EXPORT_COLORS(num_cout);
  2053. if (!exports_ps) {
  2054. /* always at least export 1 component per pixel */
  2055. exports_ps = 2;
  2056. }
  2057. if (ninterp == 0) {
  2058. ninterp = 1;
  2059. have_perspective = TRUE;
  2060. }
  2061. if (!have_perspective && !have_linear)
  2062. have_perspective = TRUE;
  2063. spi_ps_in_control_0 = S_0286CC_NUM_INTERP(ninterp) |
  2064. S_0286CC_PERSP_GRADIENT_ENA(have_perspective) |
  2065. S_0286CC_LINEAR_GRADIENT_ENA(have_linear);
  2066. spi_input_z = 0;
  2067. if (pos_index != -1) {
  2068. spi_ps_in_control_0 |= S_0286CC_POSITION_ENA(1) |
  2069. S_0286CC_POSITION_CENTROID(rshader->input[pos_index].centroid) |
  2070. S_0286CC_POSITION_ADDR(rshader->input[pos_index].gpr);
  2071. spi_input_z |= 1;
  2072. }
  2073. spi_ps_in_control_1 = 0;
  2074. if (face_index != -1) {
  2075. spi_ps_in_control_1 |= S_0286D0_FRONT_FACE_ENA(1) |
  2076. S_0286D0_FRONT_FACE_ADDR(rshader->input[face_index].gpr);
  2077. }
  2078. spi_baryc_cntl = 0;
  2079. if (have_perspective)
  2080. spi_baryc_cntl |= S_0286E0_PERSP_CENTER_ENA(1) |
  2081. S_0286E0_PERSP_CENTROID_ENA(have_centroid);
  2082. if (have_linear)
  2083. spi_baryc_cntl |= S_0286E0_LINEAR_CENTER_ENA(1) |
  2084. S_0286E0_LINEAR_CENTROID_ENA(have_centroid);
  2085. r600_pipe_state_add_reg(rstate, R_0286CC_SPI_PS_IN_CONTROL_0,
  2086. spi_ps_in_control_0, 0xFFFFFFFF, NULL, 0);
  2087. r600_pipe_state_add_reg(rstate, R_0286D0_SPI_PS_IN_CONTROL_1,
  2088. spi_ps_in_control_1, 0xFFFFFFFF, NULL, 0);
  2089. r600_pipe_state_add_reg(rstate, R_0286E4_SPI_PS_IN_CONTROL_2,
  2090. 0, 0xFFFFFFFF, NULL, 0);
  2091. r600_pipe_state_add_reg(rstate, R_0286D8_SPI_INPUT_Z, spi_input_z, 0xFFFFFFFF, NULL, 0);
  2092. r600_pipe_state_add_reg(rstate,
  2093. R_0286E0_SPI_BARYC_CNTL,
  2094. spi_baryc_cntl,
  2095. 0xFFFFFFFF, NULL, 0);
  2096. r600_pipe_state_add_reg(rstate,
  2097. R_028840_SQ_PGM_START_PS,
  2098. 0, 0xFFFFFFFF, shader->bo, RADEON_USAGE_READ);
  2099. r600_pipe_state_add_reg(rstate,
  2100. R_028844_SQ_PGM_RESOURCES_PS,
  2101. S_028844_NUM_GPRS(rshader->bc.ngpr) |
  2102. S_028844_PRIME_CACHE_ON_DRAW(1) |
  2103. S_028844_STACK_SIZE(rshader->bc.nstack),
  2104. 0xFFFFFFFF, NULL, 0);
  2105. r600_pipe_state_add_reg(rstate,
  2106. R_028848_SQ_PGM_RESOURCES_2_PS,
  2107. 0x0, 0xFFFFFFFF, NULL, 0);
  2108. r600_pipe_state_add_reg(rstate,
  2109. R_02884C_SQ_PGM_EXPORTS_PS,
  2110. exports_ps, 0xFFFFFFFF, NULL, 0);
  2111. /* FIXME: Evergreen doesn't seem to support MULTIWRITE_ENABLE. */
  2112. /* only set some bits here, the other bits are set in the dsa state */
  2113. r600_pipe_state_add_reg(rstate,
  2114. R_02880C_DB_SHADER_CONTROL,
  2115. db_shader_control,
  2116. S_02880C_Z_EXPORT_ENABLE(1) |
  2117. S_02880C_STENCIL_EXPORT_ENABLE(1) |
  2118. S_02880C_KILL_ENABLE(1),
  2119. NULL, 0);
  2120. r600_pipe_state_add_reg(rstate,
  2121. R_03A200_SQ_LOOP_CONST_0, 0x01000FFF,
  2122. 0xFFFFFFFF, NULL, 0);
  2123. }
  2124. void evergreen_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shader)
  2125. {
  2126. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  2127. struct r600_pipe_state *rstate = &shader->rstate;
  2128. struct r600_shader *rshader = &shader->shader;
  2129. unsigned spi_vs_out_id[10];
  2130. unsigned i, tmp, nparams;
  2131. /* clear previous register */
  2132. rstate->nregs = 0;
  2133. /* so far never got proper semantic id from tgsi */
  2134. for (i = 0; i < 10; i++) {
  2135. spi_vs_out_id[i] = 0;
  2136. }
  2137. for (i = 0; i < 32; i++) {
  2138. tmp = i << ((i & 3) * 8);
  2139. spi_vs_out_id[i / 4] |= tmp;
  2140. }
  2141. for (i = 0; i < 10; i++) {
  2142. r600_pipe_state_add_reg(rstate,
  2143. R_02861C_SPI_VS_OUT_ID_0 + i * 4,
  2144. spi_vs_out_id[i], 0xFFFFFFFF, NULL, 0);
  2145. }
  2146. /* Certain attributes (position, psize, etc.) don't count as params.
  2147. * VS is required to export at least one param and r600_shader_from_tgsi()
  2148. * takes care of adding a dummy export.
  2149. */
  2150. nparams = rshader->noutput - rshader->npos;
  2151. if (nparams < 1)
  2152. nparams = 1;
  2153. r600_pipe_state_add_reg(rstate,
  2154. R_0286C4_SPI_VS_OUT_CONFIG,
  2155. S_0286C4_VS_EXPORT_COUNT(nparams - 1),
  2156. 0xFFFFFFFF, NULL, 0);
  2157. r600_pipe_state_add_reg(rstate,
  2158. R_028860_SQ_PGM_RESOURCES_VS,
  2159. S_028860_NUM_GPRS(rshader->bc.ngpr) |
  2160. S_028860_STACK_SIZE(rshader->bc.nstack),
  2161. 0xFFFFFFFF, NULL, 0);
  2162. r600_pipe_state_add_reg(rstate,
  2163. R_028864_SQ_PGM_RESOURCES_2_VS,
  2164. 0x0, 0xFFFFFFFF, NULL, 0);
  2165. r600_pipe_state_add_reg(rstate,
  2166. R_02885C_SQ_PGM_START_VS,
  2167. 0, 0xFFFFFFFF, shader->bo, RADEON_USAGE_READ);
  2168. r600_pipe_state_add_reg(rstate,
  2169. R_03A200_SQ_LOOP_CONST_0 + (32 * 4), 0x01000FFF,
  2170. 0xFFFFFFFF, NULL, 0);
  2171. }
  2172. void evergreen_fetch_shader(struct pipe_context *ctx,
  2173. struct r600_vertex_element *ve)
  2174. {
  2175. struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
  2176. struct r600_pipe_state *rstate = &ve->rstate;
  2177. rstate->id = R600_PIPE_STATE_FETCH_SHADER;
  2178. rstate->nregs = 0;
  2179. r600_pipe_state_add_reg(rstate, R_0288A8_SQ_PGM_RESOURCES_FS,
  2180. 0x00000000, 0xFFFFFFFF, NULL, 0);
  2181. r600_pipe_state_add_reg(rstate, R_0288A4_SQ_PGM_START_FS,
  2182. 0,
  2183. 0xFFFFFFFF, ve->fetch_shader, RADEON_USAGE_READ);
  2184. }
  2185. void *evergreen_create_db_flush_dsa(struct r600_pipe_context *rctx)
  2186. {
  2187. struct pipe_depth_stencil_alpha_state dsa;
  2188. struct r600_pipe_state *rstate;
  2189. memset(&dsa, 0, sizeof(dsa));
  2190. rstate = rctx->context.create_depth_stencil_alpha_state(&rctx->context, &dsa);
  2191. r600_pipe_state_add_reg(rstate,
  2192. R_02880C_DB_SHADER_CONTROL,
  2193. 0x0,
  2194. S_02880C_DUAL_EXPORT_ENABLE(1), NULL, 0);
  2195. r600_pipe_state_add_reg(rstate,
  2196. R_028000_DB_RENDER_CONTROL,
  2197. S_028000_DEPTH_COPY_ENABLE(1) |
  2198. S_028000_STENCIL_COPY_ENABLE(1) |
  2199. S_028000_COPY_CENTROID(1),
  2200. S_028000_DEPTH_COPY_ENABLE(1) |
  2201. S_028000_STENCIL_COPY_ENABLE(1) |
  2202. S_028000_COPY_CENTROID(1), NULL, 0);
  2203. return rstate;
  2204. }
  2205. void evergreen_pipe_init_buffer_resource(struct r600_pipe_context *rctx,
  2206. struct r600_pipe_resource_state *rstate)
  2207. {
  2208. rstate->id = R600_PIPE_STATE_RESOURCE;
  2209. rstate->val[0] = 0;
  2210. rstate->bo[0] = NULL;
  2211. rstate->val[1] = 0;
  2212. rstate->val[2] = S_030008_ENDIAN_SWAP(r600_endian_swap(32));
  2213. rstate->val[3] = S_03000C_DST_SEL_X(V_03000C_SQ_SEL_X) |
  2214. S_03000C_DST_SEL_Y(V_03000C_SQ_SEL_Y) |
  2215. S_03000C_DST_SEL_Z(V_03000C_SQ_SEL_Z) |
  2216. S_03000C_DST_SEL_W(V_03000C_SQ_SEL_W);
  2217. rstate->val[4] = 0;
  2218. rstate->val[5] = 0;
  2219. rstate->val[6] = 0;
  2220. rstate->val[7] = 0xc0000000;
  2221. }
  2222. void evergreen_pipe_mod_buffer_resource(struct r600_pipe_resource_state *rstate,
  2223. struct r600_resource *rbuffer,
  2224. unsigned offset, unsigned stride,
  2225. enum radeon_bo_usage usage)
  2226. {
  2227. rstate->bo[0] = rbuffer;
  2228. rstate->bo_usage[0] = usage;
  2229. rstate->val[0] = offset;
  2230. rstate->val[1] = rbuffer->buf->size - offset - 1;
  2231. rstate->val[2] = S_030008_ENDIAN_SWAP(r600_endian_swap(32)) |
  2232. S_030008_STRIDE(stride);
  2233. }