From 22bbe74ed9cfc72fc186b251c882126c8636fdf5 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Wed, 5 Nov 2014 21:11:22 -0400 Subject: [PATCH] Allow BC6 and BC7 compressed DDS files to be loaded into Images. --- .../macosx/love.xcodeproj/project.pbxproj | 24 +++++++++---------- src/libraries/ddsparse/ddsparse.cpp | 2 +- src/libraries/ddsparse/ddsparse.h | 2 +- src/modules/graphics/opengl/Image.cpp | 20 +++++++++++++--- src/modules/image/CompressedData.cpp | 4 ++++ src/modules/image/CompressedData.h | 4 ++++ src/modules/image/magpie/ddsHandler.cpp | 10 ++++++-- 7 files changed, 47 insertions(+), 19 deletions(-) diff --git a/platform/macosx/love.xcodeproj/project.pbxproj b/platform/macosx/love.xcodeproj/project.pbxproj index c1e0dad5e..72eebb650 100644 --- a/platform/macosx/love.xcodeproj/project.pbxproj +++ b/platform/macosx/love.xcodeproj/project.pbxproj @@ -8,23 +8,23 @@ /* Begin PBXBuildFile section */ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; - A9255DD11043183600BA1496 /* FreeType.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A93E6E4810420B4A007D418B /* FreeType.framework */; }; - A9255DD31043183600BA1496 /* Lua.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A93E6E5310420B57007D418B /* Lua.framework */; }; - A9255E031043195A00BA1496 /* Vorbis.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9255E021043195A00BA1496 /* Vorbis.framework */; }; - A9255F431043240F00BA1496 /* IL.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9255F421043240F00BA1496 /* IL.framework */; }; - A9255F58104324E100BA1496 /* Ogg.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9255F51104324D700BA1496 /* Ogg.framework */; }; + A9255DD11043183600BA1496 /* FreeType.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A93E6E4810420B4A007D418B /* FreeType.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + A9255DD31043183600BA1496 /* Lua.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A93E6E5310420B57007D418B /* Lua.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + A9255E031043195A00BA1496 /* Vorbis.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9255E021043195A00BA1496 /* Vorbis.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + A9255F431043240F00BA1496 /* IL.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9255F421043240F00BA1496 /* IL.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + A9255F58104324E100BA1496 /* Ogg.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9255F51104324D700BA1496 /* Ogg.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; A93E6E5510420B57007D418B /* Lua.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A93E6E5310420B57007D418B /* Lua.framework */; }; A93E6EED10420BA8007D418B /* love.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6A3410420AC0007D418B /* love.cpp */; }; - A9D307F2106635D3004FEDF8 /* physfs.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9D307E9106635C3004FEDF8 /* physfs.framework */; }; + A9D307F2106635D3004FEDF8 /* physfs.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9D307E9106635C3004FEDF8 /* physfs.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; A9DEC1C11046EFA70049C70C /* Love.icns in Resources */ = {isa = PBXBuildFile; fileRef = A9DEC1BF1046EFA60049C70C /* Love.icns */; }; A9DEC1C21046EFA70049C70C /* LoveDocument.icns in Resources */ = {isa = PBXBuildFile; fileRef = A9DEC1C01046EFA70049C70C /* LoveDocument.icns */; }; - A9F169AC109E825000FC83D1 /* mpg123.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9F169A6109E824900FC83D1 /* mpg123.framework */; }; - A9F169AD109E825000FC83D1 /* libmodplug.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9F16926109E7BAD00FC83D1 /* libmodplug.framework */; }; + A9F169AC109E825000FC83D1 /* mpg123.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9F169A6109E824900FC83D1 /* mpg123.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + A9F169AD109E825000FC83D1 /* libmodplug.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9F16926109E7BAD00FC83D1 /* libmodplug.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; FA08F69616C766E000F007B5 /* love.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA08F69116C765A200F007B5 /* love.framework */; }; - FA08F69716C766E700F007B5 /* love.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FA08F69116C765A200F007B5 /* love.framework */; }; + FA08F69716C766E700F007B5 /* love.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FA08F69116C765A200F007B5 /* love.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; FA9B4A0A16E1579F00074F42 /* SDL2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA9B4A0916E1579F00074F42 /* SDL2.framework */; }; - FA9B4A0B16E157B500074F42 /* SDL2.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FA9B4A0916E1579F00074F42 /* SDL2.framework */; }; - FAAFF04716CB120000CCDE45 /* OpenAL-Soft.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FAAFF04616CB120000CCDE45 /* OpenAL-Soft.framework */; }; + FA9B4A0B16E157B500074F42 /* SDL2.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FA9B4A0916E1579F00074F42 /* SDL2.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + FAAFF04716CB120000CCDE45 /* OpenAL-Soft.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FAAFF04616CB120000CCDE45 /* OpenAL-Soft.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; FAC1A449196F5DC600125284 /* license.txt in Resources */ = {isa = PBXBuildFile; fileRef = FAC1A448196F5DC600125284 /* license.txt */; }; FAC8E8D416F3C468004DADF3 /* OSX.mm in Sources */ = {isa = PBXBuildFile; fileRef = FAC8E8D316F3C468004DADF3 /* OSX.mm */; }; /* End PBXBuildFile section */ @@ -201,7 +201,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0510; + LastUpgradeCheck = 0610; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "love" */; compatibilityVersion = "Xcode 3.2"; diff --git a/src/libraries/ddsparse/ddsparse.cpp b/src/libraries/ddsparse/ddsparse.cpp index f6fe62bcc..4fbdd16a9 100644 --- a/src/libraries/ddsparse/ddsparse.cpp +++ b/src/libraries/ddsparse/ddsparse.cpp @@ -116,7 +116,7 @@ static Format parseDX10Format(DXGIFormat fmt) f = FORMAT_BC6H; break; case DXGI_FORMAT_BC6H_SF16: - f = FORAMT_BC6Hs; + f = FORMAT_BC6Hs; break; case DXGI_FORMAT_BC7_TYPELESS: case DXGI_FORMAT_BC7_UNORM: diff --git a/src/libraries/ddsparse/ddsparse.h b/src/libraries/ddsparse/ddsparse.h index 6ab659347..425919ba0 100644 --- a/src/libraries/ddsparse/ddsparse.h +++ b/src/libraries/ddsparse/ddsparse.h @@ -45,7 +45,7 @@ enum Format FORMAT_BC5, FORMAT_BC5s, FORMAT_BC6H, - FORAMT_BC6Hs, + FORMAT_BC6Hs, FORMAT_BC7, FORMAT_BC7srgb, // sRGB color space. FORMAT_UNKNOWN diff --git a/src/modules/graphics/opengl/Image.cpp b/src/modules/graphics/opengl/Image.cpp index b459fb97f..7aa7ca171 100644 --- a/src/modules/graphics/opengl/Image.cpp +++ b/src/modules/graphics/opengl/Image.cpp @@ -623,6 +623,17 @@ GLenum Image::getCompressedFormat(image::CompressedData::Format cformat) const return GL_COMPRESSED_RG_RGTC2; case image::CompressedData::FORMAT_BC5s: return GL_COMPRESSED_SIGNED_RG_RGTC2; + case image::CompressedData::FORMAT_BC6H: + return GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB; + case image::CompressedData::FORMAT_BC6Hs: + return GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB; + case image::CompressedData::FORMAT_BC7: + if (srgb) + return GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB; + else + return GL_COMPRESSED_RGBA_BPTC_UNORM_ARB; + case image::CompressedData::FORMAT_BC7SRGB: + return GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB; default: if (srgb) return GL_SRGB8_ALPHA8; @@ -672,11 +683,14 @@ bool Image::hasCompressedTextureSupport(image::CompressedData::Format format) case image::CompressedData::FORMAT_BC5: case image::CompressedData::FORMAT_BC5s: return (GLEE_VERSION_3_0 || GLEE_ARB_texture_compression_rgtc || GLEE_EXT_texture_compression_rgtc); + case image::CompressedData::FORMAT_BC6H: + case image::CompressedData::FORMAT_BC6Hs: + case image::CompressedData::FORMAT_BC7: + case image::CompressedData::FORMAT_BC7SRGB: + return GLEE_VERSION_4_2 || GLEE_ARB_texture_compression_bptc; default: - break; + return false; } - - return false; } bool Image::hasSRGBSupport() diff --git a/src/modules/image/CompressedData.cpp b/src/modules/image/CompressedData.cpp index d72ab5b0d..4c423f102 100644 --- a/src/modules/image/CompressedData.cpp +++ b/src/modules/image/CompressedData.cpp @@ -110,6 +110,10 @@ StringMap::Entry Compre {"bc4s", CompressedData::FORMAT_BC4s}, {"bc5", CompressedData::FORMAT_BC5}, {"bc5s", CompressedData::FORMAT_BC5s}, + {"bc6h", CompressedData::FORMAT_BC6H}, + {"bc6hs", CompressedData::FORMAT_BC6Hs}, + {"bc7", CompressedData::FORMAT_BC7}, + {"bc7srgb", CompressedData::FORMAT_BC7SRGB}, }; StringMap CompressedData::formats(CompressedData::formatEntries, sizeof(CompressedData::formatEntries)); diff --git a/src/modules/image/CompressedData.h b/src/modules/image/CompressedData.h index 42ee5e58d..9cf9c34dd 100644 --- a/src/modules/image/CompressedData.h +++ b/src/modules/image/CompressedData.h @@ -54,6 +54,10 @@ public: FORMAT_BC4s, FORMAT_BC5, FORMAT_BC5s, + FORMAT_BC6H, + FORMAT_BC6Hs, + FORMAT_BC7, + FORMAT_BC7SRGB, FORMAT_MAX_ENUM }; diff --git a/src/modules/image/magpie/ddsHandler.cpp b/src/modules/image/magpie/ddsHandler.cpp index 7c6c64c48..580f6fe8e 100644 --- a/src/modules/image/magpie/ddsHandler.cpp +++ b/src/modules/image/magpie/ddsHandler.cpp @@ -117,11 +117,17 @@ CompressedData::Format ddsHandler::convertFormat(dds::Format ddsformat) return CompressedData::FORMAT_BC5; case dds::FORMAT_BC5s: return CompressedData::FORMAT_BC5s; + case dds::FORMAT_BC6H: + return CompressedData::FORMAT_BC6H; + case dds::FORMAT_BC6Hs: + return CompressedData::FORMAT_BC6Hs; + case dds::FORMAT_BC7: + return CompressedData::FORMAT_BC7; + case dds::FORMAT_BC7srgb: + return CompressedData::FORMAT_BC7SRGB; default: return CompressedData::FORMAT_UNKNOWN; } - - return CompressedData::FORMAT_UNKNOWN; } } // magpie