From fa2d54a052106801c632558476bde45ab8c68480 Mon Sep 17 00:00:00 2001
From: Turo Lamminen <turotl@gmail.com>
Date: Thu, 30 Apr 2015 12:45:14 +0000
Subject: [PATCH] Fix mip size calculation for uncompressed textures

---
 mojodds.c |   37 ++++++++++++++++++++++++++++++++-----
 1 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/mojodds.c b/mojodds.c
index 593f281..173cf44 100644
--- a/mojodds.c
+++ b/mojodds.c
@@ -396,12 +396,39 @@
     unsigned long newtexlen;
     unsigned int neww;
     unsigned int newh;
-    unsigned int blocksize = 16;
+    uint32 blockDim = 1;
+    uint32 blockSize = 0;
 
-    if (glfmt == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)
-    {
-        blocksize = 8;
+    switch (glfmt) {
+    case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+        blockDim = 4;
+        blockSize = 8;
+        break;
+
+    case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
+    case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+        blockDim = 4;
+        blockSize = 16;
+        break;
+
+    case GL_BGR:
+        blockSize = 3;
+        break;
+
+    case GL_BGRA:
+        blockSize = 4;
+        break;
+
+    case GL_LUMINANCE_ALPHA:
+        blockSize = 2;
+        break;
+
+    default:
+        assert(!"unsupported GL format");
+        break;
     }
+
+    assert(blockSize != 0);
 
     newtex = _basetex;
     newtexlen = _basetexlen;
@@ -418,7 +445,7 @@
         newh >>= 1;
         if (neww < 1) neww = 1;
         if (newh < 1) newh = 1;
-        newtexlen = ((neww + 3) / 4) * ((newh + 3) / 4) * blocksize;
+        newtexlen = ((neww + blockDim - 1) / blockDim) * ((newh + blockDim - 1) / blockDim) * blockSize;
     } // for
 
     *_tex = newtex;

--
Gitblit v1.9.3