2013-04-05 06:13:26 +00:00
|
|
|
#ifndef FRAMEBUFFER_H
|
|
|
|
#define FRAMEBUFFER_H
|
|
|
|
|
2014-09-08 11:01:22 +00:00
|
|
|
#include <list>
|
|
|
|
|
2013-04-05 06:13:26 +00:00
|
|
|
#include "Types.h"
|
|
|
|
#include "Textures.h"
|
2013-06-29 11:52:57 +00:00
|
|
|
struct gDPTile;
|
2013-11-11 08:57:57 +00:00
|
|
|
struct DepthBuffer;
|
2013-04-05 06:13:26 +00:00
|
|
|
|
|
|
|
struct FrameBuffer
|
|
|
|
{
|
2014-09-08 11:01:22 +00:00
|
|
|
FrameBuffer();
|
|
|
|
FrameBuffer(FrameBuffer && _other);
|
|
|
|
~FrameBuffer();
|
2015-02-09 12:27:39 +00:00
|
|
|
void init(u32 _address, u32 _endAddress, u16 _format, u16 _size, u16 _width, u16 _height, bool _cfb);
|
|
|
|
void resolveMultisampledTexture();
|
|
|
|
CachedTexture * getTexture();
|
2013-04-05 06:13:26 +00:00
|
|
|
|
2014-09-08 11:01:22 +00:00
|
|
|
u32 m_startAddress, m_endAddress;
|
|
|
|
u32 m_size, m_width, m_height, m_fillcolor;
|
|
|
|
float m_scaleX, m_scaleY;
|
|
|
|
bool m_cleared;
|
2014-09-28 06:09:03 +00:00
|
|
|
bool m_cfb;
|
2015-02-19 12:50:02 +00:00
|
|
|
bool m_isDepthBuffer;
|
2015-02-27 13:51:53 +00:00
|
|
|
bool m_copiedToRDRAM;
|
2013-04-05 06:13:26 +00:00
|
|
|
|
2014-09-08 11:01:22 +00:00
|
|
|
GLuint m_FBO;
|
|
|
|
gDPTile *m_pLoadTile;
|
|
|
|
CachedTexture *m_pTexture;
|
|
|
|
DepthBuffer *m_pDepthBuffer;
|
2015-02-09 12:27:39 +00:00
|
|
|
// multisampling
|
|
|
|
CachedTexture *m_pResolveTexture;
|
|
|
|
GLuint m_resolveFBO;
|
|
|
|
bool m_resolved;
|
|
|
|
|
|
|
|
private:
|
|
|
|
void _initTexture(u16 _format, u16 _size, CachedTexture *_pTexture);
|
|
|
|
void _setAndAttachTexture(u16 _size, CachedTexture *_pTexture);
|
2013-04-05 06:13:26 +00:00
|
|
|
};
|
|
|
|
|
2014-09-08 11:01:22 +00:00
|
|
|
class FrameBufferList
|
2013-04-05 06:13:26 +00:00
|
|
|
{
|
2014-09-08 11:01:22 +00:00
|
|
|
public:
|
|
|
|
void init();
|
|
|
|
void destroy();
|
2014-09-28 06:09:03 +00:00
|
|
|
void saveBuffer(u32 _address, u16 _format, u16 _size, u16 _width, u16 _height, bool _cfb);
|
|
|
|
void removeBuffer(u32 _address);
|
2014-09-08 11:01:22 +00:00
|
|
|
void attachDepthBuffer();
|
2014-10-22 07:49:55 +00:00
|
|
|
FrameBuffer * findBuffer(u32 _startAddress);
|
2014-09-08 11:01:22 +00:00
|
|
|
FrameBuffer * findTmpBuffer(u32 _address);
|
|
|
|
FrameBuffer * getCurrent() const {return m_pCurrent;}
|
|
|
|
void renderBuffer(u32 _address);
|
|
|
|
bool isFboMode() const {return m_drawBuffer == GL_FRAMEBUFFER;}
|
2014-09-04 12:46:46 +00:00
|
|
|
|
|
|
|
static FrameBufferList & get()
|
|
|
|
{
|
|
|
|
static FrameBufferList frameBufferList;
|
|
|
|
return frameBufferList;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
2014-09-08 11:01:22 +00:00
|
|
|
FrameBufferList() : m_pCurrent(NULL), m_drawBuffer(GL_BACK) {}
|
2014-09-04 12:46:46 +00:00
|
|
|
FrameBufferList(const FrameBufferList &);
|
2014-09-08 11:01:22 +00:00
|
|
|
|
2014-10-22 07:49:55 +00:00
|
|
|
FrameBuffer * _findBuffer(u32 _startAddress, u32 _endAddress, u32 _width);
|
|
|
|
|
2014-09-08 11:01:22 +00:00
|
|
|
typedef std::list<FrameBuffer> FrameBuffers;
|
|
|
|
FrameBuffers m_list;
|
|
|
|
FrameBuffer * m_pCurrent;
|
|
|
|
GLenum m_drawBuffer;
|
2013-04-05 06:13:26 +00:00
|
|
|
};
|
|
|
|
|
2015-02-16 15:38:46 +00:00
|
|
|
struct PBOBinder {
|
|
|
|
#ifndef GLES2
|
|
|
|
PBOBinder(GLuint _PBO)
|
|
|
|
{
|
|
|
|
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, _PBO);
|
|
|
|
}
|
|
|
|
~PBOBinder() {
|
|
|
|
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
PBOBinder(GLubyte* _ptr) : ptr(_ptr) {}
|
|
|
|
~PBOBinder() { free(ptr); }
|
|
|
|
GLubyte* ptr;
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
2014-09-04 12:46:46 +00:00
|
|
|
inline
|
|
|
|
FrameBufferList & frameBufferList()
|
|
|
|
{
|
|
|
|
return FrameBufferList::get();
|
|
|
|
}
|
2013-04-05 06:13:26 +00:00
|
|
|
|
|
|
|
void FrameBuffer_Init();
|
|
|
|
void FrameBuffer_Destroy();
|
2015-02-24 09:57:30 +00:00
|
|
|
void FrameBuffer_CopyToRDRAM( u32 _address );
|
2013-09-15 14:40:16 +00:00
|
|
|
void FrameBuffer_CopyFromRDRAM( u32 address, bool bUseAlpha );
|
2014-10-18 15:38:32 +00:00
|
|
|
bool FrameBuffer_CopyDepthBuffer( u32 address );
|
2014-09-08 11:01:22 +00:00
|
|
|
void FrameBuffer_ActivateBufferTexture(s16 t, FrameBuffer *pBuffer);
|
|
|
|
void FrameBuffer_ActivateBufferTextureBG(s16 t, FrameBuffer *pBuffer);
|
2013-04-05 06:13:26 +00:00
|
|
|
|
|
|
|
#endif
|