// 3 DXT blocks (red, green and blue)
unsigned char DXTRedBlock[8];
DXTRedBlock[0] = 0;
DXTRedBlock[1] = 248;
DXTRedBlock[2] = 0;
DXTRedBlock[3] = 248;
DXTRedBlock[4] = 0;
DXTRedBlock[5] = 0;
DXTRedBlock[6] = 0;
DXTRedBlock[7] = 0;
unsigned char DXTGreenBlock[8];
DXTGreenBlock[0] = 224;
DXTGreenBlock[1] = 7;
DXTGreenBlock[2] = 224;
DXTGreenBlock[3] = 7;
DXTGreenBlock[4] = 0;
DXTGreenBlock[5] = 0;
DXTGreenBlock[6] = 0;
DXTGreenBlock[7] = 0;
unsigned char DXTBlueBlock[8];
DXTBlueBlock[0] = 31;
DXTBlueBlock[1] = 0;
DXTBlueBlock[2] = 31;
DXTBlueBlock[3] = 0;
DXTBlueBlock[4] = 0;
DXTBlueBlock[5] = 0;
DXTBlueBlock[6] = 0;
DXTBlueBlock[7] = 0;
// The 3 DXT blocks grouped
unsigned char Blocks3[24];
memcpy( Blocks3, DXTRedBlock, 8 );
memcpy( Blocks3+8, DXTGreenBlock, 8 );
memcpy( Blocks3+16, DXTBlueBlock, 8 );
// 3 uncompressed 4x4 textures (Solid red, green and blue)
unsigned char Red4x4[48];
for( int i = 0; i < 48; i++ )
Red4x4[i] = (i % 3) == 0 ? 255 : 0;
unsigned char Green4x4[48];
for( int i = 0; i < 48; i++ )
Green4x4[i] = (i % 3) == 1 ? 255 : 0;
unsigned char Blue4x4[48];
for( int i = 0; i < 48; i++ )
Blue4x4[i] = (i % 3) == 2 ? 255 : 0;
glGenTextures(nNbTextures, texid);
// First texture array (NOT OK)
// -DXT compressed
// -Not mipmapped
// -Level 0 allocated and then subloaded
glBindTexture( GL_TEXTURE_2D_ARRAY_EXT, texid[0]);
glTexParameteri( GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri( GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage3D(GL_TEXTURE_2D_ARRAY_EXT, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 3, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glCompressedTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 0, 4, 4, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, DXTRedBlock);
glCompressedTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 1, 4, 4, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, DXTGreenBlock);
glCompressedTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 2, 4, 4, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, DXTBlueBlock);
// Second texture array (NOT OK)
// -DXT compressed
// -Fully mipmapped (3 levels)
// -Levels allocated and then subloaded
glBindTexture( GL_TEXTURE_2D_ARRAY_EXT, texid[1]);
glTexParameteri( GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri( GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage3D(GL_TEXTURE_2D_ARRAY_EXT, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 3, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glCompressedTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 0, 4, 4, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, DXTRedBlock);
glCompressedTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 1, 4, 4, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, DXTGreenBlock);
glCompressedTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 2, 4, 4, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, DXTBlueBlock);
glTexImage3D(GL_TEXTURE_2D_ARRAY_EXT, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 2, 2, 3, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glCompressedTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 1, 0, 0, 0, 2, 2, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, DXTRedBlock);
glCompressedTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 1, 0, 0, 1, 2, 2, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, DXTGreenBlock);
glCompressedTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 1, 0, 0, 2, 2, 2, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, DXTBlueBlock);
glTexImage3D(GL_TEXTURE_2D_ARRAY_EXT, 2, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 1, 1, 3, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glCompressedTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 2, 0, 0, 0, 1, 1, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, DXTRedBlock);
glCompressedTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 2, 0, 0, 1, 1, 1, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, DXTGreenBlock);
glCompressedTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 2, 0, 0, 2, 1, 1, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, DXTBlueBlock);
// Third texture array (NOT OK)
// -DXT compressed
// -Fully mipmapped (3 levels)
// -Mipmaps allocated and initialized at once
glBindTexture( GL_TEXTURE_2D_ARRAY_EXT, texid[2]);
glTexParameteri( GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri( GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY_EXT, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 3, 0, 24, Blocks3);
glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY_EXT, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 2, 2, 3, 0, 24, Blocks3);
glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY_EXT, 2, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 1, 2, 3, 0, 24, Blocks3);
// Fourth texture array (OK)
// -Uncompressed RGB8 data
// -Not mipmapped
// -Level 0 allocated and then subloaded
glBindTexture( GL_TEXTURE_2D_ARRAY_EXT, texid[3]);
glTexParameteri( GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri( GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage3D(GL_TEXTURE_2D_ARRAY_EXT, 0, GL_RGB8, 4, 4, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 0, 4, 4, 1, GL_RGB, GL_UNSIGNED_BYTE, Red4x4);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 1, 4, 4, 1, GL_RGB, GL_UNSIGNED_BYTE, Green4x4);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 2, 4, 4, 1, GL_RGB, GL_UNSIGNED_BYTE, Blue4x4);
// Fifth texture array (OK)
// -Uncompressed RGB8 data
// -Fully mipmapped (3 levels)
// -Levels allocated and then subloaded
glBindTexture( GL_TEXTURE_2D_ARRAY_EXT, texid[4]);
glTexParameteri( GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri( GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
glTexImage3D(GL_TEXTURE_2D_ARRAY_EXT, 0, GL_RGB8, 4, 4, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 0, 4, 4, 1, GL_RGB, GL_UNSIGNED_BYTE, Red4x4);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 1, 4, 4, 1, GL_RGB, GL_UNSIGNED_BYTE, Green4x4);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 2, 4, 4, 1, GL_RGB, GL_UNSIGNED_BYTE, Blue4x4);
glTexImage3D(GL_TEXTURE_2D_ARRAY_EXT, 1, GL_RGB8, 2, 2, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 1, 0, 0, 0, 2, 2, 1, GL_RGB, GL_UNSIGNED_BYTE, Red4x4);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 1, 0, 0, 1, 2, 2, 1, GL_RGB, GL_UNSIGNED_BYTE, Green4x4);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 1, 0, 0, 2, 2, 2, 1, GL_RGB, GL_UNSIGNED_BYTE, Blue4x4);
glTexImage3D(GL_TEXTURE_2D_ARRAY_EXT, 2, GL_RGB8, 1, 1, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 2, 0, 0, 0, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, Red4x4);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 2, 0, 0, 1, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, Green4x4);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 2, 0, 0, 2, 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, Blue4x4);
// Sixth texture array (NOT OK)
// -Uncompressed RGB8 data
// -Partially mipmapped (2 levels)
// -Levels allocated and then subloaded
glBindTexture( GL_TEXTURE_2D_ARRAY_EXT, texid[5]);
glTexParameteri( GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri( GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
glTexImage3D(GL_TEXTURE_2D_ARRAY_EXT, 0, GL_RGB8, 4, 4, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 0, 4, 4, 1, GL_RGB, GL_UNSIGNED_BYTE, Red4x4);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 1, 4, 4, 1, GL_RGB, GL_UNSIGNED_BYTE, Green4x4);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 2, 4, 4, 1, GL_RGB, GL_UNSIGNED_BYTE, Blue4x4);
glTexImage3D(GL_TEXTURE_2D_ARRAY_EXT, 1, GL_RGB8, 2, 2, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 1, 0, 0, 0, 2, 2, 1, GL_RGB, GL_UNSIGNED_BYTE, Red4x4);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 1, 0, 0, 1, 2, 2, 1, GL_RGB, GL_UNSIGNED_BYTE, Green4x4);
glTexSubImage3D( GL_TEXTURE_2D_ARRAY_EXT, 1, 0, 0, 2, 2, 2, 1, GL_RGB, GL_UNSIGNED_BYTE, Blue4x4);