From d5dae1a2114e61e8e1321c06513655ca00952cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 2 Jan 2016 03:21:27 +0100 Subject: [PATCH] Added workaround for NVidia reporting compressed block size in bits. Instead of bytes as per specification of glGetInternalformativ(). --- src/Magnum/AbstractTexture.cpp | 9 +++++++++ src/Magnum/AbstractTexture.h | 5 +++++ src/Magnum/Implementation/TextureState.cpp | 9 +++++++++ src/Magnum/Implementation/TextureState.h | 1 + src/Magnum/Implementation/driverSpecific.cpp | 4 ++++ 5 files changed, 28 insertions(+) diff --git a/src/Magnum/AbstractTexture.cpp b/src/Magnum/AbstractTexture.cpp index 94012890d..d2603e1f6 100644 --- a/src/Magnum/AbstractTexture.cpp +++ b/src/Magnum/AbstractTexture.cpp @@ -199,10 +199,19 @@ void AbstractTexture::bindImplementationMulti(const GLint firstTextureUnit, Cont #ifndef MAGNUM_TARGET_GLES Int AbstractTexture::compressedBlockDataSize(const GLenum target, const TextureFormat format) { + return (Context::current()->state().texture->compressedBlockDataSizeImplementation)(target, format); +} + +Int AbstractTexture::compressedBlockDataSizeImplementationDefault(const GLenum target, const TextureFormat format) { GLint value; glGetInternalformativ(target, GLenum(format), GL_TEXTURE_COMPRESSED_BLOCK_SIZE, 1, &value); return value; } + +Int AbstractTexture::compressedBlockDataSizeImplementationBitsWorkaround(const GLenum target, const TextureFormat format) { + /* NVidia (358.16) reports the value in bits instead of bytes */ + return compressedBlockDataSizeImplementationDefault(target, format)/8; +} #endif AbstractTexture::AbstractTexture(GLenum target): _target{target}, _flags{ObjectFlag::DeleteOnDestruction} { diff --git a/src/Magnum/AbstractTexture.h b/src/Magnum/AbstractTexture.h index 2b1657aa9..eea1ea3d4 100644 --- a/src/Magnum/AbstractTexture.h +++ b/src/Magnum/AbstractTexture.h @@ -416,6 +416,11 @@ class MAGNUM_EXPORT AbstractTexture: public AbstractObject { GLenum _target; private: + #ifndef MAGNUM_TARGET_GLES + static Int MAGNUM_LOCAL compressedBlockDataSizeImplementationDefault(GLenum target, TextureFormat format); + static Int MAGNUM_LOCAL compressedBlockDataSizeImplementationBitsWorkaround(GLenum target, TextureFormat format); + #endif + static void MAGNUM_LOCAL unbindImplementationDefault(GLint textureUnit); #ifndef MAGNUM_TARGET_GLES static void MAGNUM_LOCAL unbindImplementationMulti(GLint textureUnit); diff --git a/src/Magnum/Implementation/TextureState.cpp b/src/Magnum/Implementation/TextureState.cpp index c3073daa3..98e4fd30d 100644 --- a/src/Magnum/Implementation/TextureState.cpp +++ b/src/Magnum/Implementation/TextureState.cpp @@ -374,6 +374,15 @@ TextureState::TextureState(Context& context, std::vector& extension setMaxAnisotropyImplementation = &AbstractTexture::setMaxAnisotropyImplementationExt; } else setMaxAnisotropyImplementation = &AbstractTexture::setMaxAnisotropyImplementationNoOp; + #ifndef MAGNUM_TARGET_GLES + /* NVidia workaround for compressed block data size implementation */ + if((context.detectedDriver() & Context::DetectedDriver::NVidia) && + !context.isDriverWorkaroundDisabled("nv-compressed-block-size-in-bits")) + compressedBlockDataSizeImplementation = &AbstractTexture::compressedBlockDataSizeImplementationBitsWorkaround; + else + compressedBlockDataSizeImplementation = &AbstractTexture::compressedBlockDataSizeImplementationDefault; + #endif + /* Resize bindings array to hold all possible texture units */ glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTextureUnits); CORRADE_INTERNAL_ASSERT(maxTextureUnits > 0); diff --git a/src/Magnum/Implementation/TextureState.h b/src/Magnum/Implementation/TextureState.h index 475c62b27..f34a234b7 100644 --- a/src/Magnum/Implementation/TextureState.h +++ b/src/Magnum/Implementation/TextureState.h @@ -45,6 +45,7 @@ struct TextureState { void reset(); + Int(*compressedBlockDataSizeImplementation)(GLenum, TextureFormat); void(*unbindImplementation)(GLint); void(*bindMultiImplementation)(GLint, Containers::ArrayView); void(AbstractTexture::*createImplementation)(); diff --git a/src/Magnum/Implementation/driverSpecific.cpp b/src/Magnum/Implementation/driverSpecific.cpp index a07246c4c..1469a4647 100644 --- a/src/Magnum/Implementation/driverSpecific.cpp +++ b/src/Magnum/Implementation/driverSpecific.cpp @@ -52,6 +52,10 @@ namespace { newer GLSL version. */ "no-layout-qualifiers-on-old-glsl", + /* NVidia drivers (358.16) report compressed block size from internal + format query in bits instead of bytes */ + "nv-compressed-block-size-in-bits", + /* NVidia drivers (358.16) report different compressed image size for cubemaps based on whether the texture is immutable or not and not based on whether I'm querying all faces (ARB_DSA) or a single face