From 4e296788665a095b59e28c0c1ad38323be38774e Mon Sep 17 00:00:00 2001 From: Hayden K <819028+mrneo240@users.noreply.github.com> Date: Thu, 7 Mar 2019 19:49:24 -0500 Subject: [PATCH] Updates and Fixes for comparable execution on pc --- GL/draw.c | 65 ++++++++++++++++++++++++++++++++++++---------------- GL/flush.c | 4 ++-- GL/private.h | 1 + GL/texture.c | 3 ++- 4 files changed, 50 insertions(+), 23 deletions(-) diff --git a/GL/draw.c b/GL/draw.c index a76075e..c173c6f 100644 --- a/GL/draw.c +++ b/GL/draw.c @@ -449,8 +449,8 @@ static inline PolyBuildFunc _calcBuildFunc(const GLenum type) { case GL_QUADS: return &_buildQuad; break; - case GL_TRIANGLE_FAN: case GL_POLYGON: + case GL_TRIANGLE_FAN: return &_buildTriangleFan; break; default: @@ -459,7 +459,7 @@ static inline PolyBuildFunc _calcBuildFunc(const GLenum type) { return &_buildStrip; } - +#include static inline void nullFloatParseFunc(GLfloat* out, const GLubyte* in) {} static inline void genElementsCommon( @@ -480,6 +480,8 @@ static inline void genElementsCommon( const FloatParseFunc normalFunc = (doLighting) ? _calcNormalParseFunc() : &nullFloatParseFunc; const IndexParseFunc indexFunc = _calcParseIndexFunc(type); + assert(vertexFunc); + assert(diffuseFunc); GLsizei i = 0; const GLubyte* idx = iptr; @@ -546,6 +548,7 @@ static inline void genElementsQuads( } static inline void genElementsTriangleFan( + ClipVertex* output, GLsizei count, const GLubyte* iptr, GLuint istride, GLenum type, @@ -569,7 +572,7 @@ static inline void genElementsTriangleFan( GLsizei i = 3; ClipVertex* first = &output[0]; - for(; i < count - 1; ++i) { + for(; i < count - 1; ++i) { ClipVertex* next = &output[i + 1]; ClipVertex* previous = &output[i - 1]; ClipVertex* vertex = &output[i]; @@ -742,6 +745,8 @@ static void genArraysTriangleStrip( output[count - 1].flags = PVR_CMD_VERTEX_EOL; } +static ClipVertex buffer[MAX_POLYGON_SIZE]; + static void genArraysTriangleFan( ClipVertex* output, GLsizei count, @@ -758,25 +763,43 @@ static void genArraysTriangleFan( doTexture, doMultitexture, doLighting ); - swapVertex(&output[1], &output[2]); + #if TRACE_ENABLED + printf("%s(%s[%d]): count: %d\n",__func__, __FILE__,__LINE__, count); + #endif + assert(count <= MAX_POLYGON_SIZE); + + if(count <=3){ + swapVertex(&output[1], &output[2]); + output[2].flags = PVR_CMD_VERTEX_EOL; + return; + } + + memcpy(buffer, output, sizeof(ClipVertex) * count); + + // First 3 vertices are in the right place, just end early + //swapVertex(&output[1], &output[2]); output[2].flags = PVR_CMD_VERTEX_EOL; - GLsizei i = 3; + GLsizei i = 3, target = 3; ClipVertex* first = &output[0]; + #if TRACE_ENABLED + printf("%s(%s[%d]): Triangle!\n",__func__, __FILE__,__LINE__); + #endif - for(; i < count - 1; ++i) { - ClipVertex* next = &output[i + 1]; - ClipVertex* previous = &output[i - 1]; - ClipVertex* vertex = &output[i]; - - *next = *first; - - swapVertex(next, vertex); - - vertex = next + 1; - *vertex = *previous; - - vertex->flags = PVR_CMD_VERTEX_EOL; + for(; i < count; ++i) { + output[target++] = *first; + output[target++] = buffer[i - 1]; + output[target] = buffer[i]; + #if TRACE_ENABLED + printf("%s(%s[%d]): Triangle!\n",__func__, __FILE__,__LINE__); + printf("%s(%s[%d]):\tvert(%f,%f,%f)\n",__func__, __FILE__,__LINE__, + (*first).xyz[0],(*first).xyz[1],(*first).xyz[2]); + printf("%s(%s[%d]):\tvert(%f,%f,%f)\n",__func__, __FILE__,__LINE__, + (buffer[i - 1]).xyz[0],(buffer[i - 1]).xyz[1],(buffer[i - 1]).xyz[2]); + printf("%s(%s[%d]):\tvert(%f,%f,%f)\n",__func__, __FILE__,__LINE__, + (buffer[i]).xyz[0],(buffer[i]).xyz[1],(buffer[i]).xyz[2]); + #endif + output[target++].flags = PVR_CMD_VERTEX_EOL; } } @@ -824,6 +847,7 @@ static void generate(ClipVertex* output, const GLenum mode, const GLsizei first, doTexture, doMultitexture, doLighting ); break; + case GL_POLYGON: case GL_TRIANGLE_FAN: genArraysTriangleFan( output, @@ -873,7 +897,7 @@ static void generate(ClipVertex* output, const GLenum mode, const GLsizei first, nptr, nstride, doTexture, doMultitexture, doLighting ); - } else if(mode == GL_TRIANGLE_FAN) { + } else if(mode == GL_TRIANGLE_FAN || mode == GL_POLYGON) { genElementsTriangleFan( output, count, @@ -1046,7 +1070,7 @@ static void push(PVRHeader* header, ClipVertex* output, const GLsizei count, Pol cxt.list_type = activePolyList->list_type; _glUpdatePVRTextureContext(&cxt, textureUnit); - + pvr_poly_compile(&header->hdr, &cxt); /* Post-process the vertex list */ @@ -1061,6 +1085,7 @@ static void push(PVRHeader* header, ClipVertex* output, const GLsizei count, Pol #define DEBUG_CLIPPING 0 static void submitVertices(GLenum mode, GLsizei first, GLsizei count, GLenum type, const GLvoid* indices) { + TRACE(); /* Do nothing if vertices aren't enabled */ if(!(ENABLED_VERTEX_ATTRIBUTES & VERTEX_ENABLED_FLAG)) { return; diff --git a/GL/flush.c b/GL/flush.c index 40f0e91..9e4cd8e 100644 --- a/GL/flush.c +++ b/GL/flush.c @@ -96,8 +96,8 @@ void APIENTRY glKosSwapBuffers() { PROFILER_PUSH(__func__); - printf("Flush:\n\tOP:%d\n\tPT:%d\n\tTR:%d\n",OP_LIST.vector.size,PT_LIST.vector.size,TR_LIST.vector.size); - printf("Flush: glTexImage mem free:%d\n",pvr_mem_available()); + //printf("Flush:\n\tOP:%d\n\tPT:%d\n\tTR:%d\n",OP_LIST.vector.size,PT_LIST.vector.size,TR_LIST.vector.size); + //printf("Flush: glTexImage mem free:%d\n",pvr_mem_available()); pvr_wait_ready(); diff --git a/GL/private.h b/GL/private.h index ec9221f..d930f53 100644 --- a/GL/private.h +++ b/GL/private.h @@ -16,6 +16,7 @@ #define NORMAL_ENABLED_FLAG (1 << 4) #define MAX_TEXTURE_SIZE 1024 +#define MAX_POLYGON_SIZE 18 #define CLIP_VERTEX_INT_PADDING 6 diff --git a/GL/texture.c b/GL/texture.c index e04ab26..4a826be 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -696,6 +696,7 @@ static GLboolean _isSupportedFormat(GLenum format) { case GL_RGBA: case GL_BGRA: case GL_COLOR_INDEX: + case GL_LUMINANCE: return GL_TRUE; default: return GL_FALSE; @@ -942,7 +943,7 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, source += stride; } } - printf("GLdc: glTexImage mem free:%d\n",pvr_mem_available()); + //printf("GLdc: glTexImage mem free:%d\n",pvr_mem_available()); } void APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param) {