From 676a0b2908526cfc52a902bca81783410a66191e Mon Sep 17 00:00:00 2001 From: castano Date: Thu, 29 Sep 2011 00:58:47 +0000 Subject: [PATCH] work in progress. --- src/nvimage/DirectDrawSurface.cpp | 326 +++++++++--------------------- src/nvimage/DirectDrawSurface.h | 229 ++++++++++++++++++++- src/nvimage/ImageIO.cpp | 2 +- src/nvtt/Context.cpp | 4 +- src/nvtt/CubeSurface.cpp | 71 ++++++- src/nvtt/CubeSurface.h | 12 +- src/nvtt/nvtt.h | 2 +- 7 files changed, 387 insertions(+), 259 deletions(-) diff --git a/src/nvimage/DirectDrawSurface.cpp b/src/nvimage/DirectDrawSurface.cpp index 466d397..92f0e19 100644 --- a/src/nvimage/DirectDrawSurface.cpp +++ b/src/nvimage/DirectDrawSurface.cpp @@ -36,11 +36,6 @@ using namespace nv; -#if !defined(MAKEFOURCC) -#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ - (uint(uint8(ch0)) | (uint(uint8(ch1)) << 8) | \ - (uint(uint8(ch2)) << 16) | (uint(uint8(ch3)) << 24 )) -#endif const uint nv::FOURCC_NVTT = MAKEFOURCC('N', 'V', 'T', 'T'); @@ -54,15 +49,6 @@ const uint nv::FOURCC_RXGB = MAKEFOURCC('R', 'X', 'G', 'B'); const uint nv::FOURCC_ATI1 = MAKEFOURCC('A', 'T', 'I', '1'); const uint nv::FOURCC_ATI2 = MAKEFOURCC('A', 'T', 'I', '2'); -const uint nv::D3DFMT_A16B16G16R16 = 36; - -// Floating point formats -const uint nv::D3DFMT_R16F = 111; -const uint nv::D3DFMT_G16R16F = 112; -const uint nv::D3DFMT_A16B16G16R16F = 113; -const uint nv::D3DFMT_R32F = 114; -const uint nv::D3DFMT_G32R32F = 115; -const uint nv::D3DFMT_A32B32G32R32F = 116; namespace @@ -74,33 +60,6 @@ namespace static const uint FOURCC_UVER = MAKEFOURCC('U', 'V', 'E', 'R'); - // 32 bit RGB formats. - static const uint D3DFMT_R8G8B8 = 20; - static const uint D3DFMT_A8R8G8B8 = 21; - static const uint D3DFMT_X8R8G8B8 = 22; - static const uint D3DFMT_R5G6B5 = 23; - static const uint D3DFMT_X1R5G5B5 = 24; - static const uint D3DFMT_A1R5G5B5 = 25; - static const uint D3DFMT_A4R4G4B4 = 26; - static const uint D3DFMT_R3G3B2 = 27; - static const uint D3DFMT_A8 = 28; - static const uint D3DFMT_A8R3G3B2 = 29; - static const uint D3DFMT_X4R4G4B4 = 30; - static const uint D3DFMT_A2B10G10R10 = 31; - static const uint D3DFMT_A8B8G8R8 = 32; - static const uint D3DFMT_X8B8G8R8 = 33; - static const uint D3DFMT_G16R16 = 34; - static const uint D3DFMT_A2R10G10B10 = 35; - - // Palette formats. - static const uint D3DFMT_A8P8 = 40; - static const uint D3DFMT_P8 = 41; - - // Luminance formats. - static const uint D3DFMT_L8 = 50; - static const uint D3DFMT_A8L8 = 51; - static const uint D3DFMT_A4L4 = 52; - static const uint D3DFMT_L16 = 81; static const uint DDSD_CAPS = 0x00000001U; @@ -126,161 +85,6 @@ namespace static const uint DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x00008000U; static const uint DDSCAPS2_CUBEMAP_ALL_FACES = 0x0000FC00U; - static const uint DDPF_ALPHAPIXELS = 0x00000001U; - static const uint DDPF_ALPHA = 0x00000002U; - static const uint DDPF_FOURCC = 0x00000004U; - static const uint DDPF_RGB = 0x00000040U; - static const uint DDPF_PALETTEINDEXED1 = 0x00000800U; - static const uint DDPF_PALETTEINDEXED2 = 0x00001000U; - static const uint DDPF_PALETTEINDEXED4 = 0x00000008U; - static const uint DDPF_PALETTEINDEXED8 = 0x00000020U; - static const uint DDPF_LUMINANCE = 0x00020000U; - static const uint DDPF_ALPHAPREMULT = 0x00008000U; - - // Custom NVTT flags. - static const uint DDPF_NORMAL = 0x80000000U; - static const uint DDPF_SRGB = 0x40000000U; - - // DX10 formats. - 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, - }; - - 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, - }; - const char * getDxgiFormatString(DXGI_FORMAT dxgiFormat) { @@ -410,12 +214,12 @@ namespace { switch(resourceDimension) { - default: - case D3D10_RESOURCE_DIMENSION_UNKNOWN: return "UNKNOWN"; - case D3D10_RESOURCE_DIMENSION_BUFFER: return "BUFFER"; - case D3D10_RESOURCE_DIMENSION_TEXTURE1D: return "TEXTURE1D"; - case D3D10_RESOURCE_DIMENSION_TEXTURE2D: return "TEXTURE2D"; - case D3D10_RESOURCE_DIMENSION_TEXTURE3D: return "TEXTURE3D"; + default: + case D3D10_RESOURCE_DIMENSION_UNKNOWN: return "UNKNOWN"; + case D3D10_RESOURCE_DIMENSION_BUFFER: return "BUFFER"; + case D3D10_RESOURCE_DIMENSION_TEXTURE1D: return "TEXTURE1D"; + case D3D10_RESOURCE_DIMENSION_TEXTURE2D: return "TEXTURE2D"; + case D3D10_RESOURCE_DIMENSION_TEXTURE3D: return "TEXTURE3D"; } } @@ -504,32 +308,81 @@ namespace static const FormatDescriptor s_d3d9Formats[] = { - { D3DFMT_R8G8B8, 24, 0xFF0000, 0xFF00, 0xFF, 0 }, - { D3DFMT_A8R8G8B8, 32, 0xFF0000, 0xFF00, 0xFF, 0xFF000000 }, // DXGI_FORMAT_B8G8R8A8_UNORM - { D3DFMT_X8R8G8B8, 32, 0xFF0000, 0xFF00, 0xFF, 0 }, // DXGI_FORMAT_B8G8R8X8_UNORM - { D3DFMT_R5G6B5, 16, 0xF800, 0x7E0, 0x1F, 0 }, // DXGI_FORMAT_B5G6R5_UNORM - { D3DFMT_X1R5G5B5, 16, 0x7C00, 0x3E0, 0x1F, 0 }, - { D3DFMT_A1R5G5B5, 16, 0x7C00, 0x3E0, 0x1F, 0x8000 }, // DXGI_FORMAT_B5G5R5A1_UNORM - { D3DFMT_A4R4G4B4, 16, 0xF00, 0xF0, 0xF, 0xF000 }, - { D3DFMT_R3G3B2, 8, 0xE0, 0x1C, 0x3, 0 }, - { D3DFMT_A8, 8, 0, 0, 0, 8 }, // DXGI_FORMAT_A8_UNORM - { D3DFMT_A8R3G3B2, 16, 0xE0, 0x1C, 0x3, 0xFF00 }, - { D3DFMT_X4R4G4B4, 16, 0xF00, 0xF0, 0xF, 0 }, - { D3DFMT_A2B10G10R10, 32, 0x3FF, 0xFFC00, 0x3FF00000, 0xC0000000 }, // DXGI_FORMAT_R10G10B10A2 - { D3DFMT_A8B8G8R8, 32, 0xFF, 0xFF00, 0xFF0000, 0xFF000000 }, // DXGI_FORMAT_R8G8B8A8_UNORM - { D3DFMT_X8B8G8R8, 32, 0xFF, 0xFF00, 0xFF0000, 0 }, - { D3DFMT_G16R16, 32, 0xFFFF, 0xFFFF0000, 0, 0 }, // DXGI_FORMAT_R16G16_UNORM - { D3DFMT_A2R10G10B10, 32, 0x3FF00000, 0xFFC00, 0x3FF, 0xC0000000 }, - { D3DFMT_A2B10G10R10, 32, 0x3FF, 0xFFC00, 0x3FF00000, 0xC0000000 }, - - { D3DFMT_L8, 8, 8, 0, 0, 0 }, // DXGI_FORMAT_R8_UNORM - { D3DFMT_L16, 16, 16, 0, 0, 0 }, // DXGI_FORMAT_R16_UNORM + { D3DFMT_R8G8B8, 24, 0xFF0000, 0xFF00, 0xFF, 0 }, + { D3DFMT_A8R8G8B8, 32, 0xFF0000, 0xFF00, 0xFF, 0xFF000000 }, // DXGI_FORMAT_B8G8R8A8_UNORM + { D3DFMT_X8R8G8B8, 32, 0xFF0000, 0xFF00, 0xFF, 0 }, // DXGI_FORMAT_B8G8R8X8_UNORM + { D3DFMT_R5G6B5, 16, 0xF800, 0x7E0, 0x1F, 0 }, // DXGI_FORMAT_B5G6R5_UNORM + { D3DFMT_X1R5G5B5, 16, 0x7C00, 0x3E0, 0x1F, 0 }, + { D3DFMT_A1R5G5B5, 16, 0x7C00, 0x3E0, 0x1F, 0x8000 }, // DXGI_FORMAT_B5G5R5A1_UNORM + { D3DFMT_A4R4G4B4, 16, 0xF00, 0xF0, 0xF, 0xF000 }, + { D3DFMT_R3G3B2, 8, 0xE0, 0x1C, 0x3, 0 }, + { D3DFMT_A8, 8, 0, 0, 0, 8 }, // DXGI_FORMAT_A8_UNORM + { D3DFMT_A8R3G3B2, 16, 0xE0, 0x1C, 0x3, 0xFF00 }, + { D3DFMT_X4R4G4B4, 16, 0xF00, 0xF0, 0xF, 0 }, + { D3DFMT_A2B10G10R10, 32, 0x3FF, 0xFFC00, 0x3FF00000, 0xC0000000 }, // DXGI_FORMAT_R10G10B10A2 + { D3DFMT_A8B8G8R8, 32, 0xFF, 0xFF00, 0xFF0000, 0xFF000000 }, // DXGI_FORMAT_R8G8B8A8_UNORM + { D3DFMT_X8B8G8R8, 32, 0xFF, 0xFF00, 0xFF0000, 0 }, + { D3DFMT_G16R16, 32, 0xFFFF, 0xFFFF0000, 0, 0 }, // DXGI_FORMAT_R16G16_UNORM + { D3DFMT_A2R10G10B10, 32, 0x3FF00000, 0xFFC00, 0x3FF, 0xC0000000 }, + { D3DFMT_A2B10G10R10, 32, 0x3FF, 0xFFC00, 0x3FF00000, 0xC0000000 }, + + { D3DFMT_L8, 8, 8, 0, 0, 0 }, // DXGI_FORMAT_R8_UNORM + { D3DFMT_L16, 16, 16, 0, 0, 0 }, // DXGI_FORMAT_R16_UNORM }; static const uint s_d3d9FormatCount = NV_ARRAY_SIZE(s_d3d9Formats); } // namespace + +static uint pixelSize(D3DFORMAT format) { + if (D3DFMT_R16F) return 2; + if (D3DFMT_G16R16F) return 4; + if (D3DFMT_A16B16G16R16F) return 8; + if (D3DFMT_R32F) return 4; + if (D3DFMT_G32R32F) return 8; + if (D3DFMT_A32B32G32R32F) return 16; + + if (D3DFMT_R8G8B8) return 3; + if (D3DFMT_A8R8G8B8) return 4; + if (D3DFMT_X8R8G8B8) return 4; + if (D3DFMT_R5G6B5) return 2; + if (D3DFMT_X1R5G5B5) return 2; + if (D3DFMT_A1R5G5B5) return 2; + if (D3DFMT_A4R4G4B4) return 2; + if (D3DFMT_R3G3B2) return 1; + if (D3DFMT_A8) return 1; + if (D3DFMT_A8R3G3B2) return 2; + if (D3DFMT_X4R4G4B4) return 2; + if (D3DFMT_A2B10G10R10) return 4; + if (D3DFMT_A8B8G8R8) return 4; + if (D3DFMT_X8B8G8R8) return 4; + if (D3DFMT_G16R16) return 4; + if (D3DFMT_A2R10G10B10) return 4; + if (D3DFMT_A2B10G10R10) return 4; + + if (D3DFMT_L8) return 1; + if (D3DFMT_L16) return 2; + + return 0; +} + +static uint blockSize(uint fourcc) +{ + if (fourcc == FOURCC_DXT1) return 8; + if (fourcc == FOURCC_DXT3) return 16; + if (fourcc == FOURCC_DXT5) return 16; + if (fourcc == FOURCC_ATI1) return 8; + if (fourcc == FOURCC_ATI2) return 16; + return 0; +} + +static uint blockSize(DXGI_FORMAT format) +{ + +} + + uint nv::findD3D9Format(uint bitcount, uint rmask, uint gmask, uint bmask, uint amask) { for (int i = 0; i < s_d3d9FormatCount; i++) @@ -978,10 +831,14 @@ bool DirectDrawSurface::isSupported() const return false; } - if (isTextureCube() && (header.caps.caps2 & DDSCAPS2_CUBEMAP_ALL_FACES) != DDSCAPS2_CUBEMAP_ALL_FACES) - { - // Cubemaps must contain all faces. - return false; + if (isTextureCube()) { + if (header.width != header.height) return false; + + if ((header.caps.caps2 & DDSCAPS2_CUBEMAP_ALL_FACES) != DDSCAPS2_CUBEMAP_ALL_FACES) + { + // Cubemaps must contain all faces. + return false; + } } } @@ -1160,7 +1017,7 @@ void DirectDrawSurface::mipmap(Image * img, uint face, uint mipmap) } } -void * DirectDrawSurface::readData(uint * sizePtr) +/*void * DirectDrawSurface::readData(uint * sizePtr) { uint header_size = 128; // sizeof(DDSHeader); @@ -1180,8 +1037,23 @@ void * DirectDrawSurface::readData(uint * sizePtr) nvDebugCheck(size == *sizePtr); return data; +}*/ + +uint DirectDrawSurface::surfaceSize(uint mipmap) const +{ + + + + return 0; } +bool DirectDrawSurface::readSurface(uint face, uint mipmap, void * data, uint size) +{ + // + return false; +} + + void DirectDrawSurface::readLinearImage(Image * img) { nvDebugCheck(stream != NULL); diff --git a/src/nvimage/DirectDrawSurface.h b/src/nvimage/DirectDrawSurface.h index 0bcdf31..c681538 100644 --- a/src/nvimage/DirectDrawSurface.h +++ b/src/nvimage/DirectDrawSurface.h @@ -27,6 +27,12 @@ #include "nvimage.h" +#if !defined(MAKEFOURCC) +#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ + (uint(uint8(ch0)) | (uint(uint8(ch1)) << 8) | \ + (uint(uint8(ch2)) << 16) | (uint(uint8(ch3)) << 24 )) +#endif + namespace nv { class Image; @@ -44,14 +50,209 @@ namespace nv extern const uint FOURCC_ATI1; extern const uint FOURCC_ATI2; - extern const uint D3DFMT_G16R16; - extern const uint D3DFMT_A16B16G16R16; - extern const uint D3DFMT_R16F; - extern const uint D3DFMT_R32F; - extern const uint D3DFMT_G16R16F; - extern const uint D3DFMT_G32R32F; - extern const uint D3DFMT_A16B16G16R16F; - extern const uint D3DFMT_A32B32G32R32F; + enum DDPF + { + DDPF_ALPHAPIXELS = 0x00000001U, + DDPF_ALPHA = 0x00000002U, + DDPF_FOURCC = 0x00000004U, + DDPF_RGB = 0x00000040U, + DDPF_PALETTEINDEXED1 = 0x00000800U, + DDPF_PALETTEINDEXED2 = 0x00001000U, + DDPF_PALETTEINDEXED4 = 0x00000008U, + DDPF_PALETTEINDEXED8 = 0x00000020U, + DDPF_LUMINANCE = 0x00020000U, + DDPF_ALPHAPREMULT = 0x00008000U, + + // Custom NVTT flags. + DDPF_NORMAL = 0x80000000U, + DDPF_SRGB = 0x40000000U, + }; + + + enum D3DFORMAT + { + // 32 bit RGB formats. + D3DFMT_R8G8B8 = 20, + D3DFMT_A8R8G8B8 = 21, + D3DFMT_X8R8G8B8 = 22, + D3DFMT_R5G6B5 = 23, + D3DFMT_X1R5G5B5 = 24, + D3DFMT_A1R5G5B5 = 25, + D3DFMT_A4R4G4B4 = 26, + D3DFMT_R3G3B2 = 27, + D3DFMT_A8 = 28, + D3DFMT_A8R3G3B2 = 29, + D3DFMT_X4R4G4B4 = 30, + D3DFMT_A2B10G10R10 = 31, + D3DFMT_A8B8G8R8 = 32, + D3DFMT_X8B8G8R8 = 33, + D3DFMT_G16R16 = 34, + D3DFMT_A2R10G10B10 = 35, + + D3DFMT_A16B16G16R16 = 36, + + // Palette formats. + D3DFMT_A8P8 = 40, + D3DFMT_P8 = 41, + + // Luminance formats. + D3DFMT_L8 = 50, + D3DFMT_A8L8 = 51, + D3DFMT_A4L4 = 52, + D3DFMT_L16 = 81, + + // Floating point formats + D3DFMT_R16F = 111, + D3DFMT_G16R16F = 112, + D3DFMT_A16B16G16R16F = 113, + D3DFMT_R32F = 114, + D3DFMT_G32R32F = 115, + D3DFMT_A32B32G32R32F = 116, + }; + + + // D3D1x resource dimensions. + 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, + }; + + // DXGI formats. + 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, + }; + + extern uint findD3D9Format(uint bitcount, uint rmask, uint gmask, uint bmask, uint amask); @@ -171,11 +372,19 @@ namespace nv void setUserVersion(int version); void mipmap(Image * img, uint f, uint m); + + uint surfaceSize(uint mipmap) const; + bool readSurface(uint face, uint mipmap, void * data, uint size); + // void mipmap(FloatImage * img, uint f, uint m); - void * readData(uint * sizePtr); + //void * readData(uint * sizePtr); void printInfo() const; + // Only initialized after loading. + DDSHeader header; + DDSHeader10 header10; + private: uint blockSize() const; @@ -191,8 +400,6 @@ namespace nv private: Stream * stream; - DDSHeader header; - DDSHeader10 header10; }; } // nv namespace diff --git a/src/nvimage/ImageIO.cpp b/src/nvimage/ImageIO.cpp index 1524c0c..f0d5b32 100644 --- a/src/nvimage/ImageIO.cpp +++ b/src/nvimage/ImageIO.cpp @@ -322,7 +322,7 @@ static bool savePPM(Stream & s, const Image * img) writer.write("P6\n"); writer.write("%d %d\n", w, h); writer.write("255\n"); - for (int i = 0; i < w * h; i++) { + for (uint i = 0; i < w * h; i++) { Color32 c = img->pixel(i); s << c.r << c.g << c.b; } diff --git a/src/nvtt/Context.cpp b/src/nvtt/Context.cpp index ce1cd5c..f10b6e6 100644 --- a/src/nvtt/Context.cpp +++ b/src/nvtt/Context.cpp @@ -153,7 +153,7 @@ int Compressor::estimateSize(const Surface & tex, int mipmapCount, const Compres bool Compressor::outputHeader(const CubeSurface & cube, int mipmapCount, const CompressionOptions & compressionOptions, const OutputOptions & outputOptions) const { - return m.outputHeader(TextureType_Cube, cube.size(), cube.size(), 1, mipmapCount, false, compressionOptions.m, outputOptions.m); + return m.outputHeader(TextureType_Cube, cube.edgeLength(), cube.edgeLength(), 1, mipmapCount, false, compressionOptions.m, outputOptions.m); } bool Compressor::compress(const CubeSurface & cube, int mipmap, const CompressionOptions & compressionOptions, const OutputOptions & outputOptions) const @@ -168,7 +168,7 @@ bool Compressor::compress(const CubeSurface & cube, int mipmap, const Compressio int Compressor::estimateSize(const CubeSurface & cube, int mipmapCount, const CompressionOptions & compressionOptions) const { - return 6 * estimateSize(cube.size(), cube.size(), 1, mipmapCount, compressionOptions); + return 6 * estimateSize(cube.edgeLength(), cube.edgeLength(), 1, mipmapCount, compressionOptions); } diff --git a/src/nvtt/CubeSurface.cpp b/src/nvtt/CubeSurface.cpp index c6c1a17..1dc31ea 100644 --- a/src/nvtt/CubeSurface.cpp +++ b/src/nvtt/CubeSurface.cpp @@ -24,9 +24,12 @@ #include "CubeSurface.h" #include "Surface.h" +#include "nvimage/DirectDrawSurface.h" + #include "nvmath/Vector.h" #include "nvcore/Array.h" +#include "nvcore/StrLib.h" using namespace nv; @@ -73,17 +76,17 @@ void CubeSurface::detach() bool CubeSurface::isNull() const { - return m->size == 0; + return m->edgeLength == 0; } -int CubeSurface::size() const +int CubeSurface::edgeLength() const { - return m->size; + return m->edgeLength; } int CubeSurface::countMipmaps() const { - return nv::countMipmaps(m->size); + return nv::countMipmaps(m->edgeLength); } Surface & CubeSurface::face(int f) @@ -101,6 +104,52 @@ const Surface & CubeSurface::face(int f) const bool CubeSurface::load(const char * fileName) { + if (strcmp(Path::extension(fileName), ".dds") == 0) { + nv::DirectDrawSurface dds(fileName); + + if (!dds.isValid()/* || !dds.isSupported()*/) { + return false; + } + + if (!dds.isTextureCube()) { + return false; + } + + // Make sure it's a valid cube. + if (dds.header.width != dds.header.height) return false; + //if ((dds.header.caps.caps2 & DDSCAPS2_CUBEMAP_ALL_FACES) != DDSCAPS2_CUBEMAP_ALL_FACES) return false; + + + nvtt::InputFormat inputFormat = nvtt::InputFormat_RGBA_16F; + + if (dds.header.hasDX10Header()) { + if (dds.header10.dxgiFormat == DXGI_FORMAT_R16G16B16A16_FLOAT) inputFormat = nvtt::InputFormat_RGBA_16F; + else if (dds.header10.dxgiFormat == DXGI_FORMAT_R32G32B32A32_FLOAT) inputFormat = nvtt::InputFormat_RGBA_32F; + else return false; + } + else { + if ((dds.header.pf.flags & DDPF_FOURCC) == 0) return false; + + if (dds.header.pf.fourcc == D3DFMT_A16B16G16R16F) inputFormat = nvtt::InputFormat_RGBA_16F; + else if (dds.header.pf.fourcc == D3DFMT_A32B32G32R32F) inputFormat = nvtt::InputFormat_RGBA_32F; + else return false; + } + + uint edgeLength = dds.header.width; + + uint size = dds.surfaceSize(0); + void * data = malloc(size); + + for (int f = 0; f < 6; f++) { + dds.readSurface(f, 0, data, size); + m->face[f].setImage(inputFormat, edgeLength, edgeLength, 1, data); + } + + m->edgeLength = edgeLength; + + free(data); + } + // @@ TODO return false; } @@ -205,7 +254,7 @@ Vector3 texelDirection(uint face, uint x, uint y, float ilen) } struct VectorTable { - VectorTable(int edgeLength) : size(edgeLength) { + VectorTable(uint edgeLength) : size(edgeLength) { float invEdgeLength = 1.0f / edgeLength; for (uint f = 0; f < 6; f++) { @@ -222,14 +271,14 @@ struct VectorTable { return data[(f * size + y) * size + x]; } - int size; + uint size; nv::Array data; }; CubeSurface CubeSurface::cosinePowerFilter(int size, float cosinePower) const { - const uint edgeLength = m->size; + const uint edgeLength = m->edgeLength; // Allocate output cube. CubeSurface filteredCube; @@ -256,15 +305,15 @@ CubeSurface CubeSurface::cosinePowerFilter(int size, float cosinePower) const float g = face.m->image->pixel(1, x, y, 0) * solidAngle;; float b = face.m->image->pixel(2, x, y, 0) * solidAngle;; - Vector3 texelDir = texelDirection(f, x, y, edgeLength); + Vector3 texelDir = texelDirection(f, x, y, 1.0f / edgeLength); for (uint ff = 0; ff < 6; ff++) { FloatImage * filteredFace = filteredCube.m->face[ff].m->image; - for (uint yy = 0; yy < size; yy++) { - for (uint xx = 0; xx < size; xx++) { + for (uint yy = 0; yy < uint(size); yy++) { + for (uint xx = 0; xx < uint(size); xx++) { - Vector3 filterDir = texelDirection(ff, xx, yy, size); + Vector3 filterDir = texelDirection(ff, xx, yy, 1.0f / size); float power = powf(saturate(dot(texelDir, filterDir)), cosinePower); diff --git a/src/nvtt/CubeSurface.h b/src/nvtt/CubeSurface.h index 44ce392..a7fe248 100644 --- a/src/nvtt/CubeSurface.h +++ b/src/nvtt/CubeSurface.h @@ -44,13 +44,13 @@ namespace nvtt { nvDebugCheck( refCount() == 0 ); - size = 0; + edgeLength = 0; } Private(const Private & p) : RefCounted() // Copy ctor. inits refcount to 0. { nvDebugCheck( refCount() == 0 ); - size = p.size; + edgeLength = p.edgeLength; for (uint i = 0; i < 6; i++) { face[i] = p.face[6]; } @@ -59,17 +59,17 @@ namespace nvtt { } - void allocate(int size) + void allocate(uint edgeLength) { - this->size = size; + this->edgeLength = edgeLength; for (uint i = 0; i < 6; i++) { face[i].detach(); face[i].m->image = new nv::FloatImage; - face[i].m->image->allocate(size, size, 1); + face[i].m->image->allocate(edgeLength, edgeLength, 1); } } - int size; + uint edgeLength; Surface face[6]; }; diff --git a/src/nvtt/nvtt.h b/src/nvtt/nvtt.h index 354c5e4..ec1d17f 100644 --- a/src/nvtt/nvtt.h +++ b/src/nvtt/nvtt.h @@ -538,7 +538,7 @@ namespace nvtt // Queries. NVTT_API bool isNull() const; - NVTT_API int size() const; + NVTT_API int edgeLength() const; NVTT_API int countMipmaps() const; // Texture data.