summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Nichols <andy.nichols@qt.io>2019-09-16 13:59:55 +0300
committerJere Tuliniemi <jere.tuliniemi@qt.io>2019-09-17 14:21:05 +0300
commit6ad0356b8f570ef4533c82319e2af275bb410368 (patch)
tree48e39fa89709e3fb8cee01460ffd640fc8de7fdb
parentfe29ee5c5b0c1edbfabccf211bd8d73bb61672dc (diff)
Check more than S3/DXT support for compressed textures
Task-number: QT3DS-3903 Change-Id: I23e50102857067324681c6ffaa0f166336214695 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Antti Määttä <antti.maatta@qt.io> Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
-rw-r--r--src/render/Qt3DSRenderContext.h13
-rw-r--r--src/render/backends/Qt3DSRenderBackend.h8
-rw-r--r--src/render/backends/gl/Qt3DSRenderBackendGL3.cpp16
-rw-r--r--src/render/backends/gl/Qt3DSRenderBackendGL4.cpp6
-rw-r--r--src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp9
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp14
6 files changed, 54 insertions, 12 deletions
diff --git a/src/render/Qt3DSRenderContext.h b/src/render/Qt3DSRenderContext.h
index b454a3f..e729ad1 100644
--- a/src/render/Qt3DSRenderContext.h
+++ b/src/render/Qt3DSRenderContext.h
@@ -132,7 +132,7 @@ namespace render {
virtual QT3DSU32 GetStencilBits() const = 0;
virtual bool
GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::Enum inCap) const = 0;
- virtual bool AreDXTImagesSupported() const = 0;
+ virtual bool AreCompressedTexturesSupported() const = 0;
virtual bool IsDepthStencilSupported() const = 0;
virtual bool IsFpRenderTargetSupported() const = 0;
virtual bool IsTessellationSupported() const = 0;
@@ -693,11 +693,16 @@ namespace render {
return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::ConstantBuffer);
}
- bool AreDXTImagesSupported() const override
+ bool AreCompressedTexturesSupported() const override
{
- return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::DxtImages);
+ return (GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::DxtImages)
+ || GetRenderBackendCap(
+ NVRenderBackend::NVRenderBackendCaps::CompressedTextureEtc1)
+ || GetRenderBackendCap(
+ NVRenderBackend::NVRenderBackendCaps::CompressedTextureEtc2)
+ || GetRenderBackendCap(
+ NVRenderBackend::NVRenderBackendCaps::CompressedTextureAstc));
}
-
bool IsDepthStencilSupported() const override
{
return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::DepthStencilTexture);
diff --git a/src/render/backends/Qt3DSRenderBackend.h b/src/render/backends/Qt3DSRenderBackend.h
index 226e0b7..3d9901f 100644
--- a/src/render/backends/Qt3DSRenderBackend.h
+++ b/src/render/backends/Qt3DSRenderBackend.h
@@ -129,7 +129,10 @@ namespace render {
VertexArrayObject,
StandardDerivatives,
TextureLod,
- BinaryProgram
+ BinaryProgram,
+ CompressedTextureEtc1,
+ CompressedTextureEtc2,
+ CompressedTextureAstc
};
} NVRenderBackendCaps;
@@ -2237,6 +2240,9 @@ namespace render {
bool bStandardDerivativesSupported : 1;
bool bTextureLodSupported : 1;
bool bBinaryProgramsSupported : 1;
+ bool bTextureEtc1Supported : 1;
+ bool bTextureEtc2Supported : 1;
+ bool bTextureAstcSupported : 1;
} bits;
QT3DSU32 u32Values;
diff --git a/src/render/backends/gl/Qt3DSRenderBackendGL3.cpp b/src/render/backends/gl/Qt3DSRenderBackendGL3.cpp
index 4e637da..49e7a34 100644
--- a/src/render/backends/gl/Qt3DSRenderBackendGL3.cpp
+++ b/src/render/backends/gl/Qt3DSRenderBackendGL3.cpp
@@ -68,10 +68,12 @@ namespace render {
eastl::string extsAniso("GL_EXT_texture_filter_anisotropic");
eastl::string extsTexSwizzle("GL_ARB_texture_swizzle");
eastl::string extsAstcHDR("GL_KHR_texture_compression_astc_hdr");
- eastl::string extsAstcLDR("GL_KHR_texture_compression_astc_ldr");
+ eastl::string extsAstcLDR("GL_KHR_texture_compression_astc_ldr"); // ES 3.2
eastl::string extsFPRenderTarget("GL_EXT_color_buffer_float");
eastl::string extsTimerQuery("GL_EXT_timer_query");
eastl::string extsGpuShader5("EXT_gpu_shader5");
+ eastl::string extsEtc1("GL_OES_compressed_ETC1_RGB8_texture");
+ eastl::string extsEtc2("GL_COMPRESSED_RGB8_ETC2"); //ES 3.0+ && OpenGL 4.3+
const char *languageVersion = GetShadingLanguageVersion();
qCInfo(TRACE_INFO, "GLSL version: %s", languageVersion);
@@ -119,6 +121,16 @@ namespace render {
} else if (!m_backendSupport.caps.bits.bGPUShader5ExtensionSupported
&& extsGpuShader5.compare(extensionString) == 0) {
m_backendSupport.caps.bits.bGPUShader5ExtensionSupported = true;
+ } else if (!m_backendSupport.caps.bits.bTextureEtc1Supported
+ && extsEtc1.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bTextureEtc1Supported = true;
+ } else if (!m_backendSupport.caps.bits.bTextureEtc2Supported
+ && extsEtc2.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bTextureEtc2Supported = true;
+ } else if (!m_backendSupport.caps.bits.bTextureAstcSupported
+ && (extsAstcHDR.compare(extensionString) == 0
+ || extsAstcLDR.compare(extensionString) == 0)) {
+ m_backendSupport.caps.bits.bTextureAstcSupported = true;
}
}
@@ -143,6 +155,8 @@ namespace render {
m_backendSupport.caps.bits.bMsTextureSupported = true;
// timer queries are always supported on none ES systems which support >=GL3
m_backendSupport.caps.bits.bTimerQuerySupported = true;
+ // ETC2 support >=GL3
+ m_backendSupport.caps.bits.bTextureEtc1Supported = true;
}
// query hardware
diff --git a/src/render/backends/gl/Qt3DSRenderBackendGL4.cpp b/src/render/backends/gl/Qt3DSRenderBackendGL4.cpp
index 4ff532d..fe3bb7c 100644
--- a/src/render/backends/gl/Qt3DSRenderBackendGL4.cpp
+++ b/src/render/backends/gl/Qt3DSRenderBackendGL4.cpp
@@ -140,6 +140,9 @@ namespace render {
// geometry shader is always supported on none ES systems which support >=GL4 ( actually
// 3.2 already )
m_backendSupport.caps.bits.bGeometrySupported = true;
+ // ETC2 texture compression is supported in 4.3 and greater
+ if (format.minorVersion() >= 3)
+ m_backendSupport.caps.bits.bTextureEtc2Supported = true;
} else {
// always true for GLES 3.1 devices
m_backendSupport.caps.bits.bComputeSupported = true;
@@ -147,6 +150,9 @@ namespace render {
m_backendSupport.caps.bits.bStorageBufferSupported = true;
m_backendSupport.caps.bits.bAtomicCounterBufferSupported = true;
m_backendSupport.caps.bits.bShaderImageLoadStoreSupported = true;
+ // ASTC ldr profile supported in ES 3.2 and greater
+ if (format.minorVersion() >= 2)
+ m_backendSupport.caps.bits.bTextureAstcSupported = true;
}
#if !defined(QT_OPENGL_ES)
diff --git a/src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp b/src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp
index 3505564..ca40d93 100644
--- a/src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp
+++ b/src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp
@@ -244,6 +244,15 @@ bool NVRenderBackendGLBase::GetRenderBackendCap(
case NVRenderBackendCaps::BinaryProgram:
bSupported = m_backendSupport.caps.bits.bBinaryProgramsSupported;
break;
+ case NVRenderBackendCaps::CompressedTextureEtc1:
+ bSupported = m_backendSupport.caps.bits.bTextureEtc1Supported;
+ break;
+ case NVRenderBackendCaps::CompressedTextureEtc2:
+ bSupported = m_backendSupport.caps.bits.bTextureEtc2Supported;
+ break;
+ case NVRenderBackendCaps::CompressedTextureAstc:
+ bSupported = m_backendSupport.caps.bits.bTextureAstcSupported;
+ break;
default:
QT3DS_ASSERT(false);
bSupported = false;
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp
index f3f85f4..a5a4e50 100644
--- a/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp
@@ -117,7 +117,7 @@ struct SBufferManager : public IBufferManager
TMeshMap m_MeshMap;
SPrimitiveEntry m_PrimitiveNames[5];
nvvector<qt3ds::render::NVRenderVertexBufferEntry> m_EntryBuffer;
- bool m_GPUSupportsDXT;
+ bool m_GPUSupportsCompressedTextures;
bool m_reloadableResources;
QHash<QString, QSharedPointer<QQmlImageProviderBase> > m_imageProviders;
@@ -140,7 +140,7 @@ struct SBufferManager : public IBufferManager
, m_AliasImageMap(ctx.GetAllocator(), "SBufferManager::m_AliasImageMap")
, m_MeshMap(ctx.GetAllocator(), "SBufferManager::m_MeshMap")
, m_EntryBuffer(ctx.GetAllocator(), "SBufferManager::m_EntryBuffer")
- , m_GPUSupportsDXT(ctx.AreDXTImagesSupported())
+ , m_GPUSupportsCompressedTextures(ctx.AreCompressedTexturesSupported())
, m_reloadableResources(false)
{
}
@@ -485,14 +485,16 @@ struct SBufferManager : public IBufferManager
}
} else if (inLoadedImage.dds) {
theImage.first->second.m_Texture = theTexture;
- bool supportsDXT = m_GPUSupportsDXT;
- bool isDXT = NVRenderTextureFormats::isCompressedTextureFormat(inLoadedImage.format);
- bool requiresDecompression = (supportsDXT == false && isDXT) || false;
+ bool supportsCompressedTextures = m_GPUSupportsCompressedTextures;
+ bool isACompressedTexture
+ = NVRenderTextureFormats::isCompressedTextureFormat(inLoadedImage.format);
+ bool requiresDecompression
+ = (supportsCompressedTextures == false && isACompressedTexture) || false;
// test code for DXT decompression
// if ( isDXT ) requiresDecompression = true;
if (requiresDecompression) {
qCWarning(WARNING, PERF_INFO,
- "Image %s is DXT format which is unsupported by "
+ "Image %s is compressed format which is unsupported by "
"the graphics subsystem, decompressing in CPU",
inImagePath.c_str());
}