merge changes

This commit is contained in:
Hayden K 2019-03-03 14:10:37 -05:00
commit 19ab4ee47b
13 changed files with 132 additions and 99 deletions

View File

@ -14,11 +14,11 @@
static unsigned char ZCLIP_ENABLED = 1; static unsigned char ZCLIP_ENABLED = 1;
unsigned char isClippingEnabled() { unsigned char _glIsClippingEnabled() {
return ZCLIP_ENABLED; return ZCLIP_ENABLED;
} }
void enableClipping(unsigned char v) { void _glEnableClipping(unsigned char v) {
ZCLIP_ENABLED = v; ZCLIP_ENABLED = v;
} }

View File

@ -19,7 +19,7 @@ static AttribPointer DIFFUSE_POINTER;
static GLuint ENABLED_VERTEX_ATTRIBUTES = 0; static GLuint ENABLED_VERTEX_ATTRIBUTES = 0;
static GLubyte ACTIVE_CLIENT_TEXTURE = 0; static GLubyte ACTIVE_CLIENT_TEXTURE = 0;
void initAttributePointers() { void _glInitAttributePointers() {
TRACE(); TRACE();
VERTEX_POINTER.ptr = NULL; VERTEX_POINTER.ptr = NULL;
@ -263,12 +263,12 @@ static inline IndexParseFunc _calcParseIndexFunc(GLenum type) {
static inline void transformToEyeSpace(GLfloat* point) { static inline void transformToEyeSpace(GLfloat* point) {
_matrixLoadModelView(); _glMatrixLoadModelView();
mat_trans_single3_nodiv(point[0], point[1], point[2]); mat_trans_single3_nodiv(point[0], point[1], point[2]);
} }
static inline void transformNormalToEyeSpace(GLfloat* normal) { static inline void transformNormalToEyeSpace(GLfloat* normal) {
_matrixLoadNormal(); _glMatrixLoadNormal();
mat_trans_normal3(normal[0], normal[1], normal[2]); mat_trans_normal3(normal[0], normal[1], normal[2]);
} }
@ -933,7 +933,7 @@ static void transform(ClipVertex* output, const GLsizei count) {
ClipVertex* vertex = output; ClipVertex* vertex = output;
_applyRenderMatrix(); /* Apply the Render Matrix Stack */ _glApplyRenderMatrix(); /* Apply the Render Matrix Stack */
GLsizei i = count; GLsizei i = count;
while(i--) { while(i--) {
@ -999,7 +999,7 @@ static void mat_transform_normal3(const float* xyz, const float* xyzOut, const u
} }
static void light(ClipVertex* output, const GLsizei count) { static void light(ClipVertex* output, const GLsizei count) {
if(!isLightingEnabled()) { if(!_glIsLightingEnabled()) {
return; return;
} }
@ -1021,10 +1021,10 @@ static void light(ClipVertex* output, const GLsizei count) {
ClipVertex* vertex = output; ClipVertex* vertex = output;
EyeSpaceData* eye_space = (EyeSpaceData*) eye_space_data->data; EyeSpaceData* eye_space = (EyeSpaceData*) eye_space_data->data;
_matrixLoadModelView(); _glMatrixLoadModelView();
mat_transform3(vertex->xyz, eye_space->xyz, count, sizeof(ClipVertex), sizeof(EyeSpaceData)); mat_transform3(vertex->xyz, eye_space->xyz, count, sizeof(ClipVertex), sizeof(EyeSpaceData));
_matrixLoadNormal(); _glMatrixLoadNormal();
mat_transform_normal3(vertex->nxyz, eye_space->n, count, sizeof(ClipVertex), sizeof(EyeSpaceData)); mat_transform_normal3(vertex->nxyz, eye_space->n, count, sizeof(ClipVertex), sizeof(EyeSpaceData));
GLsizei i; GLsizei i;
@ -1038,7 +1038,7 @@ static void light(ClipVertex* output, const GLsizei count) {
GLfloat to_add [] = {0.0f, 0.0f, 0.0f, 0.0f}; GLfloat to_add [] = {0.0f, 0.0f, 0.0f, 0.0f};
GLubyte j; GLubyte j;
for(j = 0; j < MAX_LIGHTS; ++j) { for(j = 0; j < MAX_LIGHTS; ++j) {
if(isLightEnabled(j)) { if(_glIsLightEnabled(j)) {
_glCalculateLightingContribution(j, ES->xyz, ES->n, vertex->bgra, to_add); _glCalculateLightingContribution(j, ES->xyz, ES->n, vertex->bgra, to_add);
total[0] += to_add[0]; total[0] += to_add[0];
@ -1070,7 +1070,7 @@ static void divide(ClipVertex* output, const GLsizei count) {
static void push(PVRHeader* header, ClipVertex* output, const GLsizei count, PolyList* activePolyList, GLshort textureUnit) { static void push(PVRHeader* header, ClipVertex* output, const GLsizei count, PolyList* activePolyList, GLshort textureUnit) {
// Compile the header // Compile the header
pvr_poly_cxt_t cxt = *getPVRContext(); pvr_poly_cxt_t cxt = *_glGetPVRContext();
cxt.list_type = activePolyList->list_type; cxt.list_type = activePolyList->list_type;
_glUpdatePVRTextureContext(&cxt, textureUnit); _glUpdatePVRTextureContext(&cxt, textureUnit);
@ -1104,14 +1104,14 @@ static void submitVertices(GLenum mode, GLsizei first, GLsizei count, GLenum typ
glActiveTextureARB(GL_TEXTURE1); glActiveTextureARB(GL_TEXTURE1);
glGetBooleanv(GL_TEXTURE_2D, &doMultitexture); glGetBooleanv(GL_TEXTURE_2D, &doMultitexture);
doLighting = isLightingEnabled(); doLighting = _glIsLightingEnabled();
glActiveTextureARB(activeTexture); glActiveTextureARB(activeTexture);
profiler_push(__func__); profiler_push(__func__);
PolyList* activeList = activePolyList(); PolyList* activeList = _glActivePolyList();
/* Make room in the list buffer */ /* Make room in the list buffer */
GLsizei spaceNeeded = (mode == GL_POLYGON || mode == GL_TRIANGLE_FAN) ? ((count - 2) * 3) : count; GLsizei spaceNeeded = (mode == GL_POLYGON || mode == GL_TRIANGLE_FAN) ? ((count - 2) * 3) : count;
@ -1139,7 +1139,7 @@ static void submitVertices(GLenum mode, GLsizei first, GLsizei count, GLenum typ
profiler_checkpoint("transform"); profiler_checkpoint("transform");
if(isClippingEnabled()) { if(_glIsClippingEnabled()) {
uint32_t offset = ((start - 1) - (ClipVertex*) activeList->vector.data); uint32_t offset = ((start - 1) - (ClipVertex*) activeList->vector.data);
@ -1183,7 +1183,7 @@ static void submitVertices(GLenum mode, GLsizei first, GLsizei count, GLenum typ
profiler_checkpoint("divide"); profiler_checkpoint("divide");
push(header, start, spaceNeeded, activePolyList(), 0); push(header, start, spaceNeeded, _glActivePolyList(), 0);
profiler_checkpoint("push"); profiler_checkpoint("push");
/* /*
@ -1200,7 +1200,7 @@ static void submitVertices(GLenum mode, GLsizei first, GLsizei count, GLenum typ
return; return;
} }
TextureObject* texture1 = getTexture1(); TextureObject* texture1 = _glGetTexture1();
if(!texture1 || ((ENABLED_VERTEX_ATTRIBUTES & ST_ENABLED_FLAG) != ST_ENABLED_FLAG)) { if(!texture1 || ((ENABLED_VERTEX_ATTRIBUTES & ST_ENABLED_FLAG) != ST_ENABLED_FLAG)) {
/* Multitexture implicitly disabled */ /* Multitexture implicitly disabled */
@ -1212,7 +1212,7 @@ static void submitVertices(GLenum mode, GLsizei first, GLsizei count, GLenum typ
(hence the - 1) (hence the - 1)
*/ */
ClipVertex* vertex = aligned_vector_push_back( ClipVertex* vertex = aligned_vector_push_back(
&transparentPolyList()->vector, start - 1, spaceNeeded + 1 &_glTransparentPolyList()->vector, start - 1, spaceNeeded + 1
); );
PVRHeader* mtHeader = (PVRHeader*) vertex++; PVRHeader* mtHeader = (PVRHeader*) vertex++;
@ -1240,7 +1240,7 @@ static void submitVertices(GLenum mode, GLsizei first, GLsizei count, GLenum typ
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
/* Send the buffer again to the transparent list */ /* Send the buffer again to the transparent list */
push(mtHeader, mtStart, spaceNeeded, transparentPolyList(), 1); push(mtHeader, mtStart, spaceNeeded, _glTransparentPolyList(), 1);
/* Reset state */ /* Reset state */
glDepthFunc(depthFunc); glDepthFunc(depthFunc);
@ -1252,7 +1252,7 @@ static void submitVertices(GLenum mode, GLsizei first, GLsizei count, GLenum typ
void APIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices) { void APIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices) {
TRACE(); TRACE();
if(checkImmediateModeInactive(__func__)) { if(_glCheckImmediateModeInactive(__func__)) {
return; return;
} }
@ -1262,7 +1262,7 @@ void APIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvo
void APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count) { void APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count) {
TRACE(); TRACE();
if(checkImmediateModeInactive(__func__)) { if(_glCheckImmediateModeInactive(__func__)) {
return; return;
} }

View File

@ -38,7 +38,7 @@ static void pvr_list_submit(void *src, int n) {
d[0] = d[8] = 0; d[0] = d[8] = 0;
} }
static void _initPVR() { static void _glInitPVR() {
pvr_init_params_t params = { pvr_init_params_t params = {
/* Enable opaque and translucent polygons with size 32 and 32 */ /* Enable opaque and translucent polygons with size 32 and 32 */
{ PVR_BINSIZE_32, PVR_BINSIZE_0, PVR_BINSIZE_32, PVR_BINSIZE_0, PVR_BINSIZE_32 }, { PVR_BINSIZE_32, PVR_BINSIZE_0, PVR_BINSIZE_32, PVR_BINSIZE_0, PVR_BINSIZE_32 },
@ -52,31 +52,31 @@ static void _initPVR() {
} }
PolyList* activePolyList() { PolyList* _glActivePolyList() {
if(isBlendingEnabled()) { if(_glIsBlendingEnabled()) {
return &TR_LIST; return &TR_LIST;
} else { } else {
return &OP_LIST; return &OP_LIST;
} }
} }
PolyList *transparentPolyList() { PolyList *_glTransparentPolyList() {
return &TR_LIST; return &TR_LIST;
} }
void APIENTRY glKosInit() { void APIENTRY glKosInit() {
TRACE(); TRACE();
_initPVR(); _glInitPVR();
initMatrices(); _glInitMatrices();
initAttributePointers(); _glInitAttributePointers();
_glInitContext(); _glInitContext();
_glInitLights(); _glInitLights();
initImmediateMode(); _glInitImmediateMode();
initFramebuffers(); _glInitFramebuffers();
_glKosInitTextures(); _glInitTextures();
OP_LIST.list_type = PVR_LIST_OP_POLY; OP_LIST.list_type = PVR_LIST_OP_POLY;
PT_LIST.list_type = PVR_LIST_PT_POLY; PT_LIST.list_type = PVR_LIST_PT_POLY;

View File

@ -16,11 +16,11 @@ static FrameBuffer* ACTIVE_FRAMEBUFFER = NULL;
static NamedArray FRAMEBUFFERS; static NamedArray FRAMEBUFFERS;
void initFramebuffers() { void _glInitFramebuffers() {
named_array_init(&FRAMEBUFFERS, sizeof(FrameBuffer), 32); named_array_init(&FRAMEBUFFERS, sizeof(FrameBuffer), 32);
} }
void wipeTextureOnFramebuffers(GLuint texture) { void _glWipeTextureOnFramebuffers(GLuint texture) {
/* Spec says we don't update inactive framebuffers, they'll presumably just cause /* Spec says we don't update inactive framebuffers, they'll presumably just cause
* a GL_INVALID_OPERATION if we try to render to them */ * a GL_INVALID_OPERATION if we try to render to them */
if(ACTIVE_FRAMEBUFFER && ACTIVE_FRAMEBUFFER->texture_id == texture) { if(ACTIVE_FRAMEBUFFER && ACTIVE_FRAMEBUFFER->texture_id == texture) {
@ -201,7 +201,7 @@ void APIENTRY glGenerateMipmapEXT(GLenum target) {
return; return;
} }
TextureObject* tex = getBoundTexture(); TextureObject* tex = _glGetBoundTexture();
if(!tex || !tex->data || !tex->mipmapCount) { if(!tex || !tex->data || !tex->mipmapCount) {
_glKosThrowError(GL_INVALID_OPERATION, __func__); _glKosThrowError(GL_INVALID_OPERATION, __func__);

View File

@ -28,7 +28,7 @@ static GLfloat UV_COORD[2] = {0.0f, 0.0f};
static GLfloat ST_COORD[2] = {0.0f, 0.0f}; static GLfloat ST_COORD[2] = {0.0f, 0.0f};
void initImmediateMode() { void _glInitImmediateMode() {
aligned_vector_init(&VERTICES, sizeof(GLfloat)); aligned_vector_init(&VERTICES, sizeof(GLfloat));
aligned_vector_init(&COLOURS, sizeof(GLfloat)); aligned_vector_init(&COLOURS, sizeof(GLfloat));
aligned_vector_init(&UV_COORDS, sizeof(GLfloat)); aligned_vector_init(&UV_COORDS, sizeof(GLfloat));
@ -36,7 +36,7 @@ void initImmediateMode() {
aligned_vector_init(&NORMALS, sizeof(GLfloat)); aligned_vector_init(&NORMALS, sizeof(GLfloat));
} }
GLubyte checkImmediateModeInactive(const char* func) { GLubyte _glCheckImmediateModeInactive(const char* func) {
/* Returns 1 on error */ /* Returns 1 on error */
if(IMMEDIATE_MODE_ACTIVE) { if(IMMEDIATE_MODE_ACTIVE) {
_glKosThrowError(GL_INVALID_OPERATION, func); _glKosThrowError(GL_INVALID_OPERATION, func);

View File

@ -109,7 +109,7 @@ void APIENTRY glLightfv(GLenum light, GLenum pname, const GLfloat *params) {
memcpy(LIGHTS[idx].specular, params, sizeof(GLfloat) * 4); memcpy(LIGHTS[idx].specular, params, sizeof(GLfloat) * 4);
break; break;
case GL_POSITION: { case GL_POSITION: {
_matrixLoadModelView(); _glMatrixLoadModelView();
memcpy(LIGHTS[idx].position, params, sizeof(GLfloat) * 4); memcpy(LIGHTS[idx].position, params, sizeof(GLfloat) * 4);
LIGHTS[idx].is_directional = (params[3] == 0.0f) ? GL_TRUE : GL_FALSE; LIGHTS[idx].is_directional = (params[3] == 0.0f) ? GL_TRUE : GL_FALSE;

View File

@ -41,7 +41,7 @@ matrix_t* _glGetProjectionMatrix() {
return (matrix_t*) stack_top(&MATRIX_STACKS[1]); return (matrix_t*) stack_top(&MATRIX_STACKS[1]);
} }
void initMatrices() { void _glInitMatrices() {
init_stack(&MATRIX_STACKS[0], sizeof(matrix_t), 32); init_stack(&MATRIX_STACKS[0], sizeof(matrix_t), 32);
init_stack(&MATRIX_STACKS[1], sizeof(matrix_t), 32); init_stack(&MATRIX_STACKS[1], sizeof(matrix_t), 32);
init_stack(&MATRIX_STACKS[2], sizeof(matrix_t), 32); init_stack(&MATRIX_STACKS[2], sizeof(matrix_t), 32);
@ -389,20 +389,20 @@ void gluLookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez, GLfloat centerx,
glhLookAtf2(eye, point, up); glhLookAtf2(eye, point, up);
} }
void _applyRenderMatrix() { void _glApplyRenderMatrix() {
mat_load(&SCREENVIEW_MATRIX); mat_load(&SCREENVIEW_MATRIX);
mat_apply(stack_top(MATRIX_STACKS + (GL_PROJECTION & 0xF))); mat_apply(stack_top(MATRIX_STACKS + (GL_PROJECTION & 0xF)));
mat_apply(stack_top(MATRIX_STACKS + (GL_MODELVIEW & 0xF))); mat_apply(stack_top(MATRIX_STACKS + (GL_MODELVIEW & 0xF)));
} }
void _matrixLoadTexture() { void _glMatrixLoadTexture() {
mat_load(stack_top(MATRIX_STACKS + (GL_TEXTURE & 0xF))); mat_load(stack_top(MATRIX_STACKS + (GL_TEXTURE & 0xF)));
} }
void _matrixLoadModelView() { void _glMatrixLoadModelView() {
mat_load(stack_top(MATRIX_STACKS + (GL_MODELVIEW & 0xF))); mat_load(stack_top(MATRIX_STACKS + (GL_MODELVIEW & 0xF)));
} }
void _matrixLoadNormal() { void _glMatrixLoadNormal() {
mat_load(&NORMAL_MATRIX); mat_load(&NORMAL_MATRIX);
} }

View File

@ -93,28 +93,28 @@ typedef struct {
} LightSource; } LightSource;
PolyList *activePolyList(); PolyList *_glActivePolyList();
PolyList *transparentPolyList(); PolyList *_glTransparentPolyList();
void initAttributePointers(); void _glInitAttributePointers();
void _glInitContext(); void _glInitContext();
void _glInitLights(); void _glInitLights();
void initImmediateMode(); void _glInitImmediateMode();
void initMatrices(); void _glInitMatrices();
void initFramebuffers(); void _glInitFramebuffers();
void _matrixLoadNormal(); void _glMatrixLoadNormal();
void _matrixLoadModelView(); void _glMatrixLoadModelView();
void _matrixLoadTexture(); void _glMatrixLoadTexture();
void _applyRenderMatrix(); void _glApplyRenderMatrix();
matrix_t* _glGetProjectionMatrix(); matrix_t* _glGetProjectionMatrix();
void wipeTextureOnFramebuffers(GLuint texture); void _glWipeTextureOnFramebuffers(GLuint texture);
GLubyte checkImmediateModeInactive(const char* func); GLubyte _glCheckImmediateModeInactive(const char* func);
pvr_poly_cxt_t* getPVRContext(); pvr_poly_cxt_t* _glGetPVRContext();
GLubyte _glKosInitTextures(); GLubyte _glInitTextures();
void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit); void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit);
@ -135,27 +135,27 @@ AttribPointer* _glGetUVAttribPointer();
AttribPointer* _glGetSTAttribPointer(); AttribPointer* _glGetSTAttribPointer();
GLenum _glGetShadeModel(); GLenum _glGetShadeModel();
TextureObject* getTexture0(); TextureObject* _glGetTexture0();
TextureObject* getTexture1(); TextureObject* _glGetTexture1();
TextureObject* getBoundTexture(); TextureObject* _glGetBoundTexture();
GLubyte _glGetActiveTexture(); GLubyte _glGetActiveTexture();
GLuint _glGetActiveClientTexture(); GLuint _glGetActiveClientTexture();
GLboolean _glIsSharedTexturePaletteEnabled(); GLboolean _glIsSharedTexturePaletteEnabled();
void _glApplyColorTable(); void _glApplyColorTable();
GLboolean isBlendingEnabled(); GLboolean _glIsBlendingEnabled();
GLboolean _glIsMipmapComplete(const TextureObject* obj); GLboolean _glIsMipmapComplete(const TextureObject* obj);
GLubyte* _glGetMipmapLocation(TextureObject* obj, GLuint level); GLubyte* _glGetMipmapLocation(TextureObject* obj, GLuint level);
GLuint _glGetMipmapLevelCount(TextureObject* obj); GLuint _glGetMipmapLevelCount(TextureObject* obj);
GLboolean isLightingEnabled(); GLboolean _glIsLightingEnabled();
GLboolean isLightEnabled(GLubyte light); GLboolean _glIsLightEnabled(GLubyte light);
GLboolean _glIsColorMaterialEnabled(); GLboolean _glIsColorMaterialEnabled();
void _glCalculateLightingContribution(const GLint light, const GLfloat* pos, const GLfloat* normal, uint8_t* bgra, GLfloat* colour); void _glCalculateLightingContribution(const GLint light, const GLfloat* pos, const GLfloat* normal, uint8_t* bgra, GLfloat* colour);
unsigned char isClippingEnabled(); unsigned char _glIsClippingEnabled();
void enableClipping(unsigned char v); void _glEnableClipping(unsigned char v);
void _glKosThrowError(GLenum error, const char *function); void _glKosThrowError(GLenum error, const char *function);
void _glKosPrintError(); void _glKosPrintError();

View File

@ -14,7 +14,7 @@
static pvr_poly_cxt_t GL_CONTEXT; static pvr_poly_cxt_t GL_CONTEXT;
pvr_poly_cxt_t* getPVRContext() { pvr_poly_cxt_t* _glGetPVRContext() {
return &GL_CONTEXT; return &GL_CONTEXT;
} }
@ -80,7 +80,7 @@ static GLenum BLEND_SFACTOR = GL_ONE;
static GLenum BLEND_DFACTOR = GL_ZERO; static GLenum BLEND_DFACTOR = GL_ZERO;
static GLboolean BLEND_ENABLED = GL_FALSE; static GLboolean BLEND_ENABLED = GL_FALSE;
GLboolean isBlendingEnabled() { GLboolean _glIsBlendingEnabled() {
return BLEND_ENABLED; return BLEND_ENABLED;
} }
@ -147,7 +147,7 @@ GLboolean _glCheckValidEnum(GLint param, GLenum* values, const char* func) {
static GLboolean TEXTURES_ENABLED [] = {GL_FALSE, GL_FALSE}; static GLboolean TEXTURES_ENABLED [] = {GL_FALSE, GL_FALSE};
void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit) { void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit) {
const TextureObject *tx1 = (textureUnit == 0) ? getTexture0() : getTexture1(); const TextureObject *tx1 = (textureUnit == 0) ? _glGetTexture0() : _glGetTexture1();
if(!TEXTURES_ENABLED[textureUnit] || !tx1) { if(!TEXTURES_ENABLED[textureUnit] || !tx1) {
context->txr.enable = PVR_TEXTURE_DISABLE; context->txr.enable = PVR_TEXTURE_DISABLE;
@ -222,19 +222,16 @@ void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit) {
} else { } else {
context->txr.enable = PVR_TEXTURE_DISABLE; context->txr.enable = PVR_TEXTURE_DISABLE;
} }
/* Apply the texture palette if necessary */
_glApplyColorTable();
} }
static GLboolean LIGHTING_ENABLED = GL_FALSE; static GLboolean LIGHTING_ENABLED = GL_FALSE;
static GLboolean LIGHT_ENABLED[MAX_LIGHTS]; static GLboolean LIGHT_ENABLED[MAX_LIGHTS];
GLboolean isLightingEnabled() { GLboolean _glIsLightingEnabled() {
return LIGHTING_ENABLED; return LIGHTING_ENABLED;
} }
GLboolean isLightEnabled(unsigned char light) { GLboolean _glIsLightEnabled(unsigned char light) {
return LIGHT_ENABLED[light & 0xF]; return LIGHT_ENABLED[light & 0xF];
} }
@ -302,8 +299,12 @@ GLAPI void APIENTRY glEnable(GLenum cap) {
case GL_COLOR_MATERIAL: case GL_COLOR_MATERIAL:
COLOR_MATERIAL_ENABLED = GL_TRUE; COLOR_MATERIAL_ENABLED = GL_TRUE;
break; break;
case GL_SHARED_TEXTURE_PALETTE_EXT: case GL_SHARED_TEXTURE_PALETTE_EXT: {
SHARED_PALETTE_ENABLED = GL_TRUE; SHARED_PALETTE_ENABLED = GL_TRUE;
/* Apply the texture palette if necessary */
_glApplyColorTable();
}
break; break;
case GL_LIGHT0: case GL_LIGHT0:
case GL_LIGHT1: case GL_LIGHT1:
@ -316,7 +317,7 @@ GLAPI void APIENTRY glEnable(GLenum cap) {
LIGHT_ENABLED[cap & 0xF] = GL_TRUE; LIGHT_ENABLED[cap & 0xF] = GL_TRUE;
break; break;
case GL_NEARZ_CLIPPING_KOS: case GL_NEARZ_CLIPPING_KOS:
enableClipping(GL_TRUE); _glEnableClipping(GL_TRUE);
break; break;
default: default:
break; break;
@ -352,8 +353,12 @@ GLAPI void APIENTRY glDisable(GLenum cap) {
case GL_COLOR_MATERIAL: case GL_COLOR_MATERIAL:
COLOR_MATERIAL_ENABLED = GL_FALSE; COLOR_MATERIAL_ENABLED = GL_FALSE;
break; break;
case GL_SHARED_TEXTURE_PALETTE_EXT: case GL_SHARED_TEXTURE_PALETTE_EXT: {
SHARED_PALETTE_ENABLED = GL_FALSE; SHARED_PALETTE_ENABLED = GL_FALSE;
/* Restore whatever palette may exist on a bound texture */
_glApplyColorTable();
}
break; break;
case GL_LIGHT0: case GL_LIGHT0:
case GL_LIGHT1: case GL_LIGHT1:
@ -366,7 +371,7 @@ GLAPI void APIENTRY glDisable(GLenum cap) {
LIGHT_ENABLED[cap & 0xF] = GL_FALSE; LIGHT_ENABLED[cap & 0xF] = GL_FALSE;
break; break;
case GL_NEARZ_CLIPPING_KOS: case GL_NEARZ_CLIPPING_KOS:
enableClipping(GL_FALSE); _glEnableClipping(GL_FALSE);
break; break;
default: default:
break; break;
@ -486,7 +491,7 @@ void glPixelStorei(GLenum pname, GLint param) {
*/ */
void APIENTRY glScissor(GLint x, GLint y, GLsizei width, GLsizei height) { void APIENTRY glScissor(GLint x, GLint y, GLsizei width, GLsizei height) {
/*!!! FIXME: Shouldn't this be added to *all* lists? */ /*!!! FIXME: Shouldn't this be added to *all* lists? */
PVRTileClipCommand *c = aligned_vector_extend(&activePolyList()->vector, 1); PVRTileClipCommand *c = aligned_vector_extend(&_glActivePolyList()->vector, 1);
GLint miny, maxx, maxy; GLint miny, maxx, maxy;
GLsizei gl_scissor_width = CLAMP(width, 0, vid_mode->width); GLsizei gl_scissor_width = CLAMP(width, 0, vid_mode->width);
@ -584,7 +589,7 @@ void APIENTRY glGetIntegerv(GLenum pname, GLint *params) {
*params = MAX_LIGHTS; *params = MAX_LIGHTS;
break; break;
case GL_TEXTURE_BINDING_2D: case GL_TEXTURE_BINDING_2D:
*params = getBoundTexture()->index; *params = _glGetBoundTexture()->index;
break; break;
case GL_DEPTH_FUNC: case GL_DEPTH_FUNC:
*params = DEPTH_FUNC; *params = DEPTH_FUNC;

View File

@ -32,12 +32,14 @@ void _glApplyColorTable() {
* - Store the active palette, don't resubmit eah time * - Store the active palette, don't resubmit eah time
*/ */
static TexturePalette* last_bound = NULL;
TexturePalette* src = NULL; TexturePalette* src = NULL;
if(_glIsSharedTexturePaletteEnabled()) { if(_glIsSharedTexturePaletteEnabled()) {
src = SHARED_PALETTE; src = SHARED_PALETTE;
} else { } else {
TextureObject* active = getBoundTexture(); TextureObject* active = _glGetBoundTexture();
if(!active) { if(!active) {
return; //? Unload the palette? Make White? return; //? Unload the palette? Make White?
@ -50,6 +52,13 @@ void _glApplyColorTable() {
src = active->palette; src = active->palette;
} }
/* Don't reapply the palette if it was the last one we applied */
if(src == last_bound) {
return;
}
last_bound = src;
pvr_set_pal_format(PVR_PAL_ARGB8888); pvr_set_pal_format(PVR_PAL_ARGB8888);
GLushort i = 0; GLushort i = 0;
@ -133,22 +142,25 @@ static GLuint _glGetMipmapDataSize(TextureObject* obj) {
return size; return size;
} }
GLubyte _glKosInitTextures() { GLubyte _glInitTextures() {
named_array_init(&TEXTURE_OBJECTS, sizeof(TextureObject), MAX_TEXTURE_COUNT); named_array_init(&TEXTURE_OBJECTS, sizeof(TextureObject), MAX_TEXTURE_COUNT);
// Reserve zero so that it is never given to anyone as an ID!
named_array_reserve(&TEXTURE_OBJECTS, 0);
SHARED_PALETTE = (TexturePalette*) malloc(sizeof(TexturePalette)); SHARED_PALETTE = (TexturePalette*) malloc(sizeof(TexturePalette));
return 1; return 1;
} }
TextureObject* getTexture0() { TextureObject* _glGetTexture0() {
return TEXTURE_UNITS[0]; return TEXTURE_UNITS[0];
} }
TextureObject* getTexture1() { TextureObject* _glGetTexture1() {
return TEXTURE_UNITS[1]; return TEXTURE_UNITS[1];
} }
TextureObject* getBoundTexture() { TextureObject* _glGetBoundTexture() {
return TEXTURE_UNITS[ACTIVE_TEXTURE]; return TEXTURE_UNITS[ACTIVE_TEXTURE];
} }
@ -192,6 +204,9 @@ void APIENTRY glGenTextures(GLsizei n, GLuint *textures) {
while(n--) { while(n--) {
GLuint id = 0; GLuint id = 0;
TextureObject* txr = (TextureObject*) named_array_alloc(&TEXTURE_OBJECTS, &id); TextureObject* txr = (TextureObject*) named_array_alloc(&TEXTURE_OBJECTS, &id);
assert(id); // Generated IDs must never be zero
_glInitializeTextureObject(txr, id); _glInitializeTextureObject(txr, id);
*textures = id; *textures = id;
@ -207,7 +222,7 @@ void APIENTRY glDeleteTextures(GLsizei n, GLuint *textures) {
TextureObject* txr = (TextureObject*) named_array_get(&TEXTURE_OBJECTS, *textures); TextureObject* txr = (TextureObject*) named_array_get(&TEXTURE_OBJECTS, *textures);
/* Make sure we update framebuffer objects that have this texture attached */ /* Make sure we update framebuffer objects that have this texture attached */
wipeTextureOnFramebuffers(*textures); _glWipeTextureOnFramebuffers(*textures);
if(txr == TEXTURE_UNITS[ACTIVE_TEXTURE]) { if(txr == TEXTURE_UNITS[ACTIVE_TEXTURE]) {
TEXTURE_UNITS[ACTIVE_TEXTURE] = NULL; TEXTURE_UNITS[ACTIVE_TEXTURE] = NULL;
@ -219,7 +234,7 @@ void APIENTRY glDeleteTextures(GLsizei n, GLuint *textures) {
} }
if(txr->palette && txr->palette->data) { if(txr->palette && txr->palette->data) {
free(txr->palette->data); pvr_mem_free(txr->palette->data);
txr->palette->data = NULL; txr->palette->data = NULL;
} }
@ -243,12 +258,15 @@ void APIENTRY glBindTexture(GLenum target, GLuint texture) {
if(texture) { if(texture) {
/* If this didn't come from glGenTextures, then we should initialize the /* If this didn't come from glGenTextures, then we should initialize the
* texture the first time it's bound */ * texture the first time it's bound */
if(!named_array_used(&TEXTURE_OBJECTS, texture)) { if(!named_array_used(&TEXTURE_OBJECTS, texture)) {
TextureObject* txr = named_array_reserve(&TEXTURE_OBJECTS, texture); TextureObject* txr = named_array_reserve(&TEXTURE_OBJECTS, texture);
_glInitializeTextureObject(txr, texture); _glInitializeTextureObject(txr, texture);
} }
TEXTURE_UNITS[ACTIVE_TEXTURE] = (TextureObject*) named_array_get(&TEXTURE_OBJECTS, texture); TEXTURE_UNITS[ACTIVE_TEXTURE] = (TextureObject*) named_array_get(&TEXTURE_OBJECTS, texture);
/* Apply the texture palette if necessary */
_glApplyColorTable();
} else { } else {
TEXTURE_UNITS[ACTIVE_TEXTURE] = NULL; TEXTURE_UNITS[ACTIVE_TEXTURE] = NULL;
} }
@ -521,7 +539,11 @@ static GLuint _determinePVRFormat(GLint internalFormat, GLenum type) {
case GL_COMPRESSED_ARGB_1555_VQ_MIPMAP_TWID_KOS: case GL_COMPRESSED_ARGB_1555_VQ_MIPMAP_TWID_KOS:
return PVR_TXRFMT_ARGB1555 | PVR_TXRFMT_TWIDDLED | PVR_TXRFMT_VQ_ENABLE; return PVR_TXRFMT_ARGB1555 | PVR_TXRFMT_TWIDDLED | PVR_TXRFMT_VQ_ENABLE;
case GL_COLOR_INDEX8_EXT: case GL_COLOR_INDEX8_EXT:
return PVR_TXRFMT_PAL8BPP; if(type == GL_UNSIGNED_BYTE_TWID_KOS) {
return PVR_TXRFMT_PAL8BPP | PVR_TXRFMT_TWIDDLED;
} else {
return PVR_TXRFMT_PAL8BPP | PVR_TXRFMT_NONTWIDDLED;
}
default: default:
return 0; return 0;
} }
@ -875,7 +897,7 @@ void APIENTRY glTexParameterf(GLenum target, GLenum pname, GLint param) {
void APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param) { void APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param) {
TRACE(); TRACE();
TextureObject* active = getBoundTexture(); TextureObject* active = _glGetBoundTexture();
if(!active) { if(!active) {
return; return;
@ -942,6 +964,10 @@ void APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param) {
} }
} }
void APIENTRY glTexParameterf(GLenum target, GLenum pname, GLint param) {
glTexParameteri(target, pname, (GLint) param);
}
GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *data) { GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *data) {
GLenum validTargets[] = {GL_TEXTURE_2D, GL_SHARED_TEXTURE_PALETTE_EXT, 0}; GLenum validTargets[] = {GL_TEXTURE_2D, GL_SHARED_TEXTURE_PALETTE_EXT, 0};
GLenum validInternalFormats[] = {GL_RGB8, GL_RGBA8, 0}; GLenum validInternalFormats[] = {GL_RGB8, GL_RGBA8, 0};
@ -990,7 +1016,7 @@ GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsize
if(target == GL_SHARED_TEXTURE_PALETTE_EXT) { if(target == GL_SHARED_TEXTURE_PALETTE_EXT) {
palette = SHARED_PALETTE; palette = SHARED_PALETTE;
} else { } else {
TextureObject* active = getBoundTexture(); TextureObject* active = _glGetBoundTexture();
if(!active->palette) { if(!active->palette) {
active->palette = (TexturePalette*) malloc(sizeof(TexturePalette)); active->palette = (TexturePalette*) malloc(sizeof(TexturePalette));
} }
@ -999,11 +1025,11 @@ GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsize
} }
if(target) { if(target) {
free(palette->data); pvr_mem_free(palette->data);
palette->data = NULL; palette->data = NULL;
} }
palette->data = (GLubyte*) malloc(width * 4); palette->data = (GLubyte*) pvr_mem_malloc(width * 4);
palette->format = format; palette->format = format;
palette->width = width; palette->width = width;
@ -1018,6 +1044,9 @@ GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsize
src += sourceStride; src += sourceStride;
dst += 4; dst += 4;
} }
/* Apply the texture palette if necessary */
_glApplyColorTable();
} }
GLAPI void APIENTRY glColorSubTableEXT(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data) { GLAPI void APIENTRY glColorSubTableEXT(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data) {

View File

@ -42,7 +42,6 @@ void named_array_init(NamedArray* array, unsigned int element_size, unsigned int
} }
char named_array_used(NamedArray* array, unsigned int id) { char named_array_used(NamedArray* array, unsigned int id) {
unsigned int i = id / 8; unsigned int i = id / 8;
unsigned int j = id % 8; unsigned int j = id % 8;
@ -54,11 +53,11 @@ void* named_array_alloc(NamedArray* array, unsigned int* new_id) {
unsigned int i = 0, j = 0; unsigned int i = 0, j = 0;
for(i = 0; i < array->marker_count; ++i) { for(i = 0; i < array->marker_count; ++i) {
for(j = 0; j < 8; ++j) { for(j = 0; j < 8; ++j) {
unsigned int id = (i * 8) + j + 1; unsigned int id = (i * 8) + j;
if(!named_array_used(array, id)) { if(!named_array_used(array, id)) {
array->used_markers[i] |= (unsigned char) 1 << j; array->used_markers[i] |= (unsigned char) 1 << j;
*new_id = id; *new_id = id;
unsigned char* ptr = &array->elements[(id - 1) * array->element_size]; unsigned char* ptr = &array->elements[id * array->element_size];
memset(ptr, 0, array->element_size); memset(ptr, 0, array->element_size);
return ptr; return ptr;
} }
@ -76,7 +75,7 @@ void* named_array_reserve(NamedArray* array, unsigned int id) {
array->used_markers[i] |= (unsigned char) 1 << j; array->used_markers[i] |= (unsigned char) 1 << j;
assert(named_array_used(array, id)); assert(named_array_used(array, id));
unsigned char* ptr = &array->elements[(id - 1) * array->element_size]; unsigned char* ptr = &array->elements[id * array->element_size];
memset(ptr, 0, array->element_size); memset(ptr, 0, array->element_size);
return ptr; return ptr;
} }
@ -85,8 +84,6 @@ void* named_array_reserve(NamedArray* array, unsigned int id) {
} }
void named_array_release(NamedArray* array, unsigned int new_id) { void named_array_release(NamedArray* array, unsigned int new_id) {
new_id--;
unsigned int i = new_id / 8; unsigned int i = new_id / 8;
unsigned int j = new_id % 8; unsigned int j = new_id % 8;
@ -102,7 +99,7 @@ void* named_array_get(NamedArray* array, unsigned int id) {
return NULL; return NULL;
} }
return &array->elements[(id - 1) * array->element_size]; return &array->elements[id * array->element_size];
} }
void named_array_cleanup(NamedArray* array) { void named_array_cleanup(NamedArray* array) {

View File

@ -32,6 +32,8 @@ __BEGIN_DECLS
#define GL_NEARZ_CLIPPING_KOS 0xEEFA #define GL_NEARZ_CLIPPING_KOS 0xEEFA
#define GL_UNSIGNED_BYTE_TWID_KOS 0xEEFB
GLAPI void APIENTRY glKosSwapBuffers(); GLAPI void APIENTRY glKosSwapBuffers();

View File

@ -121,8 +121,8 @@ void LoadGLTextures() {
// 2d texture, level of detail 0 (normal), 3 components (red, green, blue), x size from image, y size from image, // 2d texture, level of detail 0 (normal), 3 components (red, green, blue), x size from image, y size from image,
// border 0 (normal), rgb color data, unsigned byte data, and finally the data itself. // border 0 (normal), rgb color data, unsigned byte data, and finally the data itself.
glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, image1->width, image1->height, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, image1->data); glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, image1->width, image1->height, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE_TWID_KOS, image1->data);
}; }
/* A general OpenGL initialization function. Sets all of the initial parameters. */ /* A general OpenGL initialization function. Sets all of the initial parameters. */
void InitGL(int Width, int Height) // We call this right after our OpenGL window is created. void InitGL(int Width, int Height) // We call this right after our OpenGL window is created.