From 5eea65c31fd36bafdeb324f3d50c7d3eaae87beb Mon Sep 17 00:00:00 2001 From: Hayden K <819028+mrneo240@users.noreply.github.com> Date: Fri, 8 Mar 2019 15:32:29 -0500 Subject: [PATCH] Fixes for rendering and new samples to test --- GL/draw.c | 2 +- GL/state.c | 10 ++- GL/texture.c | 133 +++++++++++++++++++-------------- include/glkos.h | 6 +- samples/gl_polygon/Makefile | 32 ++++++++ samples/gl_polygon/main.c | 81 ++++++++++++++++++++ samples/glquake_palette/main.c | 2 + samples/paletted/Makefile | 7 +- samples/paletted/main.c | 51 +++---------- 9 files changed, 221 insertions(+), 103 deletions(-) create mode 100644 samples/gl_polygon/Makefile create mode 100644 samples/gl_polygon/main.c diff --git a/GL/draw.c b/GL/draw.c index c173c6f..77b8c35 100644 --- a/GL/draw.c +++ b/GL/draw.c @@ -1070,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 */ diff --git a/GL/state.c b/GL/state.c index f43a143..ca9ec17 100644 --- a/GL/state.c +++ b/GL/state.c @@ -179,6 +179,9 @@ void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit) { if(tx1->isCompressed && _glIsMipmapComplete(tx1)) { enableMipmaps = GL_TRUE; } + if(tx1->isPaletted){ + enableMipmaps = GL_FALSE; + } if(enableMipmaps) { if(tx1->minFilter == GL_LINEAR_MIPMAP_NEAREST) { @@ -194,6 +197,9 @@ void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit) { if(tx1->minFilter == GL_LINEAR && tx1->magFilter == GL_LINEAR) { filter = PVR_FILTER_BILINEAR; } + if(tx1->isPaletted){ + filter = PVR_FILTER_NONE; + } } /* If we don't have complete mipmaps, and yet mipmapping was enabled, we disable texturing. @@ -303,7 +309,7 @@ GLAPI void APIENTRY glEnable(GLenum cap) { SHARED_PALETTE_ENABLED = GL_TRUE; /* Apply the texture palette if necessary */ - _glApplyColorTable(); + //_glApplyColorTable(); //@Todo: Actually Dont. } break; case GL_LIGHT0: @@ -357,7 +363,7 @@ GLAPI void APIENTRY glDisable(GLenum cap) { SHARED_PALETTE_ENABLED = GL_FALSE; /* Restore whatever palette may exist on a bound texture */ - _glApplyColorTable(); + //_glApplyColorTable(); //@Todo: Actually Dont. } break; case GL_LIGHT0: diff --git a/GL/texture.c b/GL/texture.c index 4a826be..d58cea2 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -19,6 +19,7 @@ static NamedArray TEXTURE_OBJECTS; static GLubyte ACTIVE_TEXTURE = 0; static TexturePalette* SHARED_PALETTE = NULL; +static GLbyte CURRENT_PALETTE = 0; static GLuint _determinePVRFormat(GLint internalFormat, GLenum type); @@ -27,6 +28,7 @@ static GLuint _determinePVRFormat(GLint internalFormat, GLenum type); static TexturePalette* last_bound_palette = NULL; void _glApplyColorTable() { + /* * FIXME: * @@ -278,7 +280,7 @@ void APIENTRY glBindTexture(GLenum target, GLuint texture) { TEXTURE_UNITS[ACTIVE_TEXTURE] = (TextureObject*) named_array_get(&TEXTURE_OBJECTS, texture); /* Apply the texture palette if necessary */ - _glApplyColorTable(); + //_glApplyColorTable(); //@Todo: Actually Dont. } else { TEXTURE_UNITS[ACTIVE_TEXTURE] = NULL; } @@ -551,11 +553,7 @@ static GLuint _determinePVRFormat(GLint internalFormat, GLenum type) { case GL_COMPRESSED_ARGB_1555_VQ_MIPMAP_TWID_KOS: return PVR_TXRFMT_ARGB1555 | PVR_TXRFMT_TWIDDLED | PVR_TXRFMT_VQ_ENABLE; case GL_COLOR_INDEX8_EXT: - if(type == GL_UNSIGNED_BYTE_TWID_KOS) { - return PVR_TXRFMT_PAL8BPP | PVR_TXRFMT_TWIDDLED; - } else { - return PVR_TXRFMT_PAL8BPP | PVR_TXRFMT_NONTWIDDLED; - } + return PVR_TXRFMT_PAL8BPP | PVR_TXRFMT_8BPP_PAL(CURRENT_PALETTE); default: return 0; } @@ -570,11 +568,11 @@ static inline void _rgba8888_to_argb4444(const GLubyte* source, GLubyte* dest) { static inline void _rgba8888_to_rgba8888(const GLubyte* source, GLubyte* dest) { /* Noop */ - GLubyte* dst = (GLubyte*) dest; - dst[0] = source[0]; - dst[1] = source[1]; - dst[2] = source[2]; - dst[3] = source[3]; + //GLubyte* dst = (GLubyte*) dest; + dest[0] = source[0]; + dest[1] = source[1]; + dest[2] = source[2]; + dest[3] = source[3]; } static inline void _rgba8888_to_rgb565(const GLubyte* source, GLubyte* dest) { @@ -583,11 +581,11 @@ static inline void _rgba8888_to_rgb565(const GLubyte* source, GLubyte* dest) { static inline void _rgb888_to_rgba8888(const GLubyte* source, GLubyte* dest) { /* Noop */ - GLubyte* dst = (GLubyte*) dest; - dst[0] = source[0]; - dst[1] = source[1]; - dst[2] = source[2]; - dst[3] = 255; + //GLubyte* dst = (GLubyte*) dest; + dest[0] = source[0]; + dest[1] = source[1]; + dest[2] = source[2]; + dest[3] = 255; } static inline void _rgb888_to_rgb565(const GLubyte* source, GLubyte* dest) { @@ -841,12 +839,50 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, /* Let's assume we need to convert */ GLboolean needsConversion = GL_TRUE; + GLubyte* targetData = _glGetMipmapLocation(active, level); + assert(targetData); + /* * These are the only formats where the source format passed in matches the pvr format. * Note the REV formats + GL_BGRA will reverse to ARGB which is what the PVR supports */ if(format == GL_COLOR_INDEX) { - /* Don't convert color indexes */ + if(type == GL_UNSIGNED_BYTE_TWID_KOS){ + + } else { + /* Don't convert color indexes */ + /* Linear/iterative twiddling algorithm from Marcus' tatest */ + #define TWIDTAB(x) ( (x&1)|((x&2)<<1)|((x&4)<<2)|((x&8)<<3)|((x&16)<<4)| \ + ((x&32)<<5)|((x&64)<<6)|((x&128)<<7)|((x&256)<<8)|((x&512)<<9) ) + #define TWIDOUT(x, y) ( TWIDTAB((y)) | (TWIDTAB((x)) << 1) ) + + #define MIN(a, b) ( (a)<(b)? (a):(b) ) + + uint32 x, y, yout, min, mask, invert; + + min = MIN(w, h); + mask = min - 1; + invert = 0; + + uint8 * pixels; + uint16 * vtex; + pixels = (uint8 *) data; + vtex = (uint16*)targetData; + + for(y = 0; y < h; y += 2) { + if(!invert) + yout = y; + else + yout = ((h - 1) - y); + + for(x = 0; x < w; x++) { + vtex[TWIDOUT((yout & mask) / 2, x & mask) + + (x / min + yout / min)*min * min / 2] = + pixels[y * w + x] | (pixels[(y + 1) * w + x] << 8); + } + } + data = NULL; + } needsConversion = GL_FALSE; } else if(format == GL_BGRA && type == GL_UNSIGNED_SHORT_4_4_4_4_REV && internalFormat == GL_RGBA) { needsConversion = GL_FALSE; @@ -862,9 +898,6 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, needsConversion = GL_FALSE; } - GLubyte* targetData = _glGetMipmapLocation(active, level); - assert(targetData); - if(!data) { /* No data? Do nothing! */ return; @@ -873,40 +906,8 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, assert(data); assert(bytes); - /* Linear/iterative twiddling algorithm from Marcus' tatest */ - #define TWIDTAB(x) ( (x&1)|((x&2)<<1)|((x&4)<<2)|((x&8)<<3)|((x&16)<<4)| \ - ((x&32)<<5)|((x&64)<<6)|((x&128)<<7)|((x&256)<<8)|((x&512)<<9) ) - #define TWIDOUT(x, y) ( TWIDTAB((y)) | (TWIDTAB((x)) << 1) ) - - #define MIN(a, b) ( (a)<(b)? (a):(b) ) - - uint32 x, y, yout, min, mask, invert; - - min = MIN(w, h); - mask = min - 1; - invert = 0; - - uint8 * pixels; - uint16 * vtex; - pixels = (uint8 *) data; - vtex = (uint16*)targetData; - - for(y = 0; y < h; y += 2) { - if(!invert) - yout = y; - else - yout = ((h - 1) - y); - - for(x = 0; x < w; x++) { - vtex[TWIDOUT((yout & mask) / 2, x & mask) + - (x / min + yout / min)*min * min / 2] = - pixels[y * w + x] | (pixels[(y + 1) * w + x] << 8); - } - } - active->color = PVR_TXRFMT_PAL8BPP | PVR_TXRFMT_TWIDDLED; - /* No conversion? Just copy the data, and the pvr_format is correct */ - //sq_cpy(targetData, data, bytes); + sq_cpy(targetData, data, bytes); return; } else { TextureConversionFunc convert = _determineConversion( @@ -1081,11 +1082,13 @@ GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsize assert(palette); if(target) { - pvr_mem_free(palette->data); + //pvr_mem_free(palette->data); + free(palette->data); palette->data = NULL; } - palette->data = (GLubyte*) pvr_mem_malloc(width * 4); + //palette->data = (GLubyte*) pvr_mem_malloc(width * 4); + palette->data = (GLubyte*) malloc(width * 4); palette->format = format; palette->width = width; @@ -1130,3 +1133,23 @@ GLAPI void APIENTRY glGetColorTableParameterfvEXT(GLenum target, GLenum pname, G _glKosPrintError(); } +void APIENTRY glKosSetPalette( GLenum palette ) { + switch(palette) { + case GL_EXT_PALLETE_0_8BPP: + CURRENT_PALETTE = 0; + break; + case GL_EXT_PALLETE_1_8BPP: + CURRENT_PALETTE = 1; + break; + case GL_EXT_PALLETE_2_8BPP: + CURRENT_PALETTE = 2; + break; + case GL_EXT_PALLETE_3_8BPP: + CURRENT_PALETTE = 3; + break; + } +} + +GLbyte APIENTRY glKosGetPalette() { + return CURRENT_PALETTE; +} diff --git a/include/glkos.h b/include/glkos.h index c0da05c..1aad6c2 100644 --- a/include/glkos.h +++ b/include/glkos.h @@ -34,9 +34,13 @@ __BEGIN_DECLS #define GL_UNSIGNED_BYTE_TWID_KOS 0xEEFB +#define GL_EXT_PALLETE_0_8BPP 0xEFA0 +#define GL_EXT_PALLETE_1_8BPP 0xEFA1 +#define GL_EXT_PALLETE_2_8BPP 0xEFA2 +#define GL_EXT_PALLETE_3_8BPP 0xEFA3 GLAPI void APIENTRY glKosSwapBuffers(); - +GLAPI void APIENTRY glKosSetPalette( GLenum palette ); __END_DECLS diff --git a/samples/gl_polygon/Makefile b/samples/gl_polygon/Makefile new file mode 100644 index 0000000..70a36b7 --- /dev/null +++ b/samples/gl_polygon/Makefile @@ -0,0 +1,32 @@ +TARGET = paletted.elf +OBJS = main.o +LIBS = -lGLdc + +all: rm-elf $(TARGET) + +include $(KOS_BASE)/Makefile.rules + +clean: + -rm -f $(TARGET) $(OBJS) romdisk.* 1ST_READ.BIN paletted.bin + +rm-elf: + -rm -f $(TARGET) romdisk.* 1ST_READ.BIN paletted.bin + +$(TARGET): $(OBJS) romdisk.o + $(KOS_CC) $(KOS_CFLAGS) $(KOS_LDFLAGS) -o $(TARGET) $(KOS_START) \ + $(OBJS) romdisk.o $(OBJEXTRA) $(LIBS) -lm -lkosutils $(KOS_LIBS) + +romdisk.img: + $(KOS_GENROMFS) -f romdisk.img -d romdisk -v + +romdisk.o: romdisk.img + $(KOS_BASE)/utils/bin2o/bin2o romdisk.img romdisk romdisk.o + +run: $(TARGET) + $(KOS_LOADER) $(TARGET) + +dist: $(TARGET) + rm -f $(OBJS) romdisk.o romdisk.img + $(KOS_STRIP) $(TARGET) + strip-bin paletted + scramble paletted.bin 1ST_READ.BIN diff --git a/samples/gl_polygon/main.c b/samples/gl_polygon/main.c new file mode 100644 index 0000000..57fc793 --- /dev/null +++ b/samples/gl_polygon/main.c @@ -0,0 +1,81 @@ +#include +#include +#include + +#include +#include +#include +#include + +extern uint8 romdisk[]; +KOS_INIT_ROMDISK(romdisk); + +/* 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. +{ + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // This Will Clear The Background Color To Black + glClearDepth(1.0); // Enables Clearing Of The Depth Buffer + glDepthFunc(GL_LESS); // The Type Of Depth Test To Do + glEnable(GL_DEPTH_TEST); // Enables Depth Testing + glShadeModel(GL_SMOOTH); // Enables Smooth Color Shading + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); // Reset The Projection Matrix + + gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // Calculate The Aspect Ratio Of The Window + + glMatrixMode(GL_MODELVIEW); +} + +/* The function called when our window is resized (which shouldn't happen, because we're fullscreen) */ +void ReSizeGLScene(int Width, int Height) +{ + if (Height == 0) // Prevent A Divide By Zero If The Window Is Too Small + Height = 1; + + glViewport(0, 0, Width, Height); // Reset The Current Viewport And Perspective Transformation + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); + glMatrixMode(GL_MODELVIEW); +} + + +/* The main drawing function. */ +void DrawGLScene() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer + glLoadIdentity(); // Reset The View + + glTranslatef(0.0f,0.0f,-5.0f); // move 5 units into the screen. + + glColor3f(1.0,1.0,0.0); + + glBegin(GL_POLYGON); + glVertex3f(0.1, 0.1,0.0); + glVertex3f(0.6, 0.1,0.0); + glVertex3f(0.8,0.3,0.0); + glVertex3f(0.6,0.6,0.0); + glVertex3f(0.1,0.6,0.0); + glVertex3f(0.0,0.3,0.0); + glEnd(); // done with the polygon. + + // swap buffers to display, since we're double buffered. + glKosSwapBuffers(); +} + +int main(int argc, char **argv) +{ + glKosInit(); + + InitGL(640, 480); + ReSizeGLScene(640, 480); + + while(1) { + DrawGLScene(); + } + + return 0; +} diff --git a/samples/glquake_palette/main.c b/samples/glquake_palette/main.c index cd600cb..2d28686 100644 --- a/samples/glquake_palette/main.c +++ b/samples/glquake_palette/main.c @@ -339,6 +339,8 @@ void DrawGLScene() int main(int argc, char **argv) { + vid_set_mode(DM_640x480, PM_RGB565); + glKosInit(); InitGL(640, 480); diff --git a/samples/paletted/Makefile b/samples/paletted/Makefile index 04e0bfd..4ee48c2 100644 --- a/samples/paletted/Makefile +++ b/samples/paletted/Makefile @@ -1,5 +1,6 @@ TARGET = paletted.elf OBJS = main.o +LIBS = -lGLdc all: rm-elf $(TARGET) @@ -13,7 +14,7 @@ rm-elf: $(TARGET): $(OBJS) romdisk.o $(KOS_CC) $(KOS_CFLAGS) $(KOS_LDFLAGS) -o $(TARGET) $(KOS_START) \ - $(OBJS) romdisk.o $(OBJEXTRA) -lm -lkosutils $(KOS_LIBS) + $(OBJS) romdisk.o $(OBJEXTRA) $(LIBS) -lm -lkosutils $(KOS_LIBS) romdisk.img: $(KOS_GENROMFS) -f romdisk.img -d romdisk -v @@ -24,6 +25,8 @@ romdisk.o: romdisk.img run: $(TARGET) $(KOS_LOADER) $(TARGET) -dist: +dist: $(TARGET) rm -f $(OBJS) romdisk.o romdisk.img $(KOS_STRIP) $(TARGET) + strip-bin paletted + scramble paletted.bin 1ST_READ.BIN diff --git a/samples/paletted/main.c b/samples/paletted/main.c index 3cbce97..8fdd0e5 100644 --- a/samples/paletted/main.c +++ b/samples/paletted/main.c @@ -1,17 +1,21 @@ #include #include #include - +#if 0 #include "gl.h" #include "glext.h" #include "glu.h" #include "glkos.h" +#else +#include +#include +#include +#include +#endif extern uint8 romdisk[]; KOS_INIT_ROMDISK(romdisk); -/* floats for x rotation, y rotation, z rotation */ -float xrot, yrot, zrot; /* storage for one texture */ int texture[1]; @@ -168,55 +172,18 @@ void DrawGLScene() glTranslatef(0.0f,0.0f,-5.0f); // move 5 units into the screen. - glRotatef(xrot,1.0f,0.0f,0.0f); // Rotate On The X Axis - glRotatef(yrot,0.0f,1.0f,0.0f); // Rotate On The Y Axis - glRotatef(zrot,0.0f,0.0f,1.0f); // Rotate On The Z Axis - glBindTexture(GL_TEXTURE_2D, texture[0]); // choose the texture to use. glBegin(GL_QUADS); // begin drawing a cube // Front Face (note that the texture's corners have to match the quad's corners) - glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Left Of The Texture and Quad + glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Left Of The Texture and Quad glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Bottom Right Of The Texture and Quad - glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Top Right Of The Texture and Quad + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Top Right Of The Texture and Quad glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Top Left Of The Texture and Quad - // Back Face - glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Bottom Right Of The Texture and Quad - glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Top Right Of The Texture and Quad - glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Top Left Of The Texture and Quad - glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Bottom Left Of The Texture and Quad - - // Top Face - glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Texture and Quad - glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Bottom Left Of The Texture and Quad - glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Bottom Right Of The Texture and Quad - glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Top Right Of The Texture and Quad - - // Bottom Face - glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Top Right Of The Texture and Quad - glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Top Left Of The Texture and Quad - glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Bottom Left Of The Texture and Quad - glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Right Of The Texture and Quad - - // Right face - glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Bottom Right Of The Texture and Quad - glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Top Right Of The Texture and Quad - glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Top Left Of The Texture and Quad - glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Bottom Left Of The Texture and Quad - - // Left Face - glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Bottom Left Of The Texture and Quad - glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Right Of The Texture and Quad - glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Top Right Of The Texture and Quad - glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Texture and Quad glEnd(); // done with the polygon. - - xrot+=1.5f; // X Axis Rotation - yrot+=1.5f; // Y Axis Rotation - zrot+=1.5f; // Z Axis Rotation // // swap buffers to display, since we're double buffered. glKosSwapBuffers();