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