1 /* 2 Copyright (C) 2002 Rice1964 3 4 This program is free software; you can redistribute it and/or 5 modify it under the terms of the GNU General Public License 6 as published by the Free Software Foundation; either version 2 7 of the License, or (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program; if not, write to the Free Software 16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 18 */ 19 20 #ifndef _FRAME_BUFFER_H_ 21 #define _FRAME_BUFFER_H_ 22 23 #include "typedefs.h" 24 #include "RenderTexture.h" 25 #include "TextureManager.h" 26 27 typedef int SURFFORMAT; 28 29 extern void TexRectToN64FrameBuffer_16b(uint32_t x0, uint32_t y0, uint32_t width, uint32_t height, uint32_t dwTile); 30 extern void TexRectToFrameBuffer_8b(uint32_t dwXL, uint32_t dwYL, uint32_t dwXH, uint32_t dwYH, float t0u0, float t0v0, float t0u1, float t0v1, uint32_t dwTile); 31 32 class FrameBufferManager 33 { 34 friend class CGraphicsContext; 35 friend class CDXGraphicsContext; 36 public: 37 FrameBufferManager(); 38 virtual ~FrameBufferManager(); 39 40 void Initialize(); 41 void CloseUp(); 42 void Set_CI_addr(SetImgInfo &newCI); 43 void UpdateRecentCIAddr(SetImgInfo &ciinfo); 44 void SetAddrBeDisplayed(uint32_t addr); 45 bool HasAddrBeenDisplayed(uint32_t addr, uint32_t width); 46 int FindRecentCIInfoIndex(uint32_t addr); 47 bool IsDIaRenderTexture(); 48 49 int CheckAddrInRenderTextures(uint32_t addr, bool checkcrc); 50 uint32_t ComputeRenderTextureCRCInRDRAM(int infoIdx); 51 void CheckRenderTextureCRCInRDRAM(void); 52 int CheckRenderTexturesWithNewCI(SetImgInfo &CIinfo, uint32_t height, bool byNewTxtrBuf); 53 virtual void ClearN64FrameBufferToBlack(uint32_t left, uint32_t top, uint32_t width, uint32_t height); 54 virtual int SetBackBufferAsRenderTexture(SetImgInfo &CIinfo, int ciInfoIdx); 55 void LoadTextureFromRenderTexture(TxtrCacheEntry* pEntry, int infoIdx); 56 void UpdateFrameBufferBeforeUpdateFrame(); 57 virtual void RestoreNormalBackBuffer(); // restore the normal back buffer 58 virtual void CopyBackToFrameBufferIfReadByCPU(uint32_t addr); 59 virtual void SetRenderTexture(void); 60 virtual void CloseRenderTexture(bool toSave); 61 virtual void ActiveTextureBuffer(void); 62 63 int IsAddrInRecentFrameBuffers(uint32_t addr); 64 int CheckAddrInBackBuffers(uint32_t addr, uint32_t memsize, bool copyToRDRAM); 65 66 uint8_t CIFindIndex(uint16_t val); 67 uint32_t ComputeCImgHeight(SetImgInfo &info, uint32_t &height); 68 69 int FindASlot(void); 70 71 bool ProcessFrameWriteRecord(); 72 void FrameBufferWriteByCPU(uint32_t addr, uint32_t size); 73 void FrameBufferReadByCPU( uint32_t addr ); 74 bool FrameBufferInRDRAMCheckCRC(); 75 void StoreRenderTextureToRDRAM(int infoIdx); 76 IsRenderingToTexture()77 virtual bool IsRenderingToTexture() {return m_isRenderingToTexture;} 78 79 // Device dependent functions 80 virtual void SaveBackBuffer(int ciInfoIdx, M64P_RECT* pRect, bool forceToSaveToRDRAM); // Copy the current back buffer to temp buffer CopyBackBufferToRenderTexture(int idx,RecentCIInfo & ciInfo,M64P_RECT * pRect)81 virtual void CopyBackBufferToRenderTexture(int idx, RecentCIInfo &ciInfo, M64P_RECT* pRect) {} // Copy the current back buffer to temp buffer 82 virtual void CopyBufferToRDRAM(uint32_t addr, uint32_t fmt, uint32_t siz, uint32_t width, 83 uint32_t height, uint32_t bufWidth, uint32_t bufHeight, uint32_t startaddr, 84 uint32_t memsize, uint32_t pitch, TextureFmt bufFmt, void *surf, uint32_t bufPitch); StoreBackBufferToRDRAM(uint32_t addr,uint32_t fmt,uint32_t siz,uint32_t width,uint32_t height,uint32_t bufWidth,uint32_t bufHeight,uint32_t startaddr,uint32_t memsize,uint32_t pitch,SURFFORMAT surf_fmt)85 virtual void StoreBackBufferToRDRAM(uint32_t addr, uint32_t fmt, uint32_t siz, uint32_t width, 86 uint32_t height, uint32_t bufWidth, uint32_t bufHeight, uint32_t startaddr, 87 uint32_t memsize, uint32_t pitch, SURFFORMAT surf_fmt) {} 88 #ifdef DEBUGGER 89 virtual void DisplayRenderTexture(int infoIdx); 90 #endif 91 92 protected: 93 bool m_isRenderingToTexture; 94 int m_curRenderTextureIndex; 95 int m_lastTextureBufferIndex; 96 }; 97 98 // 99 // DirectX Framebuffer 100 // 101 class DXFrameBufferManager : public FrameBufferManager 102 { ~DXFrameBufferManager()103 virtual ~DXFrameBufferManager() {} 104 105 public: 106 // Device dependent functions 107 virtual void CopyBackBufferToRenderTexture(int idx, RecentCIInfo &ciInfo, M64P_RECT* pRect); // Copy the current back buffer to temp buffer 108 virtual void StoreBackBufferToRDRAM(uint32_t addr, uint32_t fmt, uint32_t siz, uint32_t width, 109 uint32_t height, uint32_t bufWidth, uint32_t bufHeight, uint32_t startaddr, 110 uint32_t memsize, uint32_t pitch, SURFFORMAT surf_fmt); 111 }; 112 113 // 114 // OpenGL Framebuffer 115 // 116 class OGLFrameBufferManager : public FrameBufferManager 117 { ~OGLFrameBufferManager()118 virtual ~OGLFrameBufferManager() {} 119 120 public: 121 // Device dependent functions 122 virtual void CopyBackBufferToRenderTexture(int idx, RecentCIInfo &ciInfo, M64P_RECT* pRect); // Copy the current back buffer to temp buffer 123 virtual void StoreBackBufferToRDRAM(uint32_t addr, uint32_t fmt, uint32_t siz, uint32_t width, 124 uint32_t height, uint32_t bufWidth, uint32_t bufHeight, uint32_t startaddr, 125 uint32_t memsize, uint32_t pitch, SURFFORMAT surf_fmt); 126 }; 127 128 extern RenderTextureInfo gRenderTextureInfos[]; 129 extern RenderTextureInfo newRenderTextureInfo; 130 131 #define NEW_TEXTURE_BUFFER 132 133 extern RenderTextureInfo g_ZI_saves[2]; 134 extern RenderTextureInfo *g_pRenderTextureInfo; 135 136 137 extern FrameBufferManager* g_pFrameBufferManager; 138 139 extern RecentCIInfo g_RecentCIInfo[]; 140 extern RecentViOriginInfo g_RecentVIOriginInfo[]; 141 extern RenderTextureInfo gRenderTextureInfos[]; 142 extern int numOfTxtBufInfos; 143 extern RecentCIInfo *g_uRecentCIInfoPtrs[5]; 144 extern uint8_t RevTlutTable[0x10000]; 145 146 extern uint32_t CalculateRDRAMCRC(void *pAddr, uint32_t left, uint32_t top, uint32_t width, uint32_t height, uint32_t size, uint32_t pitchInBytes); 147 extern uint16_t ConvertRGBATo555(uint8_t r, uint8_t g, uint8_t b, uint8_t a); 148 extern uint16_t ConvertRGBATo555(uint32_t color32); 149 extern void InitTlutReverseLookup(void); 150 151 #endif 152 153