summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/src/image.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/src/image.cpp')
-rw-r--r--3rdparty/bgfx/src/image.cpp52
1 files changed, 41 insertions, 11 deletions
diff --git a/3rdparty/bgfx/src/image.cpp b/3rdparty/bgfx/src/image.cpp
index 2aa69de0a8d..96923f0be3b 100644
--- a/3rdparty/bgfx/src/image.cpp
+++ b/3rdparty/bgfx/src/image.cpp
@@ -1420,7 +1420,7 @@ namespace bgfx
UnpackFn unpack;
};
- static PackUnpack s_packUnpack[] =
+ static const PackUnpack s_packUnpack[] =
{
{ NULL, NULL }, // BC1
{ NULL, NULL }, // BC2
@@ -2498,7 +2498,7 @@ namespace bgfx
bool m_srgb;
};
- static TranslateDdsFormat s_translateDdsFourccFormat[] =
+ static const TranslateDdsFormat s_translateDdsFourccFormat[] =
{
{ DDS_DXT1, TextureFormat::BC1, false },
{ DDS_DXT2, TextureFormat::BC2, false },
@@ -2531,7 +2531,7 @@ namespace bgfx
{ DDS_A2B10G10R10, TextureFormat::RGB10A2, false },
};
- static TranslateDdsFormat s_translateDxgiFormat[] =
+ static const TranslateDdsFormat s_translateDxgiFormat[] =
{
{ DDS_FORMAT_BC1_UNORM, TextureFormat::BC1, false },
{ DDS_FORMAT_BC1_UNORM_SRGB, TextureFormat::BC1, true },
@@ -2578,13 +2578,14 @@ namespace bgfx
TextureFormat::Enum m_textureFormat;
};
- static TranslateDdsPixelFormat s_translateDdsPixelFormat[] =
+ static const TranslateDdsPixelFormat s_translateDdsPixelFormat[] =
{
{ 8, { 0x000000ff, 0x00000000, 0x00000000, 0x00000000 }, TextureFormat::R8 },
{ 16, { 0x0000ffff, 0x00000000, 0x00000000, 0x00000000 }, TextureFormat::R16U },
{ 16, { 0x00000f00, 0x000000f0, 0x0000000f, 0x0000f000 }, TextureFormat::RGBA4 },
{ 16, { 0x0000f800, 0x000007e0, 0x0000001f, 0x00000000 }, TextureFormat::R5G6B5 },
{ 16, { 0x00007c00, 0x000003e0, 0x0000001f, 0x00008000 }, TextureFormat::RGB5A1 },
+ { 24, { 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000 }, TextureFormat::RGB8 },
{ 32, { 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 }, TextureFormat::BGRA8 },
{ 32, { 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000 }, TextureFormat::BGRA8 },
{ 32, { 0x000003ff, 0x000ffc00, 0x3ff00000, 0xc0000000 }, TextureFormat::RGB10A2 },
@@ -2871,7 +2872,7 @@ namespace bgfx
uint32_t m_type;
};
- static KtxFormatInfo s_translateKtxFormat[] =
+ static const KtxFormatInfo s_translateKtxFormat[] =
{
{ KTX_COMPRESSED_RGBA_S3TC_DXT1_EXT, KTX_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, KTX_COMPRESSED_RGBA_S3TC_DXT1_EXT, KTX_ZERO, }, // BC1
{ KTX_COMPRESSED_RGBA_S3TC_DXT3_EXT, KTX_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, KTX_COMPRESSED_RGBA_S3TC_DXT3_EXT, KTX_ZERO, }, // BC2
@@ -2943,6 +2944,18 @@ namespace bgfx
};
BX_STATIC_ASSERT(TextureFormat::UnknownDepth == BX_COUNTOF(s_translateKtxFormat) );
+ struct KtxFormatInfo2
+ {
+ uint32_t m_internalFmt;
+ TextureFormat::Enum m_format;
+ };
+
+ static const KtxFormatInfo2 s_translateKtxFormat2[] =
+ {
+ { KTX_RED, TextureFormat::R8 },
+ { KTX_RGB, TextureFormat::RGB8 },
+ };
+
bool imageParseKtx(ImageContainer& _imageContainer, bx::ReaderSeekerI* _reader)
{
uint8_t identifier[8];
@@ -3010,6 +3023,18 @@ namespace bgfx
}
}
+ if (TextureFormat::Unknown == format)
+ {
+ for (uint32_t ii = 0; ii < BX_COUNTOF(s_translateKtxFormat2); ++ii)
+ {
+ if (s_translateKtxFormat2[ii].m_internalFmt == glInternalFormat)
+ {
+ format = s_translateKtxFormat2[ii].m_format;
+ break;
+ }
+ }
+ }
+
_imageContainer.m_data = NULL;
_imageContainer.m_size = 0;
_imageContainer.m_offset = (uint32_t)offset;
@@ -3017,7 +3042,7 @@ namespace bgfx
_imageContainer.m_height = height;
_imageContainer.m_depth = depth;
_imageContainer.m_format = format;
- _imageContainer.m_numMips = uint8_t(numMips);
+ _imageContainer.m_numMips = uint8_t(bx::uint32_max(numMips, 1) );
_imageContainer.m_hasAlpha = hasAlpha;
_imageContainer.m_cubeMap = numFaces > 1;
_imageContainer.m_ktx = true;
@@ -3064,13 +3089,14 @@ namespace bgfx
#define PVR3_CHANNEL_TYPE_ANY UINT32_MAX
#define PVR3_CHANNEL_TYPE_FLOAT UINT32_C(12)
- static struct TranslatePvr3Format
+ struct TranslatePvr3Format
{
uint64_t m_format;
uint32_t m_channelTypeMask;
TextureFormat::Enum m_textureFormat;
+ };
- } s_translatePvr3Format[] =
+ static const TranslatePvr3Format s_translatePvr3Format[] =
{
{ PVR3_PVRTC1_2BPP_RGB, PVR3_CHANNEL_TYPE_ANY, TextureFormat::PTC12 },
{ PVR3_PVRTC1_2BPP_RGBA, PVR3_CHANNEL_TYPE_ANY, TextureFormat::PTC12A },
@@ -3432,10 +3458,14 @@ namespace bgfx
break;
default:
- if (!imageConvert(_dst, TextureFormat::BGRA8, _src, _format, _width, _height, _pitch) )
{
- // Failed to convert, just make ugly red-yellow checkerboard texture.
- imageCheckerboard(_width, _height, 16, UINT32_C(0xffff0000), UINT32_C(0xffffff00), _dst);
+ const uint32_t srcBpp = s_imageBlockInfo[_format].bitsPerPixel;
+ const uint32_t srcPitch = _width * srcBpp / 8;
+ if (!imageConvert(_dst, TextureFormat::BGRA8, _src, _format, _width, _height, srcPitch) )
+ {
+ // Failed to convert, just make ugly red-yellow checkerboard texture.
+ imageCheckerboard(_width, _height, 16, UINT32_C(0xffff0000), UINT32_C(0xffffff00), _dst);
+ }
}
break;
}