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

多媒体编程

开发平台:

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 "GSState.h"
  23. template <class VERTEX>
  24. class GSRenderer : public GSState
  25. {
  26. protected:
  27. GSVertexList<VERTEX> m_vl;
  28. VERTEX* m_pVertices;
  29. int m_nMaxVertices, m_nVertices, m_nPrims;
  30. void Reset()
  31. {
  32. m_nVertices = m_nPrims = 0;
  33. m_vl.RemoveAll();
  34. __super::Reset();
  35. }
  36. void VertexKick(bool fSkip)
  37. {
  38. LOG(_T("VertexKick(%d)n"), fSkip);
  39. static const int vmin[8] = {1, 2, 2, 3, 3, 3, 2, 1};
  40. while(m_vl.GetCount() >= vmin[m_pPRIM->PRIM])
  41. {
  42. if(m_nVertices+6 > m_nMaxVertices)
  43. {
  44. VERTEX* pVertices = (VERTEX*)_aligned_malloc(sizeof(VERTEX) * (m_nMaxVertices <<= 1), 16);
  45. memcpy(pVertices, m_pVertices, m_nVertices*sizeof(VERTEX));
  46. _aligned_free(m_pVertices);
  47. m_pVertices = pVertices;
  48. }
  49. LOG(_T("DrawingKick %dn"), m_pPRIM->PRIM);
  50.             
  51. if(m_PRIM != m_pPRIM->PRIM && m_nVertices > 0) FlushPrimInternal();
  52. m_PRIM = m_pPRIM->PRIM;
  53. LOG2(_T("Prim (%d) %05x %05x %05x %04xn"), 
  54. m_PRIM,
  55. m_ctxt->FRAME.Block(), 
  56. m_pPRIM->TME ? (UINT32)m_ctxt->TEX0.TBP0 : 0xfffff,
  57. m_pPRIM->TME ? (UINT32)m_ctxt->TEX0.CBP : 0xfffff,
  58. (m_pPRIM->ABE || (m_PRIM == 1 || m_PRIM == 2) && m_pPRIM->AA1)
  59. ? ((m_ctxt->ALPHA.A<<12)|(m_ctxt->ALPHA.B<<8)|(m_ctxt->ALPHA.C<<4)|m_ctxt->ALPHA.D)
  60. : 0xffff);
  61. m_nVertices += DrawingKick(fSkip);
  62. #ifdef DEBUG_RENDERTARGETS
  63. if(::GetAsyncKeyState(VK_SPACE)&0x80000000) {FlushPrimInternal(); Flip();}
  64. #endif
  65. }
  66. }
  67. void NewPrim() {m_vl.RemoveAll();}
  68. void FlushPrim() {m_PRIM = 8; m_nVertices = 0;}
  69. public:
  70. GSRenderer(int w, int h, HWND hWnd, HRESULT& hr)
  71. : GSState(w, h, hWnd, hr)
  72. {
  73. m_pVertices = (VERTEX*)_aligned_malloc(sizeof(VERTEX) * (m_nMaxVertices = 256), 16);
  74. Reset();
  75. }
  76. ~GSRenderer()
  77. {
  78. _aligned_free(m_pVertices);
  79. }
  80. };