#ifndef FRAMEBUFFER_H #define FRAMEBUFFER_H #include #include #include "Types.h" #include "Textures.h" struct gDPTile; struct DepthBuffer; const int fingerprint[4] = { 2, 6, 4, 3 }; struct FrameBuffer { FrameBuffer(); FrameBuffer(FrameBuffer && _other); ~FrameBuffer(); void init(u32 _address, u32 _endAddress, u16 _format, u16 _size, u16 _width, u16 _height, bool _cfb); void reinit(u16 _height); void resolveMultisampledTexture(); CachedTexture * getTexture(); void copyRdram(); bool isValid() const; bool _isMarioTennisScoreboard() const; u32 m_startAddress, m_endAddress; u32 m_size, m_width, m_height, m_fillcolor, m_validityChecked; float m_scaleX, m_scaleY; bool m_copiedToRdram; bool m_fingerprint; bool m_cleared; bool m_changed; bool m_cfb; bool m_isDepthBuffer; bool m_isPauseScreen; bool m_isOBScreen; bool m_needHeightCorrection; u32 m_postProcessed; GLuint m_FBO; gDPTile *m_pLoadTile; CachedTexture *m_pTexture; DepthBuffer *m_pDepthBuffer; // multisampling CachedTexture *m_pResolveTexture; GLuint m_resolveFBO; bool m_resolved; std::vector m_RdramCopy; private: void _initTexture(u16 _format, u16 _size, CachedTexture *_pTexture); void _setAndAttachTexture(u16 _size, CachedTexture *_pTexture); }; class FrameBufferList { public: void init(); void destroy(); void saveBuffer(u32 _address, u16 _format, u16 _size, u16 _width, u16 _height, bool _cfb); void removeAux(); void copyAux(); void removeBuffer(u32 _address); void removeBuffers(u32 _width); void attachDepthBuffer(); FrameBuffer * findBuffer(u32 _startAddress); FrameBuffer * findTmpBuffer(u32 _address); FrameBuffer * getCurrent() const {return m_pCurrent;} void renderBuffer(u32 _address); void setBufferChanged(); void correctHeight(); void clearBuffersChanged(); FrameBuffer * getCopyBuffer() const { return m_pCopy; } void setCopyBuffer(FrameBuffer * _pBuffer) { m_pCopy = _pBuffer; } static FrameBufferList & get(); private: FrameBufferList() : m_pCurrent(NULL), m_pCopy(NULL) {} FrameBufferList(const FrameBufferList &); FrameBuffer * _findBuffer(u32 _startAddress, u32 _endAddress, u32 _width); typedef std::list FrameBuffers; FrameBuffers m_list; FrameBuffer * m_pCurrent; FrameBuffer * m_pCopy; }; struct PBOBinder { #ifndef GLES2 PBOBinder(GLenum _target, GLuint _PBO) : m_target(_target) { glBindBuffer(m_target, _PBO); } ~PBOBinder() { glBindBuffer(m_target, 0); } GLenum m_target; #else PBOBinder(GLubyte* _ptr) : ptr(_ptr) {} ~PBOBinder() { free(ptr); } GLubyte* ptr; #endif }; inline FrameBufferList & frameBufferList() { return FrameBufferList::get(); } void FrameBuffer_Init(); void FrameBuffer_Destroy(); void FrameBuffer_CopyToRDRAM( u32 _address , bool _sync ); void FrameBuffer_CopyChunkToRDRAM(u32 _address); void FrameBuffer_CopyFromRDRAM(u32 address, bool bUseAlpha); bool FrameBuffer_CopyDepthBuffer( u32 address ); bool FrameBuffer_CopyDepthBufferChunk(u32 address); void FrameBuffer_ActivateBufferTexture(s16 t, FrameBuffer *pBuffer); void FrameBuffer_ActivateBufferTextureBG(s16 t, FrameBuffer *pBuffer); #endif