/**************************************************************************** ** ** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB). ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtGui module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or (at your option) the GNU General ** Public license version 3 or any later version approved by the KDE Free ** Qt Foundation. The licenses are as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-2.0.html and ** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qopengltexturehelper_p.h" #include #include QT_BEGIN_NAMESPACE QOpenGLTextureHelper::QOpenGLTextureHelper(QOpenGLContext *context) { functions = context->functions(); // Resolve EXT_direct_state_access entry points if present. // However, disable it on some systems where DSA is known to be unreliable. bool allowDSA = true; const char *renderer = reinterpret_cast(context->functions()->glGetString(GL_RENDERER)); // QTBUG-40653, QTBUG-44988 if (renderer && strstr(renderer, "AMD Radeon HD")) allowDSA = false; if (allowDSA && !context->isOpenGLES() && context->hasExtension(QByteArrayLiteral("GL_EXT_direct_state_access"))) { TextureParameteriEXT = reinterpret_cast(context->getProcAddress("glTextureParameteriEXT")); TextureParameterivEXT = reinterpret_cast(context->getProcAddress("glTextureParameterivEXT")); TextureParameterfEXT = reinterpret_cast(context->getProcAddress("glTextureParameterfEXT")); TextureParameterfvEXT = reinterpret_cast(context->getProcAddress("glTextureParameterfvEXT")); GenerateTextureMipmapEXT = reinterpret_cast(context->getProcAddress("glGenerateTextureMipmapEXT")); TextureStorage3DEXT = reinterpret_cast(context->getProcAddress("glTextureStorage3DEXT")); TextureStorage2DEXT = reinterpret_cast(context->getProcAddress("glTextureStorage2DEXT")); TextureStorage1DEXT = reinterpret_cast(context->getProcAddress("glTextureStorage1DEXT")); TextureStorage3DMultisampleEXT = reinterpret_cast(context->getProcAddress("glTextureStorage3DMultisampleEXT")); TextureStorage2DMultisampleEXT = reinterpret_cast(context->getProcAddress("glTextureStorage2DMultisampleEXT")); TextureImage3DEXT = reinterpret_cast(context->getProcAddress("glTextureImage3DEXT")); TextureImage2DEXT = reinterpret_cast(context->getProcAddress("glTextureImage2DEXT")); TextureImage1DEXT = reinterpret_cast(context->getProcAddress("glTextureImage1DEXT")); TextureSubImage3DEXT = reinterpret_cast(context->getProcAddress("glTextureSubImage3DEXT")); TextureSubImage2DEXT = reinterpret_cast(context->getProcAddress("glTextureSubImage2DEXT")); TextureSubImage1DEXT = reinterpret_cast(context->getProcAddress("glTextureSubImage1DEXT")); CompressedTextureSubImage1DEXT = reinterpret_cast(context->getProcAddress("glCompressedTextureSubImage1DEXT")); CompressedTextureSubImage2DEXT = reinterpret_cast(context->getProcAddress("glCompressedTextureSubImage2DEXT")); CompressedTextureSubImage3DEXT = reinterpret_cast(context->getProcAddress("glCompressedTextureSubImage3DEXT")); CompressedTextureImage1DEXT = reinterpret_cast(context->getProcAddress("glCompressedTextureImage1DEXT")); CompressedTextureImage2DEXT = reinterpret_cast(context->getProcAddress("glCompressedTextureImage2DEXT")); CompressedTextureImage3DEXT = reinterpret_cast(context->getProcAddress("glCompressedTextureImage3DEXT")); // Use the real DSA functions TextureParameteri = &QOpenGLTextureHelper::dsa_TextureParameteri; TextureParameteriv = &QOpenGLTextureHelper::dsa_TextureParameteriv; TextureParameterf = &QOpenGLTextureHelper::dsa_TextureParameterf; TextureParameterfv = &QOpenGLTextureHelper::dsa_TextureParameterfv; GenerateTextureMipmap = &QOpenGLTextureHelper::dsa_GenerateTextureMipmap; TextureStorage3D = &QOpenGLTextureHelper::dsa_TextureStorage3D; TextureStorage2D = &QOpenGLTextureHelper::dsa_TextureStorage2D; TextureStorage1D = &QOpenGLTextureHelper::dsa_TextureStorage1D; TextureStorage3DMultisample = &QOpenGLTextureHelper::dsa_TextureStorage3DMultisample; TextureStorage2DMultisample = &QOpenGLTextureHelper::dsa_TextureStorage2DMultisample; TextureImage3D = &QOpenGLTextureHelper::dsa_TextureImage3D; TextureImage2D = &QOpenGLTextureHelper::dsa_TextureImage2D; TextureImage1D = &QOpenGLTextureHelper::dsa_TextureImage1D; TextureSubImage3D = &QOpenGLTextureHelper::dsa_TextureSubImage3D; TextureSubImage2D = &QOpenGLTextureHelper::dsa_TextureSubImage2D; TextureSubImage1D = &QOpenGLTextureHelper::dsa_TextureSubImage1D; CompressedTextureSubImage1D = &QOpenGLTextureHelper::dsa_CompressedTextureSubImage1D; CompressedTextureSubImage2D = &QOpenGLTextureHelper::dsa_CompressedTextureSubImage2D; CompressedTextureSubImage3D = &QOpenGLTextureHelper::dsa_CompressedTextureSubImage3D; CompressedTextureImage1D = &QOpenGLTextureHelper::dsa_CompressedTextureImage1D; CompressedTextureImage2D = &QOpenGLTextureHelper::dsa_CompressedTextureImage2D; CompressedTextureImage3D = &QOpenGLTextureHelper::dsa_CompressedTextureImage3D; } else { // Use our own DSA emulation TextureParameteri = &QOpenGLTextureHelper::qt_TextureParameteri; TextureParameteriv = &QOpenGLTextureHelper::qt_TextureParameteriv; TextureParameterf = &QOpenGLTextureHelper::qt_TextureParameterf; TextureParameterfv = &QOpenGLTextureHelper::qt_TextureParameterfv; GenerateTextureMipmap = &QOpenGLTextureHelper::qt_GenerateTextureMipmap; TextureStorage3D = &QOpenGLTextureHelper::qt_TextureStorage3D; TextureStorage2D = &QOpenGLTextureHelper::qt_TextureStorage2D; TextureStorage1D = &QOpenGLTextureHelper::qt_TextureStorage1D; TextureStorage3DMultisample = &QOpenGLTextureHelper::qt_TextureStorage3DMultisample; TextureStorage2DMultisample = &QOpenGLTextureHelper::qt_TextureStorage2DMultisample; TextureImage3D = &QOpenGLTextureHelper::qt_TextureImage3D; TextureImage2D = &QOpenGLTextureHelper::qt_TextureImage2D; TextureImage1D = &QOpenGLTextureHelper::qt_TextureImage1D; TextureSubImage3D = &QOpenGLTextureHelper::qt_TextureSubImage3D; TextureSubImage2D = &QOpenGLTextureHelper::qt_TextureSubImage2D; TextureSubImage1D = &QOpenGLTextureHelper::qt_TextureSubImage1D; CompressedTextureSubImage1D = &QOpenGLTextureHelper::qt_CompressedTextureSubImage1D; CompressedTextureSubImage2D = &QOpenGLTextureHelper::qt_CompressedTextureSubImage2D; CompressedTextureSubImage3D = &QOpenGLTextureHelper::qt_CompressedTextureSubImage3D; CompressedTextureImage1D = &QOpenGLTextureHelper::qt_CompressedTextureImage1D; CompressedTextureImage2D = &QOpenGLTextureHelper::qt_CompressedTextureImage2D; CompressedTextureImage3D = &QOpenGLTextureHelper::qt_CompressedTextureImage3D; } // Some DSA functions are part of NV_texture_multisample instead if (!context->isOpenGLES() && context->hasExtension(QByteArrayLiteral("GL_NV_texture_multisample"))) { TextureImage3DMultisampleNV = reinterpret_cast(context->getProcAddress("glTextureImage3DMultisampleNV")); TextureImage2DMultisampleNV = reinterpret_cast(context->getProcAddress("glTextureImage2DMultisampleNV")); TextureImage3DMultisample = &QOpenGLTextureHelper::dsa_TextureImage3DMultisample; TextureImage2DMultisample = &QOpenGLTextureHelper::dsa_TextureImage2DMultisample; } else { TextureImage3DMultisample = &QOpenGLTextureHelper::qt_TextureImage3DMultisample; TextureImage2DMultisample = &QOpenGLTextureHelper::qt_TextureImage2DMultisample; } #if defined(QT_OPENGL_ES_2) // Here we are targeting OpenGL ES 2.0+ only. This is likely using EGL, where, // similarly to WGL, non-extension functions (i.e. any function that is part of the // GLES spec) *may* not be queried via eglGetProcAddress. // OpenGL 1.0 TexImage1D = 0; // OpenGL 1.1 TexSubImage1D = 0; // OpenGL 1.3 GetCompressedTexImage = 0; CompressedTexSubImage1D = 0; CompressedTexSubImage2D = ::glCompressedTexSubImage2D; CompressedTexImage1D = 0; CompressedTexImage2D = ::glCompressedTexImage2D; ActiveTexture = ::glActiveTexture; // OpenGL 3.0 GenerateMipmap = ::glGenerateMipmap; // OpenGL 3.2 TexImage3DMultisample = 0; TexImage2DMultisample = 0; // OpenGL 4.2 QOpenGLContext *ctx = QOpenGLContext::currentContext(); if (ctx->format().majorVersion() >= 3) { // OpenGL ES 3.0+ has immutable storage for 2D and 3D at least. QOpenGLExtraFunctionsPrivate *extra = static_cast(context->extraFunctions())->d(); TexStorage3D = extra->f.TexStorage3D; TexStorage2D = extra->f.TexStorage2D; } else { TexStorage3D = 0; TexStorage2D = 0; } TexStorage1D = 0; // OpenGL 4.3 TexStorage3DMultisample = 0; TexStorage2DMultisample = 0; TexBufferRange = 0; TextureView = 0; #endif if (context->isOpenGLES() && context->hasExtension(QByteArrayLiteral("GL_OES_texture_3D"))) { TexImage3D = reinterpret_cast(context->getProcAddress("glTexImage3DOES")); TexSubImage3D = reinterpret_cast(context->getProcAddress("glTexSubImage3DOES")); CompressedTexImage3D = reinterpret_cast(context->getProcAddress("glCompressedTexImage3DOES")); CompressedTexSubImage3D = reinterpret_cast(context->getProcAddress("glCompressedTexSubImage3DOES")); } else { QOpenGLContext *ctx = QOpenGLContext::currentContext(); if (ctx->isOpenGLES() && ctx->format().majorVersion() >= 3) { // OpenGL ES 3.0+ has glTexImage3D. QOpenGLExtraFunctionsPrivate *extra = static_cast(context->extraFunctions())->d(); TexImage3D = extra->f.TexImage3D; TexSubImage3D = extra->f.TexSubImage3D; CompressedTexImage3D = extra->f.CompressedTexImage3D; CompressedTexSubImage3D = extra->f.CompressedTexSubImage3D; } else { // OpenGL 1.2 TexImage3D = reinterpret_cast(context->getProcAddress("glTexImage3D")); TexSubImage3D = reinterpret_cast(context->getProcAddress("glTexSubImage3D")); // OpenGL 1.3 CompressedTexImage3D = reinterpret_cast(context->getProcAddress("glCompressedTexImage3D")); CompressedTexSubImage3D = reinterpret_cast(context->getProcAddress("glCompressedTexSubImage3D")); } } #ifndef QT_OPENGL_ES_2 // OpenGL 1.0 and 1.1 TexImage1D = reinterpret_cast(context->getProcAddress("glTexImage1D")); TexSubImage1D = reinterpret_cast(context->getProcAddress("glTexSubImage1D"));\ // OpenGL 1.3 GetCompressedTexImage = reinterpret_cast(context->getProcAddress("glGetCompressedTexImage")); CompressedTexSubImage1D = reinterpret_cast(context->getProcAddress("glCompressedTexSubImage1D")); CompressedTexSubImage2D = reinterpret_cast(context->getProcAddress("glCompressedTexSubImage2D")); CompressedTexImage1D = reinterpret_cast(context->getProcAddress("glCompressedTexImage1D")); CompressedTexImage2D = reinterpret_cast(context->getProcAddress("glCompressedTexImage2D")); ActiveTexture = reinterpret_cast(context->getProcAddress("glActiveTexture")); // OpenGL 3.0 GenerateMipmap = reinterpret_cast(context->getProcAddress("glGenerateMipmap")); // OpenGL 3.2 TexImage3DMultisample = reinterpret_cast(context->getProcAddress("glTexImage3DMultisample")); TexImage2DMultisample = reinterpret_cast(context->getProcAddress("glTexImage2DMultisample")); // OpenGL 4.2 TexStorage3D = reinterpret_cast(context->getProcAddress("glTexStorage3D")); TexStorage2D = reinterpret_cast(context->getProcAddress("glTexStorage2D")); TexStorage1D = reinterpret_cast(context->getProcAddress("glTexStorage1D")); // OpenGL 4.3 TexStorage3DMultisample = reinterpret_cast(context->getProcAddress("glTexStorage3DMultisample")); TexStorage2DMultisample = reinterpret_cast(context->getProcAddress("glTexStorage2DMultisample")); TexBufferRange = reinterpret_cast(context->getProcAddress("glTexBufferRange")); TextureView = reinterpret_cast(context->getProcAddress("glTextureView")); #endif } void QOpenGLTextureHelper::dsa_TextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param) { Q_UNUSED(bindingTarget); TextureParameteriEXT(texture, target, pname, param); } void QOpenGLTextureHelper::dsa_TextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params) { Q_UNUSED(bindingTarget); TextureParameterivEXT(texture, target, pname, params); } void QOpenGLTextureHelper::dsa_TextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param) { Q_UNUSED(bindingTarget); TextureParameterfEXT(texture, target, pname, param); } void QOpenGLTextureHelper::dsa_TextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params) { Q_UNUSED(bindingTarget); TextureParameterfvEXT(texture, target, pname, params); } void QOpenGLTextureHelper::dsa_GenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget) { Q_UNUSED(bindingTarget); GenerateTextureMipmapEXT(texture, target); } void QOpenGLTextureHelper::dsa_TextureStorage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth) { Q_UNUSED(bindingTarget); TextureStorage3DEXT(texture, target, levels, internalFormat, width, height, depth); } void QOpenGLTextureHelper::dsa_TextureStorage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height) { Q_UNUSED(bindingTarget); TextureStorage2DEXT(texture, target, levels, internalFormat, width, height); } void QOpenGLTextureHelper::dsa_TextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width) { Q_UNUSED(bindingTarget); TextureStorage1DEXT(texture, target, levels, internalFormat, width); } void QOpenGLTextureHelper::dsa_TextureStorage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations) { Q_UNUSED(bindingTarget); TextureStorage3DMultisampleEXT(texture, target, samples, internalFormat, width, height, depth, fixedSampleLocations); } void QOpenGLTextureHelper::dsa_TextureStorage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations) { Q_UNUSED(bindingTarget); TextureStorage2DMultisampleEXT(texture, target, samples, internalFormat, width, height, fixedSampleLocations); } void QOpenGLTextureHelper::dsa_TextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels) { Q_UNUSED(bindingTarget); TextureImage3DEXT(texture, target, level, internalFormat, width, height, depth, border, format, type, pixels); } void QOpenGLTextureHelper::dsa_TextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels) { Q_UNUSED(bindingTarget); TextureImage2DEXT(texture, target, level, internalFormat, width, height, border, format, type, pixels); } void QOpenGLTextureHelper::dsa_TextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels) { Q_UNUSED(bindingTarget); TextureImage1DEXT(texture, target, level, internalFormat, width, border, format, type, pixels); } void QOpenGLTextureHelper::dsa_TextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels) { Q_UNUSED(bindingTarget); TextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); } void QOpenGLTextureHelper::dsa_TextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) { Q_UNUSED(bindingTarget); TextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, pixels); } void QOpenGLTextureHelper::dsa_TextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels) { Q_UNUSED(bindingTarget); TextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, pixels); } void QOpenGLTextureHelper::dsa_TextureImage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations) { Q_UNUSED(bindingTarget); TextureImage3DMultisampleNV(texture, target, samples, internalFormat, width, height, depth, fixedSampleLocations); } void QOpenGLTextureHelper::dsa_TextureImage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations) { Q_UNUSED(bindingTarget); TextureImage2DMultisampleNV(texture, target, samples, internalFormat, width, height, fixedSampleLocations); } void QOpenGLTextureHelper::dsa_CompressedTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits) { Q_UNUSED(bindingTarget); CompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, imageSize, bits); } void QOpenGLTextureHelper::dsa_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits) { Q_UNUSED(bindingTarget); CompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, imageSize, bits); } void QOpenGLTextureHelper::dsa_CompressedTextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits) { Q_UNUSED(bindingTarget); CompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits); } void QOpenGLTextureHelper::dsa_CompressedTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits) { Q_UNUSED(bindingTarget); CompressedTextureImage1DEXT(texture, target, level, internalFormat, width, border, imageSize, bits); } void QOpenGLTextureHelper::dsa_CompressedTextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits) { Q_UNUSED(bindingTarget); CompressedTextureImage2DEXT(texture, target, level, internalFormat, width, height, border, imageSize, bits); } void QOpenGLTextureHelper::dsa_CompressedTextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits) { Q_UNUSED(bindingTarget); CompressedTextureImage3DEXT(texture, target, level, internalFormat, width, height, depth, border, imageSize, bits); } namespace { class TextureBinder { public: TextureBinder(QOpenGLFunctions *functions, GLuint texture, GLenum target, GLenum bindingTarget) : m_functions(functions) { // For cubemaps we can't use the standard DSA emulation as it is illegal to // try to bind a texture to one of the cubemap face targets. So we force the // target and binding target to the cubemap values in this case. switch (target) { case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: case GL_TEXTURE_CUBE_MAP_POSITIVE_X: case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: bindingTarget = GL_TEXTURE_BINDING_CUBE_MAP; m_target = GL_TEXTURE_CUBE_MAP; break; default: m_target = target; break; } m_functions->glGetIntegerv(bindingTarget, &m_oldTexture); m_functions->glBindTexture(m_target, texture); } ~TextureBinder() { m_functions->glBindTexture(m_target, m_oldTexture); } private: QOpenGLFunctions *m_functions; GLenum m_target; GLint m_oldTexture; }; } // namespace void QOpenGLTextureHelper::qt_TextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param) { TextureBinder binder(functions, texture, target, bindingTarget); functions->glTexParameteri(target, pname, param); } void QOpenGLTextureHelper::qt_TextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params) { TextureBinder binder(functions, texture, target, bindingTarget); functions->glTexParameteriv(target, pname, params); } void QOpenGLTextureHelper::qt_TextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param) { TextureBinder binder(functions, texture, target, bindingTarget); functions->glTexParameterf(target, pname, param); } void QOpenGLTextureHelper::qt_TextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params) { TextureBinder binder(functions, texture, target, bindingTarget); functions->glTexParameterfv(target, pname, params); } void QOpenGLTextureHelper::qt_GenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget) { TextureBinder binder(functions, texture, target, bindingTarget); functions->glGenerateMipmap(target); } void QOpenGLTextureHelper::qt_TextureStorage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth) { TextureBinder binder(functions, texture, target, bindingTarget); glTexStorage3D(target, levels, internalFormat, width, height, depth); } void QOpenGLTextureHelper::qt_TextureStorage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height) { TextureBinder binder(functions, texture, target, bindingTarget); glTexStorage2D(target, levels, internalFormat, width, height); } void QOpenGLTextureHelper::qt_TextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width) { TextureBinder binder(functions, texture, target, bindingTarget); glTexStorage1D(target, levels, internalFormat, width); } void QOpenGLTextureHelper::qt_TextureStorage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations) { TextureBinder binder(functions, texture, target, bindingTarget); glTexStorage3DMultisample(target, samples, internalFormat, width, height, depth, fixedSampleLocations); } void QOpenGLTextureHelper::qt_TextureStorage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations) { TextureBinder binder(functions, texture, target, bindingTarget); glTexStorage2DMultisample(target, samples, internalFormat, width, height, fixedSampleLocations); } void QOpenGLTextureHelper::qt_TextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels) { TextureBinder binder(functions, texture, target, bindingTarget); glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, pixels); } void QOpenGLTextureHelper::qt_TextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels) { TextureBinder binder(functions, texture, target, bindingTarget); functions->glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels); } void QOpenGLTextureHelper::qt_TextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels) { TextureBinder binder(functions, texture, target, bindingTarget); glTexImage1D(target, level, internalFormat, width, border, format, type, pixels); } void QOpenGLTextureHelper::qt_TextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels) { TextureBinder binder(functions, texture, target, bindingTarget); glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); } void QOpenGLTextureHelper::qt_TextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) { TextureBinder binder(functions, texture, target, bindingTarget); functions->glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); } void QOpenGLTextureHelper::qt_TextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels) { TextureBinder binder(functions, texture, target, bindingTarget); glTexSubImage1D(target, level, xoffset, width, format, type, pixels); } void QOpenGLTextureHelper::qt_TextureImage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations) { TextureBinder binder(functions, texture, target, bindingTarget); glTexImage3DMultisample(target, samples, internalFormat, width, height, depth, fixedSampleLocations); } void QOpenGLTextureHelper::qt_TextureImage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations) { TextureBinder binder(functions, texture, target, bindingTarget); glTexImage2DMultisample(target, samples, internalFormat, width, height, fixedSampleLocations); } void QOpenGLTextureHelper::qt_CompressedTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits) { TextureBinder binder(functions, texture, target, bindingTarget); glCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, bits); } void QOpenGLTextureHelper::qt_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits) { TextureBinder binder(functions, texture, target, bindingTarget); glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, bits); } void QOpenGLTextureHelper::qt_CompressedTextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits) { TextureBinder binder(functions, texture, target, bindingTarget); glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits); } void QOpenGLTextureHelper::qt_CompressedTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits) { TextureBinder binder(functions, texture, target, bindingTarget); glCompressedTexImage1D(target, level, internalFormat, width, border, imageSize, bits); } void QOpenGLTextureHelper::qt_CompressedTextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits) { TextureBinder binder(functions, texture, target, bindingTarget); glCompressedTexImage2D(target, level, internalFormat, width, height, border, imageSize, bits); } void QOpenGLTextureHelper::qt_CompressedTextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits) { TextureBinder binder(functions, texture, target, bindingTarget); glCompressedTexImage3D(target, level, internalFormat, width, height, depth, border, imageSize, bits); } QT_END_NAMESPACE