diff options
author | Kaj Grönholm <kaj.gronholm@qt.io> | 2020-10-13 15:51:33 +0300 |
---|---|---|
committer | Kaj Grönholm <kaj.gronholm@qt.io> | 2020-10-15 12:59:09 +0300 |
commit | 9c04cb932a9c7c7a36ace729a58b5e6794ec7db9 (patch) | |
tree | f41acd68d650475ea13b468b1c8fade87565468b | |
parent | 8e7f57eaf3cd18265af539fcba88f2c8927fd566 (diff) |
Add option for always premultiplied astc
When QT3DS_ALL_ASTC_PREMULTIPLIED is defined or set as environment
variable, all astc images are considered to be premultiplied.
Task-number: QT3DS-4182
Change-Id: Ibe039b65322f252158bd38a2ca5b57d270c3d209
Reviewed-by: Janne Koskinen <janne.p.koskinen@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
-rw-r--r-- | commonplatform.pri | 4 | ||||
-rw-r--r-- | src/runtimerender/graphobjects/Qt3DSRenderImage.cpp | 4 | ||||
-rw-r--r-- | src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp | 18 | ||||
-rw-r--r-- | src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.h | 3 |
4 files changed, 29 insertions, 0 deletions
diff --git a/commonplatform.pri b/commonplatform.pri index f1a114c..1efc50c 100644 --- a/commonplatform.pri +++ b/commonplatform.pri @@ -18,6 +18,10 @@ DEFINES += \ _UNICODE \ NO_BOOST +# Enable this define if all ASTC images should be considered as premultiplied. +# Alternatively to enable this at runtime, set QT3DS_ALL_ASTC_PREMULTIPLIED env variable. +#DEFINES += QT3DS_ALL_ASTC_PREMULTIPLIED + # Enable this to build runtime with perf logging on. # At runtime to see logs, you should also enable "qt3ds.perf_info" # category e.g. with "QT_LOGGING_RULES=qt3ds.perf_info=true" diff --git a/src/runtimerender/graphobjects/Qt3DSRenderImage.cpp b/src/runtimerender/graphobjects/Qt3DSRenderImage.cpp index f2ca055..4fff9ca 100644 --- a/src/runtimerender/graphobjects/Qt3DSRenderImage.cpp +++ b/src/runtimerender/graphobjects/Qt3DSRenderImage.cpp @@ -84,6 +84,8 @@ bool SImage::ClearDirty(IBufferManager &inBufferManager, IOffscreenRenderManager inRenderManager.MaybeRegisterOffscreenRenderer(theInstance, *theInstance); SOffscreenRenderResult theResult = inRenderManager.GetRenderedItem(theInstance); HandleOffscreenResult(*this, newImage, theResult, replaceTexture, wasDirty); + inBufferManager.checkAlwaysPremultiplied(QString::fromLatin1(m_ImagePath.c_str()), + newImage.m_TextureFlags); } } @@ -93,6 +95,8 @@ bool SImage::ClearDirty(IBufferManager &inBufferManager, IOffscreenRenderManager SOffscreenRenderResult theResult = inRenderManager.GetRenderedItem(m_OffscreenRendererId); HandleOffscreenResult(*this, newImage, theResult, replaceTexture, wasDirty); + inBufferManager.checkAlwaysPremultiplied(QString::fromLatin1(m_ImagePath.c_str()), + newImage.m_TextureFlags); } } diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp index 658916f..a6123cb 100644 --- a/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp +++ b/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp @@ -340,6 +340,8 @@ struct SBufferManager : public IBufferManager QHash<QString, ReloadableTexturePtr> m_reloadableTextures; ReloadableTexturePtr m_nullTexture; + bool m_allAstcPremultiplied = false; + static const char8_t *GetPrimitivesDirectory() { return "res//primitives"; } SBufferManager(NVRenderContext &ctx, IStringTable &strTable, @@ -356,11 +358,25 @@ struct SBufferManager : public IBufferManager , m_GPUSupportsCompressedTextures(ctx.AreCompressedTexturesSupported()) , m_reloadableResources(false) { +#ifdef QT3DS_ALL_ASTC_PREMULTIPLIED + m_allAstcPremultiplied = true; +#else + m_allAstcPremultiplied = qEnvironmentVariableIntValue("QT3DS_ALL_ASTC_PREMULTIPLIED"); +#endif } virtual ~SBufferManager() { Clear(); } QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Context->GetAllocator()) + void checkAlwaysPremultiplied(const QString &resolvedPath, + SImageTextureFlags &textureFlags) override + { + if (m_allAstcPremultiplied) { + if (resolvedPath.endsWith(QStringLiteral(".astc"))) + textureFlags.SetPreMultiplied(true); + } + } + void SetImageHasTransparency(const QString &resolvedPath, bool inHasTransparency, bool hasOpaque) override { @@ -369,6 +385,7 @@ struct SBufferManager : public IBufferManager SImageEntry &entry = m_ImageMap[resolvedPath]; entry.m_TextureFlags.SetHasTransparency(inHasTransparency); entry.m_TextureFlags.setHasOpaquePixels(hasOpaque); + checkAlwaysPremultiplied(resolvedPath, entry.m_TextureFlags); } bool GetImageHasTransparency(const QString &resolvedPath) const override @@ -760,6 +777,7 @@ struct SBufferManager : public IBufferManager bool alsoOpaquePixels = false; flags.SetHasTransparency(inLoadedImage.ScanForTransparency(alsoOpaquePixels)); flags.setHasOpaquePixels(alsoOpaquePixels); + checkAlwaysPremultiplied(inImagePath, flags); } theImage.m_Texture = theTexture; return theImage; diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.h b/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.h index 7445b90..a0f4606 100644 --- a/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.h +++ b/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.h @@ -123,6 +123,9 @@ namespace render { virtual void InvalidateBuffer(CRegisteredString inSourcePath) = 0; virtual IStringTable &GetStringTable() = 0; + virtual void checkAlwaysPremultiplied(const QString &resolvedPath, + SImageTextureFlags &textureFlags) = 0; + static IBufferManager &Create(NVRenderContext &inRenderContext, IStringTable &inStrTable, IInputStreamFactory &inInputStreamFactory, IPerfTimer &inTimer); |