From 4b0bed8161bea8873b1b0ad35f458c5d717d2e30 Mon Sep 17 00:00:00 2001 From: "konstantin.matveyev" Date: Thu, 26 Nov 2020 13:58:42 +0300 Subject: [PATCH 1/6] GLExtensions improved: added support for WebGL compressed textures: S3TC, ETC{1,2}, PVRTC --- src/osg/GLExtensions.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/osg/GLExtensions.cpp b/src/osg/GLExtensions.cpp index 375ba86be..c2cf99eb5 100644 --- a/src/osg/GLExtensions.cpp +++ b/src/osg/GLExtensions.cpp @@ -850,13 +850,21 @@ GLExtensions::GLExtensions(unsigned int in_contextID): isTextureFilterAnisotropicSupported = validContext && isGLExtensionSupported(contextID,"GL_EXT_texture_filter_anisotropic"); isTextureSwizzleSupported = validContext && isGLExtensionSupported(contextID,"GL_ARB_texture_swizzle"); isTextureCompressionARBSupported = validContext && (builtInSupport || isGLExtensionOrVersionSupported(contextID,"GL_ARB_texture_compression", 1.3f)); - isTextureCompressionS3TCSupported = validContext && (isGLExtensionSupported(contextID,"GL_EXT_texture_compression_s3tc") || isGLExtensionSupported(contextID, "GL_S3_s3tc")); - isTextureCompressionPVRTC2BPPSupported = validContext && isGLExtensionSupported(contextID,"GL_IMG_texture_compression_pvrtc"); + isTextureCompressionS3TCSupported = validContext && (isGLExtensionSupported(contextID,"GL_EXT_texture_compression_s3tc") || + isGLExtensionSupported(contextID, "GL_S3_s3tc") || + isGLExtensionSupported(contextID, "WEBGL_compressed_texture_s3tc") || + isGLExtensionSupported(contextID, "MOZ_WEBGL_compressed_texture_s3tc") || + isGLExtensionSupported(contextID, "WEBKIT_WEBGL_compressed_texture_s3tc") || + isGLExtensionSupported(contextID, "WEBGL_compressed_texture_s3tc_srgb") /* TODO: separate flag */); + isTextureCompressionPVRTC2BPPSupported = validContext && (isGLExtensionSupported(contextID,"GL_IMG_texture_compression_pvrtc") || + isGLExtensionSupported(contextID, "WEBGL_compressed_texture_pvrtc")); isTextureCompressionPVRTC4BPPSupported = isTextureCompressionPVRTC2BPPSupported;//covered by same extension - isTextureCompressionETCSupported = validContext && isGLExtensionSupported(contextID,"GL_OES_compressed_ETC1_RGB8_texture"); - isTextureCompressionETC2Supported = validContext && isGLExtensionSupported(contextID,"GL_ARB_ES3_compatibility"); + isTextureCompressionETCSupported = validContext && (isGLExtensionSupported(contextID, "GL_OES_compressed_ETC1_RGB8_texture") || + isGLExtensionSupported(contextID, "WEBGL_compressed_texture_etc1")); + isTextureCompressionETC2Supported = validContext && (isGLExtensionSupported(contextID,"GL_ARB_ES3_compatibility") || + isGLExtensionSupported(contextID, "WEBGL_compressed_texture_etc")); isTextureCompressionRGTCSupported = validContext && isGLExtensionSupported(contextID,"GL_EXT_texture_compression_rgtc"); - isTextureCompressionPVRTCSupported = validContext && isGLExtensionSupported(contextID,"GL_IMG_texture_compression_pvrtc"); + isTextureCompressionPVRTCSupported = isTextureCompressionPVRTC2BPPSupported;//covered by same extension isTextureMirroredRepeatSupported = validContext && (builtInSupport || From 6cd699e55fb6c59fd96c37dc3d85dbf96aeae684 Mon Sep 17 00:00:00 2001 From: valid-ptr Date: Fri, 4 Dec 2020 18:19:29 +0300 Subject: [PATCH 2/6] GLExtensions: isTextureCompressionASTCSupported (ASTC compression texture), isTextureLODBiasSupported (is needed for GL_TEXTURE_LOD_BIAS) flags added --- include/osg/GLExtensions | 2 ++ src/osg/GLExtensions.cpp | 19 ++++++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/osg/GLExtensions b/include/osg/GLExtensions index aa868e9cf..f7196ae81 100644 --- a/include/osg/GLExtensions +++ b/include/osg/GLExtensions @@ -521,6 +521,7 @@ class OSG_EXPORT GLExtensions : public osg::Referenced bool isTextureCompressionETC2Supported; bool isTextureCompressionRGTCSupported; bool isTextureCompressionPVRTCSupported; + bool isTextureCompressionASTCSupported; bool isTextureMirroredRepeatSupported; bool isTextureEdgeClampSupported; bool isTextureBorderClampSupported; @@ -530,6 +531,7 @@ class OSG_EXPORT GLExtensions : public osg::Referenced bool isShadowSupported; bool isShadowAmbientSupported; bool isTextureMaxLevelSupported; + bool isTextureLODBiasSupported; GLint maxTextureSize; bool isClientStorageSupported; bool isTextureIntegerEXTSupported; diff --git a/src/osg/GLExtensions.cpp b/src/osg/GLExtensions.cpp index c2cf99eb5..932230b92 100644 --- a/src/osg/GLExtensions.cpp +++ b/src/osg/GLExtensions.cpp @@ -866,6 +866,11 @@ GLExtensions::GLExtensions(unsigned int in_contextID): isTextureCompressionRGTCSupported = validContext && isGLExtensionSupported(contextID,"GL_EXT_texture_compression_rgtc"); isTextureCompressionPVRTCSupported = isTextureCompressionPVRTC2BPPSupported;//covered by same extension + isTextureCompressionASTCSupported = validContext && (isGLExtensionSupported(contextID, "GL_KHR_texture_compression_astc_hdr") || + isGLExtensionSupported(contextID, "GL_KHR_texture_compression_astc_ldr") || + isGLExtensionSupported(contextID, "GL_OES_texture_compression_astc") || + isGLExtensionSupported(contextID, "WEBGL_compressed_texture_astc")); + isTextureMirroredRepeatSupported = validContext && (builtInSupport || isGLExtensionOrVersionSupported(contextID,"GL_IBM_texture_mirrored_repeat", 1.4f) || @@ -906,18 +911,22 @@ GLExtensions::GLExtensions(unsigned int in_contextID): { maxTextureSize = osg_max_size; } + +#if defined(__EMSCRIPTEN__) + isTextureMaxLevelSupported = (glVersion >= 3.0f); // WebGL 2.0 (OpenGL ES 3.0) + isTextureLODBiasSupported = (glVersion >= 3.0f) || isGLExtensionSupported(contextID, "GL_EXT_texture_lod_bias"); +#else isTextureMaxLevelSupported = (glVersion >= 1.2f); + isTextureLODBiasSupported = (glVersion >= 1.2f) || isGLExtensionSupported(contextID, "GL_EXT_texture_lod_bias"); +#endif isTextureStorageEnabled = validContext && ((glVersion >= 4.2f) || isGLExtensionSupported(contextID, "GL_ARB_texture_storage")); if (isTextureStorageEnabled) { std::string value; - if (getEnvVar("OSG_GL_TEXTURE_STORAGE", value)) - { - if (value=="OFF" || value=="DISABLE") isTextureStorageEnabled = false; - else isTextureStorageEnabled = true; - } + if (getEnvVar("OSG_GL_TEXTURE_STORAGE", value) && (value == "OFF" || value == "DISABLE")) + isTextureStorageEnabled = false; } setGLExtensionFuncPtr(glTexStorage1D,"glTexStorage1D","glTexStorage1DARB", validContext); From b4eb001d14e3af873349f9458d6373dcb6832333 Mon Sep 17 00:00:00 2001 From: valid-ptr Date: Fri, 4 Dec 2020 18:24:36 +0300 Subject: [PATCH 3/6] ASTC Texture compression support added --- src/osg/Texture.cpp | 382 ++++++++++++++++++++++++++++++++------------ 1 file changed, 283 insertions(+), 99 deletions(-) diff --git a/src/osg/Texture.cpp b/src/osg/Texture.cpp index b286acc52..9cdaa1b27 100644 --- a/src/osg/Texture.cpp +++ b/src/osg/Texture.cpp @@ -176,30 +176,60 @@ InternalPixelRelations sizedDepthAndStencilInternalFormats[] = { }; InternalPixelRelations compressedInternalFormats[] = { - // , { GL_COMPRESSED_RED , GL_RED , GL_COMPRESSED_RED } - // , { GL_COMPRESSED_RG , GL_RG , GL_COMPRESSED_RG } - { GL_COMPRESSED_RGB , GL_RGB , GL_COMPRESSED_RGB } - , { GL_COMPRESSED_RGBA , GL_RGBA , GL_COMPRESSED_RGBA } - , { GL_COMPRESSED_SRGB , GL_RGB , GL_COMPRESSED_SRGB } - , { GL_COMPRESSED_SRGB_ALPHA , GL_RGBA , GL_COMPRESSED_SRGB_ALPHA } - , { GL_COMPRESSED_RED_RGTC1_EXT , GL_RED , GL_COMPRESSED_RED_RGTC1_EXT } - , { GL_COMPRESSED_SIGNED_RED_RGTC1_EXT , GL_RED , GL_COMPRESSED_SIGNED_RED_RGTC1_EXT } - // , { GL_COMPRESSED_RG_RGTC2 , GL_RG , GL_COMPRESSED_RG_RGTC2 } - // , { GL_COMPRESSED_SIGNED_RG_RGTC2 , GL_RG , GL_COMPRESSED_SIGNED_RG_RGTC2 } - // , { GL_COMPRESSED_RGBA_BPTC_UNORM , GL_RGBA , GL_COMPRESSED_RGBA_BPTC_UNORM } - // , { GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM , GL_RGBA , GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM } - // , { GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT , GL_RGB , GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT } - // , { GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT , GL_RGB , GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT } + // , { GL_COMPRESSED_RED , GL_RED , GL_COMPRESSED_RED } + // , { GL_COMPRESSED_RG , GL_RG , GL_COMPRESSED_RG } + { GL_COMPRESSED_RGB , GL_RGB , GL_COMPRESSED_RGB } + , { GL_COMPRESSED_RGBA , GL_RGBA , GL_COMPRESSED_RGBA } + , { GL_COMPRESSED_SRGB , GL_RGB , GL_COMPRESSED_SRGB } + , { GL_COMPRESSED_SRGB_ALPHA , GL_RGBA , GL_COMPRESSED_SRGB_ALPHA } + , { GL_COMPRESSED_RED_RGTC1_EXT , GL_RED , GL_COMPRESSED_RED_RGTC1_EXT } + , { GL_COMPRESSED_SIGNED_RED_RGTC1_EXT , GL_RED , GL_COMPRESSED_SIGNED_RED_RGTC1_EXT } + // , { GL_COMPRESSED_RG_RGTC2 , GL_RG , GL_COMPRESSED_RG_RGTC2 } + // , { GL_COMPRESSED_SIGNED_RG_RGTC2 , GL_RG , GL_COMPRESSED_SIGNED_RG_RGTC2 } + // , { GL_COMPRESSED_RGBA_BPTC_UNORM , GL_RGBA , GL_COMPRESSED_RGBA_BPTC_UNORM } + // , { GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM , GL_RGBA , GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM } + // , { GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT , GL_RGB , GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT } + // , { GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT , GL_RGB , GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT } - , { GL_COMPRESSED_RGB_S3TC_DXT1_EXT , GL_RGB , GL_COMPRESSED_RGB_S3TC_DXT1_EXT } - , { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT , GL_RGBA , GL_COMPRESSED_RGBA_S3TC_DXT1_EXT } - , { GL_COMPRESSED_RGBA_S3TC_DXT3_EXT , GL_RGBA , GL_COMPRESSED_RGBA_S3TC_DXT3_EXT } - , { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT , GL_RGBA , GL_COMPRESSED_RGBA_S3TC_DXT5_EXT } + , { GL_COMPRESSED_RGB_S3TC_DXT1_EXT , GL_RGB , GL_COMPRESSED_RGB_S3TC_DXT1_EXT } + , { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT , GL_RGBA , GL_COMPRESSED_RGBA_S3TC_DXT1_EXT } + , { GL_COMPRESSED_RGBA_S3TC_DXT3_EXT , GL_RGBA , GL_COMPRESSED_RGBA_S3TC_DXT3_EXT } + , { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT , GL_RGBA , GL_COMPRESSED_RGBA_S3TC_DXT5_EXT } - , { GL_COMPRESSED_SRGB_S3TC_DXT1_EXT , GL_RGB , GL_COMPRESSED_SRGB_S3TC_DXT1_EXT } - , { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT , GL_RGBA , GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT } - , { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT , GL_RGBA , GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT } - , { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT , GL_RGBA , GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT } + , { GL_COMPRESSED_SRGB_S3TC_DXT1_EXT , GL_RGB , GL_COMPRESSED_SRGB_S3TC_DXT1_EXT } + , { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT , GL_RGBA , GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT } + , { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT , GL_RGBA , GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT } + , { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT , GL_RGBA , GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT } + + , { GL_COMPRESSED_RGBA_ASTC_4x4_KHR , GL_RGBA , GL_COMPRESSED_RGBA_ASTC_4x4_KHR } + , { GL_COMPRESSED_RGBA_ASTC_5x4_KHR , GL_RGBA , GL_COMPRESSED_RGBA_ASTC_5x4_KHR } + , { GL_COMPRESSED_RGBA_ASTC_5x5_KHR , GL_RGBA , GL_COMPRESSED_RGBA_ASTC_5x5_KHR } + , { GL_COMPRESSED_RGBA_ASTC_6x5_KHR , GL_RGBA , GL_COMPRESSED_RGBA_ASTC_6x5_KHR } + , { GL_COMPRESSED_RGBA_ASTC_6x6_KHR , GL_RGBA , GL_COMPRESSED_RGBA_ASTC_6x6_KHR } + , { GL_COMPRESSED_RGBA_ASTC_8x5_KHR , GL_RGBA , GL_COMPRESSED_RGBA_ASTC_8x5_KHR } + , { GL_COMPRESSED_RGBA_ASTC_8x6_KHR , GL_RGBA , GL_COMPRESSED_RGBA_ASTC_8x6_KHR } + , { GL_COMPRESSED_RGBA_ASTC_8x8_KHR , GL_RGBA , GL_COMPRESSED_RGBA_ASTC_8x8_KHR } + , { GL_COMPRESSED_RGBA_ASTC_10x5_KHR , GL_RGBA , GL_COMPRESSED_RGBA_ASTC_10x5_KHR } + , { GL_COMPRESSED_RGBA_ASTC_10x6_KHR , GL_RGBA , GL_COMPRESSED_RGBA_ASTC_10x6_KHR } + , { GL_COMPRESSED_RGBA_ASTC_10x8_KHR , GL_RGBA , GL_COMPRESSED_RGBA_ASTC_10x8_KHR } + , { GL_COMPRESSED_RGBA_ASTC_10x10_KHR , GL_RGBA , GL_COMPRESSED_RGBA_ASTC_10x10_KHR } + , { GL_COMPRESSED_RGBA_ASTC_12x10_KHR , GL_RGBA , GL_COMPRESSED_RGBA_ASTC_12x10_KHR } + , { GL_COMPRESSED_RGBA_ASTC_12x12_KHR , GL_RGBA , GL_COMPRESSED_RGBA_ASTC_12x12_KHR } + + , { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR , GL_RGBA , GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR } + , { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR , GL_RGBA , GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR } + , { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR , GL_RGBA , GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR } + , { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR , GL_RGBA , GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR } + , { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR , GL_RGBA , GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR } + , { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR , GL_RGBA , GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR } + , { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR , GL_RGBA , GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR } + , { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR , GL_RGBA , GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR } + , { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR , GL_RGBA , GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR } + , { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR , GL_RGBA , GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR } + , { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR , GL_RGBA , GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR } + , { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR , GL_RGBA , GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR } + , { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR , GL_RGBA , GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR } + , { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR , GL_RGBA , GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR } }; bool isSizedInternalFormat(GLint internalFormat) @@ -285,61 +315,102 @@ void Texture::TextureObject::setAllocated(GLint numMipmapLevels, void Texture::TextureProfile::computeSize() { - unsigned int numBitsPerTexel = 32; + double numBitsPerTexel = 32.0; switch(_internalFormat) { - case(1): numBitsPerTexel = 8; break; - case(GL_ALPHA): numBitsPerTexel = 8; break; - case(GL_LUMINANCE): numBitsPerTexel = 8; break; - case(GL_INTENSITY): numBitsPerTexel = 8; break; + case 1: + case GL_ALPHA: + case GL_LUMINANCE: + case GL_INTENSITY: + case GL_RED: + numBitsPerTexel = 8.0; + break; - case(GL_LUMINANCE_ALPHA): numBitsPerTexel = 16; break; - case(2): numBitsPerTexel = 16; break; + case 2: + case GL_LUMINANCE_ALPHA: + case GL_RG: + numBitsPerTexel = 16.0; + break; - case(GL_RGB): numBitsPerTexel = 24; break; - case(GL_BGR): numBitsPerTexel = 24; break; - case(3): numBitsPerTexel = 24; break; + case 3: + case GL_RGB: + case GL_BGR: + numBitsPerTexel = 24.0; + break; - case(GL_RGBA): numBitsPerTexel = 32; break; - case(4): numBitsPerTexel = 32; break; + case 4: + case GL_RGBA: + case GL_BGRA: + numBitsPerTexel = 32.0; + break; - case(GL_COMPRESSED_ALPHA_ARB): numBitsPerTexel = 4; break; - case(GL_COMPRESSED_INTENSITY_ARB): numBitsPerTexel = 4; break; - case(GL_COMPRESSED_LUMINANCE_ALPHA_ARB): numBitsPerTexel = 4; break; - case(GL_COMPRESSED_RGB_S3TC_DXT1_EXT): numBitsPerTexel = 4; break; - case(GL_COMPRESSED_SRGB_S3TC_DXT1_EXT): numBitsPerTexel = 4; break; - case(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT): numBitsPerTexel = 4; break; - case(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT): numBitsPerTexel = 4; break; - - case(GL_COMPRESSED_RGB_ARB): numBitsPerTexel = 8; break; - case(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT): numBitsPerTexel = 8; break; - case(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT): numBitsPerTexel = 8; break; - case(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT): numBitsPerTexel = 8; break; - case(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT): numBitsPerTexel = 8; break; + case GL_COMPRESSED_ALPHA_ARB: numBitsPerTexel = 4.0; break; + case GL_COMPRESSED_INTENSITY_ARB: numBitsPerTexel = 4.0; break; + case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: numBitsPerTexel = 4.0; break; + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: numBitsPerTexel = 4.0; break; + case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: numBitsPerTexel = 4.0; break; + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: numBitsPerTexel = 4.0; break; + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: numBitsPerTexel = 4.0; break; - case(GL_COMPRESSED_SIGNED_RED_RGTC1_EXT): numBitsPerTexel = 4; break; - case(GL_COMPRESSED_RED_RGTC1_EXT): numBitsPerTexel = 4; break; - case(GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT): numBitsPerTexel = 8; break; - case(GL_COMPRESSED_RED_GREEN_RGTC2_EXT): numBitsPerTexel = 8; break; + case GL_COMPRESSED_RGB_ARB: numBitsPerTexel = 8.0; break; + case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: numBitsPerTexel = 8.0; break; + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: numBitsPerTexel = 8.0; break; + case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: numBitsPerTexel = 8.0; break; + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: numBitsPerTexel = 8.0; break; - case(GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG): numBitsPerTexel = 2; break; - case(GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG): numBitsPerTexel = 2; break; - case(GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG): numBitsPerTexel = 4; break; - case(GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG): numBitsPerTexel = 4; break; + case GL_COMPRESSED_SIGNED_RED_RGTC1_EXT: numBitsPerTexel = 4.0; break; + case GL_COMPRESSED_RED_RGTC1_EXT: numBitsPerTexel = 4.0; break; + case GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT: numBitsPerTexel = 8.0; break; + case GL_COMPRESSED_RED_GREEN_RGTC2_EXT: numBitsPerTexel = 8.0; break; - case(GL_ETC1_RGB8_OES): numBitsPerTexel = 4; break; + case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG: numBitsPerTexel = 2.0; break; + case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: numBitsPerTexel = 2.0; break; + case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG: numBitsPerTexel = 4.0; break; + case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: numBitsPerTexel = 4.0; break; - case(GL_COMPRESSED_RGB8_ETC2): numBitsPerTexel = 4; break; - case(GL_COMPRESSED_SRGB8_ETC2): numBitsPerTexel = 4; break; - case(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2): numBitsPerTexel = 8; break; - case(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2): numBitsPerTexel = 8; break; - case(GL_COMPRESSED_RGBA8_ETC2_EAC): numBitsPerTexel = 8; break; - case(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC): numBitsPerTexel = 8; break; - case(GL_COMPRESSED_R11_EAC): numBitsPerTexel = 4; break; - case(GL_COMPRESSED_SIGNED_R11_EAC): numBitsPerTexel = 4; break; - case(GL_COMPRESSED_RG11_EAC): numBitsPerTexel = 8; break; - case(GL_COMPRESSED_SIGNED_RG11_EAC): numBitsPerTexel = 8; break; + case GL_ETC1_RGB8_OES: numBitsPerTexel = 4.0; break; + + case GL_COMPRESSED_RGB8_ETC2: numBitsPerTexel = 4.0; break; + case GL_COMPRESSED_SRGB8_ETC2: numBitsPerTexel = 4.0; break; + case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: numBitsPerTexel = 8.0; break; + case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: numBitsPerTexel = 8.0; break; + case GL_COMPRESSED_RGBA8_ETC2_EAC: numBitsPerTexel = 8.0; break; + case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: numBitsPerTexel = 8.0; break; + case GL_COMPRESSED_R11_EAC: numBitsPerTexel = 4.0; break; + case GL_COMPRESSED_SIGNED_R11_EAC: numBitsPerTexel = 4.0; break; + case GL_COMPRESSED_RG11_EAC: numBitsPerTexel = 8.0; break; + case GL_COMPRESSED_SIGNED_RG11_EAC: numBitsPerTexel = 8.0; break; + + // ASTC + case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: numBitsPerTexel = 8.0; break; + case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: numBitsPerTexel = 6.4; break; + case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: numBitsPerTexel = 5.12; break; + case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: numBitsPerTexel = 4.27; break; + case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: numBitsPerTexel = 3.56; break; + case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: numBitsPerTexel = 3.2; break; + case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: numBitsPerTexel = 2.67; break; + case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: numBitsPerTexel = 2.0; break; + case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: numBitsPerTexel = 2.56; break; + case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: numBitsPerTexel = 2.13; break; + case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: numBitsPerTexel = 1.6; break; + case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: numBitsPerTexel = 1.28; break; + case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: numBitsPerTexel = 1.07; break; + case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: numBitsPerTexel = 0.89; break; } _size = (unsigned int)(ceil(double(_width * _height * _depth * numBitsPerTexel)/8.0)); @@ -1786,39 +1857,67 @@ bool Texture::isCompressedInternalFormat() const bool Texture::isCompressedInternalFormat(GLint internalFormat) { - switch(internalFormat) + switch (internalFormat) { - case(GL_COMPRESSED_ALPHA_ARB): - case(GL_COMPRESSED_INTENSITY_ARB): - case(GL_COMPRESSED_LUMINANCE_ALPHA_ARB): - case(GL_COMPRESSED_LUMINANCE_ARB): - case(GL_COMPRESSED_RGBA_ARB): - case(GL_COMPRESSED_RGB_ARB): - case(GL_COMPRESSED_RGB_S3TC_DXT1_EXT): - case(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT): - case(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT): - case(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT): - case(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT): - case(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT): - case(GL_COMPRESSED_SIGNED_RED_RGTC1_EXT): - case(GL_COMPRESSED_RED_RGTC1_EXT): - case(GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT): - case(GL_COMPRESSED_RED_GREEN_RGTC2_EXT): - case(GL_ETC1_RGB8_OES): - case(GL_COMPRESSED_RGB8_ETC2): - case(GL_COMPRESSED_SRGB8_ETC2): - case(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2): - case(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2): - case(GL_COMPRESSED_RGBA8_ETC2_EAC): - case(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC): - case(GL_COMPRESSED_R11_EAC): - case(GL_COMPRESSED_SIGNED_R11_EAC): - case(GL_COMPRESSED_RG11_EAC): - case(GL_COMPRESSED_SIGNED_RG11_EAC): - case(GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG): - case(GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG): - case(GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG): - case(GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG): + case (GL_COMPRESSED_ALPHA_ARB): + case (GL_COMPRESSED_INTENSITY_ARB): + case (GL_COMPRESSED_LUMINANCE_ALPHA_ARB): + case (GL_COMPRESSED_LUMINANCE_ARB): + case (GL_COMPRESSED_RGBA_ARB): + case (GL_COMPRESSED_RGB_ARB): + case (GL_COMPRESSED_RGB_S3TC_DXT1_EXT): + case (GL_COMPRESSED_RGBA_S3TC_DXT1_EXT): + case (GL_COMPRESSED_RGBA_S3TC_DXT3_EXT): + case (GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT): + case (GL_COMPRESSED_RGBA_S3TC_DXT5_EXT): + case (GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT): + case (GL_COMPRESSED_SIGNED_RED_RGTC1_EXT): + case (GL_COMPRESSED_RED_RGTC1_EXT): + case (GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT): + case (GL_COMPRESSED_RED_GREEN_RGTC2_EXT): + case (GL_ETC1_RGB8_OES): + case (GL_COMPRESSED_RGB8_ETC2): + case (GL_COMPRESSED_SRGB8_ETC2): + case (GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2): + case (GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2): + case (GL_COMPRESSED_RGBA8_ETC2_EAC): + case (GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC): + case (GL_COMPRESSED_R11_EAC): + case (GL_COMPRESSED_SIGNED_R11_EAC): + case (GL_COMPRESSED_RG11_EAC): + case (GL_COMPRESSED_SIGNED_RG11_EAC): + case (GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG): + case (GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG): + case (GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG): + case (GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG): + case (GL_COMPRESSED_RGBA_ASTC_4x4_KHR): + case (GL_COMPRESSED_RGBA_ASTC_5x4_KHR): + case (GL_COMPRESSED_RGBA_ASTC_5x5_KHR): + case (GL_COMPRESSED_RGBA_ASTC_6x5_KHR): + case (GL_COMPRESSED_RGBA_ASTC_6x6_KHR): + case (GL_COMPRESSED_RGBA_ASTC_8x5_KHR): + case (GL_COMPRESSED_RGBA_ASTC_8x6_KHR): + case (GL_COMPRESSED_RGBA_ASTC_8x8_KHR): + case (GL_COMPRESSED_RGBA_ASTC_10x5_KHR): + case (GL_COMPRESSED_RGBA_ASTC_10x6_KHR): + case (GL_COMPRESSED_RGBA_ASTC_10x8_KHR): + case (GL_COMPRESSED_RGBA_ASTC_10x10_KHR): + case (GL_COMPRESSED_RGBA_ASTC_12x10_KHR): + case (GL_COMPRESSED_RGBA_ASTC_12x12_KHR): + case (GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR): + case (GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR): + case (GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR): + case (GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR): + case (GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR): + case (GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR): + case (GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR): + case (GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR): + case (GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR): + case (GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR): + case (GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR): + case (GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR): + case (GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR): + case (GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR): return true; default: return false; @@ -1862,7 +1961,7 @@ void Texture::getCompressedSize(GLenum internalFormat, GLint width, GLint height size = widthBlocks * heightBlocks * ((blockSize * bpp) / 8); return; - } + } else if (internalFormat == GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG || internalFormat == GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG) { blockSize = 4 * 4; // Pixel by pixel block size for 4bpp @@ -1879,6 +1978,91 @@ void Texture::getCompressedSize(GLenum internalFormat, GLint width, GLint height size = widthBlocks * heightBlocks * ((blockSize * bpp) / 8); return; } + // ASTC compression (block size is always equal to 16) + else if (internalFormat == GL_COMPRESSED_RGBA_ASTC_4x4_KHR || internalFormat == GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR) + { + blockSize = 16; + size = ceil(width/4.0)*ceil(height/4.0)*blockSize; + return; + } + else if (internalFormat == GL_COMPRESSED_RGBA_ASTC_5x4_KHR || internalFormat == GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR) + { + blockSize = 16; + size = ceil(width/5.0)*ceil(height/4.0)*blockSize; + return; + } + else if (internalFormat == GL_COMPRESSED_RGBA_ASTC_5x5_KHR || internalFormat == GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR) + { + blockSize = 16; + size = ceil(width/5.0)*ceil(height/5.0)*blockSize; + return; + } + else if (internalFormat == GL_COMPRESSED_RGBA_ASTC_6x5_KHR || internalFormat == GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR) + { + blockSize = 16; + size = ceil(width/6.0)*ceil(height/5.0)*blockSize; + return; + } + else if (internalFormat == GL_COMPRESSED_RGBA_ASTC_6x6_KHR || internalFormat == GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR) + { + blockSize = 16; + size = ceil(width/6.0)*ceil(height/6.0)*blockSize; + return; + } + else if (internalFormat == GL_COMPRESSED_RGBA_ASTC_8x5_KHR || internalFormat == GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR) + { + blockSize = 16; + size = ceil(width/8.0)*ceil(height/5.0)*blockSize; + return; + } + else if (internalFormat == GL_COMPRESSED_RGBA_ASTC_8x6_KHR || internalFormat == GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR) + { + blockSize = 16; + size = ceil(width/8.0)*ceil(height/6.0)*blockSize; + return; + } + else if (internalFormat == GL_COMPRESSED_RGBA_ASTC_8x8_KHR || internalFormat == GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR) + { + blockSize = 16; + size = ceil(width/8.0)*ceil(height/8.0)*blockSize; + return; + } + else if (internalFormat == GL_COMPRESSED_RGBA_ASTC_10x5_KHR || internalFormat == GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR) + { + blockSize = 16; + size = ceil(width/10.0)*ceil(height/5.0)*blockSize; + return; + } + else if (internalFormat == GL_COMPRESSED_RGBA_ASTC_10x6_KHR || internalFormat == GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR) + { + blockSize = 16; + size = ceil(width/10.0)*ceil(height/6.0)*blockSize; + return; + } + else if (internalFormat == GL_COMPRESSED_RGBA_ASTC_10x8_KHR || internalFormat == GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR) + { + blockSize = 16; + size = ceil(width/10.0)*ceil(height/8.0)*blockSize; + return; + } + else if (internalFormat == GL_COMPRESSED_RGBA_ASTC_10x10_KHR || internalFormat == GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR) + { + blockSize = 16; + size = ceil(width/10.0)*ceil(height/10.0)*blockSize; + return; + } + else if (internalFormat == GL_COMPRESSED_RGBA_ASTC_12x10_KHR || internalFormat == GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR) + { + blockSize = 16; + size = ceil(width/12.0)*ceil(height/10.0)*blockSize; + return; + } + else if (internalFormat == GL_COMPRESSED_RGBA_ASTC_12x12_KHR || internalFormat == GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR) + { + blockSize = 16; + size = ceil(width/12.0)*ceil(height/12.0)*blockSize; + return; + } else { OSG_WARN<<"Texture::getCompressedSize(...) : cannot compute correct size of compressed format ("< Date: Fri, 4 Dec 2020 18:26:21 +0300 Subject: [PATCH 4/6] isTextureLODBiasSupported check added --- src/osg/Texture.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/osg/Texture.cpp b/src/osg/Texture.cpp index 9cdaa1b27..7605083d8 100644 --- a/src/osg/Texture.cpp +++ b/src/osg/Texture.cpp @@ -2216,7 +2216,8 @@ void Texture::applyTexParameters(GLenum target, State& state) const glTexParameterf(target, GL_TEXTURE_MAX_LOD, _maxlod); } - glTexParameterf(target, GL_TEXTURE_LOD_BIAS, _lodbias); + if (extensions->isTextureLODBiasSupported) + glTexParameterf(target, GL_TEXTURE_LOD_BIAS, _lodbias); getTextureParameterDirty(state.getContextID()) = false; From 927d2f0f10745abf62c371d55401b0911d9ae938 Mon Sep 17 00:00:00 2001 From: valid-ptr Date: Tue, 19 Jan 2021 12:08:31 +0300 Subject: [PATCH 5/6] Texture::TextureProfile::computeSize function fixed for ASTC compressed textures --- src/osg/Texture.cpp | 111 ++++++++++++++++++++++++-------------------- 1 file changed, 61 insertions(+), 50 deletions(-) diff --git a/src/osg/Texture.cpp b/src/osg/Texture.cpp index 7605083d8..3c7429734 100644 --- a/src/osg/Texture.cpp +++ b/src/osg/Texture.cpp @@ -315,7 +315,7 @@ void Texture::TextureObject::setAllocated(GLint numMipmapLevels, void Texture::TextureProfile::computeSize() { - double numBitsPerTexel = 32.0; + unsigned int numBitsPerTexel = 32; switch(_internalFormat) { @@ -324,93 +324,104 @@ void Texture::TextureProfile::computeSize() case GL_LUMINANCE: case GL_INTENSITY: case GL_RED: - numBitsPerTexel = 8.0; + numBitsPerTexel = 8; break; case 2: case GL_LUMINANCE_ALPHA: case GL_RG: - numBitsPerTexel = 16.0; + numBitsPerTexel = 16; break; case 3: case GL_RGB: case GL_BGR: - numBitsPerTexel = 24.0; + numBitsPerTexel = 24; break; case 4: case GL_RGBA: case GL_BGRA: - numBitsPerTexel = 32.0; + numBitsPerTexel = 32; break; - case GL_COMPRESSED_ALPHA_ARB: numBitsPerTexel = 4.0; break; - case GL_COMPRESSED_INTENSITY_ARB: numBitsPerTexel = 4.0; break; - case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: numBitsPerTexel = 4.0; break; - case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: numBitsPerTexel = 4.0; break; - case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: numBitsPerTexel = 4.0; break; - case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: numBitsPerTexel = 4.0; break; - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: numBitsPerTexel = 4.0; break; + case GL_COMPRESSED_ALPHA_ARB: numBitsPerTexel = 4; break; + case GL_COMPRESSED_INTENSITY_ARB: numBitsPerTexel = 4; break; + case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: numBitsPerTexel = 4; break; + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: numBitsPerTexel = 4; break; + case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: numBitsPerTexel = 4; break; + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: numBitsPerTexel = 4; break; + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: numBitsPerTexel = 4; break; - case GL_COMPRESSED_RGB_ARB: numBitsPerTexel = 8.0; break; - case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: numBitsPerTexel = 8.0; break; - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: numBitsPerTexel = 8.0; break; - case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: numBitsPerTexel = 8.0; break; - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: numBitsPerTexel = 8.0; break; + case GL_COMPRESSED_RGB_ARB: numBitsPerTexel = 8; break; + case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: numBitsPerTexel = 8; break; + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: numBitsPerTexel = 8; break; + case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: numBitsPerTexel = 8; break; + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: numBitsPerTexel = 8; break; - case GL_COMPRESSED_SIGNED_RED_RGTC1_EXT: numBitsPerTexel = 4.0; break; - case GL_COMPRESSED_RED_RGTC1_EXT: numBitsPerTexel = 4.0; break; - case GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT: numBitsPerTexel = 8.0; break; - case GL_COMPRESSED_RED_GREEN_RGTC2_EXT: numBitsPerTexel = 8.0; break; + case GL_COMPRESSED_SIGNED_RED_RGTC1_EXT: numBitsPerTexel = 4; break; + case GL_COMPRESSED_RED_RGTC1_EXT: numBitsPerTexel = 4; break; + case GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT: numBitsPerTexel = 8; break; + case GL_COMPRESSED_RED_GREEN_RGTC2_EXT: numBitsPerTexel = 8; break; - case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG: numBitsPerTexel = 2.0; break; - case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: numBitsPerTexel = 2.0; break; - case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG: numBitsPerTexel = 4.0; break; - case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: numBitsPerTexel = 4.0; break; + case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG: numBitsPerTexel = 2; break; + case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: numBitsPerTexel = 2; break; + case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG: numBitsPerTexel = 4; break; + case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: numBitsPerTexel = 4; break; - case GL_ETC1_RGB8_OES: numBitsPerTexel = 4.0; break; + case GL_ETC1_RGB8_OES: numBitsPerTexel = 4; break; - case GL_COMPRESSED_RGB8_ETC2: numBitsPerTexel = 4.0; break; - case GL_COMPRESSED_SRGB8_ETC2: numBitsPerTexel = 4.0; break; - case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: numBitsPerTexel = 8.0; break; - case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: numBitsPerTexel = 8.0; break; - case GL_COMPRESSED_RGBA8_ETC2_EAC: numBitsPerTexel = 8.0; break; - case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: numBitsPerTexel = 8.0; break; - case GL_COMPRESSED_R11_EAC: numBitsPerTexel = 4.0; break; - case GL_COMPRESSED_SIGNED_R11_EAC: numBitsPerTexel = 4.0; break; - case GL_COMPRESSED_RG11_EAC: numBitsPerTexel = 8.0; break; - case GL_COMPRESSED_SIGNED_RG11_EAC: numBitsPerTexel = 8.0; break; + case GL_COMPRESSED_RGB8_ETC2: numBitsPerTexel = 4; break; + case GL_COMPRESSED_SRGB8_ETC2: numBitsPerTexel = 4; break; + case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: numBitsPerTexel = 8; break; + case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: numBitsPerTexel = 8; break; + case GL_COMPRESSED_RGBA8_ETC2_EAC: numBitsPerTexel = 8; break; + case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: numBitsPerTexel = 8; break; + case GL_COMPRESSED_R11_EAC: numBitsPerTexel = 4; break; + case GL_COMPRESSED_SIGNED_R11_EAC: numBitsPerTexel = 4; break; + case GL_COMPRESSED_RG11_EAC: numBitsPerTexel = 8; break; + case GL_COMPRESSED_SIGNED_RG11_EAC: numBitsPerTexel = 8; break; // ASTC case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: numBitsPerTexel = 8.0; break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: numBitsPerTexel = 6.4; break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: numBitsPerTexel = 5.12; break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: numBitsPerTexel = 4.27; break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: numBitsPerTexel = 3.56; break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: numBitsPerTexel = 3.2; break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: numBitsPerTexel = 2.67; break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: numBitsPerTexel = 2.0; break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: numBitsPerTexel = 2.56; break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: numBitsPerTexel = 2.13; break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: numBitsPerTexel = 1.6; break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: numBitsPerTexel = 1.28; break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: numBitsPerTexel = 1.07; break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: numBitsPerTexel = 0.89; break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: + { + _size = 0; + for (int i = 0; i < std::max(_numMipmapLevels, 1); ++i) + { + GLint blockSize; + GLint size; + getCompressedSize(_internalFormat, _width/(1 << i), _height/(1 << i), _depth, blockSize, size); + _size += size; + } + return; + } } _size = (unsigned int)(ceil(double(_width * _height * _depth * numBitsPerTexel)/8.0)); From b728587faba4ed2837cd2a9b3ad1e9a518fc9db0 Mon Sep 17 00:00:00 2001 From: valid-ptr Date: Wed, 24 Mar 2021 17:40:15 +0300 Subject: [PATCH 6/6] conflict with upstream/OpenSceneGraph-3.6 resolved --- src/osg/Texture.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/osg/Texture.cpp b/src/osg/Texture.cpp index 3c7429734..998f9dde9 100644 --- a/src/osg/Texture.cpp +++ b/src/osg/Texture.cpp @@ -2352,19 +2352,19 @@ void Texture::applyTexImage2D_load(State& state, GLenum target, const Image* ima OSG_NOTICE<<"Received a request to compress an image, but image size is not a multiple of four ("<