A full MIP map chain ends with the 1x1 texel texture inclusive. But when being used on a GPU, a MIP map chain just needs to be complete, and that may be before the 1x1 texture is reached. So it depends on how the MIP map level limits are chosen.
Your code snippet seems me correct as long as the variable mipMaps doesn't cause the 1x1 texture be considered several times. I.e. the value of mipMaps should be
0 <= mipMaps <= ld( max( width, height ) )
Alternatively also breaking the loop just behind "size+=tempSize;" like so
if (mipHeight==1 && mipWidth==1) break;
would work in this sense.
EDIT: Just for clarification: The ld(x) function in the formula above means the "logarithm dualis", i.e. the logarithm to base 2.
ld( x ) := log2( x )
In case that it isn't available in your favorite math lib, it can be computed by using any other logarithmic function when dividing by the same logarithm of the base. To compute ld when e.g. the natural logarithm or the decimal logarithm is available, this would look like
log2( x ) = loge( x ) / loge( 2 )
log2( x ) = log10( x ) / log10( 2 )
You perhaps want to round to the nearest integer to avoid floating point problems.
Edited by haegarr, 21 April 2014 - 06:41 AM.