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