summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaj Grönholm <kaj.gronholm@qt.io>2020-10-13 15:51:33 +0300
committerKaj Grönholm <kaj.gronholm@qt.io>2020-10-15 12:59:09 +0300
commit9c04cb932a9c7c7a36ace729a58b5e6794ec7db9 (patch)
treef41acd68d650475ea13b468b1c8fade87565468b
parent8e7f57eaf3cd18265af539fcba88f2c8927fd566 (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.pri4
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderImage.cpp4
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp18
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.h3
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);