1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +00:00
GLideN64/src/FrameBuffer.h

144 lines
3.7 KiB
C
Raw Normal View History

#ifndef FRAMEBUFFER_H
#define FRAMEBUFFER_H
#include <list>
#include <vector>
#include "Types.h"
#include "Textures.h"
2017-01-20 11:47:19 +00:00
#include "Graphics/ObjectHandle.h"
struct gDPTile;
struct DepthBuffer;
const int fingerprint[4] = { 2, 6, 4, 3 };
struct FrameBuffer
{
FrameBuffer();
~FrameBuffer();
2017-03-02 15:09:08 +00:00
void init(u32 _address, u16 _format, u16 _size, u16 _width, bool _cfb);
void updateEndAddress();
void resolveMultisampledTexture(bool _bForce = false);
CachedTexture * getTexture(u32 _t);
CachedTexture * getTextureBG(u32 _t);
void setBufferClearParams(u32 _fillcolor, s32 _ulx, s32 _uly, s32 _lrx, s32 _lry);
void copyRdram();
bool isValid(bool _forceCheck) const;
bool _isMarioTennisScoreboard() const;
bool isAuxiliary() const;
u32 m_startAddress, m_endAddress;
u32 m_size, m_width, m_height;
2017-03-09 10:55:16 +00:00
float m_scale;
bool m_copiedToRdram;
2015-08-02 19:01:02 +00:00
bool m_fingerprint;
bool m_cleared;
bool m_changed;
bool m_cfb;
bool m_isDepthBuffer;
bool m_isPauseScreen;
bool m_isOBScreen;
2017-03-06 09:42:23 +00:00
bool m_isMainBuffer;
bool m_readable;
struct {
u32 uls, ult;
} m_loadTileOrigin;
u32 m_loadType;
2017-01-20 11:47:19 +00:00
graphics::ObjectHandle m_FBO;
CachedTexture *m_pTexture;
DepthBuffer *m_pDepthBuffer;
2015-02-09 12:27:39 +00:00
// multisampling
2017-01-20 11:47:19 +00:00
graphics::ObjectHandle m_resolveFBO;
CachedTexture *m_pResolveTexture;
2015-02-09 12:27:39 +00:00
bool m_resolved;
// subtexture
2017-01-20 11:47:19 +00:00
graphics::ObjectHandle m_SubFBO;
CachedTexture *m_pSubTexture;
std::vector<u8> m_RdramCopy;
2015-02-09 12:27:39 +00:00
private:
struct {
u32 fillcolor;
s32 ulx, uly, lrx, lry;
} m_clearParams;
void _initTexture(u16 _width, u16 _height, u16 _format, u16 _size, CachedTexture *_pTexture);
2017-01-20 11:47:19 +00:00
void _setAndAttachTexture(graphics::ObjectHandle _fbo, CachedTexture *_pTexture, u32 _t, bool _multisampling);
bool _initSubTexture(u32 _t);
CachedTexture * _getSubTexture(u32 _t);
mutable u32 m_validityChecked;
};
class FrameBufferList
{
public:
void init();
void destroy();
2017-03-02 15:09:08 +00:00
void saveBuffer(u32 _address, u16 _format, u16 _size, u16 _width, bool _cfb);
void removeAux();
void copyAux();
void removeBuffer(u32 _address);
void removeBuffers(u32 _width);
void attachDepthBuffer();
void clearDepthBuffer(DepthBuffer * _pDepthBuffer);
FrameBuffer * findBuffer(u32 _startAddress);
FrameBuffer * findTmpBuffer(u32 _address);
FrameBuffer * getCurrent() const {return m_pCurrent;}
void renderBuffer();
void setBufferChanged(f32 _maxY);
void clearBuffersChanged();
void setCurrentDrawBuffer() const;
void fillRDRAM(s32 ulx, s32 uly, s32 lrx, s32 lry);
2014-09-04 12:46:46 +00:00
FrameBuffer * getCopyBuffer() const { return m_pCopy; }
void setCopyBuffer(FrameBuffer * _pBuffer) { m_pCopy = _pBuffer; }
void depthBufferCopyRdram();
void fillBufferInfo(void * _pinfo, u32 _size);
static FrameBufferList & get();
2014-09-04 12:46:46 +00:00
private:
FrameBufferList() : m_pCurrent(nullptr), m_pCopy(nullptr) {}
2014-09-04 12:46:46 +00:00
FrameBufferList(const FrameBufferList &);
2017-03-05 14:35:20 +00:00
void removeIntersections();
void _createScreenSizeBuffer();
void _renderScreenSizeBuffer();
typedef std::list<FrameBuffer> FrameBuffers;
FrameBuffers m_list;
FrameBuffer * m_pCurrent;
FrameBuffer * m_pCopy;
u32 m_prevColorImageHeight;
};
2014-09-04 12:46:46 +00:00
inline
FrameBufferList & frameBufferList()
{
return FrameBufferList::get();
}
u32 cutHeight(u32 _address, u32 _height, u32 _stride);
void calcCoordsScales(const FrameBuffer * _pBuffer, f32 & _scaleX, f32 & _scaleY);
void FrameBuffer_Init();
void FrameBuffer_Destroy();
void FrameBuffer_CopyToRDRAM( u32 _address , bool _sync );
2015-11-23 13:03:33 +00:00
void FrameBuffer_CopyChunkToRDRAM(u32 _address);
void FrameBuffer_CopyFromRDRAM(u32 address, bool bUseAlpha);
void FrameBuffer_AddAddress(u32 address, u32 _size);
2016-02-02 18:52:29 +00:00
bool FrameBuffer_CopyDepthBuffer(u32 address);
2015-11-23 13:03:33 +00:00
bool FrameBuffer_CopyDepthBufferChunk(u32 address);
void FrameBuffer_ActivateBufferTexture(u32 t, FrameBuffer *pBuffer);
void FrameBuffer_ActivateBufferTextureBG(u32 t, FrameBuffer *pBuffer);
#endif