77 lines
2.6 KiB
C++
77 lines
2.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();
|
|
/*
|
|
enum Format
|
|
{
|
|
None = -1,
|
|
USHORT_565 = GL_UNSIGNED_SHORT_5_6_5,
|
|
USHORT_5551_REV = GL_UNSIGNED_SHORT_1_5_5_5_REV,
|
|
UBYTE_8888
|
|
};
|
|
*/
|
|
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 use_client_storage);
|
|
bool initialise_buffers(BufferStruct* framebuffer, BufferStruct* texbuffer, FxU32 width, FxU32 height, FxU32 x_tile, FxU32 y_tile, bool use_client_storage);
|
|
void free_buffers();
|
|
void initialise_format(GrLfbWriteMode_t format);
|
|
bool begin_write();
|
|
bool end_write();
|
|
bool end_write(FxU32 alpha);
|
|
bool end_write(FxU32 alpha, GLfloat depth, bool pixelpipeline);
|
|
bool end_write_opaque();
|
|
protected:
|
|
void Clear();
|
|
bool draw(const tilesize* tilesizetable, bool pixelpipeline);
|
|
void set_gl_state(bool pixelpipeline);
|
|
void restore_gl_state(bool pixelpipeline);
|
|
inline bool createTextureData(FxU32* texbuffer, FxU32 x, FxU32 y, FxU32 x_step, FxU32 y_step);
|
|
inline bool Convert565Kto8888(FxU16* buffer1, FxU32* buffer2, register FxU32 width, register FxU32 height, register FxU32 stride);
|
|
inline bool Convert1555Kto8888(FxU16* buffer1, register FxU32* buffer2, FxU32 register width, register FxU32 height, register FxU32 stride);
|
|
inline bool ConvertARGB8888Kto8888(FxU32* buffer1, register FxU32* buffer2, FxU32 register width, register FxU32 height, register FxU32 stride);
|
|
static const int m_max_client_storage_textures = 256;
|
|
GLuint m_tex_name[m_max_client_storage_textures];
|
|
bool m_use_client_storage;
|
|
bool m_must_clear_buffer;
|
|
GrOriginLocation_t m_origin;
|
|
// GrLfbWriteMode_t m_writemode;
|
|
GLint m_glInternalFormat;
|
|
GLint m_glFormat;
|
|
GLint m_glType;
|
|
FxU16 m_ChromaKey;
|
|
bool m_format_valid;
|
|
BufferStruct* m_framebuffer;
|
|
BufferStruct* m_texbuffer;
|
|
// FxU16* m_framebuffer;
|
|
// void* m_texbuffer;
|
|
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;
|
|
tilesize m_tilesizes[MaxTiles];
|
|
const tilesize* m_custom_tilesizes;
|
|
GLfloat m_glDepth;
|
|
FxU32 m_glAlpha;
|
|
// Pixelpipeline
|
|
bool m_bRestoreColorCombine;
|
|
bool m_bRestoreAlphaCombine;
|
|
};
|