diff options
| author | Sean Harmer <sean.harmer@kdab.com> | 2014-02-13 16:39:30 +0000 |
|---|---|---|
| committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-02-14 14:36:10 +0100 |
| commit | 3232682d3b04ff16806fd8c5ad36271876a7b419 (patch) | |
| tree | 2d36117b6f8f20b1cffd23a873a9370a20aa6bbb /src/gui/opengl/qopengltexture.cpp | |
| parent | 4273c14e57d26cf2dde90ed9db1f463a25b327bd (diff) | |
OpenGL: Fix QOpenGLTexture for cubemaps with mutable storage
The code was not creating all of the storage necessary for cubemaps
as well as attempting to bind to the cubemap face targets which is
invalid when using mutable storage - typically on OS X where
EXT_direct_state_access is not available and immutable storage is only
available at all if using an OpenGL 4.1 context.
Change-Id: I4cf84f1b88c90e8359366392b3ccda65669ebfa7
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Reviewed-by: Pasi Keränen <pasi.keranen@digia.com>
Diffstat (limited to 'src/gui/opengl/qopengltexture.cpp')
| -rw-r--r-- | src/gui/opengl/qopengltexture.cpp | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/gui/opengl/qopengltexture.cpp b/src/gui/opengl/qopengltexture.cpp index 43acd0a0c36..8bdbdba6f76 100644 --- a/src/gui/opengl/qopengltexture.cpp +++ b/src/gui/opengl/qopengltexture.cpp @@ -347,7 +347,6 @@ void QOpenGLTexturePrivate::allocateMutableStorage() break; case QOpenGLTexture::Target2D: - case QOpenGLTexture::TargetCubeMap: case QOpenGLTexture::TargetRectangle: for (int level = 0; level < mipLevels; ++level) texFuncs->glTextureImage2D(textureId, target, bindingTarget, level, format, @@ -357,6 +356,29 @@ void QOpenGLTexturePrivate::allocateMutableStorage() QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, 0); break; + case QOpenGLTexture::TargetCubeMap: { + // Cubemaps are the odd one out. We have to allocate storage for each + // face and miplevel using the special cubemap face targets rather than + // GL_TARGET_CUBEMAP. + const QOpenGLTexture::CubeMapFace faceTargets[] = { + QOpenGLTexture::CubeMapPositiveX, QOpenGLTexture::CubeMapNegativeX, + QOpenGLTexture::CubeMapPositiveY, QOpenGLTexture::CubeMapNegativeY, + QOpenGLTexture::CubeMapPositiveZ, QOpenGLTexture::CubeMapNegativeZ + }; + + for (int faceTarget = 0; faceTarget < 6; ++faceTarget) { + for (int level = 0; level < mipLevels; ++level) { + texFuncs->glTextureImage2D(textureId, faceTargets[faceTarget], bindingTarget, + level, format, + mipLevelSize(level, dimensions[0]), + mipLevelSize(level, dimensions[1]), + 0, + QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, 0); + } + } + break; + } + case QOpenGLTexture::Target2DArray: if (features.testFlag(QOpenGLTexture::TextureArrays)) { for (int level = 0; level < mipLevels; ++level) |
