MacGLide/MacGLide/OpenGLide/Framebuffer.h

113 lines
3.6 KiB
C++

//**************************************************************
//* OpenGLide - Glide to OpenGL Wrapper
//* http://openglide.sourceforge.net
//*
//* framebuffer emulation
//*
//* OpenGLide is OpenSource under LGPL license
//* Mac version and additional features by Jens-Olaf Hemprich
//**************************************************************
#pragma once
class Framebuffer
{
public:
Framebuffer();
~Framebuffer();
static const int MaxTiles = 12;
struct tilesize {GLint y; GLint x[MaxTiles];};
public:
bool initialise_buffers(BufferStruct* framebuffer, BufferStruct* texbuffer, FxU32 width, FxU32 height, const tilesize* tilesizetable);
bool initialise_buffers(BufferStruct* framebuffer, BufferStruct* texbuffer, FxU32 width, FxU32 height, FxU32 x_tile, FxU32 y_tile);
void free_buffers();
void initialise_format(GrLfbWriteMode_t format);
bool begin_write();
void end_write(FxU32 alpha, GLfloat depth);
void end_write_opaque();
inline FxU16 GetChromaKeyValue() {return m_ChromaKey.Scalar;};
inline void SetChromaKeyValue(FxU16 chromakey)
{
#ifdef __ALTIVEC__
for(int i = 0; i < 8; i++)
{
(&m_ChromaKey.Scalar)[i] = chromakey;
}
#else
m_ChromaKey.Scalar = chromakey;
#endif
}
protected:
void Clear();
int buildVertexArrays();
int buildVertexArrays(const tilesize* tilesizetable, int vertexarrayindex);
void set_gl_state();
void restore_gl_state();
// Pixel conversion
enum TileUpdateState
{
TileUpdateState_TileEmpty = false,
TileUpdateState_TileDownloadToGPU = 1, // true,
TileUpdateState_TileDrawOnly = -1 // -true
};
static const int s_maxTiles = MaxTiles * MaxTiles;
GLuint m_textureNames[s_maxTiles];
inline TileUpdateState createTextureData(FxU32* texbuffer, FxU32 x, FxU32 y, FxU32 x_step, FxU32 y_step, int checksumIndex);
inline TileUpdateState Convert565Kto8888(FxU16* buffer1, FxU32* buffer2, register FxU32 width, register FxU32 height, register FxU32 stride);
#ifdef __ALTIVEC__
inline TileUpdateState Convert565Kto8888_AV(FxU16* buffer1, FxU32* buffer2, register FxU32 width, register FxU32 height, register FxU32 stride, int checksumIndex);
vector unsigned long m_tileChecksums[s_maxTiles];
#endif
inline TileUpdateState Convert1555Kto8888(FxU16* buffer1, register FxU32* buffer2, FxU32 register width, register FxU32 height, register FxU32 stride);
inline TileUpdateState ConvertARGB8888Kto8888(FxU32* buffer1, register FxU32* buffer2, FxU32 register width, register FxU32 height, register FxU32 stride);
bool m_useRectangleARB;
bool m_must_clear_buffer;
// Format
GrOriginLocation_t m_origin;
GLint m_glInternalFormat;
GLint m_glFormat;
GLint m_glType;
bool m_format_valid;
BufferStruct* m_framebuffer;
BufferStruct* m_texbuffer;
// Dimensions
FxU32 m_width;
FxU32 m_height;
GLint m_x_step_start;
GLint m_y_step_start;
GLint m_x_step_start_opaque;
GLint m_y_step_start_opaque;
// Tiles
inline int getTileCount() const;
tilesize m_tilesizes[MaxTiles];
int m_tilesizesCount;
int m_tilesizesVertexArrayIndex;
const tilesize* m_custom_tilesizes;
int m_customtilesizesCount;
int m_customtilesizesVertexArrayIndex;
// Color, depth and alpha
GLfloat m_glDepth;
union
{
FxU32 Scalar;
#ifdef __ALTIVEC__
vector unsigned long Vector;
#endif
} m_glAlpha;
// Pixelpipeline
bool m_bRestoreColorCombine;
bool m_bRestoreAlphaCombine;
private:
union
{
FxU16 Scalar;
#ifdef __ALTIVEC__
vector bool short Vector;
#endif
} m_ChromaKey;
//#ifdef DEBUG_TILE_RENDERING
protected:
static void highlightTileCorners(const Framebuffer::TileUpdateState updateState, FxU32* texbuffer, const GLint x_step, const GLint y_step);
//#endif
};