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