Rice Video Plugin for GLES1.1
[mupen64plus-pandora.git] / source / rice_gles / src / FrameBuffer.h
diff --git a/source/rice_gles/src/FrameBuffer.h b/source/rice_gles/src/FrameBuffer.h
new file mode 100644 (file)
index 0000000..1d796e9
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+Copyright (C) 2002 Rice1964
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifndef _FRAME_BUFFER_H_
+#define _FRAME_BUFFER_H_
+
+#include "typedefs.h"
+#include "RenderTexture.h"
+#include "TextureManager.h"
+
+typedef int SURFFORMAT;
+
+extern void TexRectToN64FrameBuffer_16b(uint32 x0, uint32 y0, uint32 width, uint32 height, uint32 dwTile);
+extern void TexRectToFrameBuffer_8b(uint32 dwXL, uint32 dwYL, uint32 dwXH, uint32 dwYH, float t0u0, float t0v0, float t0u1, float t0v1, uint32 dwTile);
+
+class FrameBufferManager
+{
+    friend class CGraphicsContext;
+    friend class CDXGraphicsContext;
+public:
+    FrameBufferManager();
+    virtual ~FrameBufferManager();
+
+    void Initialize();
+    void CloseUp();
+    void Set_CI_addr(SetImgInfo &newCI);
+    void UpdateRecentCIAddr(SetImgInfo &ciinfo);
+    void SetAddrBeDisplayed(uint32 addr);
+    bool HasAddrBeenDisplayed(uint32 addr, uint32 width);
+    int FindRecentCIInfoIndex(uint32 addr);
+    bool IsDIaRenderTexture();
+
+    int         CheckAddrInRenderTextures(uint32 addr, bool checkcrc = true);
+    uint32      ComputeRenderTextureCRCInRDRAM(int infoIdx);
+    void        CheckRenderTextureCRCInRDRAM(void);
+    int         CheckRenderTexturesWithNewCI(SetImgInfo &CIinfo, uint32 height, bool byNewTxtrBuf);
+    virtual void ClearN64FrameBufferToBlack(uint32 left=0, uint32 top=0, uint32 width=0, uint32 height=0);
+    virtual int SetBackBufferAsRenderTexture(SetImgInfo &CIinfo, int ciInfoIdx);
+    void        LoadTextureFromRenderTexture(TxtrCacheEntry* pEntry, int infoIdx);
+    void        UpdateFrameBufferBeforeUpdateFrame();
+    virtual void RestoreNormalBackBuffer();                 // restore the normal back buffer
+    virtual void CopyBackToFrameBufferIfReadByCPU(uint32 addr);
+    virtual void SetRenderTexture(void);
+    virtual void CloseRenderTexture(bool toSave);
+    virtual void ActiveTextureBuffer(void);
+
+    int IsAddrInRecentFrameBuffers(uint32 addr);
+    int CheckAddrInBackBuffers(uint32 addr, uint32 memsize, bool copyToRDRAM = false);
+
+    uint8 CIFindIndex(uint16 val);
+    uint32 ComputeCImgHeight(SetImgInfo &info, uint32 &height);
+
+    int FindASlot(void);
+
+    bool ProcessFrameWriteRecord();
+    void FrameBufferWriteByCPU(uint32 addr, uint32 size);
+    void FrameBufferReadByCPU( uint32 addr );
+    bool FrameBufferInRDRAMCheckCRC();
+    void StoreRenderTextureToRDRAM(int infoIdx = -1);
+
+    virtual bool IsRenderingToTexture() {return m_isRenderingToTexture;}
+
+    // Device dependent functions
+    virtual void SaveBackBuffer(int ciInfoIdx, RECT* pRect=NULL, bool forceToSaveToRDRAM = false);    // Copy the current back buffer to temp buffer
+    virtual void CopyBackBufferToRenderTexture(int idx, RecentCIInfo &ciInfo, RECT* pRect=NULL) {}    // Copy the current back buffer to temp buffer
+    virtual void CopyBufferToRDRAM(uint32 addr, uint32 fmt, uint32 siz, uint32 width, 
+        uint32 height, uint32 bufWidth, uint32 bufHeight, uint32 startaddr, 
+        uint32 memsize, uint32 pitch, TextureFmt bufFmt, void *surf, uint32 bufPitch);
+    virtual void StoreBackBufferToRDRAM(uint32 addr, uint32 fmt, uint32 siz, uint32 width, 
+        uint32 height, uint32 bufWidth, uint32 bufHeight, uint32 startaddr=0xFFFFFFFF, 
+        uint32 memsize=0xFFFFFFFF, uint32 pitch=0, SURFFORMAT surf_fmt=SURFFMT_A8R8G8B8) {}
+#ifdef DEBUGGER
+    virtual void DisplayRenderTexture(int infoIdx = -1);
+#endif
+
+protected:
+    bool    m_isRenderingToTexture;
+    int     m_curRenderTextureIndex;
+    int     m_lastTextureBufferIndex;
+};
+
+class DXFrameBufferManager : public FrameBufferManager
+{
+    virtual ~DXFrameBufferManager() {}
+
+public:
+    // Device dependent functions
+    virtual void CopyBackBufferToRenderTexture(int idx, RecentCIInfo &ciInfo, RECT* pRect=NULL);    // Copy the current back buffer to temp buffer
+    virtual void StoreBackBufferToRDRAM(uint32 addr, uint32 fmt, uint32 siz, uint32 width, 
+        uint32 height, uint32 bufWidth, uint32 bufHeight, uint32 startaddr=0xFFFFFFFF, 
+        uint32 memsize=0xFFFFFFFF, uint32 pitch=0, SURFFORMAT surf_fmt=SURFFMT_A8R8G8B8);
+};
+
+class OGLFrameBufferManager : public FrameBufferManager
+{
+    virtual ~OGLFrameBufferManager() {}
+
+public:
+    // Device dependent functions
+    virtual void CopyBackBufferToRenderTexture(int idx, RecentCIInfo &ciInfo, RECT* pRect=NULL);    // Copy the current back buffer to temp buffer
+    virtual void StoreBackBufferToRDRAM(uint32 addr, uint32 fmt, uint32 siz, uint32 width, 
+        uint32 height, uint32 bufWidth, uint32 bufHeight, uint32 startaddr=0xFFFFFFFF, 
+        uint32 memsize=0xFFFFFFFF, uint32 pitch=0, SURFFORMAT surf_fmt=SURFFMT_A8R8G8B8);
+};
+
+extern RenderTextureInfo gRenderTextureInfos[];
+extern RenderTextureInfo newRenderTextureInfo;
+
+#define NEW_TEXTURE_BUFFER
+
+extern RenderTextureInfo g_ZI_saves[2];
+extern RenderTextureInfo *g_pRenderTextureInfo;
+
+
+extern FrameBufferManager* g_pFrameBufferManager;
+
+extern RecentCIInfo g_RecentCIInfo[];
+extern RecentViOriginInfo g_RecentVIOriginInfo[];
+extern RenderTextureInfo gRenderTextureInfos[];
+extern int numOfTxtBufInfos;
+extern RecentCIInfo *g_uRecentCIInfoPtrs[5];
+extern uint8 RevTlutTable[0x10000];
+
+extern uint32 CalculateRDRAMCRC(void *pAddr, uint32 left, uint32 top, uint32 width, uint32 height, uint32 size, uint32 pitchInBytes );
+extern uint16 ConvertRGBATo555(uint8 r, uint8 g, uint8 b, uint8 a);
+extern uint16 ConvertRGBATo555(uint32 color32);
+extern void InitTlutReverseLookup(void);
+
+#endif
+