GSState.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:12k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #pragma once
  22. #include "GS.h"
  23. #include "GSWnd.h"
  24. #include "GSLocalMemory.h"
  25. #include "GSTextureCache.h"
  26. #include "GSSoftVertex.h"
  27. #include "GSVertexList.h"
  28. #include "GSCapture.h"
  29. #include "GSPerfMon.h"
  30. //
  31. #define ENABLE_CAPTURE_STATE
  32. ////
  33. /*
  34. //#define DEBUG_SAVETEXTURES
  35. #define DEBUG_LOG
  36. #define DEBUG_LOG2
  37. #define DEBUG_LOGVERTICES
  38. #define DEBUG_RENDERTARGETS
  39. */
  40. #define D3DCOLORWRITEENABLE_RGB (D3DCOLORWRITEENABLE_RED|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_BLUE)
  41. #define D3DCOLORWRITEENABLE_RGBA (D3DCOLORWRITEENABLE_RGB|D3DCOLORWRITEENABLE_ALPHA)
  42. struct GSDrawingContext
  43. {
  44. struct GSDrawingContext() {memset(this, 0, sizeof(*this));}
  45. GIFRegXYOFFSET XYOFFSET;
  46. GIFRegTEX0 TEX0;
  47. GIFRegTEX1 TEX1;
  48. GIFRegTEX2 TEX2;
  49. GIFRegCLAMP CLAMP;
  50. GIFRegMIPTBP1 MIPTBP1;
  51. GIFRegMIPTBP2 MIPTBP2;
  52. GIFRegSCISSOR SCISSOR;
  53. GIFRegALPHA ALPHA;
  54. GIFRegTEST TEST;
  55. GIFRegFBA FBA;
  56. GIFRegFRAME FRAME;
  57. GIFRegZBUF ZBUF;
  58. GSLocalMemory::psmtbl_t* ftbl;
  59. GSLocalMemory::psmtbl_t* ztbl;
  60. GSLocalMemory::psmtbl_t* ttbl;
  61. };
  62. struct GSDrawingEnvironment
  63. {
  64. struct GSDrawingEnvironment() {memset(this, 0, sizeof(*this));}
  65. GIFRegPRIM PRIM;
  66. GIFRegPRMODE PRMODE;
  67. GIFRegPRMODECONT PRMODECONT;
  68. GIFRegTEXCLUT TEXCLUT;
  69. GIFRegSCANMSK SCANMSK;
  70. GIFRegTEXA TEXA;
  71. GIFRegFOGCOL FOGCOL;
  72. GIFRegDIMX DIMX;
  73. GIFRegDTHE DTHE;
  74. GIFRegCOLCLAMP COLCLAMP;
  75. GIFRegPABE PABE;
  76. GSDrawingContext CTXT[2];
  77. };
  78. struct GSRegSet
  79. {
  80. struct GSRegSet() {memset(this, 0, sizeof(*this));}
  81. CSize GetDispSize(int en)
  82. {
  83. ASSERT(en >= 0 && en < 2);
  84. CSize size;
  85. size.cx = (DISPLAY[en].DW + 1) / (DISPLAY[en].MAGH + 1);
  86. size.cy = (DISPLAY[en].DH + 1) / (DISPLAY[en].MAGV + 1);
  87. //if(SMODE2.INT && SMODE2.FFMD && size.cy > 1) size.cy >>= 1;
  88. return size;
  89. }
  90. CRect GetDispRect(int en)
  91. {
  92. ASSERT(en >= 0 && en < 2);
  93. return CRect(CPoint(DISPFB[en].DBX, DISPFB[en].DBY), GetDispSize(en));
  94. }
  95. bool IsEnabled(int en)
  96. {
  97. ASSERT(en >= 0 && en < 2);
  98. if(en == 0 && PMODE.EN1) {return(DISPLAY[0].DW || DISPLAY[0].DH);}
  99. else if(en == 1 && PMODE.EN2) {return(DISPLAY[1].DW || DISPLAY[1].DH);}
  100. return(false);
  101. }
  102. int GetFPS()
  103. {
  104. return ((SMODE1.CMOD&1) ? 50 : 60) / (SMODE2.INT ? 1 : 2);
  105. }
  106. GSRegBGCOLOR BGCOLOR;
  107. GSRegBUSDIR BUSDIR;
  108. GSRegCSR CSRw, CSRr;
  109. GSRegDISPFB DISPFB[2];
  110. GSRegDISPLAY DISPLAY[2];
  111. GSRegEXTBUF EXTBUF;
  112. GSRegEXTDATA EXTDATA;
  113. GSRegEXTWRITE EXTWRITE;
  114. GSRegIMR IMR;
  115. GSRegPMODE PMODE;
  116. GSRegSIGLBLID SIGLBLID;
  117. GSRegSMODE1 SMODE1;
  118. GSRegSMODE2 SMODE2;
  119. GIFRegBITBLTBUF BITBLTBUF;
  120. GIFRegTRXDIR TRXDIR;
  121. GIFRegTRXPOS TRXPOS;
  122. GIFRegTRXREG TRXREG, TRXREG2;
  123. };
  124. struct GSVertex
  125. {
  126. GIFRegRGBAQ RGBAQ;
  127. GIFRegST ST;
  128. GIFRegUV UV;
  129. GIFRegXYZ XYZ;
  130. GIFRegFOG FOG;
  131. };
  132. class GSState
  133. {
  134. friend class GSTextureCache;
  135. protected:
  136. static const int m_version = 3;
  137. GSLocalMemory m_lm;
  138. GSDrawingEnvironment m_de;
  139. GSDrawingContext* m_ctxt;
  140. GSRegSet m_rs;
  141. GSVertex m_v;
  142. float m_q;
  143. GSPerfMon m_perfmon;
  144. GSCapture m_capture;
  145. private:
  146. static const int m_nTrMaxBytes = 1024*1024*4;
  147. int m_nTrBytes;
  148. BYTE* m_pTrBuff;
  149. int m_x, m_y;
  150. void WriteStep();
  151. void ReadStep();
  152. void WriteTransfer(BYTE* pMem, int len);
  153. void FlushWriteTransfer();
  154. void ReadTransfer(BYTE* pMem, int len);
  155. void MoveTransfer();
  156. protected:
  157. HWND m_hWnd;
  158. int m_width, m_height;
  159. CComPtr<IDirect3D9> m_pD3D;
  160. CComPtr<IDirect3DDevice9> m_pD3DDev;
  161. CComPtr<ID3DXFont> m_pD3DXFont;
  162. CComPtr<IDirect3DSurface9> m_pOrgRenderTarget;
  163. CComPtr<IDirect3DTexture9> m_pTmpRenderTarget;
  164. CComPtr<IDirect3DPixelShader9> m_pPixelShaders[20];
  165. CComPtr<IDirect3DPixelShader9> m_pHLSLTFX[38], m_pHLSLMerge[3], m_pHLSLRedBlue;
  166. enum {PS11_EN11 = 12, PS11_EN01 = 13, PS11_EN10 = 14, PS11_EN00 = 15};
  167. enum {PS14_EN11 = 16, PS14_EN01 = 17, PS14_EN10 = 18, PS14_EN00 = 19};
  168. enum {PS_M16 = 0, PS_M24 = 1, PS_M32 = 2};
  169. D3DPRESENT_PARAMETERS m_d3dpp;
  170. DDCAPS m_ddcaps;
  171. D3DCAPS9 m_caps;
  172. D3DSURFACE_DESC m_bd;
  173. D3DFORMAT m_fmtDepthStencil;
  174. bool m_fEnablePalettizedTextures;
  175. D3DTEXTUREFILTERTYPE m_texfilter;
  176. virtual void Reset();
  177. virtual void VertexKick(bool fSkip) = 0;
  178. virtual int DrawingKick(bool fSkip) = 0;
  179. virtual void NewPrim() = 0;
  180. virtual void FlushPrim() = 0;
  181. virtual void Flip() = 0;
  182. virtual void EndFrame() = 0;
  183. virtual void InvalidateTexture(const GIFRegBITBLTBUF& BITBLTBUF, CRect r) {}
  184. virtual void InvalidateLocalMem(DWORD TBP0, DWORD BW, DWORD PSM, CRect r) {}
  185. virtual void MinMaxUV(int w, int h, CRect& r) {r.SetRect(0, 0, w, h);}
  186. DWORD m_nVSync;
  187. CAMEvent m_evVSync;
  188. CComPtr<IReferenceClock> m_pRefClock;
  189. struct FlipInfo {CComPtr<IDirect3DTexture9> pRT; D3DSURFACE_DESC rd; scale_t scale;};
  190. void FinishFlip(FlipInfo rt[2]);
  191. void FlushPrimInternal();
  192. //
  193. struct GIFPath {GIFTag m_tag; int m_nreg;} m_path[3];
  194. // FIXME: savestate
  195. GIFRegPRIM* m_pPRIM;
  196. UINT32 m_PRIM;
  197. GSRegCSR* m_pCSRr;
  198. void (*m_fpGSirq)();
  199. typedef void (__fastcall GSState::*GIFPackedRegHandler)(GIFPackedReg* r);
  200. GIFPackedRegHandler m_fpGIFPackedRegHandlers[16];
  201. void __fastcall GIFPackedRegHandlerNull(GIFPackedReg* r);
  202. void __fastcall GIFPackedRegHandlerPRIM(GIFPackedReg* r);
  203. void __fastcall GIFPackedRegHandlerRGBA(GIFPackedReg* r);
  204. void __fastcall GIFPackedRegHandlerSTQ(GIFPackedReg* r);
  205. void __fastcall GIFPackedRegHandlerUV(GIFPackedReg* r);
  206. void __fastcall GIFPackedRegHandlerXYZF2(GIFPackedReg* r);
  207. void __fastcall GIFPackedRegHandlerXYZ2(GIFPackedReg* r);
  208. void __fastcall GIFPackedRegHandlerTEX0_1(GIFPackedReg* r);
  209. void __fastcall GIFPackedRegHandlerTEX0_2(GIFPackedReg* r);
  210. void __fastcall GIFPackedRegHandlerCLAMP_1(GIFPackedReg* r);
  211. void __fastcall GIFPackedRegHandlerCLAMP_2(GIFPackedReg* r);
  212. void __fastcall GIFPackedRegHandlerFOG(GIFPackedReg* r);
  213. void __fastcall GIFPackedRegHandlerXYZF3(GIFPackedReg* r);
  214. void __fastcall GIFPackedRegHandlerXYZ3(GIFPackedReg* r);
  215. void __fastcall GIFPackedRegHandlerA_D(GIFPackedReg* r);
  216. void __fastcall GIFPackedRegHandlerNOP(GIFPackedReg* r);
  217. typedef void (__fastcall GSState::*GIFRegHandler)(GIFReg* r);
  218. GIFRegHandler m_fpGIFRegHandlers[256];
  219. void __fastcall GIFRegHandlerNull(GIFReg* r);
  220. void __fastcall GIFRegHandlerPRIM(GIFReg* r);
  221. void __fastcall GIFRegHandlerRGBAQ(GIFReg* r);
  222. void __fastcall GIFRegHandlerST(GIFReg* r);
  223. void __fastcall GIFRegHandlerUV(GIFReg* r);
  224. void __fastcall GIFRegHandlerXYZF2(GIFReg* r);
  225. void __fastcall GIFRegHandlerXYZ2(GIFReg* r);
  226. void __fastcall GIFRegHandlerTEX0_1(GIFReg* r);
  227. void __fastcall GIFRegHandlerTEX0_2(GIFReg* r);
  228. void __fastcall GIFRegHandlerCLAMP_1(GIFReg* r);
  229. void __fastcall GIFRegHandlerCLAMP_2(GIFReg* r);
  230. void __fastcall GIFRegHandlerFOG(GIFReg* r);
  231. void __fastcall GIFRegHandlerXYZF3(GIFReg* r);
  232. void __fastcall GIFRegHandlerXYZ3(GIFReg* r);
  233. void __fastcall GIFRegHandlerNOP(GIFReg* r);
  234. void __fastcall GIFRegHandlerTEX1_1(GIFReg* r);
  235. void __fastcall GIFRegHandlerTEX1_2(GIFReg* r);
  236. void __fastcall GIFRegHandlerTEX2_1(GIFReg* r);
  237. void __fastcall GIFRegHandlerTEX2_2(GIFReg* r);
  238. void __fastcall GIFRegHandlerXYOFFSET_1(GIFReg* r);
  239. void __fastcall GIFRegHandlerXYOFFSET_2(GIFReg* r);
  240. void __fastcall GIFRegHandlerPRMODECONT(GIFReg* r);
  241. void __fastcall GIFRegHandlerPRMODE(GIFReg* r);
  242. void __fastcall GIFRegHandlerTEXCLUT(GIFReg* r);
  243. void __fastcall GIFRegHandlerSCANMSK(GIFReg* r);
  244. void __fastcall GIFRegHandlerMIPTBP1_1(GIFReg* r);
  245. void __fastcall GIFRegHandlerMIPTBP1_2(GIFReg* r);
  246. void __fastcall GIFRegHandlerMIPTBP2_1(GIFReg* r);
  247. void __fastcall GIFRegHandlerMIPTBP2_2(GIFReg* r);
  248. void __fastcall GIFRegHandlerTEXA(GIFReg* r);
  249. void __fastcall GIFRegHandlerFOGCOL(GIFReg* r);
  250. void __fastcall GIFRegHandlerTEXFLUSH(GIFReg* r);
  251. void __fastcall GIFRegHandlerSCISSOR_1(GIFReg* r);
  252. void __fastcall GIFRegHandlerSCISSOR_2(GIFReg* r);
  253. void __fastcall GIFRegHandlerALPHA_1(GIFReg* r);
  254. void __fastcall GIFRegHandlerALPHA_2(GIFReg* r);
  255. void __fastcall GIFRegHandlerDIMX(GIFReg* r);
  256. void __fastcall GIFRegHandlerDTHE(GIFReg* r);
  257. void __fastcall GIFRegHandlerCOLCLAMP(GIFReg* r);
  258. void __fastcall GIFRegHandlerTEST_1(GIFReg* r);
  259. void __fastcall GIFRegHandlerTEST_2(GIFReg* r);
  260. void __fastcall GIFRegHandlerPABE(GIFReg* r);
  261. void __fastcall GIFRegHandlerFBA_1(GIFReg* r);
  262. void __fastcall GIFRegHandlerFBA_2(GIFReg* r);
  263. void __fastcall GIFRegHandlerFRAME_1(GIFReg* r);
  264. void __fastcall GIFRegHandlerFRAME_2(GIFReg* r);
  265. void __fastcall GIFRegHandlerZBUF_1(GIFReg* r);
  266. void __fastcall GIFRegHandlerZBUF_2(GIFReg* r);
  267. void __fastcall GIFRegHandlerBITBLTBUF(GIFReg* r);
  268. void __fastcall GIFRegHandlerTRXPOS(GIFReg* r);
  269. void __fastcall GIFRegHandlerTRXREG(GIFReg* r);
  270. void __fastcall GIFRegHandlerTRXDIR(GIFReg* r);
  271. void __fastcall GIFRegHandlerHWREG(GIFReg* r);
  272. void __fastcall GIFRegHandlerSIGNAL(GIFReg* r);
  273. void __fastcall GIFRegHandlerFINISH(GIFReg* r);
  274. void __fastcall GIFRegHandlerLABEL(GIFReg* r);
  275. public:
  276. GSState(int w, int h, HWND hWnd, HRESULT& hr);
  277. virtual ~GSState();
  278. virtual HRESULT ResetDevice(bool fForceWindowed = false);
  279. UINT32 Freeze(freezeData* fd, bool fSizeOnly);
  280. UINT32 Defrost(const freezeData* fd);
  281. void Write(GS_REG mem, GSReg* r, UINT64 mask);
  282. UINT64 Read(GS_REG mem);
  283. void ReadFIFO(BYTE* pMem);
  284. void Transfer1(BYTE* pMem, UINT32 addr);
  285. void Transfer2(BYTE* pMem, UINT32 size);
  286. void Transfer3(BYTE* pMem, UINT32 size);
  287. void Transfer(BYTE* pMem, UINT32 size, GIFPath& path);
  288. void VSync();
  289. void GSirq(void (*fpGSirq)()) {m_fpGSirq = fpGSirq;}
  290. void GSsetCSR(UINT64* pCSRr) {m_pCSRr = pCSRr ? (GSRegCSR*)pCSRr : &m_rs.CSRr;}
  291. UINT32 MakeSnapshot(char* path);
  292. void Capture();
  293. CString m_strDefaultTitle;
  294. int m_iOSD;
  295. void ToggleOSD();
  296. // state
  297. void CaptureState(CString fn);
  298. FILE* m_sfp;
  299. // logging
  300. FILE* m_fp;
  301. #ifdef DEBUG_LOGVERTICES
  302.     #define LOGV(_x_) LOGVERTEX _x_
  303. #else
  304.     #define LOGV(_x_)
  305. #endif
  306. #ifdef DEBUG_LOG
  307. void LOG(LPCTSTR fmt, ...)
  308. {
  309. va_list args;
  310. va_start(args, fmt);
  311. ////////////
  312. /*
  313. if(_tcsstr(fmt, _T("VSync")) 
  314. || _tcsstr(fmt, _T("*** WARNING ***"))
  315. // || _tcsstr(fmt, _T("Flush"))
  316. || _tcsstr(fmt, _T("CSR"))
  317. || _tcsstr(fmt, _T("DISP"))
  318. || _tcsstr(fmt, _T("FRAME"))
  319. || _tcsstr(fmt, _T("ZBUF"))
  320. || _tcsstr(fmt, _T("SMODE"))
  321. || _tcsstr(fmt, _T("PMODE"))
  322. || _tcsstr(fmt, _T("BITBLTBUF"))
  323. || _tcsstr(fmt, _T("TRX"))
  324. // || _tcsstr(fmt, _T("PRIM"))
  325. // || _tcsstr(fmt, _T("RGB"))
  326. // || _tcsstr(fmt, _T("XYZ"))
  327. // || _tcsstr(fmt, _T("ST"))
  328. // || _tcsstr(fmt, _T("XYOFFSET"))
  329. // || _tcsstr(fmt, _T("TEX"))
  330. || _tcsstr(fmt, _T("TEX0"))
  331. // || _tcsstr(fmt, _T("TEX2"))
  332. // || _tcsstr(fmt, _T("TEXFLUSH"))
  333. // || _tcsstr(fmt, _T("UV"))
  334. // || _tcsstr(fmt, _T("FOG"))
  335. // || _tcsstr(fmt, _T("ALPHA"))
  336. // || _tcsstr(fmt, _T("TBP0")) == fmt
  337. // || _tcsstr(fmt, _T("CBP")) == fmt
  338. // || _tcsstr(fmt, _T("*TC2 ")) == fmt
  339. )
  340. */
  341. if(m_fp)
  342. {
  343. TCHAR buff[2048];
  344. _stprintf(buff, _T("%d: "), clock());
  345. _vstprintf(buff + strlen(buff), fmt, args);
  346. _fputts(buff, m_fp); 
  347. fflush(m_fp);
  348. }
  349. va_end(args);
  350. }
  351. #else
  352. #define LOG __noop
  353. #endif
  354. #ifdef DEBUG_LOG2
  355. void LOG2(LPCTSTR fmt, ...)
  356. {
  357. va_list args;
  358. va_start(args, fmt);
  359. if(m_fp)
  360. {
  361. TCHAR buff[2048];
  362. _stprintf(buff, _T("%d: "), clock());
  363. _vstprintf(buff + strlen(buff), fmt, args);
  364. _fputts(buff, m_fp); 
  365. }
  366. va_end(args);
  367. }
  368. #else
  369. #define LOG2 __noop
  370. #endif
  371. };