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

多媒体编程

开发平台:

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 "GSLocalMemory.h"
  24. template <class T> class CSurfMap : public CMap<DWORD, DWORD, CComPtr<T>, CComPtr<T>& > {};
  25. extern bool IsRenderTarget(IDirect3DTexture9* pTexture);
  26. extern bool HasSharedBits(DWORD sbp, DWORD spsm, DWORD dbp, DWORD dpsm);
  27. // TODO: get rid of this *PrivateData
  28. #ifdef __INTEL_COMPILER
  29. struct __declspec(uuid("5D5EFE0E-5407-4BCF-855D-C46CBCD075FA"))
  30. #else
  31. [uuid("5D5EFE0E-5407-4BCF-855D-C46CBCD075FA")] struct 
  32. #endif
  33. scale_t
  34. {
  35. float x, y;
  36. struct scale_t() {x = y = 1;}
  37. struct scale_t(float x, float y) {this->x = x; this->y = y;}
  38. struct scale_t(IDirect3DResource9* p) {Get(p);}
  39. bool operator == (const struct scale_t& s) {return fabs(x - s.x) < 0.001 && fabs(y - s.y) < 0.001;}
  40. void Set(IDirect3DResource9* p) {p->SetPrivateData(__uuidof(*this), this, sizeof(*this), 0);}
  41. void Get(IDirect3DResource9* p) {DWORD size = sizeof(*this); p->GetPrivateData(__uuidof(*this), this, &size);}
  42. };
  43. class GSDirtyRect
  44. {
  45. DWORD m_PSM;
  46. CRect m_rcDirty;
  47. public:
  48. GSDirtyRect() : m_PSM(PSM_PSMCT32), m_rcDirty(0, 0, 0, 0) {}
  49. GSDirtyRect(DWORD PSM, CRect r);
  50. CRect GetDirtyRect(const GIFRegTEX0& TEX0);
  51. };
  52. class GSDirtyRectList : public CAtlList<GSDirtyRect>
  53. {
  54. public:
  55. GSDirtyRectList() {}
  56. GSDirtyRectList(const GSDirtyRectList& l) {*this = l;}
  57. void operator = (const GSDirtyRectList& l);
  58. CRect GetDirtyRect(const GIFRegTEX0& TEX0);
  59. };
  60. struct GSTextureBase
  61. {
  62. CComPtr<IDirect3DTexture9> m_pTexture, m_pPalette;
  63. scale_t m_scale;
  64. bool m_fRT;
  65. D3DSURFACE_DESC m_desc;
  66. GSTextureBase();
  67. };
  68. struct GSTexture : public GSTextureBase
  69. {
  70. GIFRegCLAMP m_CLAMP;
  71. GIFRegTEX0 m_TEX0;
  72. GIFRegTEXA m_TEXA; // *
  73. DWORD m_clut[256]; // *
  74. GSDirtyRectList m_rcDirty;
  75. CRect m_rcValid;
  76. CRect m_rcHash;
  77. DWORD m_dwHash, m_nHashDiff, m_nHashSame;
  78. DWORD m_nBytes;
  79. int m_nAge, m_nVsyncs;
  80. CInterfaceList<IDirect3DTexture9> m_pSubTextures;
  81. bool m_fTemp;
  82. GSTexture();
  83. };
  84. class GSState;
  85. class GSTextureCache : private CAtlList<GSTexture*>
  86. {
  87. protected:
  88. CInterfaceList<IDirect3DTexture9> m_pTexturePool;
  89. HRESULT CreateTexture(GSState* s, GSTexture* pt, DWORD PSM, DWORD CPSM = PSM_PSMCT32);
  90. bool IsTextureInCache(IDirect3DTexture9* pTexture);
  91. void RemoveOldTextures(GSState* s);
  92. bool GetDirtyRect(GSState* s, GSTexture* pt, CRect& r);
  93. DWORD HashTexture(const CRect& r, int pitch, void* bits);
  94. HRESULT UpdateTexture(GSState* s, GSTexture* pt, GSLocalMemory::readTexture rt);
  95. GSTexture* ConvertRT(GSState* s, GSTexture* pt);
  96. GSTexture* ConvertRTPitch(GSState* s, GSTexture* pt);
  97. GSTexture* ConvertRTWidthHeight(GSState* s, GSTexture* pt);
  98. CInterfaceList<IDirect3DTexture9> m_pRTPool;
  99. HRESULT CreateRT(GSState* s, int w, int h, IDirect3DTexture9** ppRT);
  100. public:
  101. GSTextureCache();
  102. ~GSTextureCache();
  103. bool Fetch(GSState* s, GSTextureBase& t);
  104. bool FetchP(GSState* s, GSTextureBase& t);
  105. bool FetchNP(GSState* s, GSTextureBase& t);
  106. void IncAge(CSurfMap<IDirect3DTexture9>& pRTs);
  107. void ResetAge(DWORD TBP0);
  108. void RemoveAll();
  109. void InvalidateTexture(GSState* s, const GIFRegBITBLTBUF& BITBLTBUF, const CRect& r);
  110. void InvalidateLocalMem(GSState* s, DWORD TBP0, DWORD BW, DWORD PSM, const CRect& r);
  111. void AddRT(GIFRegTEX0& TEX0, IDirect3DTexture9* pRT, scale_t scale);
  112. };