1 /****************************************************************************
2 **
3 ** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtGui module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39
40 #include "qopengltexturehelper_p.h"
41
42 #include <QOpenGLContext>
43 #include <private/qopenglextensions_p.h>
44
45 QT_BEGIN_NAMESPACE
46
QOpenGLTextureHelper(QOpenGLContext * context)47 QOpenGLTextureHelper::QOpenGLTextureHelper(QOpenGLContext *context)
48 {
49 functions = context->functions();
50 // Resolve EXT_direct_state_access entry points if present.
51
52 // However, disable it on some systems where DSA is known to be unreliable.
53 bool allowDSA = true;
54 const char *renderer = reinterpret_cast<const char *>(context->functions()->glGetString(GL_RENDERER));
55 // QTBUG-40653, QTBUG-44988
56 if (renderer && strstr(renderer, "AMD Radeon HD"))
57 allowDSA = false;
58
59 if (allowDSA && !context->isOpenGLES()
60 && context->hasExtension(QByteArrayLiteral("GL_EXT_direct_state_access"))) {
61 TextureParameteriEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , GLint )>(context->getProcAddress("glTextureParameteriEXT"));
62 TextureParameterivEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , const GLint *)>(context->getProcAddress("glTextureParameterivEXT"));
63 TextureParameterfEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , GLfloat )>(context->getProcAddress("glTextureParameterfEXT"));
64 TextureParameterfvEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , const GLfloat *)>(context->getProcAddress("glTextureParameterfvEXT"));
65 GenerateTextureMipmapEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum )>(context->getProcAddress("glGenerateTextureMipmapEXT"));
66 TextureStorage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei )>(context->getProcAddress("glTextureStorage3DEXT"));
67 TextureStorage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei )>(context->getProcAddress("glTextureStorage2DEXT"));
68 TextureStorage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei )>(context->getProcAddress("glTextureStorage1DEXT"));
69 TextureStorage3DMultisampleEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureStorage3DMultisampleEXT"));
70 TextureStorage2DMultisampleEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureStorage2DMultisampleEXT"));
71 TextureImage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureImage3DEXT"));
72 TextureImage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureImage2DEXT"));
73 TextureImage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureImage1DEXT"));
74 TextureSubImage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureSubImage3DEXT"));
75 TextureSubImage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLsizei , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureSubImage2DEXT"));
76 TextureSubImage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureSubImage1DEXT"));
77 CompressedTextureSubImage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureSubImage1DEXT"));
78 CompressedTextureSubImage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLsizei , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureSubImage2DEXT"));
79 CompressedTextureSubImage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureSubImage3DEXT"));
80 CompressedTextureImage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureImage1DEXT"));
81 CompressedTextureImage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureImage2DEXT"));
82 CompressedTextureImage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureImage3DEXT"));
83
84 // Use the real DSA functions
85 TextureParameteri = &QOpenGLTextureHelper::dsa_TextureParameteri;
86 TextureParameteriv = &QOpenGLTextureHelper::dsa_TextureParameteriv;
87 TextureParameterf = &QOpenGLTextureHelper::dsa_TextureParameterf;
88 TextureParameterfv = &QOpenGLTextureHelper::dsa_TextureParameterfv;
89 GenerateTextureMipmap = &QOpenGLTextureHelper::dsa_GenerateTextureMipmap;
90 TextureStorage3D = &QOpenGLTextureHelper::dsa_TextureStorage3D;
91 TextureStorage2D = &QOpenGLTextureHelper::dsa_TextureStorage2D;
92 TextureStorage1D = &QOpenGLTextureHelper::dsa_TextureStorage1D;
93 TextureStorage3DMultisample = &QOpenGLTextureHelper::dsa_TextureStorage3DMultisample;
94 TextureStorage2DMultisample = &QOpenGLTextureHelper::dsa_TextureStorage2DMultisample;
95 TextureImage3D = &QOpenGLTextureHelper::dsa_TextureImage3D;
96 TextureImage2D = &QOpenGLTextureHelper::dsa_TextureImage2D;
97 TextureImage1D = &QOpenGLTextureHelper::dsa_TextureImage1D;
98 TextureSubImage3D = &QOpenGLTextureHelper::dsa_TextureSubImage3D;
99 TextureSubImage2D = &QOpenGLTextureHelper::dsa_TextureSubImage2D;
100 TextureSubImage1D = &QOpenGLTextureHelper::dsa_TextureSubImage1D;
101 CompressedTextureSubImage1D = &QOpenGLTextureHelper::dsa_CompressedTextureSubImage1D;
102 CompressedTextureSubImage2D = &QOpenGLTextureHelper::dsa_CompressedTextureSubImage2D;
103 CompressedTextureSubImage3D = &QOpenGLTextureHelper::dsa_CompressedTextureSubImage3D;
104 CompressedTextureImage1D = &QOpenGLTextureHelper::dsa_CompressedTextureImage1D;
105 CompressedTextureImage2D = &QOpenGLTextureHelper::dsa_CompressedTextureImage2D;
106 CompressedTextureImage3D = &QOpenGLTextureHelper::dsa_CompressedTextureImage3D;
107 } else {
108 // Use our own DSA emulation
109 TextureParameteri = &QOpenGLTextureHelper::qt_TextureParameteri;
110 TextureParameteriv = &QOpenGLTextureHelper::qt_TextureParameteriv;
111 TextureParameterf = &QOpenGLTextureHelper::qt_TextureParameterf;
112 TextureParameterfv = &QOpenGLTextureHelper::qt_TextureParameterfv;
113 GenerateTextureMipmap = &QOpenGLTextureHelper::qt_GenerateTextureMipmap;
114 TextureStorage3D = &QOpenGLTextureHelper::qt_TextureStorage3D;
115 TextureStorage2D = &QOpenGLTextureHelper::qt_TextureStorage2D;
116 TextureStorage1D = &QOpenGLTextureHelper::qt_TextureStorage1D;
117 TextureStorage3DMultisample = &QOpenGLTextureHelper::qt_TextureStorage3DMultisample;
118 TextureStorage2DMultisample = &QOpenGLTextureHelper::qt_TextureStorage2DMultisample;
119 TextureImage3D = &QOpenGLTextureHelper::qt_TextureImage3D;
120 TextureImage2D = &QOpenGLTextureHelper::qt_TextureImage2D;
121 TextureImage1D = &QOpenGLTextureHelper::qt_TextureImage1D;
122 TextureSubImage3D = &QOpenGLTextureHelper::qt_TextureSubImage3D;
123 TextureSubImage2D = &QOpenGLTextureHelper::qt_TextureSubImage2D;
124 TextureSubImage1D = &QOpenGLTextureHelper::qt_TextureSubImage1D;
125 CompressedTextureSubImage1D = &QOpenGLTextureHelper::qt_CompressedTextureSubImage1D;
126 CompressedTextureSubImage2D = &QOpenGLTextureHelper::qt_CompressedTextureSubImage2D;
127 CompressedTextureSubImage3D = &QOpenGLTextureHelper::qt_CompressedTextureSubImage3D;
128 CompressedTextureImage1D = &QOpenGLTextureHelper::qt_CompressedTextureImage1D;
129 CompressedTextureImage2D = &QOpenGLTextureHelper::qt_CompressedTextureImage2D;
130 CompressedTextureImage3D = &QOpenGLTextureHelper::qt_CompressedTextureImage3D;
131 }
132
133 // Some DSA functions are part of NV_texture_multisample instead
134 if (!context->isOpenGLES()
135 && context->hasExtension(QByteArrayLiteral("GL_NV_texture_multisample"))) {
136 TextureImage3DMultisampleNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLint , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureImage3DMultisampleNV"));
137 TextureImage2DMultisampleNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLint , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureImage2DMultisampleNV"));
138
139 TextureImage3DMultisample = &QOpenGLTextureHelper::dsa_TextureImage3DMultisample;
140 TextureImage2DMultisample = &QOpenGLTextureHelper::dsa_TextureImage2DMultisample;
141 } else {
142 TextureImage3DMultisample = &QOpenGLTextureHelper::qt_TextureImage3DMultisample;
143 TextureImage2DMultisample = &QOpenGLTextureHelper::qt_TextureImage2DMultisample;
144 }
145
146 #if defined(QT_OPENGL_ES_2)
147 // Here we are targeting OpenGL ES 2.0+ only. This is likely using EGL, where,
148 // similarly to WGL, non-extension functions (i.e. any function that is part of the
149 // GLES spec) *may* not be queried via eglGetProcAddress.
150
151 // OpenGL 1.0
152 TexImage1D = 0;
153
154 // OpenGL 1.1
155 TexSubImage1D = 0;
156
157 // OpenGL 1.3
158 GetCompressedTexImage = 0;
159 CompressedTexSubImage1D = 0;
160 CompressedTexSubImage2D = ::glCompressedTexSubImage2D;
161 CompressedTexImage1D = 0;
162 CompressedTexImage2D = ::glCompressedTexImage2D;
163 ActiveTexture = ::glActiveTexture;
164
165 // OpenGL 3.0
166 GenerateMipmap = ::glGenerateMipmap;
167
168 // OpenGL 3.2
169 TexImage3DMultisample = 0;
170 TexImage2DMultisample = 0;
171
172 // OpenGL 4.2
173 QOpenGLContext *ctx = QOpenGLContext::currentContext();
174 if (ctx->format().majorVersion() >= 3) {
175 // OpenGL ES 3.0+ has immutable storage for 2D and 3D at least.
176 QOpenGLExtraFunctionsPrivate *extra = static_cast<QOpenGLExtensions *>(context->extraFunctions())->d();
177 TexStorage3D = extra->f.TexStorage3D;
178 TexStorage2D = extra->f.TexStorage2D;
179 } else {
180 TexStorage3D = 0;
181 TexStorage2D = 0;
182 }
183 TexStorage1D = 0;
184
185 // OpenGL 4.3
186 TexStorage3DMultisample = 0;
187 TexStorage2DMultisample = 0;
188 TexBufferRange = 0;
189 TextureView = 0;
190
191 // OpenGL ES 3.1+ has TexStorage2DMultisample
192 if (ctx->format().version() >= qMakePair(3, 1)) {
193 QOpenGLExtraFunctionsPrivate *extra = static_cast<QOpenGLExtensions *>(context->extraFunctions())->d();
194 TexStorage2DMultisample = extra->f.TexStorage2DMultisample;
195 }
196
197 #endif
198
199 if (context->isOpenGLES() && context->hasExtension(QByteArrayLiteral("GL_OES_texture_3D"))) {
200 TexImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid*)>(context->getProcAddress("glTexImage3DOES"));
201 TexSubImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid*)>(context->getProcAddress("glTexSubImage3DOES"));
202 CompressedTexImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid*)>(context->getProcAddress("glCompressedTexImage3DOES"));
203 CompressedTexSubImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid*)>(context->getProcAddress("glCompressedTexSubImage3DOES"));
204 } else {
205 QOpenGLContext *ctx = QOpenGLContext::currentContext();
206 if (ctx->isOpenGLES() && ctx->format().majorVersion() >= 3) {
207 // OpenGL ES 3.0+ has glTexImage3D.
208 QOpenGLExtraFunctionsPrivate *extra = static_cast<QOpenGLExtensions *>(context->extraFunctions())->d();
209 TexImage3D = extra->f.TexImage3D;
210 TexSubImage3D = extra->f.TexSubImage3D;
211 CompressedTexImage3D = extra->f.CompressedTexImage3D;
212 CompressedTexSubImage3D = extra->f.CompressedTexSubImage3D;
213 } else {
214 // OpenGL 1.2
215 TexImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLsizei , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTexImage3D"));
216 TexSubImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTexSubImage3D"));
217
218 // OpenGL 1.3
219 CompressedTexImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLenum , GLsizei , GLsizei , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexImage3D"));
220 CompressedTexSubImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexSubImage3D"));
221 }
222 }
223
224 #ifndef QT_OPENGL_ES_2
225 // OpenGL 1.0 and 1.1
226 TexImage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTexImage1D"));
227 TexSubImage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTexSubImage1D"));\
228
229 // OpenGL 1.3
230 GetCompressedTexImage = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLvoid *)>(context->getProcAddress("glGetCompressedTexImage"));
231 CompressedTexSubImage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexSubImage1D"));
232 CompressedTexSubImage2D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLint , GLsizei , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexSubImage2D"));
233 CompressedTexImage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLenum , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexImage1D"));
234 CompressedTexImage2D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLenum , GLsizei , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexImage2D"));
235 ActiveTexture = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum )>(context->getProcAddress("glActiveTexture"));
236
237 // OpenGL 3.0
238 GenerateMipmap = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum )>(context->getProcAddress("glGenerateMipmap"));
239
240 // OpenGL 3.2
241 TexImage3DMultisample = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLint , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexImage3DMultisample"));
242 TexImage2DMultisample = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLint , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexImage2DMultisample"));
243
244 // OpenGL 4.2
245 TexStorage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei )>(context->getProcAddress("glTexStorage3D"));
246 TexStorage2D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei )>(context->getProcAddress("glTexStorage2D"));
247 TexStorage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei )>(context->getProcAddress("glTexStorage1D"));
248
249 // OpenGL 4.3
250 TexStorage3DMultisample = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexStorage3DMultisample"));
251 TexStorage2DMultisample = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexStorage2DMultisample"));
252 TexBufferRange = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLenum , GLuint , GLintptr , GLsizeiptr )>(context->getProcAddress("glTexBufferRange"));
253 TextureView = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLuint , GLenum , GLuint , GLuint , GLuint , GLuint )>(context->getProcAddress("glTextureView"));
254 #endif
255 }
256
dsa_TextureParameteri(GLuint texture,GLenum target,GLenum bindingTarget,GLenum pname,GLint param)257 void QOpenGLTextureHelper::dsa_TextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param)
258 {
259 Q_UNUSED(bindingTarget);
260 TextureParameteriEXT(texture, target, pname, param);
261 }
262
dsa_TextureParameteriv(GLuint texture,GLenum target,GLenum bindingTarget,GLenum pname,const GLint * params)263 void QOpenGLTextureHelper::dsa_TextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params)
264 {
265 Q_UNUSED(bindingTarget);
266 TextureParameterivEXT(texture, target, pname, params);
267 }
268
dsa_TextureParameterf(GLuint texture,GLenum target,GLenum bindingTarget,GLenum pname,GLfloat param)269 void QOpenGLTextureHelper::dsa_TextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param)
270 {
271 Q_UNUSED(bindingTarget);
272 TextureParameterfEXT(texture, target, pname, param);
273 }
274
dsa_TextureParameterfv(GLuint texture,GLenum target,GLenum bindingTarget,GLenum pname,const GLfloat * params)275 void QOpenGLTextureHelper::dsa_TextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params)
276 {
277 Q_UNUSED(bindingTarget);
278 TextureParameterfvEXT(texture, target, pname, params);
279 }
280
dsa_GenerateTextureMipmap(GLuint texture,GLenum target,GLenum bindingTarget)281 void QOpenGLTextureHelper::dsa_GenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget)
282 {
283 Q_UNUSED(bindingTarget);
284 GenerateTextureMipmapEXT(texture, target);
285 }
286
dsa_TextureStorage3D(GLuint texture,GLenum target,GLenum bindingTarget,GLsizei levels,GLenum internalFormat,GLsizei width,GLsizei height,GLsizei depth)287 void QOpenGLTextureHelper::dsa_TextureStorage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth)
288 {
289 Q_UNUSED(bindingTarget);
290 TextureStorage3DEXT(texture, target, levels, internalFormat, width, height, depth);
291 }
292
dsa_TextureStorage2D(GLuint texture,GLenum target,GLenum bindingTarget,GLsizei levels,GLenum internalFormat,GLsizei width,GLsizei height)293 void QOpenGLTextureHelper::dsa_TextureStorage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height)
294 {
295 Q_UNUSED(bindingTarget);
296 TextureStorage2DEXT(texture, target, levels, internalFormat, width, height);
297 }
298
dsa_TextureStorage1D(GLuint texture,GLenum target,GLenum bindingTarget,GLsizei levels,GLenum internalFormat,GLsizei width)299 void QOpenGLTextureHelper::dsa_TextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width)
300 {
301 Q_UNUSED(bindingTarget);
302 TextureStorage1DEXT(texture, target, levels, internalFormat, width);
303 }
304
dsa_TextureStorage3DMultisample(GLuint texture,GLenum target,GLenum bindingTarget,GLsizei samples,GLenum internalFormat,GLsizei width,GLsizei height,GLsizei depth,GLboolean fixedSampleLocations)305 void QOpenGLTextureHelper::dsa_TextureStorage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
306 {
307 Q_UNUSED(bindingTarget);
308 TextureStorage3DMultisampleEXT(texture, target, samples, internalFormat, width, height, depth, fixedSampleLocations);
309 }
310
dsa_TextureStorage2DMultisample(GLuint texture,GLenum target,GLenum bindingTarget,GLsizei samples,GLenum internalFormat,GLsizei width,GLsizei height,GLboolean fixedSampleLocations)311 void QOpenGLTextureHelper::dsa_TextureStorage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
312 {
313 Q_UNUSED(bindingTarget);
314 TextureStorage2DMultisampleEXT(texture, target, samples, internalFormat, width, height, fixedSampleLocations);
315 }
316
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)317 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)
318 {
319 Q_UNUSED(bindingTarget);
320 TextureImage3DEXT(texture, target, level, internalFormat, width, height, depth, border, format, type, pixels);
321 }
322
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)323 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)
324 {
325 Q_UNUSED(bindingTarget);
326 TextureImage2DEXT(texture, target, level, internalFormat, width, height, border, format, type, pixels);
327 }
328
dsa_TextureImage1D(GLuint texture,GLenum target,GLenum bindingTarget,GLint level,GLenum internalFormat,GLsizei width,GLint border,GLenum format,GLenum type,const GLvoid * pixels)329 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)
330 {
331 Q_UNUSED(bindingTarget);
332 TextureImage1DEXT(texture, target, level, internalFormat, width, border, format, type, pixels);
333 }
334
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)335 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)
336 {
337 Q_UNUSED(bindingTarget);
338 TextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
339 }
340
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)341 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)
342 {
343 Q_UNUSED(bindingTarget);
344 TextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, pixels);
345 }
346
dsa_TextureSubImage1D(GLuint texture,GLenum target,GLenum bindingTarget,GLint level,GLint xoffset,GLsizei width,GLenum format,GLenum type,const GLvoid * pixels)347 void QOpenGLTextureHelper::dsa_TextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
348 {
349 Q_UNUSED(bindingTarget);
350 TextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, pixels);
351 }
352
dsa_TextureImage3DMultisample(GLuint texture,GLenum target,GLenum bindingTarget,GLsizei samples,GLint internalFormat,GLsizei width,GLsizei height,GLsizei depth,GLboolean fixedSampleLocations)353 void QOpenGLTextureHelper::dsa_TextureImage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
354 {
355 Q_UNUSED(bindingTarget);
356 TextureImage3DMultisampleNV(texture, target, samples, internalFormat, width, height, depth, fixedSampleLocations);
357 }
358
dsa_TextureImage2DMultisample(GLuint texture,GLenum target,GLenum bindingTarget,GLsizei samples,GLint internalFormat,GLsizei width,GLsizei height,GLboolean fixedSampleLocations)359 void QOpenGLTextureHelper::dsa_TextureImage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
360 {
361 Q_UNUSED(bindingTarget);
362 TextureImage2DMultisampleNV(texture, target, samples, internalFormat, width, height, fixedSampleLocations);
363 }
364
dsa_CompressedTextureSubImage1D(GLuint texture,GLenum target,GLenum bindingTarget,GLint level,GLint xoffset,GLsizei width,GLenum format,GLsizei imageSize,const GLvoid * bits)365 void QOpenGLTextureHelper::dsa_CompressedTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits)
366 {
367 Q_UNUSED(bindingTarget);
368 CompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, imageSize, bits);
369 }
370
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)371 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)
372 {
373 Q_UNUSED(bindingTarget);
374 CompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, imageSize, bits);
375 }
376
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)377 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)
378 {
379 Q_UNUSED(bindingTarget);
380 CompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);
381 }
382
dsa_CompressedTextureImage1D(GLuint texture,GLenum target,GLenum bindingTarget,GLint level,GLenum internalFormat,GLsizei width,GLint border,GLsizei imageSize,const GLvoid * bits)383 void QOpenGLTextureHelper::dsa_CompressedTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits)
384 {
385 Q_UNUSED(bindingTarget);
386 CompressedTextureImage1DEXT(texture, target, level, internalFormat, width, border, imageSize, bits);
387 }
388
dsa_CompressedTextureImage2D(GLuint texture,GLenum target,GLenum bindingTarget,GLint level,GLenum internalFormat,GLsizei width,GLsizei height,GLint border,GLsizei imageSize,const GLvoid * bits)389 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)
390 {
391 Q_UNUSED(bindingTarget);
392 CompressedTextureImage2DEXT(texture, target, level, internalFormat, width, height, border, imageSize, bits);
393 }
394
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)395 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)
396 {
397 Q_UNUSED(bindingTarget);
398 CompressedTextureImage3DEXT(texture, target, level, internalFormat, width, height, depth, border, imageSize, bits);
399 }
400
401 namespace {
402
403 class TextureBinder
404 {
405 public:
TextureBinder(QOpenGLFunctions * functions,GLuint texture,GLenum target,GLenum bindingTarget)406 TextureBinder(QOpenGLFunctions *functions, GLuint texture, GLenum target, GLenum bindingTarget)
407 : m_functions(functions)
408 {
409 // For cubemaps we can't use the standard DSA emulation as it is illegal to
410 // try to bind a texture to one of the cubemap face targets. So we force the
411 // target and binding target to the cubemap values in this case.
412 switch (target) {
413 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
414 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
415 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
416 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
417 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
418 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
419 bindingTarget = GL_TEXTURE_BINDING_CUBE_MAP;
420 m_target = GL_TEXTURE_CUBE_MAP;
421 break;
422
423 default:
424 m_target = target;
425 break;
426 }
427
428 m_functions->glGetIntegerv(bindingTarget, &m_oldTexture);
429 m_functions->glBindTexture(m_target, texture);
430 }
431
~TextureBinder()432 ~TextureBinder()
433 {
434 m_functions->glBindTexture(m_target, m_oldTexture);
435 }
436
437 private:
438 QOpenGLFunctions *m_functions;
439 GLenum m_target;
440 GLint m_oldTexture;
441 };
442
443 } // namespace
444
qt_TextureParameteri(GLuint texture,GLenum target,GLenum bindingTarget,GLenum pname,GLint param)445 void QOpenGLTextureHelper::qt_TextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param)
446 {
447 TextureBinder binder(functions, texture, target, bindingTarget);
448 functions->glTexParameteri(target, pname, param);
449 }
450
qt_TextureParameteriv(GLuint texture,GLenum target,GLenum bindingTarget,GLenum pname,const GLint * params)451 void QOpenGLTextureHelper::qt_TextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params)
452 {
453 TextureBinder binder(functions, texture, target, bindingTarget);
454 functions->glTexParameteriv(target, pname, params);
455 }
456
qt_TextureParameterf(GLuint texture,GLenum target,GLenum bindingTarget,GLenum pname,GLfloat param)457 void QOpenGLTextureHelper::qt_TextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param)
458 {
459 TextureBinder binder(functions, texture, target, bindingTarget);
460 functions->glTexParameterf(target, pname, param);
461 }
462
qt_TextureParameterfv(GLuint texture,GLenum target,GLenum bindingTarget,GLenum pname,const GLfloat * params)463 void QOpenGLTextureHelper::qt_TextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params)
464 {
465 TextureBinder binder(functions, texture, target, bindingTarget);
466 functions->glTexParameterfv(target, pname, params);
467 }
468
qt_GenerateTextureMipmap(GLuint texture,GLenum target,GLenum bindingTarget)469 void QOpenGLTextureHelper::qt_GenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget)
470 {
471 TextureBinder binder(functions, texture, target, bindingTarget);
472 functions->glGenerateMipmap(target);
473 }
474
qt_TextureStorage3D(GLuint texture,GLenum target,GLenum bindingTarget,GLsizei levels,GLenum internalFormat,GLsizei width,GLsizei height,GLsizei depth)475 void QOpenGLTextureHelper::qt_TextureStorage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth)
476 {
477 TextureBinder binder(functions, texture, target, bindingTarget);
478 glTexStorage3D(target, levels, internalFormat, width, height, depth);
479 }
480
qt_TextureStorage2D(GLuint texture,GLenum target,GLenum bindingTarget,GLsizei levels,GLenum internalFormat,GLsizei width,GLsizei height)481 void QOpenGLTextureHelper::qt_TextureStorage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height)
482 {
483 TextureBinder binder(functions, texture, target, bindingTarget);
484 glTexStorage2D(target, levels, internalFormat, width, height);
485 }
486
qt_TextureStorage1D(GLuint texture,GLenum target,GLenum bindingTarget,GLsizei levels,GLenum internalFormat,GLsizei width)487 void QOpenGLTextureHelper::qt_TextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width)
488 {
489 TextureBinder binder(functions, texture, target, bindingTarget);
490 glTexStorage1D(target, levels, internalFormat, width);
491 }
492
qt_TextureStorage3DMultisample(GLuint texture,GLenum target,GLenum bindingTarget,GLsizei samples,GLenum internalFormat,GLsizei width,GLsizei height,GLsizei depth,GLboolean fixedSampleLocations)493 void QOpenGLTextureHelper::qt_TextureStorage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
494 {
495 TextureBinder binder(functions, texture, target, bindingTarget);
496 glTexStorage3DMultisample(target, samples, internalFormat, width, height, depth, fixedSampleLocations);
497 }
498
qt_TextureStorage2DMultisample(GLuint texture,GLenum target,GLenum bindingTarget,GLsizei samples,GLenum internalFormat,GLsizei width,GLsizei height,GLboolean fixedSampleLocations)499 void QOpenGLTextureHelper::qt_TextureStorage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
500 {
501 TextureBinder binder(functions, texture, target, bindingTarget);
502 glTexStorage2DMultisample(target, samples, internalFormat, width, height, fixedSampleLocations);
503 }
504
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)505 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)
506 {
507 TextureBinder binder(functions, texture, target, bindingTarget);
508 glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, pixels);
509 }
510
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)511 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)
512 {
513 TextureBinder binder(functions, texture, target, bindingTarget);
514 functions->glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels);
515 }
516
qt_TextureImage1D(GLuint texture,GLenum target,GLenum bindingTarget,GLint level,GLenum internalFormat,GLsizei width,GLint border,GLenum format,GLenum type,const GLvoid * pixels)517 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)
518 {
519 TextureBinder binder(functions, texture, target, bindingTarget);
520 glTexImage1D(target, level, internalFormat, width, border, format, type, pixels);
521 }
522
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)523 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)
524 {
525 TextureBinder binder(functions, texture, target, bindingTarget);
526 glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
527 }
528
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)529 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)
530 {
531 TextureBinder binder(functions, texture, target, bindingTarget);
532 functions->glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
533 }
534
qt_TextureSubImage1D(GLuint texture,GLenum target,GLenum bindingTarget,GLint level,GLint xoffset,GLsizei width,GLenum format,GLenum type,const GLvoid * pixels)535 void QOpenGLTextureHelper::qt_TextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
536 {
537 TextureBinder binder(functions, texture, target, bindingTarget);
538 glTexSubImage1D(target, level, xoffset, width, format, type, pixels);
539 }
540
qt_TextureImage3DMultisample(GLuint texture,GLenum target,GLenum bindingTarget,GLsizei samples,GLint internalFormat,GLsizei width,GLsizei height,GLsizei depth,GLboolean fixedSampleLocations)541 void QOpenGLTextureHelper::qt_TextureImage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
542 {
543 TextureBinder binder(functions, texture, target, bindingTarget);
544 glTexImage3DMultisample(target, samples, internalFormat, width, height, depth, fixedSampleLocations);
545 }
546
qt_TextureImage2DMultisample(GLuint texture,GLenum target,GLenum bindingTarget,GLsizei samples,GLint internalFormat,GLsizei width,GLsizei height,GLboolean fixedSampleLocations)547 void QOpenGLTextureHelper::qt_TextureImage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
548 {
549 TextureBinder binder(functions, texture, target, bindingTarget);
550 glTexImage2DMultisample(target, samples, internalFormat, width, height, fixedSampleLocations);
551 }
552
qt_CompressedTextureSubImage1D(GLuint texture,GLenum target,GLenum bindingTarget,GLint level,GLint xoffset,GLsizei width,GLenum format,GLsizei imageSize,const GLvoid * bits)553 void QOpenGLTextureHelper::qt_CompressedTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits)
554 {
555 TextureBinder binder(functions, texture, target, bindingTarget);
556 glCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, bits);
557 }
558
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)559 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)
560 {
561 TextureBinder binder(functions, texture, target, bindingTarget);
562 glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, bits);
563 }
564
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)565 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)
566 {
567 TextureBinder binder(functions, texture, target, bindingTarget);
568 glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);
569 }
570
qt_CompressedTextureImage1D(GLuint texture,GLenum target,GLenum bindingTarget,GLint level,GLenum internalFormat,GLsizei width,GLint border,GLsizei imageSize,const GLvoid * bits)571 void QOpenGLTextureHelper::qt_CompressedTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits)
572 {
573 TextureBinder binder(functions, texture, target, bindingTarget);
574 glCompressedTexImage1D(target, level, internalFormat, width, border, imageSize, bits);
575 }
576
qt_CompressedTextureImage2D(GLuint texture,GLenum target,GLenum bindingTarget,GLint level,GLenum internalFormat,GLsizei width,GLsizei height,GLint border,GLsizei imageSize,const GLvoid * bits)577 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)
578 {
579 TextureBinder binder(functions, texture, target, bindingTarget);
580 glCompressedTexImage2D(target, level, internalFormat, width, height, border, imageSize, bits);
581 }
582
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)583 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)
584 {
585 TextureBinder binder(functions, texture, target, bindingTarget);
586 glCompressedTexImage3D(target, level, internalFormat, width, height, depth, border, imageSize, bits);
587 }
588
589 QT_END_NAMESPACE
590