diff options
author | Andy Nichols <andy.nichols@qt.io> | 2019-09-16 13:59:55 +0300 |
---|---|---|
committer | Jere Tuliniemi <jere.tuliniemi@qt.io> | 2019-09-17 14:21:05 +0300 |
commit | 6ad0356b8f570ef4533c82319e2af275bb410368 (patch) | |
tree | 48e39fa89709e3fb8cee01460ffd640fc8de7fdb | |
parent | fe29ee5c5b0c1edbfabccf211bd8d73bb61672dc (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.h | 13 | ||||
-rw-r--r-- | src/render/backends/Qt3DSRenderBackend.h | 8 | ||||
-rw-r--r-- | src/render/backends/gl/Qt3DSRenderBackendGL3.cpp | 16 | ||||
-rw-r--r-- | src/render/backends/gl/Qt3DSRenderBackendGL4.cpp | 6 | ||||
-rw-r--r-- | src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp | 9 | ||||
-rw-r--r-- | src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp | 14 |
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()); } |