From e3e5c7bbc6be14f8f15c65aca33bb39dd958c6f9 Mon Sep 17 00:00:00 2001 From: Rinnegatamante Date: Sat, 31 Oct 2020 19:33:37 +0100 Subject: [PATCH] Do not compress textures lower than 4x4. --- src/gl/gl3device.cpp | 4 ++-- src/gl/gl3raster.cpp | 27 +++++++++++++++++---------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/gl/gl3device.cpp b/src/gl/gl3device.cpp index 334c60c..d8af980 100644 --- a/src/gl/gl3device.cpp +++ b/src/gl/gl3device.cpp @@ -911,7 +911,7 @@ flushCache(void) { flushGlRenderState(); - glUniform4fv(U(u_matColor), 1, (GLfloat*)&matColorCache); + glUniform4fv(U(u_matColor), 1, &matColorCache.red); glUniform4fv(U(u_surfProps), 1, surfPropsCache); // TODO: this is probably a stupid way to do it without UBOs @@ -947,7 +947,7 @@ flushCache(void) uniformState.fogDisable = rwStateCache.fogEnable ? 0.0f : 1.0f; uniformState.fogStart = rwStateCache.fogStart; uniformState.fogEnd = rwStateCache.fogEnd; - uniformState.fogRange = 1.0f/(rwStateCache.fogStart - rwStateCache.fogEnd); + uniformState.fogRange = 1.0f / (rwStateCache.fogStart - rwStateCache.fogEnd); //if(uniformStateDirty[RWGL_ALPHAFUNC] || uniformStateDirty[RWGL_ALPHAREF]){ switch(alphaFunc){ diff --git a/src/gl/gl3raster.cpp b/src/gl/gl3raster.cpp index 94f5d67..634f9c1 100644 --- a/src/gl/gl3raster.cpp +++ b/src/gl/gl3raster.cpp @@ -65,7 +65,8 @@ rasterCreateTexture(Raster *raster) #endif #ifndef PSP2_NO_DXT_TEXTURES - natras->internalFormat = natras->hasAlpha ? GL_COMPRESSED_RGBA_S3TC_DXT5_EXT : GL_COMPRESSED_RGB_S3TC_DXT1_EXT; + if (raster->width >= 4 && raster->height >= 4) + natras->internalFormat = natras->hasAlpha ? GL_COMPRESSED_RGBA_S3TC_DXT5_EXT : GL_COMPRESSED_RGB_S3TC_DXT1_EXT; #endif raster->stride = raster->width*natras->bpp; @@ -125,10 +126,6 @@ rasterCreateCameraTexture(Raster *raster) natras->bpp = 3; #endif -//#ifndef PSP2_NO_DXT_TEXTURES -// natras->internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; -//#endif - raster->stride = raster->width*natras->bpp; glGenTextures(1, &natras->texid); @@ -288,11 +285,18 @@ rasterLock(Raster *raster, int32 level, int32 lockMode) uint32_t internal_stride = ALIGN(raster->width, 8) * natras->bpp; while (y < raster->height) { memcpy_neon(px, p, raster->stride); - px += internal_stride; + p += internal_stride; y++; } #else - memcpy_neon(px, p, natras->hasAlpha ? (raster->width * raster->height) : (raster->width * raster->height / 2)); + if (raster->width < 4 || raster->height < 4) { + uint32_t internal_stride = ALIGN(raster->width, 8) * natras->bpp; + while (y < raster->height) { + memcpy_neon(px, p, raster->stride); + p += internal_stride; + y++; + } + } else memcpy_neon(px, p, natras->hasAlpha ? (raster->width * raster->height) : (raster->width * raster->height / 2)); #endif bindTexture(prev); } @@ -564,9 +568,11 @@ getLevelSize(Raster *raster, int32 level) { Gl3Raster *natras = PLUGINOFFSET(Gl3Raster, raster, nativeRasterOffset); #ifdef PSP2_NO_DXT_TEXTURES - uint32 size = raster->stride*raster->height; + uint32 size = raster->stride * raster->height; #else - uint32 size = natras->hasAlpha ? (raster->width*raster->height) : (raster->width*raster->height / 2); + uint32 size; + if (raster->width < 4 || raster->height < 4) size = raster->stride * raster->height; + else size = natras->hasAlpha ? (raster->width*raster->height) : (raster->width*raster->height / 2); #endif while(level--) size /= 4; @@ -617,7 +623,8 @@ readNativeTexture(Stream *stream) #ifdef PSP2_NO_DXT_TEXTURES data = raster->lock(i, Raster::LOCKWRITE|Raster::LOCKNOFETCH); #else - data = raster->lock(i, Raster::LOCKWRITE|Raster::LOCKNOFETCH|Raster::LOCKRAW); + if (raster->width < 4 || raster->height < 4) data = raster->lock(i, Raster::LOCKWRITE|Raster::LOCKNOFETCH); + else data = raster->lock(i, Raster::LOCKWRITE|Raster::LOCKNOFETCH|Raster::LOCKRAW); #endif stream->read8(data, size); raster->unlock(i);