From 35bbab8eee8a6e8363b4621ed6dce8ad935b390d Mon Sep 17 00:00:00 2001 From: Hayden Kowalchuk <819028+mrneo240@users.noreply.github.com> Date: Thu, 5 Mar 2020 15:04:44 -0500 Subject: [PATCH] feat: state.c add GL_POLYGON_OFFSET, add mipmap bias - implement simple GL_POLYGON_OFFSET implementation - add mipmap bias as per OpenGL spec - CLAMP gave warnings comparing unsigned to < 0 --- GL/state.c | 73 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 18 deletions(-) diff --git a/GL/state.c b/GL/state.c index f72e78e..e979031 100644 --- a/GL/state.c +++ b/GL/state.c @@ -18,7 +18,6 @@ pvr_poly_cxt_t* _glGetPVRContext() { return &GL_CONTEXT; } - /* We can't just use the GL_CONTEXT for this state as the two * GL states are combined, so we store them separately and then * calculate the appropriate PVR state from them. */ @@ -32,6 +31,8 @@ static GLboolean SHARED_PALETTE_ENABLED = GL_FALSE; static GLboolean ALPHA_TEST_ENABLED = GL_FALSE; +static GLboolean POLYGON_OFFSET_ENABLED = GL_FALSE; + static GLboolean NORMALIZE_ENABLED = GL_FALSE; GLboolean _glIsSharedTexturePaletteEnabled() { @@ -84,6 +85,9 @@ static GLenum BLEND_SFACTOR = GL_ONE; static GLenum BLEND_DFACTOR = GL_ZERO; static GLboolean BLEND_ENABLED = GL_FALSE; +static GLfloat OFFSET_FACTOR = 0.0f; +static GLfloat OFFSET_UNITS = 0.0f; + GLboolean _glIsNormalizeEnabled() { return NORMALIZE_ENABLED; } @@ -150,7 +154,7 @@ GLboolean _glCheckValidEnum(GLint param, GLint* values, const char* func) { return GL_FALSE; } -static GLboolean TEXTURES_ENABLED [] = {GL_FALSE, GL_FALSE}; +GLboolean TEXTURES_ENABLED [] = {GL_FALSE, GL_FALSE}; void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit) { const TextureObject *tx1 = (textureUnit == 0) ? _glGetTexture0() : _glGetTexture1(); @@ -187,6 +191,10 @@ void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit) { enableMipmaps = GL_TRUE; } + if(tx1->height != tx1->width){ + enableMipmaps = GL_FALSE; + } + if(enableMipmaps) { if(tx1->minFilter == GL_LINEAR_MIPMAP_NEAREST) { filter = PVR_FILTER_TRILINEAR1; @@ -215,15 +223,13 @@ void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit) { context->txr.filter = filter; context->txr.width = tx1->width; context->txr.height = tx1->height; + context->txr.mipmap = enableMipmaps; + context->txr.mipmap_bias = tx1->mipmap_bias; if(enableMipmaps) { context->txr.base = tx1->data; - context->txr.mipmap = PVR_MIPMAP_ENABLE; - context->txr.mipmap_bias = PVR_MIPBIAS_NORMAL; } else { context->txr.base = tx1->data + tx1->baseDataOffset; - context->txr.mipmap = PVR_MIPMAP_DISABLE; - context->txr.mipmap_bias = PVR_MIPBIAS_NORMAL; } context->txr.format = tx1->color; @@ -338,6 +344,11 @@ GLAPI void APIENTRY glEnable(GLenum cap) { case GL_NEARZ_CLIPPING_KOS: _glEnableClipping(GL_TRUE); break; + case GL_POLYGON_OFFSET_POINT: + case GL_POLYGON_OFFSET_LINE: + case GL_POLYGON_OFFSET_FILL: + POLYGON_OFFSET_ENABLED = GL_TRUE; + break; case GL_NORMALIZE: NORMALIZE_ENABLED = GL_TRUE; break; @@ -395,6 +406,11 @@ GLAPI void APIENTRY glDisable(GLenum cap) { case GL_NEARZ_CLIPPING_KOS: _glEnableClipping(GL_FALSE); break; + case GL_POLYGON_OFFSET_POINT: + case GL_POLYGON_OFFSET_LINE: + case GL_POLYGON_OFFSET_FILL: + POLYGON_OFFSET_ENABLED = GL_FALSE; + break; case GL_NORMALIZE: NORMALIZE_ENABLED = GL_FALSE; break; @@ -423,18 +439,22 @@ GLAPI void APIENTRY glClearColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a) { /* Depth Testing */ GLAPI void APIENTRY glClearDepthf(GLfloat depth) { + _GL_UNUSED(depth); } GLAPI void APIENTRY glClearDepth(GLfloat depth) { + _GL_UNUSED(depth); } GLAPI void APIENTRY glDrawBuffer(GLenum mode) { + _GL_UNUSED(mode); } GLAPI void APIENTRY glReadBuffer(GLenum mode) { + _GL_UNUSED(mode); } @@ -500,23 +520,30 @@ GLAPI void APIENTRY glAlphaFunc(GLenum func, GLclampf ref) { } void glLineWidth(GLfloat width) { - ; + _GL_UNUSED(width); } void glPolygonOffset(GLfloat factor, GLfloat units) { - ; + OFFSET_FACTOR = factor; + OFFSET_UNITS = units; } void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params) { - ; + _GL_UNUSED(target); + _GL_UNUSED(pname); + _GL_UNUSED(params); } void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { - ; + _GL_UNUSED(red); + _GL_UNUSED(green); + _GL_UNUSED(blue); + _GL_UNUSED(alpha); } void glPixelStorei(GLenum pname, GLint param) { - ; + _GL_UNUSED(pname); + _GL_UNUSED(param); } @@ -538,8 +565,8 @@ void APIENTRY glScissor(GLint x, GLint y, GLsizei width, GLsizei height) { PVRTileClipCommand *c = aligned_vector_extend(&_glActivePolyList()->vector, 1); GLint miny, maxx, maxy; - GLsizei gl_scissor_width = CLAMP(width, 0, vid_mode->width); - GLsizei gl_scissor_height = CLAMP(height, 0, vid_mode->height); + GLsizei gl_scissor_width = MAX( MIN(width, vid_mode->width), 0 ); + GLsizei gl_scissor_height = MAX( MIN(height, vid_mode->height), 0 ); /* force the origin to the lower left-hand corner of the screen */ miny = (vid_mode->height - gl_scissor_height) - y; @@ -567,6 +594,10 @@ GLboolean APIENTRY glIsEnabled(GLenum cap) { return LIGHTING_ENABLED; case GL_BLEND: return BLEND_ENABLED; + case GL_POLYGON_OFFSET_POINT: + case GL_POLYGON_OFFSET_LINE: + case GL_POLYGON_OFFSET_FILL: + return POLYGON_OFFSET_ENABLED; } return GL_FALSE; @@ -581,7 +612,7 @@ static GLenum COMPRESSED_FORMATS [] = { GL_COMPRESSED_RGB_565_VQ_TWID_KOS }; -static GLint NUM_COMPRESSED_FORMATS = sizeof(COMPRESSED_FORMATS) / sizeof(GLenum); +static GLuint NUM_COMPRESSED_FORMATS = sizeof(COMPRESSED_FORMATS) / sizeof(GLenum); void APIENTRY glGetBooleanv(GLenum pname, GLboolean* params) { GLuint enabledAttrs = *_glGetEnabledAttributes(); @@ -616,13 +647,19 @@ void APIENTRY glGetBooleanv(GLenum pname, GLboolean* params) { void APIENTRY glGetFloatv(GLenum pname, GLfloat* params) { switch(pname) { case GL_PROJECTION_MATRIX: - memcpy(params, _glGetProjectionMatrix(), sizeof(float) * 16); + memcpy4(params, _glGetProjectionMatrix(), sizeof(float) * 16); break; case GL_MODELVIEW_MATRIX: - memcpy(params, _glGetModelViewMatrix(), sizeof(float) * 16); + memcpy4(params, _glGetModelViewMatrix(), sizeof(float) * 16); + break; + case GL_POLYGON_OFFSET_FACTOR: + *params = OFFSET_FACTOR; + break; + case GL_POLYGON_OFFSET_UNITS: + *params = OFFSET_UNITS; break; default: - _glKosThrowError(GL_INVALID_ENUM, "glGetIntegerv"); + _glKosThrowError(GL_INVALID_ENUM, __func__); _glKosPrintError(); break; } @@ -664,7 +701,7 @@ void APIENTRY glGetIntegerv(GLenum pname, GLint *params) { } } break; default: - _glKosThrowError(GL_INVALID_ENUM, "glGetIntegerv"); + _glKosThrowError(GL_INVALID_ENUM, __func__); _glKosPrintError(); break; }