diff options
author | Antti Määttä <antti.maatta@qt.io> | 2019-03-18 09:17:22 +0200 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2019-03-18 14:16:16 +0000 |
commit | 057d6e3cf525fa625a22487ca1d1968e313e5801 (patch) | |
tree | 6f8f0a74b8fe09e662f53b675837665b17951b72 /src | |
parent | 5d9f20e35c11292ebefcd19653c1cf51ee7baaf0 (diff) |
Fix compressed texture image loading
- Add DXT1 format to block size for texture
- Set correct image size for each mip level
Task-number: QT3DS-3175
Change-Id: I5ca31882bdf43b0f5d2bda7cab345113184724ea
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/runtime/q3dsimageloaders_p.h | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/runtime/q3dsimageloaders_p.h b/src/runtime/q3dsimageloaders_p.h index f22d8bc..a1e2459 100644 --- a/src/runtime/q3dsimageloaders_p.h +++ b/src/runtime/q3dsimageloaders_p.h @@ -832,6 +832,7 @@ static inline quint32 q3ds_blockSizeForTextureFormat(QOpenGLTexture::TextureForm case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2: case QOpenGLTexture::R11_EAC_UNorm: case QOpenGLTexture::R11_EAC_SNorm: + case QOpenGLTexture::RGB_DXT1: return 8; default: @@ -920,12 +921,12 @@ inline QVector<Qt3DRender::QTextureImageDataPtr> q3ds_loadKtx(QIODevice *source) const int level0Height = decode(header.pixelHeight); int faceCount = decode(header.numberOfFaces); const int mipMapLevels = decode(header.numberOfMipmapLevels); - auto createImageData = [=](const QByteArray &compressedData) { + auto createImageData = [=](const QByteArray &compressedData, int mipLevel) { Qt3DRender::QTextureImageDataPtr imageData = Qt3DRender::QTextureImageDataPtr::create(); imageData->setTarget(faceCount == 6 ? QOpenGLTexture::TargetCubeMap : QOpenGLTexture::Target2D); imageData->setFormat(QOpenGLTexture::TextureFormat(decode(header.glInternalFormat))); - imageData->setWidth(level0Width); - imageData->setHeight(level0Height); + imageData->setWidth(qMax(level0Width >> mipLevel, 1)); + imageData->setHeight(qMax(level0Height >> mipLevel, 1)); imageData->setLayers(1); imageData->setDepth(1); // separate textureimage per face and per mipmap @@ -947,7 +948,7 @@ inline QVector<Qt3DRender::QTextureImageDataPtr> q3ds_loadKtx(QIODevice *source) int imageSize = *reinterpret_cast<const quint32 *>(p); p += 4; for (int face = 0; face < faceCount; ++face) { - result << createImageData(QByteArray(p, imageSize)); + result << createImageData(QByteArray(p, imageSize), mip); p = basep + q3ds_alignedOffset(p + imageSize - basep, 4); } } |