/////////////////////////////////////////////////////////////////////////////////////////////////// // OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) /////////////////////////////////////////////////////////////////////////////////////////////////// // Created : 2010-09-26 // Updated : 2010-09-27 // Licence : This source is under MIT License // File : gli/gtx/loader_dds10.inl /////////////////////////////////////////////////////////////////////////////////////////////////// namespace gli{ namespace gtx{ namespace loader_dds10{ namespace detail { // DDS Documentation /* http://msdn.microsoft.com/en-us/library/bb943991(VS.85).aspx#File_Layout1 http://msdn.microsoft.com/en-us/library/bb943992.aspx */ #define GLI_MAKEFOURCC(ch0, ch1, ch2, ch3) \ (glm::uint32)( \ (((glm::uint32)(glm::uint8)(ch3) << 24) & 0xFF000000) | \ (((glm::uint32)(glm::uint8)(ch2) << 16) & 0x00FF0000) | \ (((glm::uint32)(glm::uint8)(ch1) << 8) & 0x0000FF00) | \ ((glm::uint32)(glm::uint8)(ch0) & 0x000000FF) ) enum DXGI_FORMAT { DXGI_FORMAT_UNKNOWN = 0, DXGI_FORMAT_R32G32B32A32_TYPELESS = 1, DXGI_FORMAT_R32G32B32A32_FLOAT = 2, DXGI_FORMAT_R32G32B32A32_UINT = 3, DXGI_FORMAT_R32G32B32A32_SINT = 4, DXGI_FORMAT_R32G32B32_TYPELESS = 5, DXGI_FORMAT_R32G32B32_FLOAT = 6, DXGI_FORMAT_R32G32B32_UINT = 7, DXGI_FORMAT_R32G32B32_SINT = 8, DXGI_FORMAT_R16G16B16A16_TYPELESS = 9, DXGI_FORMAT_R16G16B16A16_FLOAT = 10, DXGI_FORMAT_R16G16B16A16_UNORM = 11, DXGI_FORMAT_R16G16B16A16_UINT = 12, DXGI_FORMAT_R16G16B16A16_SNORM = 13, DXGI_FORMAT_R16G16B16A16_SINT = 14, DXGI_FORMAT_R32G32_TYPELESS = 15, DXGI_FORMAT_R32G32_FLOAT = 16, DXGI_FORMAT_R32G32_UINT = 17, DXGI_FORMAT_R32G32_SINT = 18, DXGI_FORMAT_R32G8X24_TYPELESS = 19, DXGI_FORMAT_D32_FLOAT_S8X24_UINT = 20, DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS = 21, DXGI_FORMAT_X32_TYPELESS_G8X24_UINT = 22, DXGI_FORMAT_R10G10B10A2_TYPELESS = 23, DXGI_FORMAT_R10G10B10A2_UNORM = 24, DXGI_FORMAT_R10G10B10A2_UINT = 25, DXGI_FORMAT_R11G11B10_FLOAT = 26, DXGI_FORMAT_R8G8B8A8_TYPELESS = 27, DXGI_FORMAT_R8G8B8A8_UNORM = 28, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29, DXGI_FORMAT_R8G8B8A8_UINT = 30, DXGI_FORMAT_R8G8B8A8_SNORM = 31, DXGI_FORMAT_R8G8B8A8_SINT = 32, DXGI_FORMAT_R16G16_TYPELESS = 33, DXGI_FORMAT_R16G16_FLOAT = 34, DXGI_FORMAT_R16G16_UNORM = 35, DXGI_FORMAT_R16G16_UINT = 36, DXGI_FORMAT_R16G16_SNORM = 37, DXGI_FORMAT_R16G16_SINT = 38, DXGI_FORMAT_R32_TYPELESS = 39, DXGI_FORMAT_D32_FLOAT = 40, DXGI_FORMAT_R32_FLOAT = 41, DXGI_FORMAT_R32_UINT = 42, DXGI_FORMAT_R32_SINT = 43, DXGI_FORMAT_R24G8_TYPELESS = 44, DXGI_FORMAT_D24_UNORM_S8_UINT = 45, DXGI_FORMAT_R24_UNORM_X8_TYPELESS = 46, DXGI_FORMAT_X24_TYPELESS_G8_UINT = 47, DXGI_FORMAT_R8G8_TYPELESS = 48, DXGI_FORMAT_R8G8_UNORM = 49, DXGI_FORMAT_R8G8_UINT = 50, DXGI_FORMAT_R8G8_SNORM = 51, DXGI_FORMAT_R8G8_SINT = 52, DXGI_FORMAT_R16_TYPELESS = 53, DXGI_FORMAT_R16_FLOAT = 54, DXGI_FORMAT_D16_UNORM = 55, DXGI_FORMAT_R16_UNORM = 56, DXGI_FORMAT_R16_UINT = 57, DXGI_FORMAT_R16_SNORM = 58, DXGI_FORMAT_R16_SINT = 59, DXGI_FORMAT_R8_TYPELESS = 60, DXGI_FORMAT_R8_UNORM = 61, DXGI_FORMAT_R8_UINT = 62, DXGI_FORMAT_R8_SNORM = 63, DXGI_FORMAT_R8_SINT = 64, DXGI_FORMAT_A8_UNORM = 65, DXGI_FORMAT_R1_UNORM = 66, DXGI_FORMAT_R9G9B9E5_SHAREDEXP = 67, DXGI_FORMAT_R8G8_B8G8_UNORM = 68, DXGI_FORMAT_G8R8_G8B8_UNORM = 69, DXGI_FORMAT_BC1_TYPELESS = 70, DXGI_FORMAT_BC1_UNORM = 71, DXGI_FORMAT_BC1_UNORM_SRGB = 72, DXGI_FORMAT_BC2_TYPELESS = 73, DXGI_FORMAT_BC2_UNORM = 74, DXGI_FORMAT_BC2_UNORM_SRGB = 75, DXGI_FORMAT_BC3_TYPELESS = 76, DXGI_FORMAT_BC3_UNORM = 77, DXGI_FORMAT_BC3_UNORM_SRGB = 78, DXGI_FORMAT_BC4_TYPELESS = 79, DXGI_FORMAT_BC4_UNORM = 80, DXGI_FORMAT_BC4_SNORM = 81, DXGI_FORMAT_BC5_TYPELESS = 82, DXGI_FORMAT_BC5_UNORM = 83, DXGI_FORMAT_BC5_SNORM = 84, DXGI_FORMAT_B5G6R5_UNORM = 85, DXGI_FORMAT_B5G5R5A1_UNORM = 86, DXGI_FORMAT_B8G8R8A8_UNORM = 87, DXGI_FORMAT_B8G8R8X8_UNORM = 88, DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM = 89, DXGI_FORMAT_B8G8R8A8_TYPELESS = 90, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB = 91, DXGI_FORMAT_B8G8R8X8_TYPELESS = 92, DXGI_FORMAT_B8G8R8X8_UNORM_SRGB = 93, DXGI_FORMAT_BC6H_TYPELESS = 94, DXGI_FORMAT_BC6H_UF16 = 95, DXGI_FORMAT_BC6H_SF16 = 96, DXGI_FORMAT_BC7_TYPELESS = 97, DXGI_FORMAT_BC7_UNORM = 98, DXGI_FORMAT_BC7_UNORM_SRGB = 99, DXGI_FORMAT_FORCE_UINT = 0xffffffffUL }; enum D3D10_RESOURCE_DIMENSION { D3D10_RESOURCE_DIMENSION_UNKNOWN = 0, D3D10_RESOURCE_DIMENSION_BUFFER = 1, D3D10_RESOURCE_DIMENSION_TEXTURE1D = 2, D3D10_RESOURCE_DIMENSION_TEXTURE2D = 3, D3D10_RESOURCE_DIMENSION_TEXTURE3D = 4 }; enum D3D10_RESOURCE_MISC_FLAG { D3D10_RESOURCE_MISC_GENERATE_MIPS = 0x1L, D3D10_RESOURCE_MISC_SHARED = 0x2L, D3D10_RESOURCE_MISC_TEXTURECUBE = 0x4L, D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX = 0x10L, D3D10_RESOURCE_MISC_GDI_COMPATIBLE = 0x20L }; enum dds_format { GLI_D3DFMT_R8G8B8 = 20, GLI_D3DFMT_A8R8G8B8 = 21, GLI_D3DFMT_X8R8G8B8 = 22, GLI_D3DFMT_A8 = 28, GLI_D3DFMT_A2B10G10R10 = 31, GLI_D3DFMT_A8B8G8R8 = 32, GLI_D3DFMT_X8B8G8R8 = 33, GLI_D3DFMT_G16R16 = 34, GLI_D3DFMT_A2R10G10B10 = 35, GLI_D3DFMT_A16B16G16R16 = 36, GLI_D3DFMT_L8 = 50, GLI_D3DFMT_A8L8 = 51, GLI_D3DFMT_DXT1 = GLI_MAKEFOURCC('D', 'X', 'T', '1'), GLI_D3DFMT_DXT2 = GLI_MAKEFOURCC('D', 'X', 'T', '2'), GLI_D3DFMT_DXT3 = GLI_MAKEFOURCC('D', 'X', 'T', '3'), GLI_D3DFMT_DXT4 = GLI_MAKEFOURCC('D', 'X', 'T', '4'), GLI_D3DFMT_DXT5 = GLI_MAKEFOURCC('D', 'X', 'T', '5'), GLI_D3DFMT_DX10 = GLI_MAKEFOURCC('D', 'X', '1', '0'), GLI_D3DFMT_D32 = 71, GLI_D3DFMT_D24S8 = 75, GLI_D3DFMT_D24X8 = 77, GLI_D3DFMT_D16 = 80, GLI_D3DFMT_L16 = 81, GLI_D3DFMT_D32F_LOCKABLE = 82, GLI_D3DFMT_D24FS8 = 83, GLI_D3DFMT_R16F = 111, GLI_D3DFMT_G16R16F = 112, GLI_D3DFMT_A16B16G16R16F = 113, GLI_D3DFMT_R32F = 114, GLI_D3DFMT_G32R32F = 115, GLI_D3DFMT_A32B32G32R32F = 116 }; struct ddsHeader10 { DXGI_FORMAT dxgiFormat; D3D10_RESOURCE_DIMENSION resourceDimension; glm::uint32 miscFlag; // D3D10_RESOURCE_MISC_GENERATE_MIPS glm::uint32 arraySize; glm::uint32 reserved; }; inline gli::format format_fourcc2gli_cast(glm::uint32 const & FourCC) { switch(FourCC) { case loader_dds9::detail::GLI_FOURCC_DXT1: return DXT1; case loader_dds9::detail::GLI_FOURCC_DXT2: case loader_dds9::detail::GLI_FOURCC_DXT3: return DXT3; case loader_dds9::detail::GLI_FOURCC_DXT4: case loader_dds9::detail::GLI_FOURCC_DXT5: return DXT5; case loader_dds9::detail::GLI_FOURCC_R16F: return R16F; case loader_dds9::detail::GLI_FOURCC_G16R16F: return RG16F; case loader_dds9::detail::GLI_FOURCC_A16B16G16R16F: return RGBA16F; case loader_dds9::detail::GLI_FOURCC_R32F: return R32F; case loader_dds9::detail::GLI_FOURCC_G32R32F: return RG32F; case loader_dds9::detail::GLI_FOURCC_A32B32G32R32F: return RGBA32F; case loader_dds9::detail::GLI_D3DFMT_R8G8B8: return RGB8U; case loader_dds9::detail::GLI_D3DFMT_A8R8G8B8: case loader_dds9::detail::GLI_D3DFMT_X8R8G8B8: case loader_dds9::detail::GLI_D3DFMT_A8B8G8R8: case loader_dds9::detail::GLI_D3DFMT_X8B8G8R8: return RGBA8U; case loader_dds9::detail::GLI_D3DFMT_R5G6B5: return R5G6B5; case loader_dds9::detail::GLI_D3DFMT_A4R4G4B4: case loader_dds9::detail::GLI_D3DFMT_X4R4G4B4: return RGBA4; case loader_dds9::detail::GLI_D3DFMT_G16R16: return RG16U; case loader_dds9::detail::GLI_D3DFMT_A16B16G16R16: return RGBA16U; case loader_dds9::detail::GLI_D3DFMT_A2R10G10B10: case loader_dds9::detail::GLI_D3DFMT_A2B10G10R10: return RGB10A2; default: assert(0); return FORMAT_NULL; } } inline DXGI_FORMAT format_gli2dds_cast(gli::format const & Format) { DXGI_FORMAT Cast[] = { DXGI_FORMAT_UNKNOWN, //FORMAT_NULL, // Unsigned integer formats DXGI_FORMAT_R8_UINT, //R8U, DXGI_FORMAT_R8G8_UINT, //RG8U, DXGI_FORMAT_UNKNOWN, //RGB8U, DXGI_FORMAT_R8G8B8A8_UINT, //RGBA8U, DXGI_FORMAT_R16_UINT, //R16U, DXGI_FORMAT_R16G16_UINT, //RG16U, DXGI_FORMAT_UNKNOWN, //RGB16U, DXGI_FORMAT_R16G16B16A16_UINT, //RGBA16U, DXGI_FORMAT_R32_UINT, //R32U, DXGI_FORMAT_R32G32_UINT, //RG32U, DXGI_FORMAT_R32G32B32_UINT, //RGB32U, DXGI_FORMAT_R32G32B32A32_UINT, //RGBA32U, // Signed integer formats DXGI_FORMAT_R8_SINT, //R8I, DXGI_FORMAT_R8G8_SINT, //RG8I, DXGI_FORMAT_UNKNOWN, //RGB8I, DXGI_FORMAT_R8G8B8A8_SINT, //RGBA8I, DXGI_FORMAT_R16_SINT, //R16I, DXGI_FORMAT_R16G16_SINT, //RG16I, DXGI_FORMAT_UNKNOWN, //RGB16I, DXGI_FORMAT_R16G16B16A16_SINT, //RGBA16I, DXGI_FORMAT_R32_SINT, //R32I, DXGI_FORMAT_R32G32_SINT, //RG32I, DXGI_FORMAT_R32G32B32_SINT, //RGB32I, DXGI_FORMAT_R32G32B32A32_SINT, //RGBA32I, // Floating formats DXGI_FORMAT_R16_FLOAT, //R16F, DXGI_FORMAT_R16G16_FLOAT, //RG16F, DXGI_FORMAT_UNKNOWN, //RGB16F, DXGI_FORMAT_R16G16B16A16_FLOAT, //RGBA16F, DXGI_FORMAT_R32_FLOAT, //R32F, DXGI_FORMAT_R32G32_FLOAT, //RG32F, DXGI_FORMAT_R32G32B32_FLOAT, //RGB32F, DXGI_FORMAT_R32G32B32A32_FLOAT, //RGBA32F, // Packed formats DXGI_FORMAT_UNKNOWN, //RGBE8, DXGI_FORMAT_R9G9B9E5_SHAREDEXP, //RGB9E5, DXGI_FORMAT_R11G11B10_FLOAT, DXGI_FORMAT_B5G6R5_UNORM, //R5G6B5, DXGI_FORMAT_UNKNOWN, //RGBA4, DXGI_FORMAT_R10G10B10A2_TYPELESS, //RGB10A2, // Depth formats DXGI_FORMAT_D16_UNORM, //D16, DXGI_FORMAT_D24_UNORM_S8_UINT, //D24X8, DXGI_FORMAT_D24_UNORM_S8_UINT, //D24S8, DXGI_FORMAT_D32_FLOAT, //D32F, DXGI_FORMAT_D32_FLOAT_S8X24_UINT, //D32FS8X24, // Compressed formats DXGI_FORMAT_BC1_UNORM, //DXT1, DXGI_FORMAT_BC2_UNORM, //DXT3, DXGI_FORMAT_BC3_UNORM, //DXT5, DXGI_FORMAT_BC4_UNORM, //ATI1N_UNORM, DXGI_FORMAT_BC4_SNORM, //ATI1N_SNORM, DXGI_FORMAT_BC5_UNORM, //ATI2N_UNORM, DXGI_FORMAT_BC5_SNORM, //ATI2N_SNORM, DXGI_FORMAT_BC6H_UF16, //BP_FLOAT, DXGI_FORMAT_BC6H_SF16, //BP_FLOAT, DXGI_FORMAT_BC7_UNORM //BP, }; return Cast[Format]; } inline gli::format format_dds2gli_cast(DXGI_FORMAT const & Format) { gli::format Cast[] = { gli::FORMAT_NULL, //DXGI_FORMAT_UNKNOWN = 0, gli::RGBA32U, //DXGI_FORMAT_R32G32B32A32_TYPELESS = 1, gli::RGBA32F, //DXGI_FORMAT_R32G32B32A32_FLOAT = 2, gli::RGBA32U, //DXGI_FORMAT_R32G32B32A32_UINT = 3, gli::RGBA32I, //DXGI_FORMAT_R32G32B32A32_SINT = 4, gli::RGB32U, //DXGI_FORMAT_R32G32B32_TYPELESS = 5, gli::RGB32F, //DXGI_FORMAT_R32G32B32_FLOAT = 6, gli::RGB32U, //DXGI_FORMAT_R32G32B32_UINT = 7, gli::RGB32I, //DXGI_FORMAT_R32G32B32_SINT = 8, gli::RGBA16U, //DXGI_FORMAT_R16G16B16A16_TYPELESS = 9, gli::RGBA16F, //DXGI_FORMAT_R16G16B16A16_FLOAT = 10, gli::RGBA16U, //DXGI_FORMAT_R16G16B16A16_UNORM = 11, gli::RGBA16I, //DXGI_FORMAT_R16G16B16A16_UINT = 12, gli::RGBA16I, //DXGI_FORMAT_R16G16B16A16_SNORM = 13, gli::RGBA16I, //DXGI_FORMAT_R16G16B16A16_SINT = 14, gli::RG32U, //DXGI_FORMAT_R32G32_TYPELESS = 15, gli::RG32F, //DXGI_FORMAT_R32G32_FLOAT = 16, gli::RG32U, //DXGI_FORMAT_R32G32_UINT = 17, gli::RG32I, //DXGI_FORMAT_R32G32_SINT = 18, gli::FORMAT_NULL, //DXGI_FORMAT_R32G8X24_TYPELESS = 19, gli::D32FS8X24, //DXGI_FORMAT_D32_FLOAT_S8X24_UINT = 20, gli::FORMAT_NULL, //DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS = 21, gli::FORMAT_NULL, //DXGI_FORMAT_X32_TYPELESS_G8X24_UINT = 22, gli::RGB10A2, //DXGI_FORMAT_R10G10B10A2_TYPELESS = 23, gli::RGB10A2, //DXGI_FORMAT_R10G10B10A2_UNORM = 24, gli::RGB10A2, //DXGI_FORMAT_R10G10B10A2_UINT = 25, gli::RG11B10F, //DXGI_FORMAT_R11G11B10_FLOAT = 26, gli::RGBA8U, //DXGI_FORMAT_R8G8B8A8_TYPELESS = 27, gli::RGBA8U, //DXGI_FORMAT_R8G8B8A8_UNORM = 28, gli::RGBA8U, //DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29, gli::RGBA8U, //DXGI_FORMAT_R8G8B8A8_UINT = 30, gli::RGBA8I, //DXGI_FORMAT_R8G8B8A8_SNORM = 31, gli::RGBA8I, //DXGI_FORMAT_R8G8B8A8_SINT = 32, gli::RG16U, //DXGI_FORMAT_R16G16_TYPELESS = 33, gli::RG16F, //DXGI_FORMAT_R16G16_FLOAT = 34, gli::RG16U, //DXGI_FORMAT_R16G16_UNORM = 35, gli::RG16U, //DXGI_FORMAT_R16G16_UINT = 36, gli::RG16I, //DXGI_FORMAT_R16G16_SNORM = 37, gli::RG16I, //DXGI_FORMAT_R16G16_SINT = 38, gli::R32F, //DXGI_FORMAT_R32_TYPELESS = 39, gli::D32F, //DXGI_FORMAT_D32_FLOAT = 40, gli::R32F, //DXGI_FORMAT_R32_FLOAT = 41, gli::R32U, //DXGI_FORMAT_R32_UINT = 42, gli::R32I, //DXGI_FORMAT_R32_SINT = 43, gli::FORMAT_NULL, //DXGI_FORMAT_R24G8_TYPELESS = 44, gli::FORMAT_NULL, //DXGI_FORMAT_D24_UNORM_S8_UINT = 45, gli::FORMAT_NULL, //DXGI_FORMAT_R24_UNORM_X8_TYPELESS = 46, gli::FORMAT_NULL, //DXGI_FORMAT_X24_TYPELESS_G8_UINT = 47, gli::RG8U, //DXGI_FORMAT_R8G8_TYPELESS = 48, gli::RG8U, //DXGI_FORMAT_R8G8_UNORM = 49, gli::RG8U, //DXGI_FORMAT_R8G8_UINT = 50, gli::RG8I, //DXGI_FORMAT_R8G8_SNORM = 51, gli::RG8I, //DXGI_FORMAT_R8G8_SINT = 52, gli::R16U, //DXGI_FORMAT_R16_TYPELESS = 53, gli::R16F, //DXGI_FORMAT_R16_FLOAT = 54, gli::D16, //DXGI_FORMAT_D16_UNORM = 55, gli::R16U, //DXGI_FORMAT_R16_UNORM = 56, gli::R16U, //DXGI_FORMAT_R16_UINT = 57, gli::R16I, //DXGI_FORMAT_R16_SNORM = 58, gli::R16I, //DXGI_FORMAT_R16_SINT = 59, gli::R8U, //DXGI_FORMAT_R8_TYPELESS = 60, gli::R8U, //DXGI_FORMAT_R8_UNORM = 61, gli::R8U, //DXGI_FORMAT_R8_UINT = 62, gli::R8I, //DXGI_FORMAT_R8_SNORM = 63, gli::R8I, //DXGI_FORMAT_R8_SINT = 64, gli::R8U, //DXGI_FORMAT_A8_UNORM = 65, gli::FORMAT_NULL, //DXGI_FORMAT_R1_UNORM = 66, gli::RGB9E5, //DXGI_FORMAT_R9G9B9E5_SHAREDEXP = 67, gli::FORMAT_NULL, //DXGI_FORMAT_R8G8_B8G8_UNORM = 68, gli::FORMAT_NULL, //DXGI_FORMAT_G8R8_G8B8_UNORM = 69, gli::DXT1, //DXGI_FORMAT_BC1_TYPELESS = 70, gli::DXT1, //DXGI_FORMAT_BC1_UNORM = 71, gli::DXT1, //DXGI_FORMAT_BC1_UNORM_SRGB = 72, gli::DXT3, //DXGI_FORMAT_BC2_TYPELESS = 73, gli::DXT3, //DXGI_FORMAT_BC2_UNORM = 74, gli::DXT3, //DXGI_FORMAT_BC2_UNORM_SRGB = 75, gli::DXT5, //DXGI_FORMAT_BC3_TYPELESS = 76, gli::DXT5, //DXGI_FORMAT_BC3_UNORM = 77, gli::DXT5, //DXGI_FORMAT_BC3_UNORM_SRGB = 78, gli::ATI1N_UNORM, //DXGI_FORMAT_BC4_TYPELESS = 79, gli::ATI1N_UNORM, //DXGI_FORMAT_BC4_UNORM = 80, gli::ATI1N_SNORM, //DXGI_FORMAT_BC4_SNORM = 81, gli::ATI2N_UNORM, //DXGI_FORMAT_BC5_TYPELESS = 82, gli::ATI2N_UNORM, //DXGI_FORMAT_BC5_UNORM = 83, gli::ATI2N_SNORM, //DXGI_FORMAT_BC5_SNORM = 84, gli::FORMAT_NULL, //DXGI_FORMAT_B5G6R5_UNORM = 85, gli::FORMAT_NULL, //DXGI_FORMAT_B5G5R5A1_UNORM = 86, gli::RGBA8U, //DXGI_FORMAT_B8G8R8A8_UNORM = 87, gli::RGBA8U, //DXGI_FORMAT_B8G8R8X8_UNORM = 88, gli::FORMAT_NULL, //DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM = 89, gli::RGBA8U, //DXGI_FORMAT_B8G8R8A8_TYPELESS = 90, gli::RGBA8U, //DXGI_FORMAT_B8G8R8A8_UNORM_SRGB = 91, gli::RGBA8U, //DXGI_FORMAT_B8G8R8X8_TYPELESS = 92, gli::RGBA8U, //DXGI_FORMAT_B8G8R8X8_UNORM_SRGB = 93, gli::BP_UF16, //DXGI_FORMAT_BC6H_TYPELESS = 94, gli::BP_UF16, //DXGI_FORMAT_BC6H_UF16 = 95, gli::BP_SF16, //DXGI_FORMAT_BC6H_SF16 = 96, gli::BP, //DXGI_FORMAT_BC7_TYPELESS = 97, gli::BP, //DXGI_FORMAT_BC7_UNORM = 98, gli::BP, //DXGI_FORMAT_BC7_UNORM_SRGB = 99, gli::R32U //DXGI_FORMAT_FORCE_UINT = 0xffffffffUL }; return Cast[Format]; } }//namespace detail inline texture2D loadDDS10 ( std::string const & Filename ) { std::ifstream FileIn(Filename.c_str(), std::ios::in | std::ios::binary); if(FileIn.fail()) return texture2D(); loader_dds9::detail::ddsHeader HeaderDesc; detail::ddsHeader10 HeaderDesc10; char Magic[4]; //* Read magic number and check if valid .dds file FileIn.read((char*)&Magic, sizeof(Magic)); assert(strncmp(Magic, "DDS ", 4) == 0); // Get the surface descriptor FileIn.read((char*)&HeaderDesc, sizeof(HeaderDesc)); if(HeaderDesc.format.flags & loader_dds9::detail::GLI_DDPF_FOURCC && HeaderDesc.format.fourCC == loader_dds9::detail::GLI_FOURCC_DX10) FileIn.read((char*)&HeaderDesc10, sizeof(HeaderDesc10)); loader_dds9::detail::DDLoader Loader; if(HeaderDesc.format.fourCC == loader_dds9::detail::GLI_FOURCC_DX10) Loader.Format = detail::format_dds2gli_cast(HeaderDesc10.dxgiFormat); else if(HeaderDesc.format.flags & loader_dds9::detail::GLI_DDPF_FOURCC) Loader.Format = detail::format_fourcc2gli_cast(HeaderDesc.format.fourCC); else { switch(HeaderDesc.format.bpp) { case 8: Loader.Format = R8U; break; case 16: Loader.Format = RG8U; break; case 24: Loader.Format = RGB8U; break; case 32: Loader.Format = RGBA8U; break; } } Loader.BlockSize = size(image2D(texture2D::dimensions_type(0), Loader.Format), BLOCK_SIZE); Loader.BPP = size(image2D(image2D::dimensions_type(0), Loader.Format), BIT_PER_PIXEL); std::size_t Width = HeaderDesc.width; std::size_t Height = HeaderDesc.height; gli::format Format = Loader.Format; std::streamoff Curr = FileIn.tellg(); FileIn.seekg(0, std::ios_base::end); std::streamoff End = FileIn.tellg(); FileIn.seekg(Curr, std::ios_base::beg); std::vector Data(std::size_t(End - Curr), 0); std::size_t Offset = 0; FileIn.read((char*)&Data[0], std::streamsize(Data.size())); //texture2D Image(glm::min(MipMapCount, Levels));//SurfaceDesc.mipMapLevels); std::size_t MipMapCount = (HeaderDesc.flags & loader_dds9::detail::GLI_DDSD_MIPMAPCOUNT) ? HeaderDesc.mipMapLevels : 1; //if(Loader.Format == DXT1 || Loader.Format == DXT3 || Loader.Format == DXT5) // MipMapCount -= 2; texture2D Image(MipMapCount); for(std::size_t Level = 0; Level < Image.levels() && (Width || Height); ++Level) { Width = glm::max(std::size_t(Width), std::size_t(1)); Height = glm::max(std::size_t(Height), std::size_t(1)); std::size_t MipmapSize = 0; if((Loader.BlockSize << 3) > Loader.BPP) MipmapSize = ((Width + 3) >> 2) * ((Height + 3) >> 2) * Loader.BlockSize; else MipmapSize = Width * Height * Loader.BlockSize; std::vector MipmapData(MipmapSize, 0); memcpy(&MipmapData[0], &Data[0] + Offset, MipmapSize); image2D::dimensions_type Dimensions(Width, Height); Image[Level] = image2D(Dimensions, Format, MipmapData); Offset += MipmapSize; Width >>= 1; Height >>= 1; } return Image; } inline void saveDDS10 ( gli::texture2D const & Image, std::string const & Filename ) { std::ofstream FileOut(Filename.c_str(), std::ios::out | std::ios::binary); if (!FileOut) return; char const * Magic = "DDS "; FileOut.write((char*)Magic, sizeof(char) * 4); glm::uint32 Caps = loader_dds9::detail::GLI_DDSD_CAPS | loader_dds9::detail::GLI_DDSD_HEIGHT | loader_dds9::detail::GLI_DDSD_WIDTH | loader_dds9::detail::GLI_DDSD_PIXELFORMAT; loader_dds9::detail::ddsHeader HeaderDesc; HeaderDesc.size = sizeof(loader_dds9::detail::ddsHeader); HeaderDesc.flags = Caps | (loader_dds9::detail::isCompressed(Image) ? loader_dds9::detail::GLI_DDSD_LINEARSIZE : loader_dds9::detail::GLI_DDSD_PITCH) | (Image.levels() > 1 ? loader_dds9::detail::GLI_DDSD_MIPMAPCOUNT : 0); //659463; HeaderDesc.width = Image[0].dimensions().x; HeaderDesc.height = Image[0].dimensions().y; HeaderDesc.pitch = loader_dds9::detail::isCompressed(Image) ? size(Image, LINEAR_SIZE) : 32; HeaderDesc.depth = 0; HeaderDesc.mipMapLevels = glm::uint32(Image.levels()); HeaderDesc.format.size = sizeof(loader_dds9::detail::ddsPixelFormat); HeaderDesc.format.flags = loader_dds9::detail::GLI_DDPF_FOURCC; HeaderDesc.format.fourCC = loader_dds9::detail::GLI_FOURCC_DX10; HeaderDesc.format.bpp = size(Image, BIT_PER_PIXEL); HeaderDesc.format.redMask = 0; HeaderDesc.format.greenMask = 0; HeaderDesc.format.blueMask = 0; HeaderDesc.format.alphaMask = 0; HeaderDesc.surfaceFlags = loader_dds9::detail::GLI_DDSCAPS_TEXTURE | (Image.levels() > 1 ? loader_dds9::detail::GLI_DDSCAPS_MIPMAP : 0); HeaderDesc.cubemapFlags = 0; FileOut.write((char*)&HeaderDesc, sizeof(HeaderDesc)); detail::ddsHeader10 HeaderDesc10; HeaderDesc10.arraySize = 1; HeaderDesc10.resourceDimension = detail::D3D10_RESOURCE_DIMENSION_TEXTURE2D; HeaderDesc10.miscFlag = 0;//Image.levels() > 0 ? detail::D3D10_RESOURCE_MISC_GENERATE_MIPS : 0; HeaderDesc10.dxgiFormat = detail::format_gli2dds_cast(Image.format()); HeaderDesc10.reserved = 0; FileOut.write((char*)&HeaderDesc10, sizeof(HeaderDesc10)); for(gli::texture2D::level_type Level = 0; Level < Image.levels(); ++Level) { gli::texture2D::size_type ImageSize = size(Image[Level], gli::LINEAR_SIZE); FileOut.write((char*)(Image[Level].data()), ImageSize); } if(FileOut.fail() || FileOut.bad()) return; FileOut.close (); } }//namespace loader_dds10 }//namespace gtx }//namespace gli