2 Copyright (C) 2010 Tieto Corporation.
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with this library; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 #include "GraphicsContext3D.h"
23 #include "WebGLObject.h"
24 #include "CanvasRenderingContext.h"
25 #include "Extensions3DQt.h"
26 #include "GraphicsContext.h"
27 #include "HTMLCanvasElement.h"
28 #include "HostWindow.h"
29 #include "ImageBuffer.h"
30 #include "NotImplemented.h"
31 #include "QWebPageClient.h"
32 #include <QAbstractScrollArea>
34 #include <wtf/UnusedParam.h>
35 #include <wtf/text/CString.h>
45 #if !defined(APIENTRY)
50 typedef GLsizeiptr GLsizeiptrType;
51 typedef GLintptr GLintptrType;
53 typedef ptrdiff_t GLsizeiptrType;
54 typedef ptrdiff_t GLintptrType;
57 typedef void (APIENTRY* glActiveTextureType) (GLenum);
58 typedef void (APIENTRY* glAttachShaderType) (GLuint, GLuint);
59 typedef void (APIENTRY* glBindAttribLocationType) (GLuint, GLuint, const char*);
60 typedef void (APIENTRY* glBindBufferType) (GLenum, GLuint);
61 typedef void (APIENTRY* glBindFramebufferType) (GLenum, GLuint);
62 typedef void (APIENTRY* glBindRenderbufferType) (GLenum, GLuint);
63 typedef void (APIENTRY* glBlendColorType) (GLclampf, GLclampf, GLclampf, GLclampf);
64 typedef void (APIENTRY* glBlendEquationType) (GLenum);
65 typedef void (APIENTRY* glBlendEquationSeparateType)(GLenum, GLenum);
66 typedef void (APIENTRY* glBlendFuncSeparateType)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
67 typedef void (APIENTRY* glBufferDataType) (GLenum, GLsizeiptrType, const GLvoid*, GLenum);
68 typedef void (APIENTRY* glBufferSubDataType) (GLenum, GLintptrType, GLsizeiptrType, const GLvoid*);
69 typedef GLenum (APIENTRY* glCheckFramebufferStatusType) (GLenum);
70 typedef void (APIENTRY* glCompileShaderType) (GLuint);
71 typedef GLuint (APIENTRY* glCreateProgramType) ();
72 typedef GLuint (APIENTRY* glCreateShaderType) (GLenum);
73 typedef void (APIENTRY* glDeleteBuffersType) (GLsizei, const GLuint*);
74 typedef void (APIENTRY* glDeleteFramebuffersType) (GLsizei n, const GLuint*);
75 typedef void (APIENTRY* glDeleteProgramType) (GLuint);
76 typedef void (APIENTRY* glDeleteRenderbuffersType) (GLsizei n, const GLuint*);
77 typedef void (APIENTRY* glDeleteShaderType) (GLuint);
78 typedef void (APIENTRY* glDetachShaderType) (GLuint, GLuint);
79 typedef void (APIENTRY* glDisableVertexAttribArrayType) (GLuint);
80 typedef void (APIENTRY* glEnableVertexAttribArrayType) (GLuint);
81 typedef void (APIENTRY* glFramebufferRenderbufferType) (GLenum, GLenum, GLenum, GLuint);
82 typedef void (APIENTRY* glFramebufferTexture2DType) (GLenum, GLenum, GLenum, GLuint, GLint);
83 typedef void (APIENTRY* glGenBuffersType) (GLsizei, GLuint*);
84 typedef void (APIENTRY* glGenerateMipmapType) (GLenum target);
85 typedef void (APIENTRY* glGenFramebuffersType) (GLsizei, GLuint*);
86 typedef void (APIENTRY* glGenRenderbuffersType) (GLsizei, GLuint*);
87 typedef void (APIENTRY* glGetActiveAttribType) (GLuint, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLchar*);
88 typedef void (APIENTRY* glGetActiveUniformType) (GLuint, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLchar*);
89 typedef void (APIENTRY* glGetAttachedShadersType) (GLuint, GLsizei, GLsizei*, GLuint*);
90 typedef GLint (APIENTRY* glGetAttribLocationType) (GLuint, const char*);
91 typedef void (APIENTRY* glGetBufferParameterivType) (GLenum, GLenum, GLint*);
92 typedef void (APIENTRY* glGetFramebufferAttachmentParameterivType) (GLenum, GLenum, GLenum, GLint* params);
93 typedef void (APIENTRY* glGetProgramInfoLogType) (GLuint, GLsizei, GLsizei*, char*);
94 typedef void (APIENTRY* glGetProgramivType) (GLuint, GLenum, GLint*);
95 typedef void (APIENTRY* glGetRenderbufferParameterivType) (GLenum, GLenum, GLint*);
96 typedef void (APIENTRY* glGetShaderInfoLogType) (GLuint, GLsizei, GLsizei*, char*);
97 typedef void (APIENTRY* glGetShaderivType) (GLuint, GLenum, GLint*);
98 typedef void (APIENTRY* glGetShaderSourceType) (GLuint, GLsizei, GLsizei*, char*);
99 typedef GLint (APIENTRY* glGetUniformLocationType) (GLuint, const char*);
100 typedef void (APIENTRY* glGetUniformfvType) (GLuint, GLint, GLfloat*);
101 typedef void (APIENTRY* glGetUniformivType) (GLuint, GLint, GLint*);
102 typedef void (APIENTRY* glGetVertexAttribfvType) (GLuint, GLenum, GLfloat*);
103 typedef void (APIENTRY* glGetVertexAttribivType) (GLuint, GLenum, GLint*);
104 typedef void (APIENTRY* glGetVertexAttribPointervType) (GLuint, GLenum, GLvoid**);
105 typedef GLboolean (APIENTRY* glIsBufferType) (GLuint);
106 typedef GLboolean (APIENTRY* glIsFramebufferType) (GLuint);
107 typedef GLboolean (APIENTRY* glIsProgramType) (GLuint);
108 typedef GLboolean (APIENTRY* glIsRenderbufferType) (GLuint);
109 typedef GLboolean (APIENTRY* glIsShaderType) (GLuint);
110 typedef void (APIENTRY* glLinkProgramType) (GLuint);
111 typedef void (APIENTRY* glRenderbufferStorageType) (GLenum, GLenum, GLsizei, GLsizei);
112 typedef void (APIENTRY* glSampleCoverageType) (GLclampf, GLboolean);
113 typedef void (APIENTRY* glShaderSourceType) (GLuint, GLsizei, const char**, const GLint*);
114 typedef void (APIENTRY* glStencilFuncSeparateType) (GLenum, GLenum, GLint, GLuint);
115 typedef void (APIENTRY* glStencilMaskSeparateType) (GLenum, GLuint);
116 typedef void (APIENTRY* glStencilOpSeparateType) (GLenum, GLenum, GLenum, GLenum);
117 typedef void (APIENTRY* glUniform1fType) (GLint, GLfloat);
118 typedef void (APIENTRY* glUniform1fvType) (GLint, GLsizei, const GLfloat*);
119 typedef void (APIENTRY* glUniform1iType) (GLint, GLint);
120 typedef void (APIENTRY* glUniform1ivType) (GLint, GLsizei, const GLint*);
121 typedef void (APIENTRY* glUniform2fType) (GLint, GLfloat, GLfloat);
122 typedef void (APIENTRY* glUniform2fvType) (GLint, GLsizei, const GLfloat*);
123 typedef void (APIENTRY* glUniform2iType) (GLint, GLint, GLint);
124 typedef void (APIENTRY* glUniform2ivType) (GLint, GLsizei, const GLint*);
125 typedef void (APIENTRY* glUniform3fType) (GLint, GLfloat, GLfloat, GLfloat);
126 typedef void (APIENTRY* glUniform3fvType) (GLint, GLsizei, const GLfloat*);
127 typedef void (APIENTRY* glUniform3iType) (GLint, GLint, GLint, GLint);
128 typedef void (APIENTRY* glUniform3ivType) (GLint, GLsizei, const GLint*);
129 typedef void (APIENTRY* glUniform4fType) (GLint, GLfloat, GLfloat, GLfloat, GLfloat);
130 typedef void (APIENTRY* glUniform4fvType) (GLint, GLsizei, const GLfloat*);
131 typedef void (APIENTRY* glUniform4iType) (GLint, GLint, GLint, GLint, GLint);
132 typedef void (APIENTRY* glUniform4ivType) (GLint, GLsizei, const GLint*);
133 typedef void (APIENTRY* glUniformMatrix2fvType) (GLint, GLsizei, GLboolean, const GLfloat*);
134 typedef void (APIENTRY* glUniformMatrix3fvType) (GLint, GLsizei, GLboolean, const GLfloat*);
135 typedef void (APIENTRY* glUniformMatrix4fvType) (GLint, GLsizei, GLboolean, const GLfloat*);
136 typedef void (APIENTRY* glUseProgramType) (GLuint);
137 typedef void (APIENTRY* glValidateProgramType) (GLuint);
138 typedef void (APIENTRY* glVertexAttrib1fType) (GLuint, const GLfloat);
139 typedef void (APIENTRY* glVertexAttrib1fvType) (GLuint, const GLfloat*);
140 typedef void (APIENTRY* glVertexAttrib2fType) (GLuint, const GLfloat, const GLfloat);
141 typedef void (APIENTRY* glVertexAttrib2fvType) (GLuint, const GLfloat*);
142 typedef void (APIENTRY* glVertexAttrib3fType) (GLuint, const GLfloat, const GLfloat, const GLfloat);
143 typedef void (APIENTRY* glVertexAttrib3fvType) (GLuint, const GLfloat*);
144 typedef void (APIENTRY* glVertexAttrib4fType) (GLuint, const GLfloat, const GLfloat, const GLfloat, const GLfloat);
145 typedef void (APIENTRY* glVertexAttrib4fvType) (GLuint, const GLfloat*);
146 typedef void (APIENTRY* glVertexAttribPointerType) (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid*);
148 class GraphicsContext3DInternal {
150 GraphicsContext3DInternal(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow);
151 ~GraphicsContext3DInternal();
153 bool isContextValid() { return m_contextValid; }
154 QGLWidget* getOwnerGLWidget(QWebPageClient* webPageClient);
156 glActiveTextureType activeTexture;
157 glAttachShaderType attachShader;
158 glBindAttribLocationType bindAttribLocation;
159 glBindBufferType bindBuffer;
160 glBindFramebufferType bindFramebuffer;
161 glBindRenderbufferType bindRenderbuffer;
162 glBlendColorType blendColor;
163 glBlendEquationType blendEquation;
164 glBlendEquationSeparateType blendEquationSeparate;
165 glBlendFuncSeparateType blendFuncSeparate;
166 glBufferDataType bufferData;
167 glBufferSubDataType bufferSubData;
168 glCheckFramebufferStatusType checkFramebufferStatus;
169 glCompileShaderType compileShader;
170 glCreateProgramType createProgram;
171 glCreateShaderType createShader;
172 glDeleteBuffersType deleteBuffers;
173 glDeleteFramebuffersType deleteFramebuffers;
174 glDeleteProgramType deleteProgram;
175 glDeleteRenderbuffersType deleteRenderbuffers;
176 glDeleteShaderType deleteShader;
177 glDetachShaderType detachShader;
178 glDisableVertexAttribArrayType disableVertexAttribArray;
179 glEnableVertexAttribArrayType enableVertexAttribArray;
180 glFramebufferRenderbufferType framebufferRenderbuffer;
181 glFramebufferTexture2DType framebufferTexture2D;
182 glGenBuffersType genBuffers;
183 glGenerateMipmapType generateMipmap;
184 glGenFramebuffersType genFramebuffers;
185 glGenRenderbuffersType genRenderbuffers;
186 glGetActiveAttribType getActiveAttrib;
187 glGetActiveUniformType getActiveUniform;
188 glGetAttachedShadersType getAttachedShaders;
189 glGetAttribLocationType getAttribLocation;
190 glGetBufferParameterivType getBufferParameteriv;
191 glGetFramebufferAttachmentParameterivType getFramebufferAttachmentParameteriv;
192 glGetProgramInfoLogType getProgramInfoLog;
193 glGetProgramivType getProgramiv;
194 glGetRenderbufferParameterivType getRenderbufferParameteriv;
195 glGetShaderInfoLogType getShaderInfoLog;
196 glGetShaderivType getShaderiv;
197 glGetShaderSourceType getShaderSource;
198 glGetUniformfvType getUniformfv;
199 glGetUniformivType getUniformiv;
200 glGetUniformLocationType getUniformLocation;
201 glGetVertexAttribfvType getVertexAttribfv;
202 glGetVertexAttribivType getVertexAttribiv;
203 glGetVertexAttribPointervType getVertexAttribPointerv;
204 glIsBufferType isBuffer;
205 glIsFramebufferType isFramebuffer;
206 glIsProgramType isProgram;
207 glIsRenderbufferType isRenderbuffer;
208 glIsShaderType isShader;
209 glLinkProgramType linkProgram;
210 glRenderbufferStorageType renderbufferStorage;
211 glSampleCoverageType sampleCoverage;
212 glShaderSourceType shaderSource;
213 glStencilFuncSeparateType stencilFuncSeparate;
214 glStencilMaskSeparateType stencilMaskSeparate;
215 glStencilOpSeparateType stencilOpSeparate;
216 glUniform1fType uniform1f;
217 glUniform1fvType uniform1fv;
218 glUniform1iType uniform1i;
219 glUniform1ivType uniform1iv;
220 glUniform2fType uniform2f;
221 glUniform2fvType uniform2fv;
222 glUniform2iType uniform2i;
223 glUniform2ivType uniform2iv;
224 glUniform3fType uniform3f;
225 glUniform3fvType uniform3fv;
226 glUniform3iType uniform3i;
227 glUniform3ivType uniform3iv;
228 glUniform4fType uniform4f;
229 glUniform4fvType uniform4fv;
230 glUniform4iType uniform4i;
231 glUniform4ivType uniform4iv;
232 glUniformMatrix2fvType uniformMatrix2fv;
233 glUniformMatrix3fvType uniformMatrix3fv;
234 glUniformMatrix4fvType uniformMatrix4fv;
235 glUseProgramType useProgram;
236 glValidateProgramType validateProgram;
237 glVertexAttrib1fType vertexAttrib1f;
238 glVertexAttrib1fvType vertexAttrib1fv;
239 glVertexAttrib2fType vertexAttrib2f;
240 glVertexAttrib2fvType vertexAttrib2fv;
241 glVertexAttrib3fType vertexAttrib3f;
242 glVertexAttrib3fvType vertexAttrib3fv;
243 glVertexAttrib4fType vertexAttrib4f;
244 glVertexAttrib4fvType vertexAttrib4fv;
245 glVertexAttribPointerType vertexAttribPointer;
247 GraphicsContext3D::Attributes m_attrs;
248 HostWindow* m_hostWindow;
249 QGLWidget* m_glWidget;
253 GLuint m_depthBuffer;
255 ListHashSet<unsigned long> m_syntheticErrors;
257 OwnPtr<Extensions3DQt> m_extensions;
261 void* getProcAddress(const String& proc);
265 #if defined (QT_OPENGL_ES_2)
266 #define GET_PROC_ADDRESS(Proc) Proc
268 #define GET_PROC_ADDRESS(Proc) reinterpret_cast<Proc##Type>(getProcAddress(#Proc));
271 bool GraphicsContext3D::isGLES2Compliant() const
273 #if defined (QT_OPENGL_ES_2)
280 // Even with underlying GLES2 driver, the below flags should still be set to
281 // false if extentions exist (and they almost always do).
282 bool GraphicsContext3D::isGLES2NPOTStrict() const
287 bool GraphicsContext3D::isErrorGeneratedOnOutOfBoundsAccesses() const
292 int GraphicsContext3D::getGraphicsResetStatusARB()
298 GraphicsContext3DInternal::GraphicsContext3DInternal(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow)
300 , m_hostWindow(hostWindow)
306 , m_contextValid(true)
308 QWebPageClient* webPageClient = hostWindow->platformPageClient();
309 QGLWidget* ownerGLWidget = getOwnerGLWidget(webPageClient);
312 m_glWidget = new QGLWidget(0, ownerGLWidget);
315 format.setDepth(true);
316 format.setSampleBuffers(true);
317 format.setStencil(false);
319 m_glWidget = new QGLWidget(format);
322 if (!m_glWidget->isValid()) {
323 LOG_ERROR("GraphicsContext3D: QGLWidget does not have a valid context");
324 m_contextValid = false;
328 QGLFormat format = m_glWidget->format();
330 m_attrs.alpha = format.alpha();
331 m_attrs.depth = format.depth();
332 m_attrs.stencil = format.stencil();
333 m_attrs.antialias = false;
334 m_attrs.premultipliedAlpha = true;
336 m_glWidget->makeCurrent();
338 activeTexture = GET_PROC_ADDRESS(glActiveTexture);
339 attachShader = GET_PROC_ADDRESS(glAttachShader);
340 bindAttribLocation = GET_PROC_ADDRESS(glBindAttribLocation);
341 bindBuffer = GET_PROC_ADDRESS(glBindBuffer);
342 bindFramebuffer = GET_PROC_ADDRESS(glBindFramebuffer);
343 bindRenderbuffer = GET_PROC_ADDRESS(glBindRenderbuffer);
344 blendColor = GET_PROC_ADDRESS(glBlendColor);
345 blendEquation = GET_PROC_ADDRESS(glBlendEquation);
346 blendEquationSeparate = GET_PROC_ADDRESS(glBlendEquationSeparate);
347 blendFuncSeparate = GET_PROC_ADDRESS(glBlendFuncSeparate);
348 bufferData = GET_PROC_ADDRESS(glBufferData);
349 bufferSubData = GET_PROC_ADDRESS(glBufferSubData);
350 checkFramebufferStatus = GET_PROC_ADDRESS(glCheckFramebufferStatus);
351 compileShader = GET_PROC_ADDRESS(glCompileShader);
352 createProgram = GET_PROC_ADDRESS(glCreateProgram);
353 createShader = GET_PROC_ADDRESS(glCreateShader);
354 deleteBuffers = GET_PROC_ADDRESS(glDeleteBuffers);
355 deleteFramebuffers = GET_PROC_ADDRESS(glDeleteFramebuffers);
356 deleteProgram = GET_PROC_ADDRESS(glDeleteProgram);
357 deleteRenderbuffers = GET_PROC_ADDRESS(glDeleteRenderbuffers);
358 deleteShader = GET_PROC_ADDRESS(glDeleteShader);
359 detachShader = GET_PROC_ADDRESS(glDetachShader);
360 disableVertexAttribArray = GET_PROC_ADDRESS(glDisableVertexAttribArray);
361 enableVertexAttribArray = GET_PROC_ADDRESS(glEnableVertexAttribArray);
362 framebufferRenderbuffer = GET_PROC_ADDRESS(glFramebufferRenderbuffer);
363 framebufferTexture2D = GET_PROC_ADDRESS(glFramebufferTexture2D);
364 genBuffers = GET_PROC_ADDRESS(glGenBuffers);
365 generateMipmap = GET_PROC_ADDRESS(glGenerateMipmap);
366 genFramebuffers = GET_PROC_ADDRESS(glGenFramebuffers);
367 genRenderbuffers = GET_PROC_ADDRESS(glGenRenderbuffers);
368 getActiveAttrib = GET_PROC_ADDRESS(glGetActiveAttrib);
369 getActiveUniform = GET_PROC_ADDRESS(glGetActiveUniform);
370 getAttachedShaders = GET_PROC_ADDRESS(glGetAttachedShaders);
371 getAttribLocation = GET_PROC_ADDRESS(glGetAttribLocation);
372 getBufferParameteriv = GET_PROC_ADDRESS(glGetBufferParameteriv);
373 getFramebufferAttachmentParameteriv = GET_PROC_ADDRESS(glGetFramebufferAttachmentParameteriv);
374 getProgramInfoLog = GET_PROC_ADDRESS(glGetProgramInfoLog);
375 getProgramiv = GET_PROC_ADDRESS(glGetProgramiv);
376 getRenderbufferParameteriv = GET_PROC_ADDRESS(glGetRenderbufferParameteriv);
377 getShaderInfoLog = GET_PROC_ADDRESS(glGetShaderInfoLog);
378 getShaderiv = GET_PROC_ADDRESS(glGetShaderiv);
379 getShaderSource = GET_PROC_ADDRESS(glGetShaderSource);
380 getUniformfv = GET_PROC_ADDRESS(glGetUniformfv);
381 getUniformiv = GET_PROC_ADDRESS(glGetUniformiv);
382 getUniformLocation = GET_PROC_ADDRESS(glGetUniformLocation);
383 getVertexAttribfv = GET_PROC_ADDRESS(glGetVertexAttribfv);
384 getVertexAttribiv = GET_PROC_ADDRESS(glGetVertexAttribiv);
385 getVertexAttribPointerv = GET_PROC_ADDRESS(glGetVertexAttribPointerv);
386 isBuffer = GET_PROC_ADDRESS(glIsBuffer);
387 isFramebuffer = GET_PROC_ADDRESS(glIsFramebuffer);
388 isProgram = GET_PROC_ADDRESS(glIsProgram);
389 isRenderbuffer = GET_PROC_ADDRESS(glIsRenderbuffer);
390 isShader = GET_PROC_ADDRESS(glIsShader);
391 linkProgram = GET_PROC_ADDRESS(glLinkProgram);
392 renderbufferStorage = GET_PROC_ADDRESS(glRenderbufferStorage);
393 sampleCoverage = GET_PROC_ADDRESS(glSampleCoverage);
394 shaderSource = GET_PROC_ADDRESS(glShaderSource);
395 stencilFuncSeparate = GET_PROC_ADDRESS(glStencilFuncSeparate);
396 stencilMaskSeparate = GET_PROC_ADDRESS(glStencilMaskSeparate);
397 stencilOpSeparate = GET_PROC_ADDRESS(glStencilOpSeparate);
398 uniform1f = GET_PROC_ADDRESS(glUniform1f);
399 uniform1fv = GET_PROC_ADDRESS(glUniform1fv);
400 uniform1i = GET_PROC_ADDRESS(glUniform1i);
401 uniform1iv = GET_PROC_ADDRESS(glUniform1iv);
402 uniform2f = GET_PROC_ADDRESS(glUniform2f);
403 uniform2fv = GET_PROC_ADDRESS(glUniform2fv);
404 uniform2i = GET_PROC_ADDRESS(glUniform2i);
405 uniform2iv = GET_PROC_ADDRESS(glUniform2iv);
406 uniform3f = GET_PROC_ADDRESS(glUniform3f);
407 uniform3fv = GET_PROC_ADDRESS(glUniform3fv);
408 uniform3i = GET_PROC_ADDRESS(glUniform3i);
409 uniform3iv = GET_PROC_ADDRESS(glUniform3iv);
410 uniform4f = GET_PROC_ADDRESS(glUniform4f);
411 uniform4fv = GET_PROC_ADDRESS(glUniform4fv);
412 uniform4i = GET_PROC_ADDRESS(glUniform4i);
413 uniform4iv = GET_PROC_ADDRESS(glUniform4iv);
414 uniformMatrix2fv = GET_PROC_ADDRESS(glUniformMatrix2fv);
415 uniformMatrix3fv = GET_PROC_ADDRESS(glUniformMatrix3fv);
416 uniformMatrix4fv = GET_PROC_ADDRESS(glUniformMatrix4fv);
417 useProgram = GET_PROC_ADDRESS(glUseProgram);
418 validateProgram = GET_PROC_ADDRESS(glValidateProgram);
419 vertexAttrib1f = GET_PROC_ADDRESS(glVertexAttrib1f);
420 vertexAttrib1fv = GET_PROC_ADDRESS(glVertexAttrib1fv);
421 vertexAttrib2f = GET_PROC_ADDRESS(glVertexAttrib2f);
422 vertexAttrib2fv = GET_PROC_ADDRESS(glVertexAttrib2fv);
423 vertexAttrib3f = GET_PROC_ADDRESS(glVertexAttrib3f);
424 vertexAttrib3fv = GET_PROC_ADDRESS(glVertexAttrib3fv);
425 vertexAttrib4f = GET_PROC_ADDRESS(glVertexAttrib4f);
426 vertexAttrib4fv = GET_PROC_ADDRESS(glVertexAttrib4fv);
427 vertexAttribPointer = GET_PROC_ADDRESS(glVertexAttribPointer);
429 if (!m_contextValid) {
430 LOG_ERROR("GraphicsContext3D: All needed OpenGL extensions are not available");
431 m_contextValid = false;
435 glGenTextures(1, &m_texture);
436 glBindTexture(GraphicsContext3D::TEXTURE_2D, m_texture);
437 glTexParameterf(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR);
438 glTexParameterf(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR);
439 glTexParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE);
440 glTexParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE);
441 glTexImage2D(GraphicsContext3D::TEXTURE_2D, 0, GraphicsContext3D::RGBA, 1, 1, 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, 0);
442 glBindTexture(GraphicsContext3D::TEXTURE_2D, 0);
444 genFramebuffers(/* count */ 1, &m_mainFbo);
445 m_currentFbo = m_mainFbo;
447 bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_mainFbo);
449 genRenderbuffers(/* count */ 1, &m_depthBuffer);
450 bindRenderbuffer(GraphicsContext3D::RENDERBUFFER, m_depthBuffer);
451 #if defined(QT_OPENGL_ES_2)
452 renderbufferStorage(GraphicsContext3D::RENDERBUFFER, GraphicsContext3D::DEPTH_COMPONENT16, /* width */ 1, /* height */ 1);
454 renderbufferStorage(GraphicsContext3D::RENDERBUFFER, GraphicsContext3D::DEPTH_COMPONENT, /* width */ 1, /* height */ 1);
457 bindRenderbuffer(GraphicsContext3D::RENDERBUFFER, 0);
459 framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, m_texture, 0);
460 framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::DEPTH_ATTACHMENT, GraphicsContext3D::RENDERBUFFER, m_depthBuffer);
461 glClearColor(/* red */ 0, /* green */ 0, /* blue */ 0, /* alpha */ 0);
463 if (checkFramebufferStatus(GraphicsContext3D::FRAMEBUFFER) != GraphicsContext3D::FRAMEBUFFER_COMPLETE) {
464 LOG_ERROR("GraphicsContext3D: Wasn't able to create the main framebuffer");
465 m_contextValid = false;
469 GraphicsContext3DInternal::~GraphicsContext3DInternal()
475 QGLWidget* GraphicsContext3DInternal::getOwnerGLWidget(QWebPageClient* webPageClient)
477 QAbstractScrollArea* scrollArea = qobject_cast<QAbstractScrollArea*>(webPageClient->ownerWidget());
480 return qobject_cast<QGLWidget*>(scrollArea->viewport());
485 void* GraphicsContext3DInternal::getProcAddress(const String& proc)
487 String ext[3] = { "", "ARB", "EXT" };
489 for (int i = 0; i < 3; i++) {
490 String nameWithExt = proc + ext[i];
492 void* addr = m_glWidget->context()->getProcAddress(nameWithExt.utf8().data());
497 LOG_ERROR("GraphicsContext3D: Did not find GL function %s", proc.utf8().data());
498 m_contextValid = false;
502 PassOwnPtr<GraphicsContext3D> GraphicsContext3D::create(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, GraphicsContext3D::RenderStyle renderStyle)
504 // This implementation doesn't currently support rendering directly to the HostWindow.
505 if (renderStyle == RenderDirectlyToHostWindow)
507 OwnPtr<GraphicsContext3D> context(new GraphicsContext3D(attrs, hostWindow, false));
508 return context->m_internal ? context.release() : 0;
511 GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, bool)
512 : m_internal(new GraphicsContext3DInternal(attrs, hostWindow))
514 if (!m_internal->isContextValid())
518 GraphicsContext3D::~GraphicsContext3D()
522 PlatformGraphicsContext3D GraphicsContext3D::platformGraphicsContext3D()
524 return m_internal->m_glWidget;
527 Platform3DObject GraphicsContext3D::platformTexture() const
529 return m_internal->m_texture;
532 void GraphicsContext3D::makeContextCurrent()
534 m_internal->m_glWidget->makeCurrent();
537 void GraphicsContext3D::paintRenderingResultsToCanvas(CanvasRenderingContext* context)
539 m_internal->m_glWidget->makeCurrent();
540 HTMLCanvasElement* canvas = context->canvas();
541 ImageBuffer* imageBuffer = canvas->buffer();
542 QPainter* painter = imageBuffer->context()->platformContext();
543 paint(painter, QRect(QPoint(0, 0), QSize(m_currentWidth, m_currentHeight)));
546 void GraphicsContext3D::paint(QPainter* painter, const QRect& rect) const
548 #if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
549 QWebPageClient* webPageClient = m_internal->m_hostWindow->platformPageClient();
550 QGLWidget* ownerGLWidget = m_internal->getOwnerGLWidget(webPageClient);
552 ownerGLWidget->drawTexture(rect, m_internal->m_texture);
556 m_internal->m_glWidget->makeCurrent();
557 m_internal->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_internal->m_mainFbo);
558 glReadPixels(/* x */ 0, /* y */ 0, m_currentWidth, m_currentHeight, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, m_internal->m_pixels.bits());
559 painter->drawImage(/* x */ 0, /* y */ 0, m_internal->m_pixels.rgbSwapped().transformed(QMatrix().rotate(180)));
560 m_internal->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_internal->m_currentFbo);
563 void GraphicsContext3D::reshape(int width, int height)
565 if (((width == m_currentWidth) && (height == m_currentHeight)) || (!m_internal))
568 m_currentWidth = width;
569 m_currentHeight = height;
571 m_internal->m_pixels = QImage(m_currentWidth, m_currentHeight, QImage::Format_ARGB32);
573 m_internal->m_glWidget->makeCurrent();
575 glBindTexture(GraphicsContext3D::TEXTURE_2D, m_internal->m_texture);
576 glTexImage2D(GraphicsContext3D::TEXTURE_2D, /* level */ 0, GraphicsContext3D::RGBA, width, height, /* border */ 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, /* data */ 0);
577 glBindTexture(GraphicsContext3D::TEXTURE_2D, 0);
579 m_internal->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_internal->m_mainFbo);
580 m_internal->bindRenderbuffer(GraphicsContext3D::RENDERBUFFER, m_internal->m_depthBuffer);
581 #if defined(QT_OPENGL_ES_2)
582 renderbufferStorage(GraphicsContext3D::RENDERBUFFER, GraphicsContext3D::DEPTH_COMPONENT16, width, height);
584 renderbufferStorage(GraphicsContext3D::RENDERBUFFER, GraphicsContext3D::DEPTH_COMPONENT, width, height);
586 m_internal->bindRenderbuffer(GraphicsContext3D::RENDERBUFFER, 0);
588 m_internal->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, m_internal->m_texture, 0);
589 m_internal->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::DEPTH_ATTACHMENT, GraphicsContext3D::RENDERBUFFER, m_internal->m_depthBuffer);
591 GLenum status = m_internal->checkFramebufferStatus(GraphicsContext3D::FRAMEBUFFER);
592 if (status != GraphicsContext3D::FRAMEBUFFER_COMPLETE) {
593 LOG_ERROR("GraphicsContext3D: Wasn't able to reshape the main framebuffer");
597 glClear(GraphicsContext3D::COLOR_BUFFER_BIT);
601 IntSize GraphicsContext3D::getInternalFramebufferSize()
603 return IntSize(m_currentWidth, m_currentHeight);
606 void GraphicsContext3D::activeTexture(GC3Denum texture)
608 m_internal->m_glWidget->makeCurrent();
609 m_internal->activeTexture(texture);
612 void GraphicsContext3D::attachShader(Platform3DObject program, Platform3DObject shader)
616 m_internal->m_glWidget->makeCurrent();
617 m_internal->attachShader(program, shader);
620 void GraphicsContext3D::getAttachedShaders(Platform3DObject program, GC3Dsizei maxCount, GC3Dsizei* count, Platform3DObject* shaders)
623 synthesizeGLError(INVALID_VALUE);
627 m_internal->m_glWidget->makeCurrent();
628 getAttachedShaders(program, maxCount, count, shaders);
631 void GraphicsContext3D::bindAttribLocation(Platform3DObject program, GC3Duint index, const String& name)
634 m_internal->m_glWidget->makeCurrent();
635 m_internal->bindAttribLocation(program, index, name.utf8().data());
638 void GraphicsContext3D::bindBuffer(GC3Denum target, Platform3DObject buffer)
640 m_internal->m_glWidget->makeCurrent();
641 m_internal->bindBuffer(target, buffer);
644 void GraphicsContext3D::bindFramebuffer(GC3Denum target, Platform3DObject buffer)
646 m_internal->m_glWidget->makeCurrent();
647 m_internal->m_currentFbo = buffer ? buffer : m_internal->m_mainFbo;
648 m_internal->bindFramebuffer(target, m_internal->m_currentFbo);
651 void GraphicsContext3D::bindRenderbuffer(GC3Denum target, Platform3DObject renderbuffer)
653 m_internal->m_glWidget->makeCurrent();
654 m_internal->bindRenderbuffer(target, renderbuffer);
657 void GraphicsContext3D::bindTexture(GC3Denum target, Platform3DObject texture)
659 m_internal->m_glWidget->makeCurrent();
660 glBindTexture(target, texture);
663 void GraphicsContext3D::blendColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha)
665 m_internal->m_glWidget->makeCurrent();
666 m_internal->blendColor(red, green, blue, alpha);
669 void GraphicsContext3D::blendEquation(GC3Denum mode)
671 m_internal->m_glWidget->makeCurrent();
672 m_internal->blendEquation(mode);
675 void GraphicsContext3D::blendEquationSeparate(GC3Denum modeRGB, GC3Denum modeAlpha)
677 m_internal->m_glWidget->makeCurrent();
678 m_internal->blendEquationSeparate(modeRGB, modeAlpha);
681 void GraphicsContext3D::blendFunc(GC3Denum sfactor, GC3Denum dfactor)
683 m_internal->m_glWidget->makeCurrent();
684 glBlendFunc(sfactor, dfactor);
687 void GraphicsContext3D::blendFuncSeparate(GC3Denum srcRGB, GC3Denum dstRGB, GC3Denum srcAlpha, GC3Denum dstAlpha)
689 m_internal->m_glWidget->makeCurrent();
690 m_internal->blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
693 void GraphicsContext3D::bufferData(GC3Denum target, GC3Dsizeiptr size, GC3Denum usage)
695 m_internal->m_glWidget->makeCurrent();
696 m_internal->bufferData(target, size, /* data */ 0, usage);
699 void GraphicsContext3D::bufferData(GC3Denum target, GC3Dsizeiptr size, const void* data, GC3Denum usage)
701 m_internal->m_glWidget->makeCurrent();
702 m_internal->bufferData(target, size, data, usage);
705 void GraphicsContext3D::bufferSubData(GC3Denum target, GC3Dintptr offset, GC3Dsizeiptr size, const void* data)
707 m_internal->m_glWidget->makeCurrent();
708 m_internal->bufferSubData(target, offset, size, data);
711 GC3Denum GraphicsContext3D::checkFramebufferStatus(GC3Denum target)
713 m_internal->m_glWidget->makeCurrent();
714 return m_internal->checkFramebufferStatus(target);
717 void GraphicsContext3D::clearColor(GC3Dclampf r, GC3Dclampf g, GC3Dclampf b, GC3Dclampf a)
719 m_internal->m_glWidget->makeCurrent();
720 glClearColor(r, g, b, a);
723 void GraphicsContext3D::clear(GC3Dbitfield mask)
725 m_internal->m_glWidget->makeCurrent();
729 void GraphicsContext3D::clearDepth(GC3Dclampf depth)
731 m_internal->m_glWidget->makeCurrent();
732 #if defined(QT_OPENGL_ES_2)
733 glClearDepthf(depth);
739 void GraphicsContext3D::clearStencil(GC3Dint s)
741 m_internal->m_glWidget->makeCurrent();
745 void GraphicsContext3D::colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboolean alpha)
747 m_internal->m_glWidget->makeCurrent();
748 glColorMask(red, green, blue, alpha);
751 void GraphicsContext3D::compileShader(Platform3DObject shader)
754 m_internal->m_glWidget->makeCurrent();
755 m_internal->compileShader(shader);
758 void GraphicsContext3D::copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border)
760 m_internal->m_glWidget->makeCurrent();
761 glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
764 void GraphicsContext3D::copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
766 m_internal->m_glWidget->makeCurrent();
767 glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
770 void GraphicsContext3D::cullFace(GC3Denum mode)
772 m_internal->m_glWidget->makeCurrent();
776 void GraphicsContext3D::depthFunc(GC3Denum func)
778 m_internal->m_glWidget->makeCurrent();
782 void GraphicsContext3D::depthMask(GC3Dboolean flag)
784 m_internal->m_glWidget->makeCurrent();
788 void GraphicsContext3D::depthRange(GC3Dclampf zNear, GC3Dclampf zFar)
790 m_internal->m_glWidget->makeCurrent();
791 #if defined(QT_OPENGL_ES_2)
792 glDepthRangef(zNear, zFar);
794 glDepthRange(zNear, zFar);
798 void GraphicsContext3D::detachShader(Platform3DObject program, Platform3DObject shader)
802 m_internal->m_glWidget->makeCurrent();
803 m_internal->detachShader(program, shader);
806 void GraphicsContext3D::disable(GC3Denum cap)
808 m_internal->m_glWidget->makeCurrent();
812 void GraphicsContext3D::disableVertexAttribArray(GC3Duint index)
814 m_internal->m_glWidget->makeCurrent();
815 m_internal->disableVertexAttribArray(index);
818 void GraphicsContext3D::drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count)
820 m_internal->m_glWidget->makeCurrent();
821 glDrawArrays(mode, first, count);
824 void GraphicsContext3D::drawElements(GC3Denum mode, GC3Dsizei count, GC3Denum type, GC3Dintptr offset)
826 m_internal->m_glWidget->makeCurrent();
827 glDrawElements(mode, count, type, reinterpret_cast<GLvoid*>(static_cast<intptr_t>(offset)));
830 void GraphicsContext3D::enable(GC3Denum cap)
832 m_internal->m_glWidget->makeCurrent();
836 void GraphicsContext3D::enableVertexAttribArray(GC3Duint index)
838 m_internal->m_glWidget->makeCurrent();
839 m_internal->enableVertexAttribArray(index);
842 void GraphicsContext3D::finish()
844 m_internal->m_glWidget->makeCurrent();
848 void GraphicsContext3D::flush()
850 m_internal->m_glWidget->makeCurrent();
854 void GraphicsContext3D::framebufferRenderbuffer(GC3Denum target, GC3Denum attachment, GC3Denum renderbuffertarget, Platform3DObject buffer)
856 m_internal->m_glWidget->makeCurrent();
857 m_internal->framebufferRenderbuffer(target, attachment, renderbuffertarget, buffer);
860 void GraphicsContext3D::framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, Platform3DObject texture, GC3Dint level)
862 m_internal->m_glWidget->makeCurrent();
863 m_internal->framebufferTexture2D(target, attachment, textarget, texture, level);
866 void GraphicsContext3D::frontFace(GC3Denum mode)
868 m_internal->m_glWidget->makeCurrent();
872 void GraphicsContext3D::generateMipmap(GC3Denum target)
874 m_internal->m_glWidget->makeCurrent();
875 m_internal->generateMipmap(target);
878 bool GraphicsContext3D::getActiveAttrib(Platform3DObject program, GC3Duint index, ActiveInfo& info)
881 synthesizeGLError(INVALID_VALUE);
885 m_internal->m_glWidget->makeCurrent();
888 m_internal->getProgramiv(program, GraphicsContext3D::ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxLength);
890 GLchar* name = (GLchar*) fastMalloc(maxLength);
891 GLsizei nameLength = 0;
895 m_internal->getActiveAttrib(program, index, maxLength, &nameLength, &size, &type, name);
902 info.name = String(name, nameLength);
910 bool GraphicsContext3D::getActiveUniform(Platform3DObject program, GC3Duint index, ActiveInfo& info)
913 synthesizeGLError(INVALID_VALUE);
917 m_internal->m_glWidget->makeCurrent();
920 m_internal->getProgramiv(static_cast<GLuint>(program), GraphicsContext3D::ACTIVE_UNIFORM_MAX_LENGTH, &maxLength);
922 GLchar* name = (GLchar*) fastMalloc(maxLength);
923 GLsizei nameLength = 0;
927 m_internal->getActiveUniform(static_cast<GLuint>(program), index, maxLength, &nameLength, &size, &type, name);
934 info.name = String(name, nameLength);
942 int GraphicsContext3D::getAttribLocation(Platform3DObject program, const String& name)
947 m_internal->m_glWidget->makeCurrent();
948 return m_internal->getAttribLocation(program, name.utf8().data());
951 GraphicsContext3D::Attributes GraphicsContext3D::getContextAttributes()
953 return m_internal->m_attrs;
956 GC3Denum GraphicsContext3D::getError()
958 if (m_internal->m_syntheticErrors.size() > 0) {
959 ListHashSet<GC3Denum>::iterator iter = m_internal->m_syntheticErrors.begin();
960 GC3Denum err = *iter;
961 m_internal->m_syntheticErrors.remove(iter);
965 m_internal->m_glWidget->makeCurrent();
969 String GraphicsContext3D::getString(GC3Denum name)
971 m_internal->m_glWidget->makeCurrent();
972 return String((const char*) glGetString(name));
975 void GraphicsContext3D::hint(GC3Denum target, GC3Denum mode)
977 m_internal->m_glWidget->makeCurrent();
978 glHint(target, mode);
981 GC3Dboolean GraphicsContext3D::isBuffer(Platform3DObject buffer)
986 m_internal->m_glWidget->makeCurrent();
987 return m_internal->isBuffer(buffer);
990 GC3Dboolean GraphicsContext3D::isEnabled(GC3Denum cap)
992 m_internal->m_glWidget->makeCurrent();
993 return glIsEnabled(cap);
996 GC3Dboolean GraphicsContext3D::isFramebuffer(Platform3DObject framebuffer)
1001 m_internal->m_glWidget->makeCurrent();
1002 return m_internal->isFramebuffer(framebuffer);
1005 GC3Dboolean GraphicsContext3D::isProgram(Platform3DObject program)
1010 m_internal->m_glWidget->makeCurrent();
1011 return m_internal->isProgram(program);
1014 GC3Dboolean GraphicsContext3D::isRenderbuffer(Platform3DObject renderbuffer)
1019 m_internal->m_glWidget->makeCurrent();
1020 return m_internal->isRenderbuffer(renderbuffer);
1023 GC3Dboolean GraphicsContext3D::isShader(Platform3DObject shader)
1028 m_internal->m_glWidget->makeCurrent();
1029 return m_internal->isShader(shader);
1032 GC3Dboolean GraphicsContext3D::isTexture(Platform3DObject texture)
1037 m_internal->m_glWidget->makeCurrent();
1038 return glIsTexture(texture);
1041 void GraphicsContext3D::lineWidth(double width)
1043 m_internal->m_glWidget->makeCurrent();
1044 glLineWidth(static_cast<float>(width));
1047 void GraphicsContext3D::linkProgram(Platform3DObject program)
1050 m_internal->m_glWidget->makeCurrent();
1051 m_internal->linkProgram(program);
1054 void GraphicsContext3D::pixelStorei(GC3Denum paramName, GC3Dint param)
1056 m_internal->m_glWidget->makeCurrent();
1057 glPixelStorei(paramName, param);
1060 void GraphicsContext3D::polygonOffset(GC3Dfloat factor, GC3Dfloat units)
1062 m_internal->m_glWidget->makeCurrent();
1063 glPolygonOffset(factor, units);
1066 void GraphicsContext3D::readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data)
1068 m_internal->m_glWidget->makeCurrent();
1070 if (type != GraphicsContext3D::UNSIGNED_BYTE || format != GraphicsContext3D::RGBA)
1073 glReadPixels(x, y, width, height, format, type, data);
1076 void GraphicsContext3D::releaseShaderCompiler()
1078 m_internal->m_glWidget->makeCurrent();
1082 void GraphicsContext3D::renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height)
1084 m_internal->m_glWidget->makeCurrent();
1085 m_internal->renderbufferStorage(target, internalformat, width, height);
1088 void GraphicsContext3D::sampleCoverage(GC3Dclampf value, GC3Dboolean invert)
1090 m_internal->m_glWidget->makeCurrent();
1091 m_internal->sampleCoverage(value, invert);
1094 void GraphicsContext3D::scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
1096 m_internal->m_glWidget->makeCurrent();
1097 glScissor(x, y, width, height);
1100 void GraphicsContext3D::shaderSource(Platform3DObject shader, const String& source)
1104 m_internal->m_glWidget->makeCurrent();
1106 String prefixedSource;
1108 #if defined (QT_OPENGL_ES_2)
1109 prefixedSource.append("precision mediump float;\n");
1112 prefixedSource.append(source);
1114 CString sourceCS = prefixedSource.utf8();
1115 const char* data = sourceCS.data();
1116 int length = prefixedSource.length();
1117 m_internal->shaderSource((GLuint) shader, /* count */ 1, &data, &length);
1120 void GraphicsContext3D::stencilFunc(GC3Denum func, GC3Dint ref, GC3Duint mask)
1122 m_internal->m_glWidget->makeCurrent();
1123 glStencilFunc(func, ref, mask);
1126 void GraphicsContext3D::stencilFuncSeparate(GC3Denum face, GC3Denum func, GC3Dint ref, GC3Duint mask)
1128 m_internal->m_glWidget->makeCurrent();
1129 m_internal->stencilFuncSeparate(face, func, ref, mask);
1132 void GraphicsContext3D::stencilMask(GC3Duint mask)
1134 m_internal->m_glWidget->makeCurrent();
1135 glStencilMask(mask);
1138 void GraphicsContext3D::stencilMaskSeparate(GC3Denum face, GC3Duint mask)
1140 m_internal->m_glWidget->makeCurrent();
1141 m_internal->stencilMaskSeparate(face, mask);
1144 void GraphicsContext3D::stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zpass)
1146 m_internal->m_glWidget->makeCurrent();
1147 glStencilOp(fail, zfail, zpass);
1150 void GraphicsContext3D::stencilOpSeparate(GC3Denum face, GC3Denum fail, GC3Denum zfail, GC3Denum zpass)
1152 m_internal->m_glWidget->makeCurrent();
1153 m_internal->stencilOpSeparate(face, fail, zfail, zpass);
1156 void GraphicsContext3D::texParameterf(GC3Denum target, GC3Denum paramName, GC3Dfloat value)
1158 m_internal->m_glWidget->makeCurrent();
1159 glTexParameterf(target, paramName, value);
1162 void GraphicsContext3D::texParameteri(GC3Denum target, GC3Denum paramName, GC3Dint value)
1164 m_internal->m_glWidget->makeCurrent();
1165 glTexParameteri(target, paramName, value);
1168 void GraphicsContext3D::uniform1f(GC3Dint location, GC3Dfloat v0)
1170 m_internal->m_glWidget->makeCurrent();
1171 m_internal->uniform1f(location, v0);
1174 void GraphicsContext3D::uniform1fv(GC3Dint location, GC3Dfloat* array, GC3Dsizei size)
1176 m_internal->m_glWidget->makeCurrent();
1177 m_internal->uniform1fv(location, size, array);
1180 void GraphicsContext3D::uniform2f(GC3Dint location, GC3Dfloat v0, GC3Dfloat v1)
1182 m_internal->m_glWidget->makeCurrent();
1183 m_internal->uniform2f(location, v0, v1);
1186 void GraphicsContext3D::uniform2fv(GC3Dint location, GC3Dfloat* array, GC3Dsizei size)
1188 m_internal->m_glWidget->makeCurrent();
1189 m_internal->uniform2fv(location, size, array);
1192 void GraphicsContext3D::uniform3f(GC3Dint location, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2)
1194 m_internal->m_glWidget->makeCurrent();
1195 m_internal->uniform3f(location, v0, v1, v2);
1198 void GraphicsContext3D::uniform3fv(GC3Dint location, GC3Dfloat* array, GC3Dsizei size)
1200 m_internal->m_glWidget->makeCurrent();
1201 m_internal->uniform3fv(location, size, array);
1204 void GraphicsContext3D::uniform4f(GC3Dint location, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2, GC3Dfloat v3)
1206 m_internal->m_glWidget->makeCurrent();
1207 m_internal->uniform4f(location, v0, v1, v2, v3);
1210 void GraphicsContext3D::uniform4fv(GC3Dint location, GC3Dfloat* array, GC3Dsizei size)
1212 m_internal->m_glWidget->makeCurrent();
1213 m_internal->uniform4fv(location, size, array);
1216 void GraphicsContext3D::uniform1i(GC3Dint location, GC3Dint v0)
1218 m_internal->m_glWidget->makeCurrent();
1219 m_internal->uniform1i(location, v0);
1222 void GraphicsContext3D::uniform1iv(GC3Dint location, GC3Dint* array, GC3Dsizei size)
1224 m_internal->m_glWidget->makeCurrent();
1225 m_internal->uniform1iv(location, size, array);
1228 void GraphicsContext3D::uniform2i(GC3Dint location, GC3Dint v0, GC3Dint v1)
1230 m_internal->m_glWidget->makeCurrent();
1231 m_internal->uniform2i(location, v0, v1);
1234 void GraphicsContext3D::uniform2iv(GC3Dint location, GC3Dint* array, GC3Dsizei size)
1236 m_internal->m_glWidget->makeCurrent();
1237 m_internal->uniform2iv(location, size, array);
1240 void GraphicsContext3D::uniform3i(GC3Dint location, GC3Dint v0, GC3Dint v1, GC3Dint v2)
1242 m_internal->m_glWidget->makeCurrent();
1243 m_internal->uniform3i(location, v0, v1, v2);
1246 void GraphicsContext3D::uniform3iv(GC3Dint location, GC3Dint* array, GC3Dsizei size)
1248 m_internal->m_glWidget->makeCurrent();
1249 m_internal->uniform3iv(location, size, array);
1252 void GraphicsContext3D::uniform4i(GC3Dint location, GC3Dint v0, GC3Dint v1, GC3Dint v2, GC3Dint v3)
1254 m_internal->m_glWidget->makeCurrent();
1255 m_internal->uniform4i(location, v0, v1, v2, v3);
1258 void GraphicsContext3D::uniform4iv(GC3Dint location, GC3Dint* array, GC3Dsizei size)
1260 m_internal->m_glWidget->makeCurrent();
1261 m_internal->uniform4iv(location, size, array);
1264 void GraphicsContext3D::uniformMatrix2fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* array, GC3Dsizei size)
1266 m_internal->m_glWidget->makeCurrent();
1267 m_internal->uniformMatrix2fv(location, size, transpose, array);
1270 void GraphicsContext3D::uniformMatrix3fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* array, GC3Dsizei size)
1272 m_internal->m_glWidget->makeCurrent();
1273 m_internal->uniformMatrix3fv(location, size, transpose, array);
1276 void GraphicsContext3D::uniformMatrix4fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* array, GC3Dsizei size)
1278 m_internal->m_glWidget->makeCurrent();
1279 m_internal->uniformMatrix4fv(location, size, transpose, array);
1282 void GraphicsContext3D::useProgram(Platform3DObject program)
1286 m_internal->m_glWidget->makeCurrent();
1287 m_internal->useProgram(program);
1290 void GraphicsContext3D::validateProgram(Platform3DObject program)
1294 m_internal->m_glWidget->makeCurrent();
1295 m_internal->validateProgram(program);
1298 void GraphicsContext3D::vertexAttrib1f(GC3Duint index, GC3Dfloat v0)
1300 m_internal->m_glWidget->makeCurrent();
1301 m_internal->vertexAttrib1f(index, v0);
1304 void GraphicsContext3D::vertexAttrib1fv(GC3Duint index, GC3Dfloat* array)
1306 m_internal->m_glWidget->makeCurrent();
1307 m_internal->vertexAttrib1fv(index, array);
1310 void GraphicsContext3D::vertexAttrib2f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1)
1312 m_internal->m_glWidget->makeCurrent();
1313 m_internal->vertexAttrib2f(index, v0, v1);
1316 void GraphicsContext3D::vertexAttrib2fv(GC3Duint index, GC3Dfloat* array)
1318 m_internal->m_glWidget->makeCurrent();
1319 m_internal->vertexAttrib2fv(index, array);
1322 void GraphicsContext3D::vertexAttrib3f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2)
1324 m_internal->m_glWidget->makeCurrent();
1325 m_internal->vertexAttrib3f(index, v0, v1, v2);
1328 void GraphicsContext3D::vertexAttrib3fv(GC3Duint index, GC3Dfloat* array)
1330 m_internal->m_glWidget->makeCurrent();
1331 m_internal->vertexAttrib3fv(index, array);
1334 void GraphicsContext3D::vertexAttrib4f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2, GC3Dfloat v3)
1336 m_internal->m_glWidget->makeCurrent();
1337 m_internal->vertexAttrib4f(index, v0, v1, v2, v3);
1340 void GraphicsContext3D::vertexAttrib4fv(GC3Duint index, GC3Dfloat* array)
1342 m_internal->m_glWidget->makeCurrent();
1343 m_internal->vertexAttrib4fv(index, array);
1346 void GraphicsContext3D::vertexAttribPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dboolean normalized, GC3Dsizei stride, GC3Dintptr offset)
1348 m_internal->m_glWidget->makeCurrent();
1349 m_internal->vertexAttribPointer(index, size, type, normalized, stride, reinterpret_cast<GLvoid*>(static_cast<intptr_t>(offset)));
1352 void GraphicsContext3D::viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
1354 m_internal->m_glWidget->makeCurrent();
1355 glViewport(x, y, width, height);
1358 void GraphicsContext3D::getBooleanv(GC3Denum paramName, GC3Dboolean* value)
1360 m_internal->m_glWidget->makeCurrent();
1361 glGetBooleanv(paramName, value);
1364 void GraphicsContext3D::getBufferParameteriv(GC3Denum target, GC3Denum paramName, GC3Dint* value)
1366 m_internal->m_glWidget->makeCurrent();
1367 m_internal->getBufferParameteriv(target, paramName, value);
1370 void GraphicsContext3D::getFloatv(GC3Denum paramName, GC3Dfloat* value)
1372 m_internal->m_glWidget->makeCurrent();
1373 glGetFloatv(paramName, value);
1376 void GraphicsContext3D::getFramebufferAttachmentParameteriv(GC3Denum target, GC3Denum attachment, GC3Denum paramName, GC3Dint* value)
1378 m_internal->m_glWidget->makeCurrent();
1379 m_internal->getFramebufferAttachmentParameteriv(target, attachment, paramName, value);
1382 void GraphicsContext3D::getIntegerv(GC3Denum paramName, GC3Dint* value)
1384 m_internal->m_glWidget->makeCurrent();
1385 glGetIntegerv(paramName, value);
1388 void GraphicsContext3D::getProgramiv(Platform3DObject program, GC3Denum paramName, GC3Dint* value)
1390 m_internal->m_glWidget->makeCurrent();
1391 m_internal->getProgramiv(program, paramName, value);
1394 String GraphicsContext3D::getProgramInfoLog(Platform3DObject program)
1396 m_internal->m_glWidget->makeCurrent();
1399 m_internal->getProgramiv(program, GraphicsContext3D::INFO_LOG_LENGTH, &length);
1403 GLchar* info = (GLchar*) fastMalloc(length);
1407 m_internal->getProgramInfoLog(program, length, &size, info);
1409 String result(info);
1415 void GraphicsContext3D::getRenderbufferParameteriv(GC3Denum target, GC3Denum paramName, GC3Dint* value)
1417 m_internal->m_glWidget->makeCurrent();
1418 m_internal->getRenderbufferParameteriv(target, paramName, value);
1421 void GraphicsContext3D::getShaderiv(Platform3DObject shader, GC3Denum paramName, GC3Dint* value)
1424 m_internal->m_glWidget->makeCurrent();
1425 m_internal->getShaderiv(shader, paramName, value);
1428 String GraphicsContext3D::getShaderInfoLog(Platform3DObject shader)
1430 m_internal->m_glWidget->makeCurrent();
1433 m_internal->getShaderiv(shader, GraphicsContext3D::INFO_LOG_LENGTH, &length);
1436 GLchar* info = (GLchar*) fastMalloc(length);
1440 m_internal->getShaderInfoLog(shader, length, &size, info);
1442 String result(info);
1448 String GraphicsContext3D::getShaderSource(Platform3DObject shader)
1450 m_internal->m_glWidget->makeCurrent();
1453 m_internal->getShaderiv(shader, GraphicsContext3D::SHADER_SOURCE_LENGTH, &length);
1456 GLchar* info = (GLchar*) fastMalloc(length);
1460 m_internal->getShaderSource(shader, length, &size, info);
1462 String result(info);
1468 void GraphicsContext3D::getTexParameterfv(GC3Denum target, GC3Denum paramName, GC3Dfloat* value)
1470 m_internal->m_glWidget->makeCurrent();
1471 glGetTexParameterfv(target, paramName, value);
1474 void GraphicsContext3D::getTexParameteriv(GC3Denum target, GC3Denum paramName, GC3Dint* value)
1476 m_internal->m_glWidget->makeCurrent();
1477 glGetTexParameteriv(target, paramName, value);
1480 void GraphicsContext3D::getUniformfv(Platform3DObject program, GC3Dint location, GC3Dfloat* value)
1482 m_internal->m_glWidget->makeCurrent();
1483 m_internal->getUniformfv(program, location, value);
1486 void GraphicsContext3D::getUniformiv(Platform3DObject program, GC3Dint location, GC3Dint* value)
1488 m_internal->m_glWidget->makeCurrent();
1489 m_internal->getUniformiv(program, location, value);
1492 long GraphicsContext3D::getUniformLocation(Platform3DObject program, const String& name)
1496 m_internal->m_glWidget->makeCurrent();
1497 return m_internal->getUniformLocation(program, name.utf8().data());
1500 void GraphicsContext3D::getVertexAttribfv(GC3Duint index, GC3Denum paramName, GC3Dfloat* value)
1502 m_internal->m_glWidget->makeCurrent();
1503 m_internal->getVertexAttribfv(index, paramName, value);
1506 void GraphicsContext3D::getVertexAttribiv(GC3Duint index, GC3Denum paramName, GC3Dint* value)
1508 m_internal->m_glWidget->makeCurrent();
1509 m_internal->getVertexAttribiv(index, paramName, value);
1512 GC3Dsizeiptr GraphicsContext3D::getVertexAttribOffset(GC3Duint index, GC3Denum paramName)
1514 m_internal->m_glWidget->makeCurrent();
1516 GLvoid* pointer = 0;
1517 m_internal->getVertexAttribPointerv(index, paramName, &pointer);
1518 return static_cast<GC3Dsizeiptr>(reinterpret_cast<intptr_t>(pointer));
1521 bool GraphicsContext3D::texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels)
1523 m_internal->m_glWidget->makeCurrent();
1524 glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
1528 void GraphicsContext3D::texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoff, GC3Dint yoff, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels)
1530 m_internal->m_glWidget->makeCurrent();
1531 glTexSubImage2D(target, level, xoff, yoff, width, height, format, type, pixels);
1534 Platform3DObject GraphicsContext3D::createBuffer()
1536 m_internal->m_glWidget->makeCurrent();
1538 m_internal->genBuffers(/* count */ 1, &handle);
1542 Platform3DObject GraphicsContext3D::createFramebuffer()
1544 m_internal->m_glWidget->makeCurrent();
1546 m_internal->genFramebuffers(/* count */ 1, &handle);
1550 Platform3DObject GraphicsContext3D::createProgram()
1552 m_internal->m_glWidget->makeCurrent();
1553 return m_internal->createProgram();
1556 Platform3DObject GraphicsContext3D::createRenderbuffer()
1558 m_internal->m_glWidget->makeCurrent();
1560 m_internal->genRenderbuffers(/* count */ 1, &handle);
1564 Platform3DObject GraphicsContext3D::createShader(GC3Denum type)
1566 m_internal->m_glWidget->makeCurrent();
1567 return m_internal->createShader(type);
1570 Platform3DObject GraphicsContext3D::createTexture()
1572 m_internal->m_glWidget->makeCurrent();
1574 glGenTextures(1, &handle);
1578 void GraphicsContext3D::deleteBuffer(Platform3DObject buffer)
1580 m_internal->m_glWidget->makeCurrent();
1581 m_internal->deleteBuffers(1, &buffer);
1584 void GraphicsContext3D::deleteFramebuffer(Platform3DObject framebuffer)
1586 m_internal->m_glWidget->makeCurrent();
1587 m_internal->deleteFramebuffers(1, &framebuffer);
1590 void GraphicsContext3D::deleteProgram(Platform3DObject program)
1592 m_internal->m_glWidget->makeCurrent();
1593 m_internal->deleteProgram(program);
1596 void GraphicsContext3D::deleteRenderbuffer(Platform3DObject renderbuffer)
1598 m_internal->m_glWidget->makeCurrent();
1599 m_internal->deleteRenderbuffers(1, &renderbuffer);
1602 void GraphicsContext3D::deleteShader(Platform3DObject shader)
1604 m_internal->m_glWidget->makeCurrent();
1605 m_internal->deleteShader(shader);
1608 void GraphicsContext3D::deleteTexture(Platform3DObject texture)
1610 m_internal->m_glWidget->makeCurrent();
1611 glDeleteTextures(1, &texture);
1614 void GraphicsContext3D::synthesizeGLError(GC3Denum error)
1616 m_internal->m_syntheticErrors.add(error);
1619 Extensions3D* GraphicsContext3D::getExtensions()
1621 if (!m_internal->m_extensions)
1622 m_internal->m_extensions = adoptPtr(new Extensions3DQt);
1623 return m_internal->m_extensions;
1626 bool GraphicsContext3D::getImageData(Image* image,
1629 bool premultiplyAlpha,
1630 bool ignoreGammaAndColorProfile,
1631 Vector<uint8_t>& outputVector)
1633 UNUSED_PARAM(ignoreGammaAndColorProfile);
1636 QPixmap* nativePixmap = image->nativeImageForCurrentFrame();
1640 AlphaOp neededAlphaOp = kAlphaDoNothing;
1641 if (!premultiplyAlpha)
1642 // FIXME: must fetch the image data before the premultiplication step
1643 neededAlphaOp = kAlphaDoUnmultiply;
1644 QImage nativeImage = nativePixmap->toImage().convertToFormat(QImage::Format_ARGB32);
1645 outputVector.resize(nativeImage.byteCount());
1646 return packPixels(nativeImage.rgbSwapped().bits(), kSourceFormatRGBA8, image->width(), image->height(), 0,
1647 format, type, neededAlphaOp, outputVector.data());
1650 void GraphicsContext3D::setContextLostCallback(PassOwnPtr<ContextLostCallback>)
1656 #endif // ENABLE(WEBGL)