throw invalid_operation("TextureCube::allocate");
if(level>=levels)
throw invalid_argument("TextureCube::allocate");
- if(allocated&(1<<level))
+ if(allocated&(64<<level))
return;
if(ARB_texture_storage)
glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, levels-1);
glTexImage2D(face, level, ifmt, s, s, 0, get_upload_format(fmt), type, data);
- // XXX Allocation should be tracked per-face, but we'll run out of bits
- allocated |= 1<<level;
- if(auto_gen_mipmap && level==0)
+ if(level==0)
{
- // TODO Only do this once all faces are created
- generate_mipmap();
- allocated |= (1<<levels)-1;
+ allocated |= 1<<get_face_index(face);
+ if((allocated&63)==63)
+ {
+ allocated |= 64;
+ if(auto_gen_mipmap)
+ {
+ generate_mipmap();
+ allocated |= (64<<levels)-1;
+ }
+ }
+ }
+ else if(!(allocated&(64<<level)))
+ {
+ for(unsigned i=0; i<6; ++i)
+ if(enumerate_faces(i)!=face)
+ glTexImage2D(enumerate_faces(i), level, ifmt, s, s, 0, get_upload_format(fmt), type, 0);
+
+ allocated |= 64<<level;
}
}