PrecompiledBatch.cpp 79 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195
  1. #include "..\..\..\common_h\render.h"
  2. #ifndef COMPILE_PROPS_INCLUDED
  3. #error CompileProps.h must be included
  4. #endif
  5. #if defined (_XBOX) && defined(_PRECOMPILED_COMMAND_BUFFER_BAKER)
  6. #include "PrecompiledBatch.h"
  7. #include "..\VariablesDB.h"
  8. #include "..\Render.h"
  9. #define DUMP_FILE_NAME "game:\\dump.txt"
  10. bool bGlobalDump = false;
  11. precompiledBatch::precompiledBatch(const char * szShdrName) : vs_consts_v4 (_FL_),
  12. ps_consts_v4 (_FL_),
  13. ps_consts_b (_FL_),
  14. vs_consts_b (_FL_),
  15. tex_consts (_FL_),
  16. dynamicDrawRS(_FL_, 8),
  17. dynamicDrawSS(_FL_, 8)
  18. {
  19. originalColorMask = 0x0F;
  20. originalGpuCull = GPUCULL_NONE_FRONTFACE_CCW;
  21. originalZEnable = 0;
  22. originalHyperZEnable = 0;
  23. bDepthEnable = false;
  24. bDepthWriteEnable = false;
  25. bHiZEnable = false;
  26. bHiZWriteEnable = false;
  27. bNeedFlushHiperZ = true;
  28. shaderName = szShdrName;
  29. pWhiteTexture = (IDirect3DBaseTexture9*)NGRender::pRS->getWhiteTexture()->GetBaseTexture();
  30. dwBytesAllocated = 0;
  31. sourcePrecompiledBuffer = NULL;
  32. m_pVertexShader = NULL;
  33. m_pPixelShader = NULL;
  34. m_pDB = NULL;
  35. bTemp_VertexShaderNotSet = true;
  36. bTemp_PixelShaderNotSet = true;
  37. commandBuffer_temp = NULL;
  38. bLogOnlyWhenParse = false;
  39. baseData = 0;
  40. dwParser_Offset = 0;
  41. dwIndxOffset_Offset = GPU_INVALID_OFFSET;
  42. dwDepthControl_Offset = GPU_INVALID_OFFSET;
  43. dwColorMask_Offset = GPU_INVALID_OFFSET;
  44. dwBlendControl0_Offset = GPU_INVALID_OFFSET;
  45. dwBlendControl1_Offset = GPU_INVALID_OFFSET;
  46. dwBlendControl2_Offset = GPU_INVALID_OFFSET;
  47. dwBlendControl3_Offset = GPU_INVALID_OFFSET;
  48. dwHiZControl_Offset = GPU_INVALID_OFFSET;
  49. dwSetCullMode_Offset = GPU_INVALID_OFFSET;
  50. dwSetVertexShader_Offset_ = GPU_INVALID_OFFSET;
  51. dwSetPixelShader_Offset_ = GPU_INVALID_OFFSET;
  52. dwDrawToken_Offset = GPU_INVALID_OFFSET;
  53. dwEndCommandBuffer_Offset = GPU_INVALID_OFFSET;
  54. dwSizeInDwords = 0;
  55. dwCurrentSizeInDwords = 0;
  56. for (DWORD i = 0; i < MAX_STREAMS_COUNT; i++)
  57. {
  58. dwStreamSource_Offsets[i] = GPU_INVALID_OFFSET;
  59. }
  60. for (DWORD i = 0; i < MAX_TEXTURES_COUNT; i++)
  61. {
  62. dwTexture_Offsets[i] = GPU_INVALID_OFFSET;
  63. }
  64. for (DWORD i = 0; i < MAX_ALU_CONST_COUNT; i++)
  65. {
  66. dwALUConst_Offsets[i] = GPU_INVALID_OFFSET;
  67. }
  68. for (DWORD i = 0; i < MAX_ALU_CONST_COUNT_BOOL; i++)
  69. {
  70. dwALUConstBool_Offsets[i] = GPU_INVALID_OFFSET;
  71. }
  72. dwCommandBufferDataSize = 0;
  73. dwCommandBufferData = NULL;
  74. dwHeaderSize_temp = 0;
  75. pHeaderBytes_temp = NULL;
  76. dwInitializationSize_temp = 0;
  77. pInitializationBytes_temp = NULL;
  78. dipPacketHeader.CountMinusOne = (sizeof(GPUCOMMAND_DRAW_INDEX)/sizeof(DWORD)) - 1;
  79. dipPacketHeader.OpCode = GPUCOMMANDOP_DRAW;
  80. dipPacketHeader.PacketType = GPU_PACKET_TYPE_3;
  81. dipPacket.VizQueryId = 0;
  82. dipPacket.UseVizQuery = 0;
  83. dipPacket.Endian = GPUENDIAN_8IN16;
  84. dipPacket.IndexBase = 0x0;
  85. dipPacket.IndexSize = 0;
  86. dipPacket.NumIndices = 0;
  87. dipPacket.IndexType = GPUINDEXTYPE_16BIT;
  88. dipPacket.MajorMode = 0;
  89. dipPacket.NotEndOfPacket = 0;
  90. dipPacket.PrimType = GPUPRIMTYPE_TRILIST;
  91. dipPacket.SrcSelect = GPUINDEXSELECT_DMA;
  92. dpPacketHeader.CountMinusOne = (sizeof(GPUCOMMAND_DRAW_AUTO)/sizeof(DWORD)) - 1;
  93. dpPacketHeader.OpCode = GPUCOMMANDOP_DRAW;
  94. dpPacketHeader.PacketType = GPU_PACKET_TYPE_3;
  95. dpPacket.VizQueryId = 0;
  96. dpPacket.UseVizQuery = 0;
  97. dpPacket.PrimType = GPUPRIMTYPE_TRILIST;
  98. dpPacket.SrcSelect = GPUINDEXSELECT_AUTO;
  99. dpPacket.MajorMode = 0;
  100. dpPacket.NotEndOfPacket = 0;
  101. dpPacket.IndexSize = 1;
  102. dpPacket.NumIndices = 0;
  103. }
  104. precompiledBatch::~precompiledBatch()
  105. {
  106. Cleanup();
  107. }
  108. D3DCommandBuffer * precompiledBatch::getCommandBuffer()
  109. {
  110. return commandBuffer_temp;
  111. }
  112. D3DCommandBuffer * precompiledBatch::getSourceCommandBuffer()
  113. {
  114. return sourcePrecompiledBuffer;
  115. }
  116. void precompiledBatch::CleanupTempData()
  117. {
  118. if (sourcePrecompiledBuffer)
  119. {
  120. sourcePrecompiledBuffer->Release();
  121. sourcePrecompiledBuffer = NULL;
  122. }
  123. }
  124. void precompiledBatch::Cleanup()
  125. {
  126. if (m_pPixelShader)
  127. {
  128. m_pPixelShader->Release();
  129. m_pPixelShader = NULL;
  130. }
  131. if (m_pVertexShader)
  132. {
  133. m_pVertexShader->Release();
  134. m_pVertexShader = NULL;
  135. }
  136. CleanupTempData();
  137. commandBuffer_temp = NULL;
  138. if (pHeaderBytes_temp)
  139. {
  140. free(pHeaderBytes_temp);
  141. pHeaderBytes_temp = NULL;
  142. dwHeaderSize_temp = 0;
  143. }
  144. if (pInitializationBytes_temp)
  145. {
  146. free(pInitializationBytes_temp);
  147. pInitializationBytes_temp = NULL;
  148. dwInitializationSize_temp = 0;
  149. }
  150. if (dwCommandBufferData)
  151. {
  152. XPhysicalFree(dwCommandBufferData);
  153. dwCommandBufferData = NULL;
  154. }
  155. dwCommandBufferDataSize = 0;
  156. dwDepthControl_Offset = GPU_INVALID_OFFSET;
  157. dwColorMask_Offset = GPU_INVALID_OFFSET;
  158. dwBlendControl0_Offset = GPU_INVALID_OFFSET;
  159. dwBlendControl1_Offset = GPU_INVALID_OFFSET;
  160. dwBlendControl2_Offset = GPU_INVALID_OFFSET;
  161. dwBlendControl3_Offset = GPU_INVALID_OFFSET;
  162. dwSetCullMode_Offset = GPU_INVALID_OFFSET;
  163. dwSetVertexShader_Offset_ = GPU_INVALID_OFFSET;
  164. dwSetPixelShader_Offset_ = GPU_INVALID_OFFSET;
  165. dwDrawToken_Offset = GPU_INVALID_OFFSET;
  166. dwEndCommandBuffer_Offset = GPU_INVALID_OFFSET;
  167. dwSizeInDwords = 0;
  168. dwCurrentSizeInDwords = 0;
  169. for (DWORD i = 0; i < MAX_STREAMS_COUNT; i++)
  170. {
  171. dwStreamSource_Offsets[i] = GPU_INVALID_OFFSET;
  172. }
  173. for (DWORD i = 0; i < MAX_TEXTURES_COUNT; i++)
  174. {
  175. dwTexture_Offsets[i] = GPU_INVALID_OFFSET;
  176. }
  177. for (DWORD i = 0; i < MAX_ALU_CONST_COUNT; i++)
  178. {
  179. dwALUConst_Offsets[i] = GPU_INVALID_OFFSET;
  180. }
  181. for (DWORD i = 0; i < MAX_ALU_CONST_COUNT_BOOL; i++)
  182. {
  183. dwALUConstBool_Offsets[i] = GPU_INVALID_OFFSET;
  184. }
  185. ps_consts_v4.DelAll();
  186. vs_consts_v4.DelAll();
  187. ps_consts_b.DelAll();
  188. vs_consts_b.DelAll();
  189. tex_consts.DelAll();
  190. }
  191. //===========================================================================================================================================
  192. void precompiledBatch::DeleteTraceFile()
  193. {
  194. DeleteFile(DUMP_FILE_NAME);
  195. }
  196. void precompiledBatch::Trace (const char * str, ...)
  197. {
  198. if (!bGlobalDump)
  199. {
  200. return;
  201. }
  202. static char tempBuffer[16384];
  203. va_list args;
  204. va_start(args, str);
  205. vsnprintf_s(tempBuffer, 16384 - 4, 16384-4, str, args);
  206. va_end(args);
  207. /*
  208. FILE* file = 0;
  209. fopen_s(&file, DUMP_FILE_NAME, "a+b");
  210. if (file)
  211. {
  212. fseek(file, 0, SEEK_END);
  213. long len = strlen(tempBuffer);
  214. fwrite(tempBuffer, len, 1, file);
  215. fclose(file);
  216. }
  217. */
  218. OutputDebugString(tempBuffer);
  219. }
  220. //Парсер коммандного буфера
  221. //===========================================================================================================================================
  222. void precompiledBatch::parseCommandBuffer(BYTE * memoryPtr)
  223. {
  224. baseData = memoryPtr;
  225. //По данным шагаем dword'ами
  226. const DWORD * dataStream = (DWORD *)baseData;
  227. Trace("Parse command buffer addr = 0x%08X\n", (DWORD)baseData);
  228. Trace("=====================================================================\n");
  229. //Общий хидер
  230. GPUCOMMANDBUFFER_HEADER_PACKET_COMMON header_s;
  231. //Больше 65K пакетов быть не может
  232. for (DWORD i = 0; i < 0xFFFF; i++)
  233. {
  234. //Рассчитываем текущий offset
  235. dwParser_Offset = (((DWORD)dataStream - (DWORD)baseData));
  236. //Считываем хидер пакета
  237. header_s.dword = *dataStream;
  238. Trace("offset = 0x%08X ", dwParser_Offset);
  239. //Рассчитываем "магическую" константу являющуюся признаком окончания command buffer
  240. DWORD dwMagicConstEndOfBuffer = GPUGenerateMagicValue(dataStream);
  241. dataStream++;
  242. //нашли окончание command buffer'a
  243. //это de-constructed буффер, к рендеру не готовый
  244. if (header_s.dword == 0x00000000)
  245. {
  246. DWORD endToken = *dataStream;
  247. if (endToken == GPU_END_CB_TOKEN)
  248. {
  249. Trace("deconstructed command buffer - parse end!, parsed %d bytes\n", dwParser_Offset);
  250. Trace("=====================================================================\n");
  251. if (bLogOnlyWhenParse == false)
  252. {
  253. dwEndCommandBuffer_Offset = dwParser_Offset;
  254. Assert (dwEndCommandBuffer_Offset <= 262140);
  255. dwSizeInDwords = (WORD)(dwEndCommandBuffer_Offset / sizeof(DWORD));
  256. dwCurrentSizeInDwords = dwSizeInDwords;
  257. }
  258. baseData = 0;
  259. return;
  260. } else
  261. {
  262. Assert(false);
  263. }
  264. }
  265. //нашли окончание command buffer'a
  266. //это constructed буффер, готовый к рендеру
  267. if (header_s.dword == dwMagicConstEndOfBuffer)
  268. {
  269. DWORD endToken = *dataStream;
  270. if (endToken == GPU_END_CB_TOKEN)
  271. {
  272. Trace("constructed command buffer - parse end!, parsed %d bytes\n", dwParser_Offset);
  273. Trace("=====================================================================\n");
  274. if (bLogOnlyWhenParse == false)
  275. {
  276. dwEndCommandBuffer_Offset = dwParser_Offset;
  277. Assert (dwEndCommandBuffer_Offset <= 262140);
  278. dwSizeInDwords = (WORD)(dwEndCommandBuffer_Offset / sizeof(DWORD));
  279. dwCurrentSizeInDwords = dwSizeInDwords;
  280. }
  281. baseData = 0;
  282. return;
  283. } else
  284. {
  285. Assert(false);
  286. }
  287. }
  288. //Смторим на типа пакета...
  289. switch (header_s.Packet0.PacketType)
  290. {
  291. case GPU_PACKET_TYPE_0:
  292. {
  293. //Это настройки для render targets 0..3
  294. if (GPUREG_BLENDCONTROL1 == header_s.Packet0.BaseRegisterIndex && header_s.Packet0.CountMinusOne == 2)
  295. {
  296. //FIXME
  297. //OutputDebugString("----------------------- need to crop this block !!!!!!!!!!!! --------------------------------------------------------\n");
  298. }
  299. ParseType0Packet (dataStream, (header_s.Packet0.CountMinusOne+1), header_s.Packet0.BaseRegisterIndex);
  300. dataStream += (header_s.Packet0.CountMinusOne+1);
  301. break;
  302. }
  303. case GPU_PACKET_TYPE_1:
  304. {
  305. DWORD regData1 = *dataStream;
  306. Trace("Write register[%d] = %d\n", header_s.Packet1.regIndex1, regData1);
  307. dataStream++;
  308. DWORD regData2 = *dataStream;
  309. Trace("Write register[%d] = %d\n", header_s.Packet1.regIndex2, regData2);
  310. dataStream++;
  311. break;
  312. }
  313. case GPU_PACKET_TYPE_2:
  314. {
  315. Trace("Filler packet\n");
  316. Trace("{\n");
  317. Trace("}\n");
  318. Assert(header_s.Packet2.Reserved == 0x0);
  319. break;
  320. }
  321. case GPU_PACKET_TYPE_3:
  322. {
  323. ParseType3Packet (header_s.Packet3.OpCode, dataStream, (header_s.Packet3.CountMinusOne+1));
  324. DWORD dwStepSize = (header_s.Packet3.CountMinusOne + 1);
  325. dataStream += dwStepSize;
  326. break;
  327. }
  328. } // awitch ()
  329. } // for()
  330. Assert(false);
  331. }
  332. //Парсер значений vertex fetch constant
  333. //===========================================================================================================================================
  334. void precompiledBatch::ParseVertexFetchConst(DWORD dwStreamIndex, DWORD dwRegisterElementIndex, DWORD regData)
  335. {
  336. Trace(" {\n");
  337. //Vertex fetch константы состоят из двух dword всегда
  338. switch (dwRegisterElementIndex)
  339. {
  340. case 0:
  341. {
  342. if (bLogOnlyWhenParse == false)
  343. {
  344. Assert(dwStreamIndex >= 0 && dwStreamIndex < MAX_STREAMS_COUNT);
  345. dwStreamSource_Offsets[dwStreamIndex] = dwParser_Offset;
  346. }
  347. GPUVERTEX_FETCH_CONSTANT_0 data;
  348. data.dword[0] = regData;
  349. Trace(" Type = %d\n", data.Type);
  350. Trace(" BaseAddress = 0x%08X (Effective : 0x%08X)\n", data.BaseAddress, data.BaseAddress << 12);
  351. Assert(data.Type == 0 || data.Type == GPUCONSTANTTYPE_INVALID_VERTEX || data.Type == GPUCONSTANTTYPE_VERTEX);
  352. break;
  353. }
  354. case 1:
  355. {
  356. GPUVERTEX_FETCH_CONSTANT_1 data;
  357. data.dword[0] = regData;
  358. Trace(" Endian = %d\n", data.Endian);
  359. Trace(" Size = %d\n", data.Size);
  360. Trace(" AddressClamp = %d\n", data.AddressClamp);
  361. Trace(" RequestSize = %d\n", data.RequestSize);
  362. Trace(" ClampDisable = %d\n", data.ClampDisable);
  363. break;
  364. }
  365. default:
  366. Assert(false);
  367. }
  368. Trace(" }\n");
  369. }
  370. //Парсер значений texture fetch constant
  371. //===========================================================================================================================================
  372. void precompiledBatch::ParseTextureFetchConst(DWORD dwRegIndex, DWORD dwRegisterElementIndex, DWORD regData)
  373. {
  374. Trace(" {\n");
  375. //Texture fetch константы состоят из шести dword всегда
  376. switch (dwRegisterElementIndex)
  377. {
  378. case 0:
  379. {
  380. /*
  381. if (dwRegIndex >= MAX_TEXTURES_COUNT)
  382. {
  383. int a = 0;
  384. }
  385. */
  386. if (bLogOnlyWhenParse == false)
  387. {
  388. Assert(dwRegIndex >= 0 && dwRegIndex < MAX_TEXTURES_COUNT);
  389. dwTexture_Offsets[dwRegIndex] = dwParser_Offset;
  390. }
  391. GPUTEXTURE_FETCH_CONSTANT_0 data;
  392. data.dword[0] = regData;
  393. Trace(" Type = %d\n", data.Type);
  394. Trace(" SignX = %d\n", data.SignX);
  395. Trace(" SignY = %d\n", data.SignX);
  396. Trace(" SignZ = %d\n", data.SignX);
  397. Trace(" SignW = %d\n", data.SignW);
  398. Trace(" ClampX = %d\n", data.ClampX);
  399. Trace(" ClampY = %d\n", data.ClampY);
  400. Trace(" ClampZ = %d\n", data.ClampZ);
  401. Trace(" Pitch = %d (Effective : %d)\n", data.Pitch, data.Pitch<<5);
  402. Trace(" Tiled = %d\n", data.Tiled);
  403. Assert(data.Type == 0 || data.Type == GPUCONSTANTTYPE_TEXTURE || data.Type == GPUCONSTANTTYPE_INVALID_TEXTURE);
  404. break;
  405. }
  406. case 1:
  407. {
  408. GPUTEXTURE_FETCH_CONSTANT_1 data;
  409. data.dword[0] = regData;
  410. Trace(" DataFormat = %d\n", data.DataFormat);
  411. Trace(" Endian = %d\n", data.Endian);
  412. Trace(" RequestSize = %d\n", data.RequestSize);
  413. Trace(" Stacked = %d\n", data.Stacked);
  414. Trace(" ClampPolicy = %d\n", data.ClampPolicy);
  415. Trace(" BaseAddress = 0x%08X (Effective : 0x%08X)\n", data.BaseAddress, data.BaseAddress << 12);
  416. break;
  417. }
  418. case 2:
  419. {
  420. Trace(" TexSize\n");
  421. break;
  422. }
  423. case 3:
  424. {
  425. GPUTEXTURE_FETCH_CONSTANT_3 data;
  426. data.dword[0] = regData;
  427. Trace(" NumFormat = %d\n", data.NumFormat);
  428. Trace(" SwizzleX = %d\n", data.SwizzleX);
  429. Trace(" SwizzleY = %d\n", data.SwizzleY);
  430. Trace(" SwizzleZ = %d\n", data.SwizzleZ);
  431. Trace(" SwizzleW = %d\n", data.SwizzleW);
  432. Trace(" ExpAdjust = %d\n", data.ExpAdjust);
  433. Trace(" MagFilter = %d\n", data.MagFilter);
  434. Trace(" MinFilter = %d\n", data.MinFilter);
  435. Trace(" MipFilter = %d\n", data.MipFilter);
  436. Trace(" AnisoFilter = %d\n", data.AnisoFilter);
  437. Trace(" BorderSize = %d\n", data.BorderSize);
  438. break;
  439. }
  440. case 4:
  441. {
  442. GPUTEXTURE_FETCH_CONSTANT_4 data;
  443. data.dword[0] = regData;
  444. Trace(" VolMagFilter = %d\n", data.VolMagFilter);
  445. Trace(" VolMinFilter = %d\n", data.VolMinFilter);
  446. Trace(" MinMipLevel = %d\n", data.MinMipLevel);
  447. Trace(" MaxMipLevel = %d\n", data.MaxMipLevel);
  448. Trace(" MagAnisoWalk = %d\n", data.MagAnisoWalk);
  449. Trace(" MinAnisoWalk = %d\n", data.MinAnisoWalk);
  450. Trace(" LODBias = %d\n", data.LODBias);
  451. Trace(" GradExpAdjustH = %d\n", data.GradExpAdjustH);
  452. Trace(" GradExpAdjustV = %d\n", data.GradExpAdjustV);
  453. break;
  454. }
  455. case 5:
  456. {
  457. GPUTEXTURE_FETCH_CONSTANT_5 data;
  458. data.dword[0] = regData;
  459. Trace(" BorderColor = %d\n", data.BorderColor);
  460. Trace(" ForceBCWToMax = %d\n", data.ForceBCWToMax);
  461. Trace(" TriClamp = %d\n", data.TriClamp);
  462. Trace(" AnisoBias = %d\n", data.AnisoBias);
  463. Trace(" Dimension = %d\n", data.Dimension);
  464. Trace(" PackedMips = %d\n", data.PackedMips);
  465. Trace(" MipAddress = 0x%08X (Effective : 0x%08X)\n", data.MipAddress, data.MipAddress<<12);
  466. break;
  467. }
  468. default:
  469. Assert(false);
  470. }
  471. Trace(" }\n");
  472. }
  473. //Парсер пакетов 0 типа (установка пачки регистров GPU)
  474. //===========================================================================================================================================
  475. void precompiledBatch::ParseType0Packet (const DWORD * dataStream, DWORD count, DWORD gpuRegisterBase)
  476. {
  477. Trace("Write DWORD to %d registers (base index = 0x%08X)\n", count, gpuRegisterBase);
  478. Trace("{\n");
  479. for (DWORD regIdx = 0; regIdx < count; regIdx++)
  480. {
  481. dwParser_Offset = (((DWORD)dataStream - (DWORD)baseData));
  482. Trace(" ");
  483. DWORD regData = *dataStream;
  484. bool bNotFound = false;
  485. DWORD regIndex = gpuRegisterBase + regIdx;
  486. GPUREGISTER gpuRegIndex = (GPUREGISTER)regIndex;
  487. switch (gpuRegIndex)
  488. {
  489. case GPUREG_WAITUNTIL:
  490. {
  491. Trace("GPUREG_WAITUNTIL\n");
  492. break;
  493. }
  494. case GPUREG_COHERSIZEHOST:
  495. {
  496. Trace("GPUREG_COHERSIZEHOST = 0x%08X\n", regData);
  497. break;
  498. }
  499. case GPUREG_COHERBASEHOST:
  500. {
  501. Trace("GPUREG_COHERBASEHOST = 0x%08X\n", regData);
  502. break;
  503. }
  504. case GPUREG_COHERSTATUSHOST:
  505. {
  506. GPU_COHERSTATUS dta;
  507. dta.dword = regData;
  508. Trace("GPUREG_COHERSTATUSHOST = [%d, %d, %d, %d, %d, %d, %d, %d]\n", dta.DestBase0Enable, dta.DestBase1Enable, dta.DestBase2Enable, dta.DestBase3Enable, dta.DestBase4Enable, dta.DestBase5Enable, dta.DestBase6Enable, dta.DestBase7Enable);
  509. break;
  510. }
  511. case GPUREG_CPUINTERRUPTACK:
  512. {
  513. Trace("GPUREG_CPUINTERRUPTACK\n");
  514. break;
  515. }
  516. case GPUREG_CALLBACKADDRESS:
  517. {
  518. Trace("GPUREG_CALLBACKADDRESS\n");
  519. break;
  520. }
  521. case GPUREG_GPRMANAGEMENT:
  522. {
  523. Trace("GPUREG_GPRMANAGEMENT\n");
  524. break;
  525. }
  526. case GPUREG_INSTSTOREMANAGEMENT:
  527. {
  528. Trace("GPUREG_INSTSTOREMANAGEMENT\n");
  529. break;
  530. }
  531. case GPUREG_INVALIDATECONSTANTS:
  532. {
  533. Trace("GPUREG_INVALIDATECONSTANTS\n");
  534. break;
  535. }
  536. case GPUREG_BCCONTROL:
  537. {
  538. Trace("GPUREG_BCCONTROL\n");
  539. break;
  540. }
  541. case GPUREG_SURFACEINFO:
  542. {
  543. Trace("GPUREG_SURFACEINFO\n");
  544. break;
  545. }
  546. case GPUREG_COLOR0INFO:
  547. {
  548. Trace("GPUREG_COLOR0INFO\n");
  549. break;
  550. }
  551. case GPUREG_DEPTHINFO:
  552. {
  553. Trace("GPUREG_DEPTHINFO\n");
  554. break;
  555. }
  556. case GPUREG_COLOR1INFO:
  557. {
  558. Trace("GPUREG_COLOR1INFO\n");
  559. break;
  560. }
  561. case GPUREG_COLOR2INFO:
  562. {
  563. Trace("GPUREG_COLOR2INFO\n");
  564. break;
  565. }
  566. case GPUREG_COLOR3INFO:
  567. {
  568. Trace("GPUREG_COLOR3INFO\n");
  569. break;
  570. }
  571. case GPUREG_COHERDESTBASE0:
  572. {
  573. Trace("GPUREG_COHERDESTBASE0\n");
  574. break;
  575. }
  576. case GPUREG_COHERDESTBASE1:
  577. {
  578. Trace("GPUREG_COHERDESTBASE1 = 0x%08X\n", regData);
  579. break;
  580. }
  581. case GPUREG_COHERDESTBASE2:
  582. {
  583. Trace("GPUREG_COHERDESTBASE2 = 0x%08X\n", regData);
  584. break;
  585. }
  586. case GPUREG_COHERDESTBASE3:
  587. {
  588. Trace("GPUREG_COHERDESTBASE3 = 0x%08X\n", regData);
  589. break;
  590. }
  591. case GPUREG_COHERDESTBASE4:
  592. {
  593. Trace("GPUREG_COHERDESTBASE4 = 0x%08X\n", regData);
  594. break;
  595. }
  596. case GPUREG_COHERDESTBASE5:
  597. {
  598. Trace("GPUREG_COHERDESTBASE5 = 0x%08X\n", regData);
  599. break;
  600. }
  601. case GPUREG_COHERDESTBASE6:
  602. {
  603. Trace("GPUREG_COHERDESTBASE6 = 0x%08X\n", regData);
  604. break;
  605. }
  606. case GPUREG_COHERDESTBASE7:
  607. {
  608. Trace("GPUREG_COHERDESTBASE7 = 0x%08X\n", regData);
  609. break;
  610. }
  611. case GPUREG_SCREENSCISSORTL:
  612. {
  613. Trace("GPUREG_SCREENSCISSORTL\n");
  614. break;
  615. }
  616. case GPUREG_SCREENSCISSORBR:
  617. {
  618. Trace("GPUREG_SCREENSCISSORBR\n");
  619. break;
  620. }
  621. case GPUREG_WINDOWOFFSET:
  622. {
  623. Trace("GPUREG_WINDOWOFFSET\n");
  624. break;
  625. }
  626. case GPUREG_WINDOWSCISSORTL:
  627. {
  628. Trace("GPUREG_WINDOWSCISSORTL\n");
  629. break;
  630. }
  631. case GPUREG_WINDOWSCISSORBR:
  632. {
  633. Trace("GPUREG_WINDOWSCISSORBR\n");
  634. break;
  635. }
  636. case GPUREG_MAXVTXINDX:
  637. {
  638. Trace("GPUREG_MAXVTXINDX\n");
  639. break;
  640. }
  641. case GPUREG_MINVTXINDX:
  642. {
  643. Trace("GPUREG_MINVTXINDX\n");
  644. break;
  645. }
  646. case GPUREG_INDXOFFSET:
  647. {
  648. dwIndxOffset_Offset = dwParser_Offset;
  649. Trace("GPUREG_INDXOFFSET = 0x%08X\n", regData);
  650. break;
  651. }
  652. case GPUREG_MULTIPRIMIBRESETINDX:
  653. {
  654. Trace("GPUREG_MULTIPRIMIBRESETINDX\n");
  655. break;
  656. }
  657. case GPUREG_COLORMASK:
  658. {
  659. if (bLogOnlyWhenParse == false)
  660. {
  661. dwColorMask_Offset = dwParser_Offset;
  662. }
  663. GPU_COLORMASK dta;
  664. dta.dword = regData;
  665. originalColorMask = dta.Write0;
  666. Trace("GPUREG_COLORMASK [%d, %d, %d, %d]\n", dta.Write0, dta.Write1, dta.Write2, dta.Write3);
  667. break;
  668. }
  669. case GPUREG_BLENDRED:
  670. {
  671. Trace("GPUREG_BLENDRED\n");
  672. break;
  673. }
  674. case GPUREG_BLENDGREEN:
  675. {
  676. Trace("GPUREG_BLENDGREEN\n");
  677. break;
  678. }
  679. case GPUREG_BLENDBLUE:
  680. {
  681. Trace("GPUREG_BLENDBLUE\n");
  682. break;
  683. }
  684. case GPUREG_BLENDALPHA:
  685. {
  686. Trace("GPUREG_BLENDALPHA\n");
  687. break;
  688. }
  689. case GPUREG_STENCILREFMASKBF:
  690. {
  691. Trace("GPUREG_STENCILREFMASKBF\n");
  692. break;
  693. }
  694. case GPUREG_STENCILREFMASK:
  695. {
  696. Trace("GPUREG_STENCILREFMASK\n");
  697. break;
  698. }
  699. case GPUREG_ALPHAREF:
  700. {
  701. float * pFloat = (float *)&regData;
  702. Trace("GPUREG_ALPHAREF [%f]\n", pFloat);
  703. break;
  704. }
  705. case GPUREG_VPORTXSCALE:
  706. {
  707. Trace("GPUREG_VPORTXSCALE\n");
  708. break;
  709. }
  710. case GPUREG_VPORTXOFFSET:
  711. {
  712. Trace("GPUREG_VPORTXOFFSET\n");
  713. break;
  714. }
  715. case GPUREG_VPORTYSCALE:
  716. {
  717. Trace("GPUREG_VPORTYSCALE\n");
  718. break;
  719. }
  720. case GPUREG_VPORTYOFFSET:
  721. {
  722. Trace("GPUREG_VPORTYOFFSET\n");
  723. break;
  724. }
  725. case GPUREG_VPORTZSCALE:
  726. {
  727. Trace("GPUREG_VPORTZSCALE\n");
  728. break;
  729. }
  730. case GPUREG_VPORTZOFFSET:
  731. {
  732. Trace("GPUREG_VPORTZOFFSET\n");
  733. break;
  734. }
  735. case GPUREG_PROGRAMCONTROL:
  736. {
  737. GPU_PROGRAMCONTROL dta;
  738. dta.dword = regData;
  739. Trace("GPUREG_PROGRAMCONTROL (VsMaxReg = %d, PsMaxReg = %d)...\n", dta.VsMaxReg, dta.PsMaxReg);
  740. break;
  741. }
  742. case GPUREG_CONTEXTMISC:
  743. {
  744. GPU_CONTEXTMISC dta;
  745. dta.dword = regData;
  746. Trace("GPUREG_CONTEXTMISC (SampleControl = %d)...\n", dta.SampleControl);
  747. break;
  748. }
  749. case GPUREG_INTERPOLATORCONTROL:
  750. {
  751. GPU_INTERPOLATORCONTROL dta;
  752. dta.dword = regData;
  753. Trace("GPUREG_INTERPOLATORCONTROL (ParamShade = %d, SamplingPattern = %d)...\n", dta.ParamShade, dta.SamplingPattern);
  754. break;
  755. }
  756. case GPUREG_WRAPPING0:
  757. {
  758. Trace("GPUREG_WRAPPING0\n");
  759. break;
  760. }
  761. case GPUREG_WRAPPING1:
  762. {
  763. Trace("GPUREG_WRAPPING1\n");
  764. break;
  765. }
  766. case GPUREG_DEPTHCONTROL:
  767. {
  768. if (bLogOnlyWhenParse == false)
  769. {
  770. dwDepthControl_Offset = dwParser_Offset;
  771. }
  772. GPU_DEPTHCONTROL dta;
  773. dta.dword = regData;
  774. originalZEnable = dta.ZWriteEnable;
  775. Trace("GPUREG_DEPTHCONTROL [zenable = %d, zwriteenable = %d]\n", dta.ZEnable, dta.ZWriteEnable);
  776. break;
  777. }
  778. case GPUREG_BLENDCONTROL0:
  779. {
  780. if (bLogOnlyWhenParse == false)
  781. {
  782. dwBlendControl0_Offset = dwParser_Offset;
  783. }
  784. GPU_BLENDCONTROL dta;
  785. dta.dword = regData;
  786. Trace("GPUREG_BLENDCONTROL0 color[%d, %d, %d] alpha[%d, %d, %d]\n", dta.ColorBlendOp, dta.ColorDestBlend, dta.ColorSrcBlend, dta.AlphaBlendOp, dta.AlphaDestBlend, dta.AlphaSrcBlend);
  787. break;
  788. }
  789. case GPUREG_COLORCONTROL:
  790. {
  791. GPU_COLORCONTROL dta;
  792. dta.dword = regData;
  793. Trace("GPUREG_COLORCONTROL [alpha test = %d, alpha func = %d, alpha to mask = %d]\n", dta.AlphaTestEnable, dta.AlphaFunc, dta.AlphaToMaskEnable);
  794. break;
  795. }
  796. case GPUREG_HICONTROL:
  797. {
  798. GPU_HICONTROL dta;
  799. dta.dword = regData;
  800. if (bLogOnlyWhenParse == false)
  801. {
  802. dwHiZControl_Offset = dwParser_Offset;
  803. }
  804. originalHyperZEnable = dta.HiZWriteEnable;
  805. Trace("GPUREG_HICONTROL (HiZEnable = %d)...\n", dta.HiZEnable);
  806. break;
  807. }
  808. case GPUREG_CLIPCONTROL:
  809. {
  810. GPU_CLIPCONTROL dta;
  811. dta.dword = regData;
  812. Trace("GPUREG_CLIPCONTROL [%d, %d, %d, %d, %d, %d], mode %d, disable %d, cullonly %d\n", dta.ClipPlaneEnable0, dta.ClipPlaneEnable1, dta.ClipPlaneEnable2, dta.ClipPlaneEnable3, dta.ClipPlaneEnable4, dta.ClipPlaneEnable5, dta.ClipPlaneMode, dta.ClipDisable, dta.ClipPlaneCullOnlyEnable);
  813. break;
  814. }
  815. case GPUREG_MODECONTROL:
  816. {
  817. if (bLogOnlyWhenParse == false)
  818. {
  819. dwSetCullMode_Offset = dwParser_Offset;
  820. }
  821. GPU_MODECONTROL dta;
  822. dta.dword = regData;
  823. originalGpuCull = (GPUCULL)dta.CullMode;
  824. Trace("GPUREG_MODECONTROL (CullMode = %d, MSAA = %d)...\n", dta.CullMode, dta.MsaaEnable);
  825. break;
  826. }
  827. case GPUREG_VTECONTROL:
  828. {
  829. Trace("GPUREG_VTECONTROL\n");
  830. break;
  831. }
  832. case GPUREG_EDRAMMODECONTROL:
  833. {
  834. GPU_EDRAMMODECONTROL dta;
  835. dta.dword = regData;
  836. const char * szMode = "unkonwn";
  837. switch (dta.EdramMode)
  838. {
  839. case GPUEDRAMMODE_NOP:
  840. szMode = "GPUEDRAMMODE_NOP";
  841. break;
  842. case GPUEDRAMMODE_COLOR_DEPTH:
  843. szMode = "GPUEDRAMMODE_COLOR_DEPTH";
  844. break;
  845. case GPUEDRAMMODE_DOUBLE_DEPTH:
  846. szMode = "GPUEDRAMMODE_DOUBLE_DEPTH";
  847. break;
  848. case GPUEDRAMMODE_COPY:
  849. szMode = "GPUEDRAMMODE_COPY";
  850. break;
  851. }
  852. Trace("GPUREG_EDRAMMODECONTROL [mode = '%s', %d]\n", szMode, dta.ColorDepthMacro);
  853. break;
  854. }
  855. case GPUREG_BLENDCONTROL1:
  856. {
  857. if (bLogOnlyWhenParse == false)
  858. {
  859. dwBlendControl1_Offset = dwParser_Offset;
  860. }
  861. Trace("GPUREG_BLENDCONTROL1\n");
  862. break;
  863. }
  864. case GPUREG_BLENDCONTROL2:
  865. {
  866. if (bLogOnlyWhenParse == false)
  867. {
  868. dwBlendControl2_Offset = dwParser_Offset;
  869. }
  870. Trace("GPUREG_BLENDCONTROL2\n");
  871. break;
  872. }
  873. case GPUREG_BLENDCONTROL3:
  874. {
  875. if (bLogOnlyWhenParse == false)
  876. {
  877. dwBlendControl3_Offset = dwParser_Offset;
  878. }
  879. Trace("GPUREG_BLENDCONTROL3\n");
  880. break;
  881. }
  882. case GPUREG_POINTSIZE:
  883. {
  884. Trace("GPUREG_POINTSIZE\n");
  885. break;
  886. }
  887. case GPUREG_POINTMINMAX:
  888. {
  889. Trace("GPUREG_POINTMINMAX\n");
  890. break;
  891. }
  892. case GPUREG_LINECONTROL:
  893. {
  894. Trace("GPUREG_LINECONTROL\n");
  895. break;
  896. }
  897. case GPUREG_OUTPUTPATHCONTROL:
  898. {
  899. Trace("GPUREG_OUTPUTPATHCONTROL\n");
  900. break;
  901. }
  902. case GPUREG_HOSCONTROL:
  903. {
  904. Trace("GPUREG_HOSCONTROL\n");
  905. break;
  906. }
  907. case GPUREG_HOSMAXTESSLEVEL:
  908. {
  909. Trace("GPUREG_HOSMAXTESSLEVEL\n");
  910. break;
  911. }
  912. case GPUREG_HOSMINTESSLEVEL:
  913. {
  914. Trace("GPUREG_HOSMINTESSLEVEL\n");
  915. break;
  916. }
  917. case GPUREG_HOSREUSEDEPTH:
  918. {
  919. Trace("GPUREG_HOSREUSEDEPTH\n");
  920. break;
  921. }
  922. case GPUREG_GROUPPRIMTYPE:
  923. {
  924. Trace("GPUREG_GROUPPRIMTYPE\n");
  925. break;
  926. }
  927. case GPUREG_GROUPFIRSTDECR:
  928. {
  929. Trace("GPUREG_GROUPFIRSTDECR\n");
  930. break;
  931. }
  932. case GPUREG_GROUPDECR:
  933. {
  934. Trace("GPUREG_GROUPDECR\n");
  935. break;
  936. }
  937. case GPUREG_GROUPVECT0CONTROL:
  938. {
  939. Trace("GPUREG_GROUPVECT0CONTROL\n");
  940. break;
  941. }
  942. case GPUREG_GROUPVECT1CONTROL:
  943. {
  944. Trace("GPUREG_GROUPVECT1CONTROL\n");
  945. break;
  946. }
  947. case GPUREG_GROUPVECT0FMTCONTROL:
  948. {
  949. Trace("GPUREG_GROUPVECT0FMTCONTROL\n");
  950. break;
  951. }
  952. case GPUREG_GROUPVECT1FMTCONTROL:
  953. {
  954. Trace("GPUREG_GROUPVECT1FMTCONTROL\n");
  955. break;
  956. }
  957. case GPUREG_MPASSPSCONTROL:
  958. {
  959. Trace("GPUREG_MPASSPSCONTROL\n");
  960. break;
  961. }
  962. case GPUREG_VIZQUERY:
  963. {
  964. Trace("GPUREG_VIZQUERY\n");
  965. break;
  966. }
  967. case GPUREG_ENHANCE:
  968. {
  969. Trace("GPUREG_ENHANCE\n");
  970. break;
  971. }
  972. case GPUREG_SCLINECONTROL:
  973. {
  974. Trace("GPUREG_SCLINECONTROL\n");
  975. break;
  976. }
  977. case GPUREG_AACONFIG:
  978. {
  979. Trace("GPUREG_AACONFIG\n");
  980. break;
  981. }
  982. case GPUREG_VTXCONTROL:
  983. {
  984. Trace("GPUREG_VTXCONTROL\n");
  985. break;
  986. }
  987. case GPUREG_GBVERTCLIPADJ:
  988. {
  989. Trace("GPUREG_GBVERTCLIPADJ\n");
  990. break;
  991. }
  992. case GPUREG_GBVERTDISCADJ:
  993. {
  994. Trace("GPUREG_GBVERTDISCADJ\n");
  995. break;
  996. }
  997. case GPUREG_GBHORZCLIPADJ:
  998. {
  999. Trace("GPUREG_GBHORZCLIPADJ\n");
  1000. break;
  1001. }
  1002. case GPUREG_GBHORZDISCADJ:
  1003. {
  1004. Trace("GPUREG_GBHORZDISCADJ\n");
  1005. break;
  1006. }
  1007. case GPUREG_VSCONST:
  1008. {
  1009. Trace("GPUREG_VSCONST\n");
  1010. break;
  1011. }
  1012. case GPUREG_PSCONST:
  1013. {
  1014. Trace("GPUREG_PSCONST\n");
  1015. break;
  1016. }
  1017. case GPUREG_DEBUGMISC0:
  1018. {
  1019. Trace("GPUREG_DEBUGMISC0\n");
  1020. break;
  1021. }
  1022. case GPUREG_DEBUGMISC1:
  1023. {
  1024. Trace("GPUREG_DEBUGMISC1\n");
  1025. break;
  1026. }
  1027. case GPUREG_AAMASK:
  1028. {
  1029. Trace("GPUREG_AAMASK\n");
  1030. break;
  1031. }
  1032. case GPUREG_VERTEXREUSEBLOCKCONTROL:
  1033. {
  1034. Trace("GPUREG_VERTEXREUSEBLOCKCONTROL\n");
  1035. break;
  1036. }
  1037. case GPUREG_OUTDEALLOCCONTROL:
  1038. {
  1039. Trace("GPUREG_OUTDEALLOCCONTROL\n");
  1040. break;
  1041. }
  1042. case GPUREG_COPYCONTROL:
  1043. {
  1044. Trace("GPUREG_COPYCONTROL\n");
  1045. break;
  1046. }
  1047. case GPUREG_COPYDESTBASE:
  1048. {
  1049. Trace("GPUREG_COPYDESTBASE\n");
  1050. break;
  1051. }
  1052. case GPUREG_COPYDESTPITCH:
  1053. {
  1054. Trace("GPUREG_COPYDESTPITCH\n");
  1055. break;
  1056. }
  1057. case GPUREG_COPYDESTINFO:
  1058. {
  1059. Trace("GPUREG_COPYDESTINFO\n");
  1060. break;
  1061. }
  1062. case GPUREG_HICLEAR:
  1063. {
  1064. Trace("GPUREG_HICLEAR\n");
  1065. break;
  1066. }
  1067. case GPUREG_DEPTHCLEAR:
  1068. {
  1069. Trace("GPUREG_DEPTHCLEAR\n");
  1070. break;
  1071. }
  1072. case GPUREG_COLORCLEAR:
  1073. {
  1074. Trace("GPUREG_COLORCLEAR\n");
  1075. break;
  1076. }
  1077. case GPUREG_COLORCLEARLO:
  1078. {
  1079. Trace("GPUREG_COLORCLEARLO\n");
  1080. break;
  1081. }
  1082. case GPUREG_COPYFUNC:
  1083. {
  1084. Trace("GPUREG_COPYFUNC\n");
  1085. break;
  1086. }
  1087. case GPUREG_COPYREF:
  1088. {
  1089. Trace("GPUREG_COPYREF\n");
  1090. break;
  1091. }
  1092. case GPUREG_COPYMASK:
  1093. {
  1094. Trace("GPUREG_COPYMASK\n");
  1095. break;
  1096. }
  1097. case GPUREG_COPYSURFACESLICE:
  1098. {
  1099. Trace("GPUREG_COPYSURFACESLICE\n");
  1100. break;
  1101. }
  1102. case GPUREG_SAMPLECOUNTCONTROL:
  1103. {
  1104. Trace("GPUREG_SAMPLECOUNTCONTROL\n");
  1105. break;
  1106. }
  1107. case GPUREG_SAMPLECOUNTADDRESS:
  1108. {
  1109. Trace("GPUREG_SAMPLECOUNTADDRESS\n");
  1110. break;
  1111. }
  1112. case GPUREG_POLYOFFSETFRONTSCALE:
  1113. {
  1114. Trace("GPUREG_POLYOFFSETFRONTSCALE\n");
  1115. break;
  1116. }
  1117. case GPUREG_POLYOFFSETFRONTOFFSET:
  1118. {
  1119. Trace("GPUREG_POLYOFFSETFRONTOFFSET\n");
  1120. break;
  1121. }
  1122. case GPUREG_POLYOFFSETBACKSCALE:
  1123. {
  1124. Trace("GPUREG_POLYOFFSETBACKSCALE\n");
  1125. break;
  1126. }
  1127. case GPUREG_POLYOFFSETBACKOFFSET:
  1128. {
  1129. Trace("GPUREG_POLYOFFSETBACKOFFSET\n");
  1130. break;
  1131. }
  1132. case GPUREG_POINTXRAD:
  1133. {
  1134. Trace("GPUREG_POINTXRAD\n");
  1135. break;
  1136. }
  1137. case GPUREG_POINTYRAD:
  1138. {
  1139. Trace("GPUREG_POINTYRAD\n");
  1140. break;
  1141. }
  1142. case GPUREG_POINTCONSTANTSIZE:
  1143. {
  1144. Trace("GPUREG_POINTCONSTANTSIZE\n");
  1145. break;
  1146. }
  1147. case GPUREG_POINTCULLRAD:
  1148. {
  1149. Trace("GPUREG_POINTCULLRAD\n");
  1150. break;
  1151. }
  1152. default:
  1153. bNotFound = true;
  1154. } //switch
  1155. //Если не нашли проверяем не одна из константа ли это, и номер константы вычисляем
  1156. if (bNotFound)
  1157. {
  1158. if (regIndex > GPUREG_CALLBACKADDRESS && regIndex < GPUREG_GPRMANAGEMENT)
  1159. {
  1160. Trace("Pix, Debug data... [0x%08X]\n", regData);
  1161. bNotFound = false;
  1162. }
  1163. if (regIndex >= GPUREG_CLIPPLANE0 && regIndex < GPUREG_CLIPPLANE0+4)
  1164. {
  1165. DWORD dwComponent = (regIndex - GPUREG_CLIPPLANE0);
  1166. float val = *((float*)&regData);
  1167. Trace("ClipPlane0[%d] = %f\n", dwComponent, val);
  1168. bNotFound = false;
  1169. }
  1170. if (regIndex >= GPUREG_CLIPPLANE1 && regIndex < GPUREG_CLIPPLANE1+4)
  1171. {
  1172. DWORD dwComponent = (regIndex - GPUREG_CLIPPLANE1);
  1173. float val = *((float*)&regData);
  1174. Trace("ClipPlane1[%d] = %f\n", dwComponent, val);
  1175. bNotFound = false;
  1176. }
  1177. if (regIndex >= GPUREG_CLIPPLANE2 && regIndex < GPUREG_CLIPPLANE2+4)
  1178. {
  1179. DWORD dwComponent = (regIndex - GPUREG_CLIPPLANE2);
  1180. float val = *((float*)&regData);
  1181. Trace("ClipPlane2[%d] = %f\n", dwComponent, val);
  1182. bNotFound = false;
  1183. }
  1184. if (regIndex >= GPUREG_CLIPPLANE3 && regIndex < GPUREG_CLIPPLANE3+4)
  1185. {
  1186. DWORD dwComponent = (regIndex - GPUREG_CLIPPLANE3);
  1187. float val = *((float*)&regData);
  1188. Trace("ClipPlane3[%d] = %f\n", dwComponent, val);
  1189. bNotFound = false;
  1190. }
  1191. if (regIndex >= GPUREG_CLIPPLANE4 && regIndex < GPUREG_CLIPPLANE4+4)
  1192. {
  1193. DWORD dwComponent = (regIndex - GPUREG_CLIPPLANE4);
  1194. float val = *((float*)&regData);
  1195. Trace("ClipPlane4[%d] = %f\n", dwComponent, val);
  1196. bNotFound = false;
  1197. }
  1198. if (regIndex >= GPUREG_CLIPPLANE5 && regIndex < GPUREG_CLIPPLANE5+4)
  1199. {
  1200. DWORD dwComponent = (regIndex - GPUREG_CLIPPLANE5);
  1201. float val = *((float*)&regData);
  1202. Trace("ClipPlane5[%d] = %f\n", dwComponent, val);
  1203. bNotFound = false;
  1204. }
  1205. //Vertex или Pixel shader константа
  1206. if (regIndex >= GPUREG_ALUCONSTANTS && regIndex < GPUREG_ALUCONSTANTS+(GPU_ALU_CONSTANTS*4))
  1207. {
  1208. DWORD dwAluConstIndex = (regIndex - GPUREG_ALUCONSTANTS) / sizeof(DWORD);
  1209. DWORD dwComponent = (regIndex - GPUREG_ALUCONSTANTS) - (dwAluConstIndex * sizeof(DWORD));
  1210. if (bLogOnlyWhenParse == false)
  1211. {
  1212. if (dwComponent == 0)
  1213. {
  1214. dwALUConst_Offsets[dwAluConstIndex] = dwParser_Offset;
  1215. }
  1216. }
  1217. float val = *((float*)&regData);
  1218. Trace("Alu const [%d].v[%d] = %f\n", dwAluConstIndex, dwComponent, val);
  1219. bNotFound = false;
  1220. }
  1221. //Установка врешинного потока или установка текстуры
  1222. if (regIndex >= GPUREG_FETCHCONSTANTS && regIndex < GPUREG_FETCHCONSTANTS+(GPU_FETCH_CONSTANTS*sizeof(GPUFETCH_CONSTANT)/sizeof(DWORD)))
  1223. {
  1224. DWORD dwFetchConstIndex = (regIndex-GPUREG_FETCHCONSTANTS)/(sizeof(GPUFETCH_CONSTANT)/sizeof(DWORD));
  1225. DWORD dwFetchConstElement = (regIndex-GPUREG_FETCHCONSTANTS) - dwFetchConstIndex*(sizeof(GPUFETCH_CONSTANT)/sizeof(DWORD));
  1226. //Вертексные потоки устанавливаются с последнего регистра и растут в обратную сторону
  1227. //31 - это потоки 0, 1, 2
  1228. //30 - это потоки 3, 4, 5
  1229. if (dwFetchConstIndex == 31)
  1230. {
  1231. DWORD dwVertexStreamIndex = 95 - ((regIndex-GPUREG_FETCHCONSTANTS)/(sizeof(GPUVERTEX_FETCH_CONSTANT)/sizeof(DWORD)));
  1232. //они пачками по 3 штуки, поэтому вместо 6 всего 2 индекса...
  1233. dwFetchConstElement = dwFetchConstElement % 2;
  1234. Trace("Vertex Fetch const [%d].v[%d]\n", dwVertexStreamIndex, dwFetchConstElement);
  1235. ParseVertexFetchConst(dwVertexStreamIndex, dwFetchConstElement, regData);
  1236. } else
  1237. {
  1238. //Установка текстуры с нулевого регистра и растет вниз как обычно
  1239. Trace("Texture Fetch const [%d].v[%d]\n", dwFetchConstIndex, dwFetchConstElement);
  1240. ParseTextureFetchConst(dwFetchConstIndex, dwFetchConstElement, regData);
  1241. }
  1242. bNotFound = false;
  1243. }
  1244. //
  1245. if (regIndex >= GPUREG_FLOWCONSTANTS && regIndex < GPUREG_FLOWCONSTANTS+GPU_FLOW_CONSTANTS)
  1246. {
  1247. //
  1248. //Trace("Flow const\n");
  1249. bNotFound = false;
  1250. }
  1251. //Bool константы упакованы побитно, в одном dword 32 константы (256 штук - 8 dword)
  1252. if (regIndex >= GPUREG_BOOLEANCONSTANTS && regIndex < GPUREG_BOOLEANCONSTANTS+GPU_BOOLEAN_CONSTANTS/32)
  1253. {
  1254. //
  1255. Trace("Bool const\n");
  1256. bNotFound = false;
  1257. DWORD dwBoolIndex = regIndex-GPUREG_BOOLEANCONSTANTS;
  1258. Assert (dwBoolIndex >= 0 && dwBoolIndex < MAX_ALU_CONST_COUNT_BOOL)
  1259. dwALUConstBool_Offsets[dwBoolIndex] = dwParser_Offset;
  1260. }
  1261. //int константы упакованы (32 штуки)
  1262. if (regIndex >= GPUREG_INTEGERCONSTANTS && regIndex < GPUREG_INTEGERCONSTANTS+GPU_INTEGER_CONSTANTS)
  1263. {
  1264. //
  1265. Trace("Integer const\n");
  1266. bNotFound = false;
  1267. }
  1268. if (regIndex >= GPUREG_FLUSHFETCHCONSTANTS && regIndex < GPUREG_FLUSHFETCHCONSTANTS+3)
  1269. {
  1270. //
  1271. Trace("Flush fetch const [%d] = 0x%08X\n", regIndex-GPUREG_FLUSHFETCHCONSTANTS, regData);
  1272. bNotFound = false;
  1273. }
  1274. }
  1275. if (bNotFound)
  1276. {
  1277. Trace("---- Unknown GPU const !!! [0x%08X]\n", regIndex);
  1278. Assert(false);
  1279. }
  1280. dataStream++;
  1281. }
  1282. Trace("}\n");
  1283. }
  1284. //Парсер пакетов 3 типа (выполнение GPU операции с параметрами)
  1285. //===========================================================================================================================================
  1286. void precompiledBatch::ParseType3Packet (DWORD opCode, const DWORD * dataStream, DWORD count)
  1287. {
  1288. dwParser_Offset = (((DWORD)dataStream - (DWORD)baseData));
  1289. GPUCOMMANDOP code = (GPUCOMMANDOP)opCode;
  1290. switch (code)
  1291. {
  1292. case GPUCOMMANDOP_NOP:
  1293. {
  1294. break;
  1295. }
  1296. case GPUCOMMANDOP_REG_RMW:
  1297. {
  1298. break;
  1299. }
  1300. case GPUCOMMANDOP_DRAW:
  1301. {
  1302. bool bNotProcessed = true;
  1303. //Рисование неиндексного примитива
  1304. if ((count*sizeof(DWORD)) == sizeof(GPUCOMMAND_DRAW_AUTO))
  1305. {
  1306. bNotProcessed = false;
  1307. Trace ("Draw (DrawPrimitive)\n");
  1308. Trace ("{\n");
  1309. GPUCOMMAND_DRAW_AUTO* drawData = (GPUCOMMAND_DRAW_AUTO*)dataStream;
  1310. Trace (" VisQueryId = %d\n", drawData->VizQueryId);
  1311. Trace (" UseVizQuery = %d\n", drawData->UseVizQuery);
  1312. TracePrimitiveType (drawData->PrimType);
  1313. switch (drawData->SrcSelect)
  1314. {
  1315. case GPUINDEXSELECT_DMA:
  1316. Trace (" SrcSelect = GPUINDEXSELECT_DMA\n");
  1317. break;
  1318. case GPUINDEXSELECT_IMMEDIATE:
  1319. Trace (" SrcSelect = GPUINDEXSELECT_IMMEDIATE\n");
  1320. break;
  1321. case GPUINDEXSELECT_AUTO:
  1322. Trace (" SrcSelect = GPUINDEXSELECT_AUTO\n");
  1323. break;
  1324. default:
  1325. Assert(false);
  1326. }
  1327. Trace (" MajorMode = %d\n", drawData->MajorMode);
  1328. Trace (" NotEndOfPacket = %d\n", drawData->NotEndOfPacket);
  1329. Trace (" NumIndices = %d\n", drawData->NumIndices);
  1330. Trace ("}\n");
  1331. }
  1332. //Рисование индексного примитива
  1333. if ((count*sizeof(DWORD)) == sizeof(GPUCOMMAND_DRAW_INDEX))
  1334. {
  1335. if (bLogOnlyWhenParse == false)
  1336. {
  1337. dwDrawToken_Offset = dwParser_Offset;
  1338. }
  1339. bNotProcessed = false;
  1340. Trace ("Draw (DrawIndexedPrimitive)\n");
  1341. Trace ("{\n");
  1342. GPUCOMMAND_DRAW_INDEX* drawData = (GPUCOMMAND_DRAW_INDEX*)dataStream;
  1343. Trace (" VisQueryId = %d\n", drawData->VizQueryId);
  1344. Trace (" UseVizQuery = %d\n", drawData->UseVizQuery);
  1345. TracePrimitiveType (drawData->PrimType);
  1346. Assert (drawData->SrcSelect == GPUINDEXSELECT_DMA);
  1347. Trace (" SrcSelect = GPUINDEXSELECT_DMA\n");
  1348. Trace (" MajorMode = %d\n", drawData->MajorMode);
  1349. if (drawData->IndexType == GPUINDEXTYPE_16BIT)
  1350. {
  1351. Trace (" IndexType = GPUINDEXTYPE_16BIT\n");
  1352. } else
  1353. {
  1354. if (drawData->IndexType == GPUINDEXTYPE_32BIT)
  1355. {
  1356. Trace (" IndexType = GPUINDEXTYPE_32BIT\n");
  1357. } else
  1358. {
  1359. Assert(false);
  1360. }
  1361. }
  1362. Trace (" NotEndOfPacket = %d\n", drawData->NotEndOfPacket);
  1363. Trace (" NumIndices = %d\n", drawData->NumIndices);
  1364. Trace (" IndexBase = 0x%08X (Effective : 0x%08X)\n", drawData->IndexBase, drawData->IndexBase << 5);
  1365. Trace (" IndexSize = %d\n", drawData->IndexSize);
  1366. switch(drawData->Endian)
  1367. {
  1368. case GPUENDIAN_NONE:
  1369. Trace (" Endian = GPUENDIAN_NONE\n");
  1370. break;
  1371. case GPUENDIAN_8IN16:
  1372. Trace (" Endian = GPUENDIAN_8IN16\n");
  1373. break;
  1374. case GPUENDIAN_8IN32:
  1375. Trace (" Endian = GPUENDIAN_8IN32\n");
  1376. break;
  1377. case GPUENDIAN_16IN32:
  1378. Trace (" Endian = GPUENDIAN_16IN32\n");
  1379. break;
  1380. default:
  1381. Assert(false);
  1382. }
  1383. Trace ("}\n");
  1384. }
  1385. //Если DRAW не распознали
  1386. Assert(bNotProcessed == false);
  1387. break;
  1388. }
  1389. case GPUCOMMANDOP_VIZ_QUERY:
  1390. {
  1391. break;
  1392. }
  1393. case GPUCOMMANDOP_SET_STATE:
  1394. {
  1395. break;
  1396. }
  1397. case GPUCOMMANDOP_WAIT_FOR_IDLE:
  1398. {
  1399. break;
  1400. }
  1401. case GPUCOMMANDOP_LOAD_SHADER:
  1402. {
  1403. //Загрузить shader на исполнение
  1404. GPUCOMMAND_LOAD_SHADER* loadShader = (GPUCOMMAND_LOAD_SHADER*)dataStream;
  1405. Trace ("Load shader\n");
  1406. Trace ("{\n");
  1407. //Вершинный шейдер
  1408. if (loadShader->Type == GPULOADTYPE_VERTEX)
  1409. {
  1410. Trace (" Type = GPULOADTYPE_VERTEX\n");
  1411. dwSetVertexShader_Offset_ = dwParser_Offset;
  1412. } else
  1413. {
  1414. //Пиксельный шейдер
  1415. if (loadShader->Type == GPULOADTYPE_PIXEL)
  1416. {
  1417. Trace (" Type = GPULOADTYPE_PIXEL\n");
  1418. dwSetPixelShader_Offset_ = dwParser_Offset;
  1419. } else
  1420. {
  1421. //неизвестный шейдер
  1422. Assert(false);
  1423. }
  1424. }
  1425. Trace (" Adress = 0x%08X (Effective : 0x%08X)\n", loadShader->Address, loadShader->Address << 5);
  1426. Trace (" Size = %d\n", loadShader->Size);
  1427. Trace ("}\n");
  1428. break;
  1429. }
  1430. case GPUCOMMANDOP_LOAD_SHADER_IMMEDIATE:
  1431. {
  1432. break;
  1433. }
  1434. case GPUCOMMANDOP_SET_CONSTANT:
  1435. {
  1436. break;
  1437. }
  1438. case GPUCOMMANDOP_LOAD_ALU_CONSTANT:
  1439. {
  1440. break;
  1441. }
  1442. case GPUCOMMANDOP_DRAW_IMMEDIATE:
  1443. {
  1444. break;
  1445. }
  1446. case GPUCOMMANDOP_MPEG_INDEX:
  1447. {
  1448. break;
  1449. }
  1450. case GPUCOMMANDOP_INVALIDATE_STATE:
  1451. {
  1452. break;
  1453. }
  1454. case GPUCOMMANDOP_WAIT_REG_MEM:
  1455. {
  1456. GPUCOMMAND_WAIT_REG_MEM* waitRegMem = (GPUCOMMAND_WAIT_REG_MEM*)dataStream;
  1457. Trace ("WaitRegMem\n");
  1458. Trace ("{\n");
  1459. Trace (" addr = 0x%08X\n", waitRegMem->Address);
  1460. Trace (" func = %d\n", waitRegMem->Function);
  1461. Trace (" register = 0x%08X\n", waitRegMem->Register);
  1462. Trace (" waitinterval = %d\n", waitRegMem->WaitInterval);
  1463. Trace (" ref = %d\n", waitRegMem->Reference);
  1464. Trace ("}\n");
  1465. break;
  1466. }
  1467. case GPUCOMMANDOP_MEM_WRITE:
  1468. {
  1469. break;
  1470. }
  1471. case GPUCOMMANDOP_REG_TO_MEM:
  1472. {
  1473. break;
  1474. }
  1475. case GPUCOMMANDOP_INDIRECT_BUFFER :
  1476. {
  1477. break;
  1478. }
  1479. case GPUCOMMANDOP_COND_WRITE:
  1480. {
  1481. break;
  1482. }
  1483. case GPUCOMMANDOP_EVENT_WRITE:
  1484. {
  1485. break;
  1486. }
  1487. case GPUCOMMANDOP_ME_INIT:
  1488. {
  1489. break;
  1490. }
  1491. case GPUCOMMANDOP_FIX_2_FLT_REG:
  1492. {
  1493. break;
  1494. }
  1495. case GPUCOMMANDOP_MEM_WRITE_COUNTER:
  1496. {
  1497. break;
  1498. }
  1499. case GPUCOMMANDOP_WAIT_REG_EQ:
  1500. {
  1501. break;
  1502. }
  1503. case GPUCOMMANDOP_WAIT_REG_GTE:
  1504. {
  1505. break;
  1506. }
  1507. case GPUCOMMANDOP_CPU_INTERRUPT:
  1508. {
  1509. break;
  1510. }
  1511. case GPUCOMMANDOP_EVENT_WRITE_SHADER:
  1512. {
  1513. break;
  1514. }
  1515. case GPUCOMMANDOP_EVENT_WRITE_CACHE_FLUSH:
  1516. {
  1517. break;
  1518. }
  1519. case GPUCOMMANDOP_EVENT_WRITE_SCREEN_EXTENT:
  1520. {
  1521. break;
  1522. }
  1523. case GPUCOMMANDOP_EVENT_WRITE_ZPASS_DONE:
  1524. {
  1525. break;
  1526. }
  1527. case GPUCOMMANDOP_CONTEXT_UPDATE:
  1528. {
  1529. break;
  1530. }
  1531. case GPUCOMMANDOP_SET_BIN_MASK_LO:
  1532. {
  1533. break;
  1534. }
  1535. case GPUCOMMANDOP_SET_BIN_MASK_HI:
  1536. {
  1537. break;
  1538. }
  1539. case GPUCOMMANDOP_SET_BIN_SELECT_LO:
  1540. {
  1541. break;
  1542. }
  1543. case GPUCOMMANDOP_SET_BIN_SELECT_HI:
  1544. {
  1545. break;
  1546. }
  1547. default:
  1548. //Неизвестный тип команды...
  1549. Assert(false);
  1550. }
  1551. }
  1552. //Вывести в лог, тип примитива
  1553. //===========================================================================================================================================
  1554. void precompiledBatch::TracePrimitiveType (DWORD dwPrimType)
  1555. {
  1556. switch (dwPrimType)
  1557. {
  1558. case GPUPRIMTYPE_NONE:
  1559. Trace (" PrimeType = GPUPRIMTYPE_NONE\n");
  1560. break;
  1561. case GPUPRIMTYPE_POINTLIST:
  1562. Trace (" PrimeType = GPUPRIMTYPE_POINTLIST\n");
  1563. break;
  1564. case GPUPRIMTYPE_LINELIST:
  1565. Trace (" PrimeType = GPUPRIMTYPE_LINELIST\n");
  1566. break;
  1567. case GPUPRIMTYPE_LINESTRIP:
  1568. Trace (" PrimeType = GPUPRIMTYPE_LINESTRIP\n");
  1569. break;
  1570. case GPUPRIMTYPE_TRILIST:
  1571. Trace (" PrimeType = GPUPRIMTYPE_TRILIST\n");
  1572. break;
  1573. case GPUPRIMTYPE_TRIFAN:
  1574. Trace (" PrimeType = GPUPRIMTYPE_TRIFAN\n");
  1575. break;
  1576. case GPUPRIMTYPE_TRISTRIP:
  1577. Trace (" PrimeType = GPUPRIMTYPE_TRISTRIP\n");
  1578. break;
  1579. case GPUPRIMTYPE_TRI_WITH_WFLAGS:
  1580. Trace (" PrimeType = GPUPRIMTYPE_TRI_WITH_WFLAGS\n");
  1581. break;
  1582. case GPUPRIMTYPE_RECTLIST:
  1583. Trace (" PrimeType = GPUPRIMTYPE_RECTLIST\n");
  1584. break;
  1585. case GPUPRIMTYPE_LINELOOP:
  1586. Trace (" PrimeType = GPUPRIMTYPE_LINELOOP\n");
  1587. break;
  1588. case GPUPRIMTYPE_QUADLIST:
  1589. Trace (" PrimeType = GPUPRIMTYPE_QUADLIST\n");
  1590. break;
  1591. case GPUPRIMTYPE_QUADSTRIP:
  1592. Trace (" PrimeType = GPUPRIMTYPE_QUADSTRIP\n");
  1593. break;
  1594. case GPUPRIMTYPE_POLYGON:
  1595. Trace (" PrimeType = GPUPRIMTYPE_POLYGON\n");
  1596. break;
  1597. case GPUPRIMTYPE_2D_COPY_RECT_LIST_V0:
  1598. Trace (" PrimeType = GPUPRIMTYPE_2D_COPY_RECT_LIST_V0\n");
  1599. break;
  1600. case GPUPRIMTYPE_2D_COPY_RECT_LIST_V1:
  1601. Trace (" PrimeType = GPUPRIMTYPE_2D_COPY_RECT_LIST_V1\n");
  1602. break;
  1603. case GPUPRIMTYPE_2D_COPY_RECT_LIST_V2:
  1604. Trace (" PrimeType = GPUPRIMTYPE_2D_COPY_RECT_LIST_V2\n");
  1605. break;
  1606. case GPUPRIMTYPE_2D_COPY_RECT_LIST_V3:
  1607. Trace (" PrimeType = GPUPRIMTYPE_2D_COPY_RECT_LIST_V3\n");
  1608. break;
  1609. case GPUPRIMTYPE_2D_FILL_RECT_LIST:
  1610. Trace (" PrimeType = GPUPRIMTYPE_2D_FILL_RECT_LIST\n");
  1611. break;
  1612. case GPUPRIMTYPE_2D_LINE_STRIP:
  1613. Trace (" PrimeType = GPUPRIMTYPE_2D_LINE_STRIP\n");
  1614. break;
  1615. case GPUPRIMTYPE_2D_TRI_STRIP:
  1616. Trace (" PrimeType = GPUPRIMTYPE_2D_TRI_STRIP\n");
  1617. break;
  1618. default:
  1619. //Неизвестный тип примитива
  1620. Assert(false);
  1621. }
  1622. }
  1623. void precompiledBatch::debugOutCommandBuffer(BYTE * bDataPtr, bool bDumpToLog)
  1624. {
  1625. bGlobalDump = bDumpToLog;
  1626. bLogOnlyWhenParse = true;
  1627. parseCommandBuffer(bDataPtr);
  1628. }
  1629. DWORD precompiledBatch::getBytesAllocated()
  1630. {
  1631. return dwBytesAllocated;
  1632. }
  1633. void precompiledBatch::offlineCreate (D3DCommandBuffer * cmdPrecompiledBuffer, D3DVertexShader* vertexShaderToCreateFixup, D3DPixelShader* pixelShaderToCreateFixup, bool bDumpToLog)
  1634. {
  1635. sourcePrecompiledBuffer = cmdPrecompiledBuffer;
  1636. sourcePrecompiledBuffer->AddRef();
  1637. bLogOnlyWhenParse = false;
  1638. bGlobalDump = bDumpToLog;
  1639. cmdPrecompiledBuffer->BeginFixupCreation();
  1640. {
  1641. if (vertexShaderToCreateFixup)
  1642. {
  1643. dwVSO_Temp = cmdPrecompiledBuffer->CreateVertexShaderFixup(D3DFIXUP_DYNAMIC, vertexShaderToCreateFixup, 0, 0);
  1644. } else
  1645. {
  1646. dwVSO_Temp = GPU_INVALID_OFFSET;
  1647. }
  1648. if (pixelShaderToCreateFixup)
  1649. {
  1650. dwPSO_Temp = cmdPrecompiledBuffer->CreatePixelShaderFixup(D3DFIXUP_DYNAMIC, pixelShaderToCreateFixup, 0, 0);
  1651. } else
  1652. {
  1653. dwPSO_Temp = GPU_INVALID_OFFSET;
  1654. }
  1655. }
  1656. cmdPrecompiledBuffer->EndFixupCreation();
  1657. dwHeaderSize_temp = 0;
  1658. dwCommandBufferDataSize = 0;
  1659. dwInitializationSize_temp = 0;
  1660. cmdPrecompiledBuffer->Deconstruct( 0, NULL, &dwHeaderSize_temp, NULL, &dwCommandBufferDataSize, NULL, &dwInitializationSize_temp );
  1661. //Хвост учитываем, т.к. будем добавлять токены...
  1662. dwCommandBufferDataSize = dwCommandBufferDataSize + sizeof (GPUCOMMAND_DRAW_INDEX) * 2;
  1663. pHeaderBytes_temp = ( BYTE* )malloc( dwHeaderSize_temp );
  1664. pInitializationBytes_temp = ( BYTE* )malloc( dwInitializationSize_temp );
  1665. dwCommandBufferData = ( BYTE* )XPhysicalAlloc( dwCommandBufferDataSize, MAXULONG_PTR, 4096, PAGE_READWRITE | PAGE_WRITECOMBINE );
  1666. Assert( pHeaderBytes_temp != NULL && dwCommandBufferData != NULL && pInitializationBytes_temp != NULL );
  1667. dwBytesAllocated += dwHeaderSize_temp;
  1668. dwBytesAllocated += dwInitializationSize_temp;
  1669. dwBytesAllocated += (dwCommandBufferDataSize + 4095 & ~4095);
  1670. cmdPrecompiledBuffer->Deconstruct( 0, ( D3DCommandBuffer* )pHeaderBytes_temp, &dwHeaderSize_temp, dwCommandBufferData, &dwCommandBufferDataSize, pInitializationBytes_temp, &dwInitializationSize_temp);
  1671. commandBuffer_temp = (D3DCommandBuffer*)pHeaderBytes_temp;
  1672. commandBuffer_temp->BeginReconstruction( 0, dwCommandBufferData, pInitializationBytes_temp);
  1673. commandBuffer_temp->EndReconstruction();
  1674. parseCommandBuffer(dwCommandBufferData);
  1675. Assert(dwSetVertexShader_Offset_ != GPU_INVALID_OFFSET);
  1676. //Assert(dwSetPixelShaderOffset != GPU_INVALID_OFFSET);
  1677. Assert(dwDrawToken_Offset != GPU_INVALID_OFFSET);
  1678. Assert(dwEndCommandBuffer_Offset != GPU_INVALID_OFFSET);
  1679. //Проверяем, что draw пакет последний в command buffer
  1680. Assert(dwDrawToken_Offset+sizeof(GPUCOMMAND_DRAW_INDEX) == dwEndCommandBuffer_Offset);
  1681. Assert(dwDepthControl_Offset != GPU_INVALID_OFFSET);
  1682. Assert(dwColorMask_Offset != GPU_INVALID_OFFSET);
  1683. Assert (dwIndxOffset_Offset != GPU_INVALID_OFFSET);
  1684. bGlobalDump = false;
  1685. }
  1686. void precompiledBatch::SetStreamSource(UINT StreamNumber, IDirect3DVertexBuffer9 *pStreamData, DWORD dwOffsetInBytes)
  1687. {
  1688. Assert(StreamNumber >= 0 && StreamNumber < MAX_STREAMS_COUNT);
  1689. DWORD dwOffset = dwStreamSource_Offsets[StreamNumber];
  1690. if (dwOffset == GPU_INVALID_OFFSET)
  1691. {
  1692. return;
  1693. }
  1694. if (pStreamData == NULL)
  1695. {
  1696. return;
  1697. }
  1698. //Кратность 4-ке проверяем
  1699. Assert((dwOffsetInBytes & 0x3) == 0);
  1700. GPUVERTEX_FETCH_CONSTANT * streamDataConst = (GPUVERTEX_FETCH_CONSTANT*)(dwCommandBufferData + dwOffset);
  1701. *streamDataConst = pStreamData->Format;
  1702. streamDataConst->BaseAddress = (GPU_CONVERT_CPU_TO_GPU_ADDRESS((CONST char*)((pStreamData->Format.BaseAddress << 2))+dwOffsetInBytes) >> 2);
  1703. }
  1704. void precompiledBatch::SetDrawParameters (GPUPRIMTYPE primType, DWORD trianglesCount, DWORD dwStartVertex)
  1705. {
  1706. Assert(bTemp_VertexShaderNotSet == false);
  1707. /*
  1708. Assert (trianglesCount <= 65532);
  1709. */
  1710. dpPacket.PrimType = primType;
  1711. //start vertex учитываем...
  1712. DWORD * indxOffsetPtr = (DWORD *)(dwCommandBufferData + dwIndxOffset_Offset);
  1713. *indxOffsetPtr = dwStartVertex;
  1714. //Считаем количество индексов
  1715. const UINT * ptParams = D3DPRIMITIVEVERTEXCOUNT[primType];
  1716. DWORD dwNumIndices = (ptParams[0] * trianglesCount) + ptParams[1];
  1717. Assert (dwNumIndices <= 65532);
  1718. BYTE * bufferData = (dwCommandBufferData + dwDrawToken_Offset-sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3));
  1719. //настраиваем batch
  1720. ((GPUCOMMANDBUFFER_HEADER_PACKET3*)bufferData)->dword = dpPacketHeader.dword;
  1721. bufferData += sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3);
  1722. dpPacket.NumIndices = dwNumIndices;
  1723. *((GPUCOMMAND_DRAW_AUTO*)bufferData) = dpPacket;
  1724. //Оригинальный размер (dp на 2 dword меньше dip)
  1725. dwCurrentSizeInDwords = (dwSizeInDwords - 2);
  1726. /*
  1727. if (trianglesCount <= 21844)
  1728. {
  1729. //настраиваем batch
  1730. ((GPUCOMMANDBUFFER_HEADER_PACKET3*)bufferData)->dword = dpPacketHeader.dword;
  1731. bufferData += sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3);
  1732. dpPacket.NumIndices = dwNumIndices;
  1733. *((GPUCOMMAND_DRAW_AUTO*)bufferData) = dpPacket;
  1734. //Оригинальный размер (dp на 2 dword меньше dip)
  1735. dwCurrentSizeInDwords = (dwSizeInDwords - 2);
  1736. } else
  1737. {
  1738. if (trianglesCount <= 43688)
  1739. {
  1740. //настраиваем первый batch
  1741. //-----------------------------------------------
  1742. ((GPUCOMMANDBUFFER_HEADER_PACKET3*)bufferData)->dword = dpPacketHeader.dword;
  1743. bufferData += sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3);
  1744. dpPacket.NumIndices = 65532;
  1745. *((GPUCOMMAND_DRAW_AUTO*)bufferData) = dpPacket;
  1746. bufferData += sizeof(GPUCOMMAND_DRAW_AUTO);
  1747. //настраиваем второй batch (хвост)
  1748. //-----------------------------------------------
  1749. dwNumIndices -= 65532;
  1750. ((GPUCOMMANDBUFFER_HEADER_PACKET3*)bufferData)->dword = dpPacketHeader.dword;
  1751. bufferData += sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3);
  1752. dpPacket.NumIndices = dwNumIndices;
  1753. *((GPUCOMMAND_DRAW_AUTO*)bufferData) = dpPacket;
  1754. //добавили 1 пакет - 2 dword'а + 1 dword header...
  1755. //-----------------------------------------------
  1756. DWORD dwAdditionalSizeInDwords = (sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3) + sizeof(GPUCOMMAND_DRAW_AUTO)) / sizeof(DWORD);
  1757. dwCurrentSizeInDwords = dwSizeInDwords-2+dwAdditionalSizeInDwords;
  1758. } else
  1759. {
  1760. if (trianglesCount <= 65532)
  1761. {
  1762. //настраиваем первый batch
  1763. //-----------------------------------------------
  1764. ((GPUCOMMANDBUFFER_HEADER_PACKET3*)bufferData)->dword = dpPacketHeader.dword;
  1765. bufferData += sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3);
  1766. dpPacket.NumIndices = 65532;
  1767. *((GPUCOMMAND_DRAW_AUTO*)bufferData) = dpPacket;
  1768. bufferData += sizeof(GPUCOMMAND_DRAW_AUTO);
  1769. //настраиваем второй batch
  1770. //-----------------------------------------------
  1771. ((GPUCOMMANDBUFFER_HEADER_PACKET3*)bufferData)->dword = dpPacketHeader.dword;
  1772. bufferData += sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3);
  1773. dpPacket.NumIndices = 65532;
  1774. *((GPUCOMMAND_DRAW_AUTO*)bufferData) = dpPacket;
  1775. bufferData += sizeof(GPUCOMMAND_DRAW_AUTO);
  1776. //настраиваем третий batch (хвост)
  1777. //-----------------------------------------------
  1778. dwNumIndices -= (65532*2);
  1779. ((GPUCOMMANDBUFFER_HEADER_PACKET3*)bufferData)->dword = dpPacketHeader.dword;
  1780. bufferData += sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3);
  1781. dpPacket.NumIndices = dwNumIndices;
  1782. *((GPUCOMMAND_DRAW_AUTO*)bufferData) = dpPacket;
  1783. bufferData += sizeof(GPUCOMMAND_DRAW_AUTO);
  1784. //добавили 2 пакета - 8 dword's + 2 dword header
  1785. //-----------------------------------------------
  1786. DWORD dwAdditionalSizeInDwords = (sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3) + sizeof(GPUCOMMAND_DRAW_AUTO)+sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3) + sizeof(GPUCOMMAND_DRAW_AUTO)) / sizeof(DWORD);
  1787. dwCurrentSizeInDwords = dwSizeInDwords-2+dwAdditionalSizeInDwords;
  1788. } else
  1789. {
  1790. Assert(false && "Need todo 4 batches...");
  1791. }
  1792. }
  1793. }
  1794. */
  1795. }
  1796. void precompiledBatch::SetDrawIndexedParameters (GPUPRIMTYPE primType, IDirect3DIndexBuffer9 *pIndexData, DWORD trianglesCount, dword StartIndex)
  1797. {
  1798. Assert(primType == GPUPRIMTYPE_TRILIST);
  1799. Assert(bTemp_VertexShaderNotSet == false);
  1800. Assert (trianglesCount <= 65532);
  1801. if (pIndexData == NULL)
  1802. {
  1803. return;
  1804. }
  1805. #ifdef _DEBUG
  1806. D3DINDEXBUFFER_DESC desc;
  1807. pIndexData->GetDesc(&desc);
  1808. Assert (desc.Format == D3DFMT_INDEX16);
  1809. #endif
  1810. dipPacket.PrimType = primType;
  1811. DWORD dwOffset = StartIndex * sizeof(WORD);
  1812. DWORD dwNumIndices = (trianglesCount * 3);
  1813. BYTE * bufferData = (dwCommandBufferData + dwDrawToken_Offset-sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3));
  1814. if (trianglesCount <= 21844)
  1815. {
  1816. //настраиваем batch
  1817. ((GPUCOMMANDBUFFER_HEADER_PACKET3*)bufferData)->dword = dipPacketHeader.dword;
  1818. bufferData += sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3);
  1819. dipPacket.NumIndices = dwNumIndices;
  1820. dipPacket.IndexSize = dwNumIndices;
  1821. dipPacket.IndexBase = GPU_CONVERT_CPU_TO_GPU_ADDRESS((CONST void*)(dwOffset + pIndexData->Address));
  1822. *((GPUCOMMAND_DRAW_INDEX*)bufferData) = dipPacket;
  1823. //Оригинальный размер
  1824. dwCurrentSizeInDwords = dwSizeInDwords;
  1825. } else
  1826. {
  1827. if (trianglesCount <= 43688)
  1828. {
  1829. //настраиваем первый batch
  1830. //-----------------------------------------------
  1831. ((GPUCOMMANDBUFFER_HEADER_PACKET3*)bufferData)->dword = dipPacketHeader.dword;
  1832. bufferData += sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3);
  1833. dipPacket.NumIndices = 65532;
  1834. dipPacket.IndexSize = 65532;
  1835. dipPacket.IndexBase = GPU_CONVERT_CPU_TO_GPU_ADDRESS((CONST void*)(dwOffset + pIndexData->Address));
  1836. *((GPUCOMMAND_DRAW_INDEX*)bufferData) = dipPacket;
  1837. bufferData += sizeof(GPUCOMMAND_DRAW_INDEX);
  1838. //настраиваем второй batch (хвост)
  1839. //-----------------------------------------------
  1840. dwNumIndices -= 65532;
  1841. ((GPUCOMMANDBUFFER_HEADER_PACKET3*)bufferData)->dword = dipPacketHeader.dword;
  1842. bufferData += sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3);
  1843. dipPacket.NumIndices = dwNumIndices;
  1844. dipPacket.IndexSize = dwNumIndices;
  1845. dipPacket.IndexBase = GPU_CONVERT_CPU_TO_GPU_ADDRESS((CONST void*)(dwOffset + pIndexData->Address + (65532 * sizeof(WORD))));
  1846. *((GPUCOMMAND_DRAW_INDEX*)bufferData) = dipPacket;
  1847. bufferData += sizeof(GPUCOMMAND_DRAW_INDEX);
  1848. //добавили 1 пакет - 4 dword'а + 1 dword header...
  1849. //-----------------------------------------------
  1850. DWORD dwAdditionalSizeInDwords = (sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3)+sizeof(GPUCOMMAND_DRAW_INDEX)) / sizeof(DWORD);
  1851. dwCurrentSizeInDwords = dwSizeInDwords+dwAdditionalSizeInDwords;
  1852. } else
  1853. {
  1854. if (trianglesCount <= 65532)
  1855. {
  1856. //настраиваем первый batch
  1857. //-----------------------------------------------
  1858. ((GPUCOMMANDBUFFER_HEADER_PACKET3*)bufferData)->dword = dipPacketHeader.dword;
  1859. bufferData += sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3);
  1860. dipPacket.NumIndices = 65532;
  1861. dipPacket.IndexSize = 65532;
  1862. dipPacket.IndexBase = GPU_CONVERT_CPU_TO_GPU_ADDRESS((CONST void*)(dwOffset + pIndexData->Address));
  1863. *((GPUCOMMAND_DRAW_INDEX*)bufferData) = dipPacket;
  1864. bufferData += sizeof(GPUCOMMAND_DRAW_INDEX);
  1865. //настраиваем второй batch
  1866. //-----------------------------------------------
  1867. ((GPUCOMMANDBUFFER_HEADER_PACKET3*)bufferData)->dword = dipPacketHeader.dword;
  1868. bufferData += sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3);
  1869. dipPacket.NumIndices = 65532;
  1870. dipPacket.IndexSize = 65532;
  1871. dipPacket.IndexBase = GPU_CONVERT_CPU_TO_GPU_ADDRESS((CONST void*)(dwOffset + pIndexData->Address + (65532 * sizeof(WORD))));
  1872. *((GPUCOMMAND_DRAW_INDEX*)bufferData) = dipPacket;
  1873. bufferData += sizeof(GPUCOMMAND_DRAW_INDEX);
  1874. //настраиваем третий batch (хвост)
  1875. //-----------------------------------------------
  1876. dwNumIndices -= (65532*2);
  1877. ((GPUCOMMANDBUFFER_HEADER_PACKET3*)bufferData)->dword = dipPacketHeader.dword;
  1878. bufferData += sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3);
  1879. dipPacket.NumIndices = dwNumIndices;
  1880. dipPacket.IndexSize = dwNumIndices;
  1881. dipPacket.IndexBase = GPU_CONVERT_CPU_TO_GPU_ADDRESS((CONST void*)(dwOffset + pIndexData->Address + ((65532 * 2) * sizeof(WORD))));
  1882. *((GPUCOMMAND_DRAW_INDEX*)bufferData) = dipPacket;
  1883. //добавили 2 пакета - 8 dword's + 2 dword header
  1884. //-----------------------------------------------
  1885. DWORD dwAdditionalSizeInDwords = (sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3)+sizeof(GPUCOMMAND_DRAW_INDEX)+sizeof(GPUCOMMANDBUFFER_HEADER_PACKET3)+sizeof(GPUCOMMAND_DRAW_INDEX)) / sizeof(DWORD);
  1886. dwCurrentSizeInDwords = dwSizeInDwords+dwAdditionalSizeInDwords;
  1887. } else
  1888. {
  1889. Assert(false && "Need todo 4 batches...");
  1890. }
  1891. }
  1892. }
  1893. }
  1894. /*
  1895. void precompiledBatch::tempFixupVertexShaderAndPixelShader()
  1896. {
  1897. //надо эти проставить через стандартные
  1898. if (dwVSO_Temp != GPU_INVALID_OFFSET)
  1899. {
  1900. commandBuffer_temp->BeginDynamicFixups();
  1901. commandBuffer_temp->SetVertexShader(dwVSO_Temp, m_pVertexShader);
  1902. if (dwPSO_Temp != GPU_INVALID_OFFSET)
  1903. {
  1904. commandBuffer_temp->SetPixelShader(dwPSO_Temp, m_pPixelShader);
  1905. }
  1906. commandBuffer_temp->EndDynamicFixups();
  1907. } else
  1908. {
  1909. Assert(false);
  1910. }
  1911. //SetVertexShader(m_pVertexShader);
  1912. //SetPixelShader(m_pPixelShader);
  1913. int a = 0;
  1914. }
  1915. */
  1916. void precompiledBatch::Freeze()
  1917. {
  1918. Assert (dwCommandBufferData);
  1919. XPhysicalProtect(dwCommandBufferData, dwCommandBufferDataSize, PAGE_READWRITE);
  1920. }
  1921. void precompiledBatch::SetVertexShaderPtr (IDirect3DVertexShader9 *pVertexShader)
  1922. {
  1923. if (m_pVertexShader)
  1924. {
  1925. m_pVertexShader->Release();
  1926. m_pVertexShader = NULL;
  1927. }
  1928. m_pVertexShader = pVertexShader;
  1929. if (m_pVertexShader)
  1930. {
  1931. m_pVertexShader->AddRef();
  1932. }
  1933. Assert (pVertexShader->IsBound());
  1934. /*
  1935. GPUCOMMAND_LOAD_SHADER* data = GPUGetVertexShaderPhysicalAddress(pVertexShader);
  1936. GPUCOMMAND_LOAD_SHADER * shaderLoad = (GPUCOMMAND_LOAD_SHADER*)(dwCommandBufferData + dwSetVertexShader_Offset_);
  1937. Assert (shaderLoad->Type == GPULOADTYPE_VERTEX);
  1938. shaderLoad->Address = 2 + (GPU_CONVERT_CPU_TO_GPU_ADDRESS((CONST void*)(data->Address << 5)) >> 5);
  1939. shaderLoad->Size = data->Size;
  1940. */
  1941. if (dwVSO_Temp != GPU_INVALID_OFFSET)
  1942. {
  1943. commandBuffer_temp->BeginDynamicFixups();
  1944. commandBuffer_temp->SetVertexShader(dwVSO_Temp, m_pVertexShader);
  1945. commandBuffer_temp->EndDynamicFixups();
  1946. }
  1947. bTemp_VertexShaderNotSet = false;
  1948. }
  1949. void precompiledBatch::SetPixelShaderPtr (IDirect3DPixelShader9 *pPixelShader)
  1950. {
  1951. if (m_pPixelShader)
  1952. {
  1953. m_pPixelShader->Release();
  1954. m_pPixelShader = NULL;
  1955. }
  1956. m_pPixelShader = pPixelShader;
  1957. if (m_pPixelShader)
  1958. {
  1959. m_pPixelShader->AddRef();
  1960. }
  1961. if (dwSetPixelShader_Offset_ == GPU_INVALID_OFFSET)
  1962. {
  1963. return;
  1964. }
  1965. /*
  1966. GPUCOMMAND_LOAD_SHADER* data = GPUGetPixelShaderPhysicalAddress(pPixelShader);
  1967. GPUCOMMAND_LOAD_SHADER * shaderLoad = (GPUCOMMAND_LOAD_SHADER*)(dwCommandBufferData + dwSetPixelShader_Offset_);
  1968. Assert (shaderLoad->Type == GPULOADTYPE_PIXEL);
  1969. //Assert (data->Type == GPULOADTYPE_PIXEL);
  1970. shaderLoad->Address = 2 + (GPU_CONVERT_CPU_TO_GPU_ADDRESS((CONST void*)(data->Address << 5)) >> 5);
  1971. shaderLoad->Size = data->Size;
  1972. */
  1973. if (dwPSO_Temp != GPU_INVALID_OFFSET)
  1974. {
  1975. commandBuffer_temp->BeginDynamicFixups();
  1976. commandBuffer_temp->SetPixelShader(dwPSO_Temp, m_pPixelShader);
  1977. commandBuffer_temp->EndDynamicFixups();
  1978. }
  1979. bTemp_PixelShaderNotSet = false;
  1980. }
  1981. void precompiledBatch::SetCullMode (GPUCULL cullMode)
  1982. {
  1983. if (dwSetCullMode_Offset == GPU_INVALID_OFFSET)
  1984. {
  1985. return;
  1986. }
  1987. GPU_MODECONTROL * modeControlReg = (GPU_MODECONTROL *)(dwCommandBufferData + dwSetCullMode_Offset);
  1988. modeControlReg->CullMode = cullMode;
  1989. }
  1990. void precompiledBatch::AddTextureSampler (const char * szName, DWORD dwSamplerIdx, D3DTEXTUREFILTERTYPE minFilter, D3DTEXTUREFILTERTYPE magFilter, D3DTEXTUREFILTERTYPE mipFilter, D3DTEXTUREADDRESS clampU, D3DTEXTUREADDRESS clampV)
  1991. {
  1992. Assert(dwSamplerIdx >= 0 && dwSamplerIdx < MAX_TEXTURES_COUNT);
  1993. DWORD dwOffset = dwTexture_Offsets[dwSamplerIdx];
  1994. if (dwOffset == GPU_INVALID_OFFSET)
  1995. {
  1996. return;
  1997. }
  1998. textureSampler & sampler_const = tex_consts[tex_consts.Add()];
  1999. sampler_const.fixupPtrInCommandBuffer = (dwCommandBufferData + dwOffset);
  2000. sampler_const.dwStage = dwSamplerIdx;
  2001. sampler_const.tex = m_pDB->getTextureOutput(szName);
  2002. sampler_const.clampU = (GPUCLAMP)clampU;
  2003. sampler_const.clampV = (GPUCLAMP)clampV;
  2004. sampler_const.minFilter = (GPUMINMAGFILTER)minFilter;
  2005. sampler_const.magFilter = (GPUMINMAGFILTER)magFilter;
  2006. sampler_const.mipFilter = (GPUMIPFILTER)mipFilter;
  2007. Assert (sampler_const.tex);
  2008. }
  2009. void precompiledBatch::AddVertexShaderConstVector (const char * szName, DWORD dwIndex, DWORD dwRegCount)
  2010. {
  2011. Assert(dwIndex >= 0 && dwIndex < MAX_ALU_CONST_COUNT);
  2012. Assert((dwIndex+dwRegCount-1) >= 0 && (dwIndex+dwRegCount-1) < MAX_ALU_CONST_COUNT);
  2013. DWORD dwOffset = dwALUConst_Offsets[dwIndex];
  2014. for (DWORD i = 0; i < dwRegCount; i++)
  2015. {
  2016. Assert (dwALUConst_Offsets[dwIndex+i] != GPU_INVALID_OFFSET)
  2017. }
  2018. Assert(dwRegCount <= 256);
  2019. constVector4 & vs_const = vs_consts_v4[vs_consts_v4.Add()];
  2020. vs_const.fixupPtrInCommandBuffer = (dwCommandBufferData + dwOffset);
  2021. vs_const.dwRegCount = dwRegCount;
  2022. vs_const.dwStartIdx = dwIndex;
  2023. //vs_const.tempDBName = szName;
  2024. vs_const.sourceData = m_pDB->getVectorOutput(szName);
  2025. Assert (vs_const.sourceData);
  2026. }
  2027. void precompiledBatch::AddPixelShaderConstVector (const char * szName, DWORD dwIndex, DWORD dwRegCount)
  2028. {
  2029. dwIndex += 256;
  2030. Assert(dwIndex >= 0 && dwIndex < MAX_ALU_CONST_COUNT);
  2031. Assert((dwIndex+dwRegCount-1) >= 0 && (dwIndex+dwRegCount-1) < MAX_ALU_CONST_COUNT);
  2032. DWORD dwOffset = dwALUConst_Offsets[dwIndex];
  2033. for (DWORD i = 0; i < dwRegCount; i++)
  2034. {
  2035. Assert (dwALUConst_Offsets[dwIndex+i] != GPU_INVALID_OFFSET)
  2036. }
  2037. Assert(dwRegCount <= 256);
  2038. constVector4 & ps_const = ps_consts_v4[ps_consts_v4.Add()];
  2039. ps_const.fixupPtrInCommandBuffer = (dwCommandBufferData + dwOffset);
  2040. ps_const.dwRegCount = dwRegCount;
  2041. ps_const.dwStartIdx = dwIndex;
  2042. //ps_const.tempDBName = szName;
  2043. ps_const.sourceData = m_pDB->getVectorOutput(szName);
  2044. Assert (ps_const.sourceData);
  2045. }
  2046. void precompiledBatch::AddVertexShaderConstBool (const char * szName, DWORD dwIndex, DWORD dwRegCount)
  2047. {
  2048. /*
  2049. if (dwRegCount != 32)
  2050. {
  2051. //bool ставятся не пачками по 32 - ошибка!!!
  2052. api->Trace("ERROR : Bool registers must sets by chunks of 32 elements!!!");
  2053. Assert(false);
  2054. }
  2055. */
  2056. if ((dwIndex % 32) != 0)
  2057. {
  2058. //регистры bool начинаются не кратно 32 - ошибка!!!
  2059. api->Trace("ERROR : Bool registers address must be 32 bools aligned!!!");
  2060. Assert(false);
  2061. }
  2062. dwIndex = dwIndex >> 5;
  2063. Assert(dwIndex >= 0 && dwIndex < MAX_ALU_CONST_COUNT_BOOL);
  2064. DWORD dwOffset = dwALUConstBool_Offsets[dwIndex];
  2065. constBool & vs_const_b = vs_consts_b[vs_consts_b.Add()];
  2066. vs_const_b.fixupPtrInCommandBuffer = (dwCommandBufferData + dwOffset);
  2067. vs_const_b.dwRegCount = 1;
  2068. vs_const_b.sourceData = m_pDB->getBool32Output(szName);
  2069. Assert (vs_const_b.sourceData);
  2070. }
  2071. void precompiledBatch::AddPixelShaderConstBool (const char * szName, DWORD dwIndex, DWORD dwRegCount)
  2072. {
  2073. /*
  2074. if (dwRegCount != 32)
  2075. {
  2076. //bool ставятся не пачками по 32 - ошибка!!!
  2077. api->Trace("ERROR : Bool registers must sets by chunks of 32 elements!!!");
  2078. Assert(false);
  2079. }
  2080. */
  2081. if ((dwIndex % 32) != 0)
  2082. {
  2083. //регистры bool начинаются не кратно 32 - ошибка!!!
  2084. api->Trace("ERROR : Bool registers address must be 32 bools aligned!!!");
  2085. Assert(false);
  2086. }
  2087. dwIndex = dwIndex >> 5;
  2088. dwIndex += 4;
  2089. Assert(dwIndex >= 0 && dwIndex < MAX_ALU_CONST_COUNT_BOOL);
  2090. DWORD dwOffset = dwALUConstBool_Offsets[dwIndex];
  2091. constBool & ps_const_b = ps_consts_b[ps_consts_b.Add()];
  2092. ps_const_b.fixupPtrInCommandBuffer = (dwCommandBufferData + dwOffset);
  2093. ps_const_b.dwRegCount = 1;
  2094. ps_const_b.sourceData = m_pDB->getBool32Output(szName);
  2095. Assert (ps_const_b.sourceData);
  2096. }
  2097. /*
  2098. void precompiledBatch::AddVertexShaderConst (const char * szName, DWORD dwIndex, DWORD dwRegCount, CommandBufferCompiler::ConstantType type)
  2099. {
  2100. Assert(dwIndex >= 0 && dwIndex < MAX_ALU_CONST_COUNT);
  2101. Assert((dwIndex+dwRegCount-1) >= 0 && (dwIndex+dwRegCount-1) < MAX_ALU_CONST_COUNT);
  2102. DWORD dwOffset = dwALUConst_Offsets[dwIndex];
  2103. for (DWORD i = 0; i < dwRegCount; i++)
  2104. {
  2105. Assert (dwALUConst_Offsets[dwIndex+i] != GPU_INVALID_OFFSET)
  2106. }
  2107. switch (type)
  2108. {
  2109. case CommandBufferCompiler::CT_BOOL:
  2110. {
  2111. constBool & vs_const_b = vs_consts_b[vs_consts_b.Add()];
  2112. vs_const_b.dwOffsetInCB = dwOffset;
  2113. vs_const_b.dwRegCount = dwRegCount;
  2114. vs_const_b.sourceData = m_pDB->getBoolOutput(szName);
  2115. Assert (vs_const_b.sourceData);
  2116. }
  2117. case CommandBufferCompiler::CT_FLOAT:
  2118. case CommandBufferCompiler::CT_FLOAT3:
  2119. case CommandBufferCompiler::CT_FLOAT4:
  2120. case CommandBufferCompiler::CT_MATRIX4x4:
  2121. {
  2122. constVector4 & vs_const = vs_consts_v4[vs_consts_v4.Add()];
  2123. vs_const.dwOffsetInCB = dwOffset;
  2124. vs_const.dwRegCount = dwRegCount;
  2125. vs_const.sourceData = m_pDB->getVectorOutput(szName);
  2126. Assert (vs_const.sourceData);
  2127. break;
  2128. }
  2129. default:
  2130. Assert(false);
  2131. }
  2132. }
  2133. void precompiledBatch::AddPixelShaderConst (const char * szName, DWORD dwIndex, DWORD dwRegCount, CommandBufferCompiler::ConstantType type)
  2134. {
  2135. dwIndex += 256;
  2136. Assert(dwIndex >= 0 && dwIndex < MAX_ALU_CONST_COUNT);
  2137. Assert((dwIndex+dwRegCount-1) >= 0 && (dwIndex+dwRegCount-1) < MAX_ALU_CONST_COUNT);
  2138. DWORD dwOffset = dwALUConst_Offsets[dwIndex];
  2139. for (DWORD i = 0; i < dwRegCount; i++)
  2140. {
  2141. Assert (dwALUConst_Offsets[dwIndex+i] != GPU_INVALID_OFFSET)
  2142. }
  2143. switch (type)
  2144. {
  2145. case CommandBufferCompiler::CT_BOOL:
  2146. {
  2147. constBool & ps_const_b = ps_consts_b[ps_consts_b.Add()];
  2148. ps_const_b.dwOffsetInCB = dwOffset;
  2149. ps_const_b.dwRegCount = dwRegCount;
  2150. ps_const_b.sourceData = m_pDB->getBoolOutput(szName);
  2151. Assert (ps_const_b.sourceData);
  2152. }
  2153. case CommandBufferCompiler::CT_FLOAT:
  2154. case CommandBufferCompiler::CT_FLOAT3:
  2155. case CommandBufferCompiler::CT_FLOAT4:
  2156. case CommandBufferCompiler::CT_MATRIX4x4:
  2157. {
  2158. constVector4 & ps_const = ps_consts_v4[ps_consts_v4.Add()];
  2159. ps_const.dwOffsetInCB = dwOffset;
  2160. ps_const.dwRegCount = dwRegCount;
  2161. ps_const.sourceData = m_pDB->getVectorOutput(szName);
  2162. Assert (ps_const.sourceData);
  2163. break;
  2164. }
  2165. default:
  2166. Assert(false);
  2167. }
  2168. }
  2169. */
  2170. void precompiledBatch::SetColorMask (DWORD dwMask)
  2171. {
  2172. if (dwColorMask_Offset == GPU_INVALID_OFFSET)
  2173. {
  2174. return;
  2175. }
  2176. GPU_COLORMASK * colorMaskControl = (GPU_COLORMASK *)(dwCommandBufferData + dwColorMask_Offset);
  2177. colorMaskControl->Write0 = (dwMask & 0x0F);
  2178. colorMaskControl->Write1 = 0;
  2179. colorMaskControl->Write2 = 0;
  2180. colorMaskControl->Write3 = 0;
  2181. }
  2182. void precompiledBatch::SetBlendOp (GPUBLEND dwSrcBlendOp, GPUBLEND dwDestBlendOp)
  2183. {
  2184. if (dwBlendControl0_Offset == GPU_INVALID_OFFSET)
  2185. {
  2186. return;
  2187. }
  2188. GPU_BLENDCONTROL * blendPacket = (GPU_BLENDCONTROL *)(dwCommandBufferData + dwBlendControl0_Offset);
  2189. blendPacket->ColorDestBlend = dwDestBlendOp;
  2190. blendPacket->AlphaDestBlend = dwDestBlendOp;
  2191. blendPacket->ColorSrcBlend = dwSrcBlendOp;
  2192. blendPacket->AlphaSrcBlend = dwSrcBlendOp;
  2193. }
  2194. void precompiledBatch::SetHyperZEnable (bool bHyperZEnable, bool bHyperZWriteEnable)
  2195. {
  2196. bHiZEnable = bHyperZEnable;
  2197. bHiZWriteEnable = bHyperZWriteEnable;
  2198. GPU_HICONTROL * hiZControl = (GPU_HICONTROL *)(dwCommandBufferData + dwHiZControl_Offset);
  2199. hiZControl->HiZWriteEnable = bHyperZWriteEnable;
  2200. hiZControl->HiZEnable = bHyperZEnable;
  2201. hiZControl->HiZFunc = GPUHIZFUNC_LESS_EQUAL;
  2202. hiZControl->HiBaseAddr = 0x0;
  2203. hiZControl->HiStencilEnable = false;
  2204. hiZControl->HiStencilWriteEnable = false;
  2205. hiZControl->HiStencilFunc = GPUHISTENCILFUNC_EQUAL;
  2206. hiZControl->HiStencilRef = 0x0;
  2207. }
  2208. void precompiledBatch::SetHyperZWriteEnable (bool bHyperZWriteEnable)
  2209. {
  2210. GPU_HICONTROL * hiZControl = (GPU_HICONTROL *)(dwCommandBufferData + dwHiZControl_Offset);
  2211. hiZControl->HiZWriteEnable = bHyperZWriteEnable;
  2212. }
  2213. void precompiledBatch::SetZWriteEnable(bool bDepthWriteEnabled)
  2214. {
  2215. GPU_DEPTHCONTROL * depthControl = (GPU_DEPTHCONTROL *)(dwCommandBufferData + dwDepthControl_Offset);
  2216. depthControl->ZWriteEnable = bDepthWriteEnabled;
  2217. }
  2218. void precompiledBatch::SetZEnable(bool bDepthEnabled, bool bDepthWriteEnabled)
  2219. {
  2220. bDepthEnable = bDepthEnabled;
  2221. bDepthWriteEnable = bDepthWriteEnabled;
  2222. bNeedFlushHiperZ = !bDepthEnabled;
  2223. GPU_DEPTHCONTROL * depthControl = (GPU_DEPTHCONTROL *)(dwCommandBufferData + dwDepthControl_Offset);
  2224. depthControl->ZEnable = bDepthEnabled;
  2225. depthControl->ZWriteEnable = bDepthWriteEnabled;
  2226. }
  2227. void precompiledBatch::SetVariablesDatabase(VariablesDB * pDB)
  2228. {
  2229. m_pDB = pDB;
  2230. }
  2231. void precompiledBatch::UpdateVariablesFromDB()
  2232. {
  2233. NGRender::RenderStat & stats = NGRender::pRS->renderStats();
  2234. stats.dwUpdatesCount++;
  2235. DWORD dwPsConstSize = ps_consts_v4.Size();
  2236. //потому что последняя константа фейк, для префетча
  2237. dwPsConstSize = dwPsConstSize - 1;
  2238. constVector4 * __restrict pPsConstData = ps_consts_v4.GetBuffer();
  2239. constVector4 * __restrict pPsConstPrefetchData = ps_consts_v4.GetBuffer();
  2240. pPsConstPrefetchData++;
  2241. for (DWORD i = 0; i < dwPsConstSize; i++)
  2242. {
  2243. stats.dwConstBytes += (pPsConstData->dwRegCount * sizeof(Vector4));
  2244. stats.dwConstCount += pPsConstData->dwRegCount;
  2245. Assert(stats.dwConstCount <= 92000);
  2246. __dcbt(0, pPsConstPrefetchData->sourceData);
  2247. SetAluConstVector4(pPsConstData->fixupPtrInCommandBuffer, pPsConstData->sourceData, pPsConstData->dwRegCount);
  2248. pPsConstData++;
  2249. pPsConstPrefetchData++;
  2250. }
  2251. DWORD dwPsConstSizeB = ps_consts_b.Size();
  2252. constBool * __restrict pPsConstDataB = ps_consts_b.GetBuffer();
  2253. for (DWORD i = 0; i < dwPsConstSizeB; i++)
  2254. {
  2255. stats.dwConstBytes += sizeof(DWORD);
  2256. stats.dwConstCount++;
  2257. Assert(stats.dwConstCount <= 92000);
  2258. SetAluConstsBool32(pPsConstDataB->fixupPtrInCommandBuffer, pPsConstDataB->sourceData->value);
  2259. pPsConstDataB++;
  2260. }
  2261. DWORD dwVsConstSize = vs_consts_v4.Size();
  2262. //потому что последняя константа фейк, для префетча
  2263. dwVsConstSize = dwVsConstSize - 1;
  2264. constVector4 * __restrict pVsConstData = vs_consts_v4.GetBuffer();
  2265. constVector4 * __restrict pVsConstPrefetchData = vs_consts_v4.GetBuffer();
  2266. pVsConstPrefetchData++;
  2267. for (DWORD i = 0; i < dwVsConstSize; i++)
  2268. {
  2269. stats.dwConstBytes += (pVsConstData->dwRegCount * sizeof(Vector4));
  2270. stats.dwConstCount += pVsConstData->dwRegCount;
  2271. Assert(stats.dwConstCount <= 92000);
  2272. __dcbt(0, pVsConstPrefetchData->sourceData);
  2273. SetAluConstVector4(pVsConstData->fixupPtrInCommandBuffer, pVsConstData->sourceData, pVsConstData->dwRegCount);
  2274. pVsConstData++;
  2275. pVsConstPrefetchData++;
  2276. }
  2277. DWORD dwVsConstSizeB = vs_consts_b.Size();
  2278. constBool * __restrict pVsConstDataB = vs_consts_b.GetBuffer();
  2279. for (DWORD i = 0; i < dwVsConstSizeB; i++)
  2280. {
  2281. stats.dwConstBytes += sizeof(DWORD);
  2282. stats.dwConstCount++;
  2283. Assert(stats.dwConstCount <= 92000);
  2284. SetAluConstsBool32(pVsConstDataB->fixupPtrInCommandBuffer, pVsConstDataB->sourceData->value);
  2285. pVsConstDataB++;
  2286. }
  2287. DWORD dwTexConstSize = tex_consts.Size();
  2288. textureSampler * __restrict pTexConstData = tex_consts.GetBuffer();
  2289. for (DWORD i = 0; i < dwTexConstSize; i++)
  2290. {
  2291. stats.dwConstBytes += sizeof(GPUTEXTURE_FETCH_CONSTANT) + (sizeof(DWORD) * 2);
  2292. SetTexture(pTexConstData->fixupPtrInCommandBuffer, *pTexConstData->tex, pTexConstData->minFilter, pTexConstData->magFilter, pTexConstData->mipFilter, pTexConstData->clampU, pTexConstData->clampV);
  2293. pTexConstData++;
  2294. }
  2295. }
  2296. DWORD precompiledBatch::getPhysicalSize()
  2297. {
  2298. return dwCommandBufferDataSize;
  2299. }
  2300. BYTE* precompiledBatch::getPhysicalBytes()
  2301. {
  2302. return dwCommandBufferData;
  2303. }
  2304. DWORD precompiledBatch::getHeaderSize()
  2305. {
  2306. return dwHeaderSize_temp;
  2307. }
  2308. BYTE* precompiledBatch::getHeaderBytes()
  2309. {
  2310. return pHeaderBytes_temp;
  2311. }
  2312. DWORD precompiledBatch::getInitializationSize()
  2313. {
  2314. return dwInitializationSize_temp;
  2315. }
  2316. BYTE* precompiledBatch::getInitializationBytes()
  2317. {
  2318. return pInitializationBytes_temp;
  2319. }
  2320. DWORD precompiledBatch::getSizeInDwords()
  2321. {
  2322. return dwCurrentSizeInDwords;
  2323. }
  2324. void precompiledBatch::DynamicDraw_SetVertexShader(IDirect3DVertexShader9 *pBoundedVS)
  2325. {
  2326. pDynamicDrawVS = pBoundedVS;
  2327. }
  2328. void precompiledBatch::DynamicDraw_SetPixelShader(IDirect3DPixelShader9 *pPS)
  2329. {
  2330. pDynamicDrawPS = pPS;
  2331. }
  2332. void precompiledBatch::DynamicDraw_SetRenderState(D3DRENDERSTATETYPE State, DWORD Value)
  2333. {
  2334. if (State == D3DRS_ZENABLE)
  2335. {
  2336. bNeedFlushHiperZ = !Value;
  2337. }
  2338. if (State == D3DRS_CULLMODE)
  2339. {
  2340. originalGpuCull = (GPUCULL)Value;
  2341. }
  2342. dynamicDrawRState * state = NULL;
  2343. for (DWORD i = 0; i < dynamicDrawRS.Size(); i++)
  2344. {
  2345. if(dynamicDrawRS[i].State == State && dynamicDrawRS[i].Value == Value)
  2346. {
  2347. state = &dynamicDrawRS[i];
  2348. break;
  2349. }
  2350. }
  2351. if (state == NULL)
  2352. {
  2353. state = &dynamicDrawRS[dynamicDrawRS.Add()];
  2354. }
  2355. state->State = State;
  2356. state->Value = Value;
  2357. }
  2358. void precompiledBatch::DynamicDraw_SetSamplerState(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value)
  2359. {
  2360. Assert (Value != 0xFFFFFFFF);
  2361. dynamicDrawSState * state = NULL;
  2362. for (DWORD i = 0; i < dynamicDrawSS.Size(); i++)
  2363. {
  2364. if(dynamicDrawSS[i].Sampler == Sampler && dynamicDrawSS[i].Type == Type)
  2365. {
  2366. state = &dynamicDrawSS[i];
  2367. break;
  2368. }
  2369. }
  2370. if (state == NULL)
  2371. {
  2372. state = &dynamicDrawSS[dynamicDrawSS.Add()];;
  2373. } /*else
  2374. {
  2375. if (Type == D3DSAMP_MIPFILTER && Value != state->Value)
  2376. {
  2377. int a = 0;
  2378. }
  2379. }
  2380. if (Type == D3DSAMP_MIPFILTER && Value == 2)
  2381. {
  2382. int a = 0;
  2383. }*/
  2384. state->Sampler = Sampler;
  2385. state->Type = Type;
  2386. state->Value = Value;
  2387. }
  2388. void precompiledBatch::DynamicDraw_SetupGPU(IDirect3DDevice9* device)
  2389. {
  2390. for (DWORD i = 0; i < dynamicDrawRS.Size(); i++)
  2391. {
  2392. dynamicDrawRState & s = dynamicDrawRS[i];
  2393. device->SetRenderState(s.State, s.Value);
  2394. }
  2395. for (DWORD i = 0; i < dynamicDrawSS.Size(); i++)
  2396. {
  2397. dynamicDrawSState & s = dynamicDrawSS[i];
  2398. device->SetSamplerState(s.Sampler, s.Type, s.Value);
  2399. }
  2400. device->SetVertexDeclaration(NULL);
  2401. device->SetVertexShader(pDynamicDrawVS);
  2402. device->SetPixelShader(pDynamicDrawPS);
  2403. static BOOL tempBoolVector[32];
  2404. DWORD dwPsConstSize = ps_consts_v4.Size();
  2405. dwPsConstSize = dwPsConstSize - 1;
  2406. constVector4 * __restrict pPsConstData = ps_consts_v4.GetBuffer();
  2407. for (DWORD i = 0; i < dwPsConstSize; i++)
  2408. {
  2409. device->SetPixelShaderConstantF((pPsConstData->dwStartIdx-256), (float *)pPsConstData->sourceData, pPsConstData->dwRegCount);
  2410. pPsConstData++;
  2411. }
  2412. DWORD dwPsConstSizeB = ps_consts_b.Size();
  2413. constBool * __restrict pPsConstDataB = ps_consts_b.GetBuffer();
  2414. for (DWORD i = 0; i < dwPsConstSizeB; i++)
  2415. {
  2416. for (DWORD n = 0; n < 32; n++)
  2417. {
  2418. tempBoolVector[n] = pPsConstDataB->sourceData->get(n);
  2419. }
  2420. device->SetPixelShaderConstantB(pPsConstDataB->dwStartIdx, &tempBoolVector[0], 32);
  2421. pPsConstDataB++;
  2422. }
  2423. DWORD dwVsConstSize = vs_consts_v4.Size();
  2424. dwVsConstSize = dwVsConstSize - 1;
  2425. constVector4 * __restrict pVsConstData = vs_consts_v4.GetBuffer();
  2426. for (DWORD i = 0; i < dwVsConstSize; i++)
  2427. {
  2428. device->SetVertexShaderConstantF(pVsConstData->dwStartIdx, (float *)pVsConstData->sourceData, pVsConstData->dwRegCount);
  2429. pVsConstData++;
  2430. }
  2431. DWORD dwVsConstSizeB = vs_consts_b.Size();
  2432. constBool * __restrict pVsConstDataB = vs_consts_b.GetBuffer();
  2433. for (DWORD i = 0; i < dwVsConstSizeB; i++)
  2434. {
  2435. for (DWORD n = 0; n < 32; n++)
  2436. {
  2437. tempBoolVector[n] = pVsConstDataB->sourceData->get(n);
  2438. }
  2439. device->SetVertexShaderConstantB(pVsConstDataB->dwStartIdx, &tempBoolVector[0], 32);
  2440. pVsConstDataB++;
  2441. }
  2442. DWORD dwTexConstSize = tex_consts.Size();
  2443. textureSampler * __restrict pTexConstData = tex_consts.GetBuffer();
  2444. for (DWORD i = 0; i < dwTexConstSize; i++)
  2445. {
  2446. device->SetTexture(pTexConstData->dwStage, *pTexConstData->tex);
  2447. pTexConstData++;
  2448. }
  2449. }
  2450. const char * precompiledBatch::GetShaderName()
  2451. {
  2452. return shaderName.c_str();
  2453. }
  2454. void precompiledBatch::ApplyStateHacksInplace(IDirect3DDevice9* device, TStateHack * hacks, bool bDisableHacks)
  2455. {
  2456. if (bDisableHacks)
  2457. {
  2458. return;
  2459. }
  2460. if (hacks[SH_CULLMODE].enabled)
  2461. {
  2462. dword cullValue = D3DCULL_NONE;
  2463. switch (hacks[SH_CULLMODE].v)
  2464. {
  2465. case SHCM_NONE:
  2466. cullValue = D3DCULL_NONE;
  2467. break;
  2468. case SHCM_CW:
  2469. cullValue = D3DCULL_CW;
  2470. break;
  2471. case SHCM_CCW:
  2472. cullValue = D3DCULL_CCW;
  2473. break;
  2474. case SHCM_INVERSE:
  2475. if (originalGpuCull == D3DCULL_CW) cullValue = D3DCULL_CCW;
  2476. if (originalGpuCull == D3DCULL_CCW) cullValue = D3DCULL_CW;
  2477. break;
  2478. }
  2479. SetCullMode((GPUCULL)cullValue);
  2480. }
  2481. if (hacks[SH_ZWRITE].enabled)
  2482. {
  2483. if (hacks[SH_ZWRITE].v == SHZW_ENABLE)
  2484. {
  2485. SetHyperZWriteEnable (true);
  2486. SetZWriteEnable(true);
  2487. } else
  2488. {
  2489. SetHyperZWriteEnable (false);
  2490. SetZWriteEnable(false);
  2491. }
  2492. }
  2493. if (hacks[SH_COLORWRITE].enabled)
  2494. {
  2495. if (hacks[SH_COLORWRITE].v == SHCW_ENABLE)
  2496. {
  2497. SetColorMask(0x0F);
  2498. } else
  2499. {
  2500. SetColorMask(0x0);
  2501. }
  2502. }
  2503. //Это все не перебиваеться из CB, поэтому можно в девайс ставить...
  2504. if (hacks[SH_CLIPPLANEENABLE].enabled)
  2505. {
  2506. device->SetRenderState(D3DRS_CLIPPLANEENABLE, hacks[SH_CLIPPLANEENABLE].v);
  2507. }
  2508. if (hacks[SH_SCISSORRECT].enabled)
  2509. {
  2510. device->SetRenderState(D3DRS_SCISSORTESTENABLE, hacks[SH_SCISSORRECT].v);
  2511. }
  2512. }
  2513. void precompiledBatch::RestoreStateHacksInplace(IDirect3DDevice9* device, TStateHack * hacks, bool bDisableHacks)
  2514. {
  2515. if (bDisableHacks)
  2516. {
  2517. return;
  2518. }
  2519. //Восстанавливаем, что испортили в CB
  2520. if (hacks[SH_CULLMODE].enabled)
  2521. {
  2522. SetCullMode(originalGpuCull);
  2523. }
  2524. if (hacks[SH_ZWRITE].enabled)
  2525. {
  2526. SetHyperZWriteEnable (originalZEnable);
  2527. SetZWriteEnable(originalHyperZEnable);
  2528. }
  2529. if (hacks[SH_COLORWRITE].enabled)
  2530. {
  2531. SetColorMask(originalColorMask);
  2532. }
  2533. //востанавливаем что попортили в GPU
  2534. if (hacks[SH_CLIPPLANEENABLE].enabled)
  2535. {
  2536. device->SetRenderState(D3DRS_CLIPPLANEENABLE, FALSE);
  2537. }
  2538. if (hacks[SH_SCISSORRECT].enabled)
  2539. {
  2540. device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE);
  2541. }
  2542. }
  2543. void precompiledBatch::DynamicDraw_RestoreStateHacks(IDirect3DDevice9* device, TStateHack * hacks, bool bDisableHacks)
  2544. {
  2545. //востанавливаем что попортили в GPU
  2546. if (hacks[SH_CLIPPLANEENABLE].enabled)
  2547. {
  2548. device->SetRenderState(D3DRS_CLIPPLANEENABLE, FALSE);
  2549. }
  2550. if (hacks[SH_SCISSORRECT].enabled)
  2551. {
  2552. device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE);
  2553. }
  2554. //остальное не надо, т.к. заново переставляется все равно
  2555. }
  2556. void precompiledBatch::DynamicDraw_ApplyStateHacks(IDirect3DDevice9* device, TStateHack * hacks, bool bDisableHacks)
  2557. {
  2558. if (bDisableHacks)
  2559. {
  2560. return;
  2561. }
  2562. //cull hack
  2563. if (hacks[SH_CULLMODE].enabled)
  2564. {
  2565. dword cullValue = D3DCULL_NONE;
  2566. switch (hacks[SH_CULLMODE].v)
  2567. {
  2568. case SHCM_NONE:
  2569. cullValue = D3DCULL_NONE;
  2570. break;
  2571. case SHCM_CW:
  2572. cullValue = D3DCULL_CW;
  2573. break;
  2574. case SHCM_CCW:
  2575. cullValue = D3DCULL_CCW;
  2576. break;
  2577. case SHCM_INVERSE:
  2578. if (originalGpuCull == D3DCULL_CW) cullValue = D3DCULL_CCW;
  2579. if (originalGpuCull == D3DCULL_CCW) cullValue = D3DCULL_CW;
  2580. break;
  2581. }
  2582. device->SetRenderState(D3DRS_CULLMODE, cullValue);
  2583. }
  2584. if (hacks[SH_CLIPPLANEENABLE].enabled)
  2585. {
  2586. device->SetRenderState(D3DRS_CLIPPLANEENABLE, hacks[SH_CLIPPLANEENABLE].v);
  2587. }
  2588. if (hacks[SH_SCISSORRECT].enabled)
  2589. {
  2590. device->SetRenderState(D3DRS_SCISSORTESTENABLE, hacks[SH_SCISSORRECT].v);
  2591. }
  2592. if (hacks[SH_COLORWRITE].enabled)
  2593. {
  2594. if (hacks[SH_COLORWRITE].v == SHCW_ENABLE)
  2595. {
  2596. device->SetRenderState(D3DRS_COLORWRITEENABLE, 0x0000000F);
  2597. } else
  2598. {
  2599. device->SetRenderState(D3DRS_COLORWRITEENABLE, 0x0);
  2600. }
  2601. }
  2602. if (hacks[SH_ZWRITE].enabled)
  2603. {
  2604. if (hacks[SH_ZWRITE].v == SHZW_ENABLE)
  2605. {
  2606. device->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
  2607. } else
  2608. {
  2609. device->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
  2610. }
  2611. }
  2612. }
  2613. void precompiledBatch::InsertPrefetchFiller()
  2614. {
  2615. //
  2616. constVector4 & filler = ps_consts_v4[ps_consts_v4.Add()];
  2617. filler.dwRegCount = 0;
  2618. filler.dwStartIdx = 0;
  2619. filler.fixupPtrInCommandBuffer = NULL;
  2620. filler.sourceData = NULL;
  2621. //
  2622. filler = vs_consts_v4[vs_consts_v4.Add()];
  2623. filler.dwRegCount = 0;
  2624. filler.dwStartIdx = 0;
  2625. filler.fixupPtrInCommandBuffer = NULL;
  2626. filler.sourceData = NULL;
  2627. }
  2628. #endif