From 11532e10cc406b42a898534fdca0de12d4f4e36e Mon Sep 17 00:00:00 2001 From: rextimmy Date: Mon, 16 Jan 2017 15:35:25 +1000 Subject: [PATCH 1/2] Add log2 function to mMathFn.h --- Engine/source/math/mMathFn.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Engine/source/math/mMathFn.h b/Engine/source/math/mMathFn.h index 1855656e7..93596f63f 100644 --- a/Engine/source/math/mMathFn.h +++ b/Engine/source/math/mMathFn.h @@ -320,6 +320,11 @@ inline F32 mLog(const F32 val) return (F32) log(val); } +inline F32 mLog2(const F32 val) +{ + return (F32) log2(val); +} + inline F32 mExp(const F32 val) { return (F32) exp(val); @@ -380,6 +385,10 @@ inline F64 mLog(const F64 val) return (F64) log(val); } +inline F64 mLog2(const F64 val) +{ + return (F64) log2(val); +} inline F32 mCatmullrom(F32 t, F32 p0, F32 p1, F32 p2, F32 p3) { From f6d624be8f22c1d67bf6fd498fd4ee32d9b7e487 Mon Sep 17 00:00:00 2001 From: rextimmy Date: Mon, 16 Jan 2017 15:36:52 +1000 Subject: [PATCH 2/2] Fix mipmap count and potential crash for non square textures that are allocated with GBitmap class --- Engine/source/gfx/bitmap/gBitmap.cpp | 5 ++++- Engine/source/gfx/gfxTextureManager.cpp | 16 +--------------- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/Engine/source/gfx/bitmap/gBitmap.cpp b/Engine/source/gfx/bitmap/gBitmap.cpp index e5ef6b407..9e20d6951 100644 --- a/Engine/source/gfx/bitmap/gBitmap.cpp +++ b/Engine/source/gfx/bitmap/gBitmap.cpp @@ -327,7 +327,10 @@ void GBitmap::allocateBitmap(const U32 in_width, const U32 in_height, const bool mNumMipLevels++; allocPixels += currWidth * currHeight * mBytesPerPixel; - } while (currWidth != 1 && currHeight != 1); + } while (currWidth != 1 || currHeight != 1); + + U32 expectedMips = mFloor(mLog2(mMax(in_width, in_height))) + 1; + AssertFatal(mNumMipLevels == expectedMips, "GBitmap::allocateBitmap: mipmap count wrong"); } AssertFatal(mNumMipLevels <= c_maxMipLevels, "GBitmap::allocateBitmap: too many miplevels"); diff --git a/Engine/source/gfx/gfxTextureManager.cpp b/Engine/source/gfx/gfxTextureManager.cpp index b656fcffd..781e0daa2 100644 --- a/Engine/source/gfx/gfxTextureManager.cpp +++ b/Engine/source/gfx/gfxTextureManager.cpp @@ -1085,21 +1085,7 @@ void GFXTextureManager::_validateTexParams( const U32 width, const U32 height, // NOTE: Does this belong here? if( inOutNumMips == 0 && !autoGenSupp ) { - U32 currWidth = width; - U32 currHeight = height; - - inOutNumMips = 1; - do - { - currWidth >>= 1; - currHeight >>= 1; - if( currWidth == 0 ) - currWidth = 1; - if( currHeight == 0 ) - currHeight = 1; - - inOutNumMips++; - } while ( currWidth != 1 && currHeight != 1 ); + inOutNumMips = mFloor(mLog2(mMax(width, height))) + 1; } } }