Implement GL_EXT_shared_texture_palette

This commit is contained in:
Luke Benstead 2019-02-21 21:58:31 +00:00
parent 3d5b257e1b
commit 6d2c47bda1
4 changed files with 69 additions and 25 deletions

View File

@ -139,6 +139,9 @@ TextureObject* getBoundTexture();
GLubyte _glGetActiveTexture();
GLuint _glGetActiveClientTexture();
GLboolean _glIsSharedTexturePaletteEnabled();
void _glApplyColorTable();
GLboolean isBlendingEnabled();
GLboolean _glIsMipmapComplete(const TextureObject* obj);
GLubyte* _glGetMipmapLocation(TextureObject* obj, GLuint level);

View File

@ -27,6 +27,13 @@ static GLenum FRONT_FACE = GL_CCW;
static GLboolean CULLING_ENABLED = GL_FALSE;
static GLboolean COLOR_MATERIAL_ENABLED = GL_FALSE;
/* Is the shared texture palette enabled? */
static GLboolean SHARED_PALETTE_ENABLED = GL_FALSE;
GLboolean _glIsSharedTexturePaletteEnabled() {
return SHARED_PALETTE_ENABLED;
}
static int _calc_pvr_face_culling() {
if(!CULLING_ENABLED) {
return PVR_CULLING_NONE;
@ -214,6 +221,9 @@ void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit) {
} else {
context->txr.enable = PVR_TEXTURE_DISABLE;
}
/* Apply the texture palette if necessary */
_glApplyColorTable();
}
static GLboolean LIGHTING_ENABLED = GL_FALSE;
@ -291,6 +301,9 @@ GLAPI void APIENTRY glEnable(GLenum cap) {
case GL_COLOR_MATERIAL:
COLOR_MATERIAL_ENABLED = GL_TRUE;
break;
case GL_SHARED_TEXTURE_PALETTE_EXT:
SHARED_PALETTE_ENABLED = GL_TRUE;
break;
case GL_LIGHT0:
case GL_LIGHT1:
case GL_LIGHT2:
@ -338,6 +351,9 @@ GLAPI void APIENTRY glDisable(GLenum cap) {
case GL_COLOR_MATERIAL:
COLOR_MATERIAL_ENABLED = GL_FALSE;
break;
case GL_SHARED_TEXTURE_PALETTE_EXT:
SHARED_PALETTE_ENABLED = GL_FALSE;
break;
case GL_LIGHT0:
case GL_LIGHT1:
case GL_LIGHT2:
@ -601,7 +617,7 @@ const GLbyte *glGetString(GLenum name) {
return "GLdc 1.x";
case GL_EXTENSIONS:
return "GL_ARB_framebuffer_object, GL_ARB_multitexture, GL_ARB_texture_rg, GL_EXT_paletted_texture";
return "GL_ARB_framebuffer_object, GL_ARB_multitexture, GL_ARB_texture_rg, GL_EXT_paletted_texture, GL_EXT_shared_texture_palette";
}
return "GL_KOS_ERROR: ENUM Unsupported\n";

View File

@ -17,26 +17,43 @@ static TextureObject* TEXTURE_UNITS[MAX_TEXTURE_UNITS] = {NULL, NULL};
static NamedArray TEXTURE_OBJECTS;
static GLubyte ACTIVE_TEXTURE = 0;
static TexturePalette* SHARED_PALETTE = NULL;
static GLuint _determinePVRFormat(GLint internalFormat, GLenum type);
#define PACK_ARGB8888(a,r,g,b) ( ((a & 0xFF) << 24) | ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF) )
static void _glApplyColorTable() {
TextureObject* active = getBoundTexture();
void _glApplyColorTable() {
/*
* FIXME:
*
* - Different palette formats (GL_RGB -> PVR_PAL_RGB565)
* - Store the active palette, don't resubmit eah time
*/
if(!active) {
return; //? Unload the palette? Make White?
}
TexturePalette* src = NULL;
if(!active->palette || !active->palette->data) {
return;
if(_glIsSharedTexturePaletteEnabled()) {
src = SHARED_PALETTE;
} else {
TextureObject* active = getBoundTexture();
if(!active) {
return; //? Unload the palette? Make White?
}
if(!active->palette || !active->palette->data) {
return;
}
src = active->palette;
}
pvr_set_pal_format(PVR_PAL_ARGB8888);
GLushort i = 0;
for(; i < active->palette->width; ++i) {
GLubyte* entry = &active->palette->data[i * 4];
for(; i < src->width; ++i) {
GLubyte* entry = &src->data[i * 4];
pvr_set_pal_entry(i, PACK_ARGB8888(entry[3], entry[1], entry[2], entry[0]));
}
}
@ -117,6 +134,8 @@ static GLuint _glGetMipmapDataSize(TextureObject* obj) {
GLubyte _glKosInitTextures() {
named_array_init(&TEXTURE_OBJECTS, sizeof(TextureObject), 256);
SHARED_PALETTE = (TexturePalette*) malloc(sizeof(TexturePalette));
return 1;
}
@ -218,9 +237,6 @@ void APIENTRY glBindTexture(GLenum target, GLuint texture) {
if(texture) {
TEXTURE_UNITS[ACTIVE_TEXTURE] = (TextureObject*) named_array_get(&TEXTURE_OBJECTS, texture);
// If this is a paletted texture, we need to reapply the color table
_glApplyColorTable();
} else {
TEXTURE_UNITS[ACTIVE_TEXTURE] = NULL;
}
@ -947,20 +963,30 @@ GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsize
return;
}
TextureObject* active = getBoundTexture();
if(active->palette) {
free(active->palette->data);
active->palette->data = NULL;
TexturePalette* palette = NULL;
if(target == GL_SHARED_TEXTURE_PALETTE_EXT) {
palette = SHARED_PALETTE;
} else {
active->palette = (TexturePalette*) malloc(sizeof(TexturePalette));
TextureObject* active = getBoundTexture();
if(!active->palette) {
active->palette = (TexturePalette*) malloc(sizeof(TexturePalette));
}
palette = active->palette;
}
active->palette->data = (GLubyte*) malloc(width * 4);
active->palette->format = format;
active->palette->width = width;
if(target) {
free(palette->data);
palette->data = NULL;
}
palette->data = (GLubyte*) malloc(width * 4);
palette->format = format;
palette->width = width;
GLubyte* src = (GLubyte*) data;
GLubyte* dst = (GLubyte*) active->palette->data;
GLubyte* dst = (GLubyte*) palette->data;
/* Transform and copy the source palette to the texture */
GLushort i = 0;
@ -970,9 +996,6 @@ GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsize
src += sourceStride;
dst += 4;
}
/* Apply the palette immediately, we'll also do this when binding the texture */
_glApplyColorTable();
}
GLAPI void APIENTRY glColorSubTableEXT(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data) {

View File

@ -153,6 +153,8 @@ GLAPI GLboolean APIENTRY glIsFramebufferEXT(GLuint framebuffer);
#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED
#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB
GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *data);
GLAPI void APIENTRY glColorSubTableEXT(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
GLAPI void APIENTRY glGetColorTableEXT(GLenum target, GLenum format, GLenum type, GLvoid *data);