# PVRTexLib: Crash with mip maps generation

**URL:** <https://forums.imgtec.com/t/pvrtexlib-crash-with-mip-maps-generation/1231>\
**Category:** PowerVR Insider\
**Created:** [November 3, 2011, 12:58pm UTC](https://forums.imgtec.com/t/pvrtexlib-crash-with-mip-maps-generation/1231 "2011-11-03T12:58:44Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![pierre](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.imgtec.com/pierre/32/86_2.png) [@pierre](https://forums.imgtec.com/u/pierre)\
**Post date:** [November 3, 2011, 12:58pm UTC](https://forums.imgtec.com/t/pvrtexlib-crash-with-mip-maps-generation/1231/1 "2011-11-03T12:58:44Z")

</div>

Using the previous or latest version of the texture lib I have implemented for the first time the generation of mip maps with the CompressPVR function.  
  
  
The problem is the function will crash most all of the time (either static lib, 32 or 64 windows)  
  
  
  
  
  
Now I wonder if it is broken or if I am using it incorrectly:  
  
  
  
  
&nbsp;&nbsp;&nbsp;&nbsp;// make a CPVRTexture instance with data passed  
  
&nbsp;&nbsp;&nbsp;&nbsp;CPVRTexture sOriginalTexture(  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width,&nbsp;&nbsp;&nbsp;// u32Width,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height, // u32Height,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // u32MipMapCount,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // u32NumSurfaces,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bBorder,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bTwiddled,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bCubeMap,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bVolume,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bFalseMips,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alpha?1:0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // bHasAlpha  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bVerticallyFlipped  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eInt8StandardPixelType,&nbsp;&nbsp;&nbsp;&nbsp;// ePixelType,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.0f,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// fNormalMap,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rgba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// pPixelData  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);  
  
  
  
  
  
&nbsp;&nbsp;&nbsp;&nbsp;// create texture to encode to  
  
&nbsp;&nbsp;&nbsp;&nbsp;CPVRTexture sCompressedTexture( sOriginalTexture.getHeader() );  
  
&nbsp;&nbsp;&nbsp;&nbsp;sCompressedTexture.setMipMapCount( 2 );  
  
&nbsp;&nbsp;&nbsp;&nbsp;sCompressedTexture.setPixelType( OGL\_PVRTC4 );  
  
  
  
&nbsp;&nbsp;&nbsp;&nbsp;// encode texture  
  
&nbsp;&nbsp;&nbsp;&nbsp;PVRTextureUtilities PVRU;  
  
&nbsp;&nbsp;&nbsp;&nbsp;PVRU.CompressPVR( sOriginalTexture, sCompressedTexture );  
  
[/CODE]  
  
  
  
rgba is an array which always containing rgb and alpha, width_height pixels. No padding._  
   
  
   
_I clone the format and set the map count to a value which allows generating enough levels down to 16x16 (in this example on top I placed the number 2)._  
   
  
   
_Calling CompressPVR will result in a crash. Removing the mip map count will produce nice results._  
   
  
   
_The texture I tried it with was 512x512, but also a smaller one crashed._  
   
_`<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;// make a CPVRTexture instance with data passed<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;CPVRTexture sOriginalTexture(<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width,&nbsp;&nbsp;&nbsp;// u32Width,<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height, // u32Height,<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // u32MipMapCount,<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // u32NumSurfaces,<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bBorder,<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bTwiddled,<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bCubeMap,<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bVolume,<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bFalseMips,<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alpha?1:0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // bHasAlpha<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bVerticallyFlipped<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eInt8StandardPixelType,&nbsp;&nbsp;&nbsp;&nbsp;// ePixelType,<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.0f,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// fNormalMap,<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rgba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// pPixelData<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
<br /><br />
<br /><br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;// create texture to encode to<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;CPVRTexture sCompressedTexture( sOriginalTexture.getHeader() );<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;sCompressedTexture.setMipMapCount( 2 );<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;sCompressedTexture.setPixelType( OGL_PVRTC4 );<br />
<br /><br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;// encode texture<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;PVRTextureUtilities PVRU;<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;PVRU.CompressPVR( sOriginalTexture, sCompressedTexture );<br />
<br />`_  
  
   
  
  
   
_rgba is an array which always containing rgb and alpha, width_height pixels. No padding.  
  
  
  
  
  
I clone the format and set the map count to a value which allows generating enough levels down to 16x16 (in this example on top I placed the number 2).  
  
  
  
  
  
Calling CompressPVR will result in a crash. Removing the mip map count will produce nice results.  
  
  
  
  
  
The texture I tried it with was 512x512, but also a smaller one crashed.

---

<div class="post-metadata">

**Author:** ![tobias](https://avatars.discourse-cdn.com/v4/letter/t/c67d28/32.png) [@tobias](https://forums.imgtec.com/u/tobias)\
**Post date:** [November 3, 2011, 1:37pm UTC](https://forums.imgtec.com/t/pvrtexlib-crash-with-mip-maps-generation/1231/2 "2011-11-03T13:37:24Z")

</div>

Hi Pierre,  
  
  
  
  
  
The function you actually want to be using is ProcessRawPVR. If you  
  
simply set the MipMap count, the compressor gets confused and tries to  
  
read data that simply doesn’t exist (I’m trying to make this more clear  
  
in the next version of PVRTexLib).  
  
  
  
  
  
If you create a new CPVRTextureHeader, and set its MIP map count to 2,  
  
then pass your original texture and this header into it, it will add the  
  
desired MIP map levels. After this, initialise your compressed texture  
  
and do the set-up as you are now, minus the setMipMapCount.  
  
  
  
  
  
In case that’s not clear:  
  
  
\<pre =“BBcode”\>&nbsp;// make a CPVRTexture instance with data passed  
  
&nbsp;&nbsp;&nbsp;&nbsp;CPVRTexture sOriginalTexture(  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width,&nbsp;&nbsp;&nbsp;// u32Width,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height, // u32Height,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // u32MipMapCount,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // u32NumSurfaces,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bBorder,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bTwiddled,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bCubeMap,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bVolume,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bFalseMips,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alpha?1:0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // bHasAlpha  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bVerticallyFlipped  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eInt8StandardPixelType,&nbsp;&nbsp;&nbsp;&nbsp;// ePixelType,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.0f,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// fNormalMap,  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rgba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// pPixelData  
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);  
  
  
  
&nbsp;&nbsp;&nbsp;&nbsp;CPVRTextureHeader sProcessHeader( sOriginalTexture.getHeader() );  
  
&nbsp;&nbsp;&nbsp; sProcessHeader.setMipMapCount( 2 );  
  
&nbsp;&nbsp;&nbsp;&nbsp;PVRTextureUtilities PVRU;  
  
&nbsp;&nbsp;&nbsp; PVRU.ProcessRawPVR(sOriginalTexture,sProcessHeader,false,0.0f,0.0f,0.0f,false,eRESIZE\_NEAREST);;  
  
 &nbsp; // create texture to encode to  
  
&nbsp;&nbsp;&nbsp;&nbsp;CPVRTexture sCompressedTexture( sOriginalTexture.getHeader() );  
  
&nbsp;&nbsp;&nbsp;&nbsp;sCompressedTexture.setPixelType( OGL\_PVRTC4 );  
  
  
  
&nbsp;&nbsp;&nbsp;&nbsp;// encode texture  
  
&nbsp;&nbsp;&nbsp;&nbsp;PVRU.CompressPVR( sOriginalTexture, sCompressedTexture );   
[/CODE]  
  
Hope this helps!  
  
Thanks,  
  
Tobias &nbsp;&nbsp;

`<br><pre ="BBcode">&nbsp;// make a CPVRTexture instance with data passed<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;CPVRTexture sOriginalTexture(<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width,&nbsp;&nbsp;&nbsp;// u32Width,<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height, // u32Height,<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // u32MipMapCount,<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // u32NumSurfaces,<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bBorder,<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bTwiddled,<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bCubeMap,<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bVolume,<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bFalseMips,<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alpha?1:0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // bHasAlpha<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// bVerticallyFlipped<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eInt8StandardPixelType,&nbsp;&nbsp;&nbsp;&nbsp;// ePixelType,<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.0f,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// fNormalMap,<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rgba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// pPixelData<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
<br><br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;CPVRTextureHeader sProcessHeader( sOriginalTexture.getHeader() );<br />
<br>&nbsp;&nbsp;&nbsp; sProcessHeader.setMipMapCount( 2 );<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;PVRTextureUtilities PVRU;<br><br>&nbsp;&nbsp;&nbsp; PVRU.ProcessRawPVR(sOriginalTexture,sProcessHeader,false,0.0f,0.0f,0.0f,false,eRESIZE_NEAREST);;<br />
<br> &nbsp; // create texture to encode to<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;CPVRTexture sCompressedTexture( sOriginalTexture.getHeader() );<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;sCompressedTexture.setPixelType( OGL_PVRTC4 );<br />
<br><br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;// encode texture<br />
<br>&nbsp;&nbsp;&nbsp;&nbsp;PVRU.CompressPVR( sOriginalTexture, sCompressedTexture ); </pre><br />
`  
  
Hope this helps!  
  
Thanks,  
  
Tobias &nbsp;&nbsp;

---

<div class="post-metadata">

**Author:** ![pierre](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.imgtec.com/pierre/32/86_2.png) [@pierre](https://forums.imgtec.com/u/pierre)\
**Post date:** [November 3, 2011, 1:43pm UTC](https://forums.imgtec.com/t/pvrtexlib-crash-with-mip-maps-generation/1231/3 "2011-11-03T13:43:25Z")

</div>

Thank you Tobias, this helps a lot.  
  
  
  
  
  
The funny part is, it did work a few times and I actually had a nice .pvr which contained the mipmaps. Just it did not work all the time.  
  
  
And fopr me personally it was unclear. I think it would be nice if at least it would not crash but throw some error which I can catch. 🙂  
  
  
I also just noticed (and a bit too late) that the documentation is actually using it as you showed me. Just I did not see the line of code with ProcessRawPVR while flying over it. 🙂
