123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553 | // Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only#include"qopengltexturehelper_p.h"#include <QOpenGLContext>#include <private/qopenglextensions_p.h> 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<const char*>(context->functions()->glGetString(GL_RENDERER));// QTBUG-40653, QTBUG-44988if(renderer &&strstr(renderer,"AMD Radeon HD")) allowDSA =false;if(allowDSA && !context->isOpenGLES()&& context->hasExtension(QByteArrayLiteral("GL_EXT_direct_state_access"))) { TextureParameteriEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , GLint )>(context->getProcAddress("glTextureParameteriEXT")); TextureParameterivEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum ,const GLint *)>(context->getProcAddress("glTextureParameterivEXT")); TextureParameterfEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , GLfloat )>(context->getProcAddress("glTextureParameterfEXT")); TextureParameterfvEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum ,const GLfloat *)>(context->getProcAddress("glTextureParameterfvEXT")); GenerateTextureMipmapEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum )>(context->getProcAddress("glGenerateTextureMipmapEXT")); TextureStorage3DEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei )>(context->getProcAddress("glTextureStorage3DEXT")); TextureStorage2DEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei )>(context->getProcAddress("glTextureStorage2DEXT")); TextureStorage1DEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei )>(context->getProcAddress("glTextureStorage1DEXT")); TextureStorage3DMultisampleEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureStorage3DMultisampleEXT")); TextureStorage2DMultisampleEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureStorage2DMultisampleEXT")); TextureImage3DEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLsizei , GLint , GLenum , GLenum ,const GLvoid *)>(context->getProcAddress("glTextureImage3DEXT")); TextureImage2DEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLint , GLenum , GLenum ,const GLvoid *)>(context->getProcAddress("glTextureImage2DEXT")); TextureImage1DEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLint , GLenum , GLenum ,const GLvoid *)>(context->getProcAddress("glTextureImage1DEXT")); TextureSubImage3DEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLenum ,const GLvoid *)>(context->getProcAddress("glTextureSubImage3DEXT")); TextureSubImage2DEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLsizei , GLsizei , GLenum , GLenum ,const GLvoid *)>(context->getProcAddress("glTextureSubImage2DEXT")); TextureSubImage1DEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLsizei , GLenum , GLenum ,const GLvoid *)>(context->getProcAddress("glTextureSubImage1DEXT")); CompressedTextureSubImage1DEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLsizei , GLenum , GLsizei ,const GLvoid *)>(context->getProcAddress("glCompressedTextureSubImage1DEXT")); CompressedTextureSubImage2DEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLsizei , GLsizei , GLenum , GLsizei ,const GLvoid *)>(context->getProcAddress("glCompressedTextureSubImage2DEXT")); CompressedTextureSubImage3DEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLsizei ,const GLvoid *)>(context->getProcAddress("glCompressedTextureSubImage3DEXT")); CompressedTextureImage1DEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLint , GLsizei ,const GLvoid *)>(context->getProcAddress("glCompressedTextureImage1DEXT")); CompressedTextureImage2DEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLint , GLsizei ,const GLvoid *)>(context->getProcAddress("glCompressedTextureImage2DEXT")); CompressedTextureImage3DEXT =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLsizei , GLint , GLsizei ,const GLvoid *)>(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 insteadif(!context->isOpenGLES()&& context->hasExtension(QByteArrayLiteral("GL_NV_texture_multisample"))) { TextureImage3DMultisampleNV =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLint , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureImage3DMultisampleNV")); TextureImage2DMultisampleNV =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLint , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureImage2DMultisampleNV")); TextureImage3DMultisample = &QOpenGLTextureHelper::dsa_TextureImage3DMultisample; TextureImage2DMultisample = &QOpenGLTextureHelper::dsa_TextureImage2DMultisample;}else{ TextureImage3DMultisample = &QOpenGLTextureHelper::qt_TextureImage3DMultisample; TextureImage2DMultisample = &QOpenGLTextureHelper::qt_TextureImage2DMultisample;}#if QT_CONFIG(opengles2)// 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<QOpenGLExtensions *>(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;// OpenGL ES 3.1+ has TexStorage2DMultisampleif(ctx->format().version() >=std::pair(3,1)) { QOpenGLExtraFunctionsPrivate *extra =static_cast<QOpenGLExtensions *>(context->extraFunctions())->d(); TexStorage2DMultisample = extra->f.TexStorage2DMultisample;}#endifif(context->isOpenGLES() && context->hasExtension(QByteArrayLiteral("GL_OES_texture_3D"))) { TexImage3D =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum,const GLvoid*)>(context->getProcAddress("glTexImage3DOES")); TexSubImage3D =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum,const GLvoid*)>(context->getProcAddress("glTexSubImage3DOES")); CompressedTexImage3D =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei,const GLvoid*)>(context->getProcAddress("glCompressedTexImage3DOES")); CompressedTexSubImage3D =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei,const GLvoid*)>(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<QOpenGLExtensions *>(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<void(QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLsizei , GLsizei , GLint , GLenum , GLenum ,const GLvoid *)>(context->getProcAddress("glTexImage3D")); TexSubImage3D =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLenum ,const GLvoid *)>(context->getProcAddress("glTexSubImage3D"));// OpenGL 1.3 CompressedTexImage3D =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLint , GLenum , GLsizei , GLsizei , GLsizei , GLint , GLsizei ,const GLvoid *)>(context->getProcAddress("glCompressedTexImage3D")); CompressedTexSubImage3D =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLsizei ,const GLvoid *)>(context->getProcAddress("glCompressedTexSubImage3D"));}}#if !QT_CONFIG(opengles2)// OpenGL 1.0 and 1.1 TexImage1D =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLint , GLenum , GLenum ,const GLvoid *)>(context->getProcAddress("glTexImage1D")); TexSubImage1D =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLenum , GLenum ,const GLvoid *)>(context->getProcAddress("glTexSubImage1D"));\ // OpenGL 1.3 GetCompressedTexImage =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLint , GLvoid *)>(context->getProcAddress("glGetCompressedTexImage")); CompressedTexSubImage1D =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLenum , GLsizei ,const GLvoid *)>(context->getProcAddress("glCompressedTexSubImage1D")); CompressedTexSubImage2D =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLint , GLsizei , GLsizei , GLenum , GLsizei ,const GLvoid *)>(context->getProcAddress("glCompressedTexSubImage2D")); CompressedTexImage1D =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLint , GLenum , GLsizei , GLint , GLsizei ,const GLvoid *)>(context->getProcAddress("glCompressedTexImage1D")); CompressedTexImage2D =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLint , GLenum , GLsizei , GLsizei , GLint , GLsizei ,const GLvoid *)>(context->getProcAddress("glCompressedTexImage2D")); ActiveTexture =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum )>(context->getProcAddress("glActiveTexture"));// OpenGL 3.0 GenerateMipmap =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum )>(context->getProcAddress("glGenerateMipmap"));// OpenGL 3.2 TexImage3DMultisample =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLint , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexImage3DMultisample")); TexImage2DMultisample =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLint , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexImage2DMultisample"));// OpenGL 4.2 TexStorage3D =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei )>(context->getProcAddress("glTexStorage3D")); TexStorage2D =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei )>(context->getProcAddress("glTexStorage2D")); TexStorage1D =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei )>(context->getProcAddress("glTexStorage1D"));// OpenGL 4.3 TexStorage3DMultisample =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexStorage3DMultisample")); TexStorage2DMultisample =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexStorage2DMultisample")); TexBufferRange =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum , GLenum , GLuint , GLintptr , GLsizeiptr )>(context->getProcAddress("glTexBufferRange")); TextureView =reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLuint , GLenum , GLuint , GLenum , GLuint , GLuint , GLuint , GLuint )>(context->getProcAddress("glTextureView"));#endif}voidQOpenGLTextureHelper::dsa_TextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param){Q_UNUSED(bindingTarget);TextureParameteriEXT(texture, target, pname, param);}voidQOpenGLTextureHelper::dsa_TextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname,const GLint *params){Q_UNUSED(bindingTarget);TextureParameterivEXT(texture, target, pname, params);}voidQOpenGLTextureHelper::dsa_TextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param){Q_UNUSED(bindingTarget);TextureParameterfEXT(texture, target, pname, param);}voidQOpenGLTextureHelper::dsa_TextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname,const GLfloat *params){Q_UNUSED(bindingTarget);TextureParameterfvEXT(texture, target, pname, params);}voidQOpenGLTextureHelper::dsa_GenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget){Q_UNUSED(bindingTarget);GenerateTextureMipmapEXT(texture, target);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::dsa_TextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width){Q_UNUSED(bindingTarget);TextureStorage1DEXT(texture, target, levels, internalFormat, width);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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;};}// namespacevoidQOpenGLTextureHelper::qt_TextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param){ TextureBinder binder(functions, texture, target, bindingTarget); functions->glTexParameteri(target, pname, param);}voidQOpenGLTextureHelper::qt_TextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname,const GLint *params){ TextureBinder binder(functions, texture, target, bindingTarget); functions->glTexParameteriv(target, pname, params);}voidQOpenGLTextureHelper::qt_TextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param){ TextureBinder binder(functions, texture, target, bindingTarget); functions->glTexParameterf(target, pname, param);}voidQOpenGLTextureHelper::qt_TextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname,const GLfloat *params){ TextureBinder binder(functions, texture, target, bindingTarget); functions->glTexParameterfv(target, pname, params);}voidQOpenGLTextureHelper::qt_GenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget){ TextureBinder binder(functions, texture, target, bindingTarget); functions->glGenerateMipmap(target);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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);}voidQOpenGLTextureHelper::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
|