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

多媒体编程

开发平台:

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. #include "stdafx.h"
  22. #include "GSState.h"
  23. void GSState::WriteStep()
  24. {
  25. // if(m_y == m_rs.TRXREG.RRH && m_x == m_rs.TRXPOS.DSAX) ASSERT(0);
  26. if(++m_x == m_rs.TRXREG.RRW)
  27. {
  28. m_x = m_rs.TRXPOS.DSAX;
  29. m_y++;
  30. }
  31. }
  32. void GSState::ReadStep()
  33. {
  34. // if(m_y == m_rs.TRXREG.RRH && m_x == m_rs.TRXPOS.SSAX) ASSERT(0);
  35. if(++m_x == m_rs.TRXREG.RRW)
  36. {
  37. m_x = m_rs.TRXPOS.SSAX;
  38. m_y++;
  39. }
  40. }
  41. void GSState::WriteTransfer(BYTE* pMem, int len)
  42. {
  43. LOG(_T("*TC2 WriteTransfer %d,%d (psm=%d rr=%dx%d len=%d)n"), m_x, m_y, m_rs.BITBLTBUF.DPSM, m_rs.TRXREG.RRW, m_rs.TRXREG.RRH, len);
  44. if(len == 0) return;
  45. // TODO: hmmmm
  46. if(m_pPRIM->TME && (m_rs.BITBLTBUF.DBP == m_ctxt->TEX0.TBP0 || m_rs.BITBLTBUF.DBP == m_ctxt->TEX0.CBP))
  47. FlushPrim();
  48. int bpp = GSLocalMemory::m_psmtbl[m_rs.BITBLTBUF.DPSM].trbpp;
  49. int pitch = (m_rs.TRXREG.RRW - m_rs.TRXPOS.DSAX)*bpp>>3;
  50. int height = len / pitch;
  51. if(m_nTrBytes > 0 || height < m_rs.TRXREG.RRH - m_rs.TRXPOS.DSAY)
  52. {
  53. LOG(_T("*TC2 WriteTransfer delayedn"));
  54. ASSERT(len <= m_nTrMaxBytes); // transferring more than 4mb into a 4mb local mem doesn't make any sense
  55. len = min(m_nTrMaxBytes, len);
  56. if(m_nTrBytes + len > m_nTrMaxBytes)
  57. FlushWriteTransfer();
  58. memcpy(&m_pTrBuff[m_nTrBytes], pMem, len);
  59. m_nTrBytes += len;
  60. }
  61. else
  62. {
  63. int x = m_x, y = m_y;
  64. (m_lm.*GSLocalMemory::m_psmtbl[m_rs.BITBLTBUF.DPSM].st)(m_x, m_y, pMem, len, m_rs.BITBLTBUF, m_rs.TRXPOS, m_rs.TRXREG);
  65. m_perfmon.IncCounter(GSPerfMon::c_swizzle, len);
  66. //ASSERT(m_rs.TRXREG.RRH >= m_y - y);
  67. CRect r(m_rs.TRXPOS.DSAX, y, m_rs.TRXREG.RRW, min(m_x == m_rs.TRXPOS.DSAX ? m_y : m_y+1, m_rs.TRXREG.RRH));
  68. InvalidateTexture(m_rs.BITBLTBUF, r);
  69. m_lm.InvalidateCLUT();
  70. }
  71. }
  72. void GSState::FlushWriteTransfer()
  73. {
  74. if(!m_nTrBytes) return;
  75. int x = m_x, y = m_y;
  76. LOG(_T("*TC2 FlushWriteTransfer %d,%d-%d,%d (psm=%d rr=%dx%d len=%d)n"), x, y, m_x, m_y, m_rs.BITBLTBUF.DPSM, m_rs.TRXREG.RRW, m_rs.TRXREG.RRH, m_nTrBytes);
  77. (m_lm.*GSLocalMemory::m_psmtbl[m_rs.BITBLTBUF.DPSM].st)(m_x, m_y, m_pTrBuff, m_nTrBytes, m_rs.BITBLTBUF, m_rs.TRXPOS, m_rs.TRXREG);
  78. m_perfmon.IncCounter(GSPerfMon::c_swizzle, m_nTrBytes);
  79. m_nTrBytes = 0;
  80. //ASSERT(m_rs.TRXREG.RRH >= m_y - y);
  81. CRect r(m_rs.TRXPOS.DSAX, y, m_rs.TRXREG.RRW, min(m_x == m_rs.TRXPOS.DSAX ? m_y : m_y+1, m_rs.TRXREG.RRH));
  82. InvalidateTexture(m_rs.BITBLTBUF, r);
  83. m_lm.InvalidateCLUT();
  84. }
  85. void GSState::ReadTransfer(BYTE* pMem, int len)
  86. {
  87. BYTE* pb = (BYTE*)pMem;
  88. WORD* pw = (WORD*)pMem;
  89. DWORD* pd = (DWORD*)pMem;
  90. if(m_y >= (int)m_rs.TRXREG.RRH) {ASSERT(0); return;}
  91. if(m_x == m_rs.TRXPOS.SSAX && m_y == m_rs.TRXPOS.SSAY)
  92. {
  93. CRect r(m_rs.TRXPOS.SSAX, m_rs.TRXPOS.SSAY, m_rs.TRXREG.RRW, m_rs.TRXREG.RRH);
  94. InvalidateLocalMem(m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW, m_rs.BITBLTBUF.SPSM, r);
  95. }
  96. switch(m_rs.BITBLTBUF.SPSM)
  97. {
  98. case PSM_PSMCT32:
  99. for(len /= 4; len-- > 0; ReadStep(), pd++)
  100. *pd = m_lm.readPixel32(m_x, m_y, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW);
  101. break;
  102. case PSM_PSMCT24:
  103. for(len /= 3; len-- > 0; ReadStep(), pb+=3)
  104. {
  105. DWORD dw = m_lm.readPixel24(m_x, m_y, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW);
  106. pb[0] = ((BYTE*)&dw)[0]; pb[1] = ((BYTE*)&dw)[1]; pb[2] = ((BYTE*)&dw)[2];
  107. }
  108. break;
  109. case PSM_PSMCT16:
  110. for(len /= 2; len-- > 0; ReadStep(), pw++)
  111. *pw = (WORD)m_lm.readPixel16(m_x, m_y, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW);
  112. break;
  113. case PSM_PSMCT16S:
  114. for(len /= 2; len-- > 0; ReadStep(), pw++)
  115. *pw = (WORD)m_lm.readPixel16S(m_x, m_y, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW);
  116. break;
  117. case PSM_PSMT8:
  118. for(; len-- > 0; ReadStep(), pb++)
  119. *pb = (BYTE)m_lm.readPixel8(m_x, m_y, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW);
  120. break;
  121. case PSM_PSMT4:
  122. for(; len-- > 0; ReadStep(), ReadStep(), pb++)
  123. *pb = (BYTE)(m_lm.readPixel4(m_x, m_y, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW)&0x0f)
  124. | (BYTE)(m_lm.readPixel4(m_x+1, m_y, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW)<<4);
  125. break;
  126. case PSM_PSMT8H:
  127. for(; len-- > 0; ReadStep(), pb++)
  128. *pb = (BYTE)m_lm.readPixel8H(m_x, m_y, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW);
  129. break;
  130. case PSM_PSMT4HL:
  131. for(; len-- > 0; ReadStep(), ReadStep(), pb++)
  132. *pb = (BYTE)(m_lm.readPixel4HL(m_x, m_y, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW)&0x0f)
  133. | (BYTE)(m_lm.readPixel4HL(m_x+1, m_y, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW)<<4);
  134. break;
  135. case PSM_PSMT4HH:
  136. for(; len-- > 0; ReadStep(), ReadStep(), pb++)
  137. *pb = (BYTE)(m_lm.readPixel4HH(m_x, m_y, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW)&0x0f)
  138. | (BYTE)(m_lm.readPixel4HH(m_x+1, m_y, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW)<<4);
  139. break;
  140. case PSM_PSMZ32:
  141. for(len /= 4; len-- > 0; ReadStep(), pd++)
  142. *pd = m_lm.readPixel32Z(m_x, m_y, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW);
  143. break;
  144. case PSM_PSMZ24:
  145. for(len /= 3; len-- > 0; ReadStep(), pb+=3)
  146. {
  147. DWORD dw = m_lm.readPixel24Z(m_x, m_y, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW);
  148. pb[0] = ((BYTE*)&dw)[0]; pb[1] = ((BYTE*)&dw)[1]; pb[2] = ((BYTE*)&dw)[2];
  149. }
  150. break;
  151. case PSM_PSMZ16:
  152. for(len /= 2; len-- > 0; ReadStep(), pw++)
  153. *pw = (WORD)m_lm.readPixel16Z(m_x, m_y, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW);
  154. break;
  155. case PSM_PSMZ16S:
  156. for(len /= 2; len-- > 0; ReadStep(), pw++)
  157. *pw = (WORD)m_lm.readPixel16SZ(m_x, m_y, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW);
  158. break;
  159. }
  160. }
  161. void GSState::MoveTransfer()
  162. {
  163. GSLocalMemory::readPixel rp = GSLocalMemory::m_psmtbl[m_rs.BITBLTBUF.SPSM].rp;
  164. GSLocalMemory::writePixel wp = GSLocalMemory::m_psmtbl[m_rs.BITBLTBUF.DPSM].wp;
  165. int sx = m_rs.TRXPOS.SSAX;
  166. int dx = m_rs.TRXPOS.DSAX;
  167. int sy = m_rs.TRXPOS.SSAY;
  168. int dy = m_rs.TRXPOS.DSAY;
  169. int w = m_rs.TRXREG.RRW;
  170. int h = m_rs.TRXREG.RRH;
  171. int xinc = 1;
  172. int yinc = 1;
  173. if(sx < dx) sx += w-1, dx += w-1, xinc = -1;
  174. if(sy < dy) sy += h-1, dy += h-1, yinc = -1;
  175. for(int y = 0; y < h; y++, sy += yinc, dy += yinc, sx -= xinc*w, dx -= xinc*w)
  176. for(int x = 0; x < w; x++, sx += xinc, dx += xinc)
  177. (m_lm.*wp)(dx, dy, (m_lm.*rp)(sx, sy, m_rs.BITBLTBUF.SBP, m_rs.BITBLTBUF.SBW), m_rs.BITBLTBUF.DBP, m_rs.BITBLTBUF.DBW);
  178. }