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 <cairo/OpenGLShims.h>
25 #include "CanvasRenderingContext.h"
26 #if defined(QT_OPENGL_ES_2)
27 #include "Extensions3DQt.h"
29 #include "Extensions3DOpenGL.h"
31 #include "GraphicsContext.h"
32 #include "HTMLCanvasElement.h"
33 #include "HostWindow.h"
34 #include "ImageBuffer.h"
35 #include "ImageData.h"
36 #include "NotImplemented.h"
37 #include "QWebPageClient.h"
38 #include "SharedBuffer.h"
40 #include <QAbstractScrollArea>
41 #include <QGraphicsObject>
43 #include <QStyleOptionGraphicsItem>
44 #include <wtf/UnusedParam.h>
45 #include <wtf/text/CString.h>
47 #if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER) && USE(TEXTURE_MAPPER_GL)
48 #include <opengl/TextureMapperGL.h>
59 #if !defined(GL_DEPTH24_STENCIL8)
60 #define GL_DEPTH24_STENCIL8 0x88F0
63 class GraphicsContext3DPrivate
64 #if USE(ACCELERATED_COMPOSITING)
65 #if USE(TEXTURE_MAPPER)
66 : public TextureMapperPlatformLayer
68 : public QGraphicsObject
73 GraphicsContext3DPrivate(GraphicsContext3D*, HostWindow*);
74 ~GraphicsContext3DPrivate();
76 QGLWidget* getViewportGLWidget();
77 #if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER)
78 virtual void paintToTextureMapper(TextureMapper*, const FloatRect& target, const TransformationMatrix&, float opacity, BitmapTexture* mask) const;
81 void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
82 QRectF boundingRect() const;
83 void blitMultisampleFramebuffer() const;
84 void blitMultisampleFramebufferAndRestoreContext() const;
86 GraphicsContext3D* m_context;
87 HostWindow* m_hostWindow;
88 QGLWidget* m_glWidget;
89 QGLWidget* m_viewportGLWidget;
92 bool GraphicsContext3D::isGLES2Compliant() const
94 #if defined (QT_OPENGL_ES_2)
101 GraphicsContext3DPrivate::GraphicsContext3DPrivate(GraphicsContext3D* context, HostWindow* hostWindow)
103 , m_hostWindow(hostWindow)
105 , m_viewportGLWidget(0)
107 m_viewportGLWidget = getViewportGLWidget();
109 if (m_viewportGLWidget)
110 m_glWidget = new QGLWidget(0, m_viewportGLWidget);
112 m_glWidget = new QGLWidget();
114 // Geometry can be set to zero because m_glWidget is used only for its QGLContext.
115 m_glWidget->setGeometry(0, 0, 0, 0);
117 m_glWidget->makeCurrent();
120 GraphicsContext3DPrivate::~GraphicsContext3DPrivate()
126 QGLWidget* GraphicsContext3DPrivate::getViewportGLWidget()
128 QWebPageClient* webPageClient = m_hostWindow->platformPageClient();
132 QAbstractScrollArea* scrollArea = qobject_cast<QAbstractScrollArea*>(webPageClient->ownerWidget());
134 return qobject_cast<QGLWidget*>(scrollArea->viewport());
139 static inline quint32 swapBgrToRgb(quint32 pixel)
141 return ((pixel << 16) & 0xff0000) | ((pixel >> 16) & 0xff) | (pixel & 0xff00ff00);
144 #if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER)
145 void GraphicsContext3DPrivate::paintToTextureMapper(TextureMapper* textureMapper, const FloatRect& targetRect, const TransformationMatrix& matrix, float opacity, BitmapTexture* mask) const
147 blitMultisampleFramebufferAndRestoreContext();
149 if (textureMapper->isOpenGLBacked()) {
150 TextureMapperGL* texmapGL = static_cast<TextureMapperGL*>(textureMapper);
151 texmapGL->drawTexture(m_context->m_texture, !m_context->m_attrs.alpha, FloatSize(1, 1), targetRect, matrix, opacity, mask, true /* flip */);
155 GraphicsContext* context = textureMapper->graphicsContext();
156 QPainter* painter = context->platformContext();
158 painter->setTransform(matrix);
159 painter->setOpacity(opacity);
161 const int height = m_context->m_currentHeight;
162 const int width = m_context->m_currentWidth;
164 // Alternatively read pixels to a memory buffer.
165 QImage offscreenImage(width, height, QImage::Format_ARGB32);
166 quint32* imagePixels = reinterpret_cast<quint32*>(offscreenImage.bits());
168 m_glWidget->makeCurrent();
169 glBindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_context->m_fbo);
170 glReadPixels(/* x */ 0, /* y */ 0, width, height, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, imagePixels);
171 glBindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_context->m_boundFBO);
173 // OpenGL gives us ABGR on 32 bits, and with the origin at the bottom left
174 // We need RGB32 or ARGB32_PM, with the origin at the top left.
175 quint32* pixelsSrc = imagePixels;
176 const int halfHeight = height / 2;
177 for (int row = 0; row < halfHeight; ++row) {
178 const int targetIdx = (height - 1 - row) * width;
179 quint32* pixelsDst = imagePixels + targetIdx;
180 for (int column = 0; column < width; ++column) {
181 quint32 tempPixel = *pixelsSrc;
182 *pixelsSrc = swapBgrToRgb(*pixelsDst);
183 *pixelsDst = swapBgrToRgb(tempPixel);
188 if (static_cast<int>(height) % 2) {
189 for (int column = 0; column < width; ++column) {
190 *pixelsSrc = swapBgrToRgb(*pixelsSrc);
195 painter->drawImage(targetRect, offscreenImage);
198 #endif // USE(ACCELERATED_COMPOSITING)
200 QRectF GraphicsContext3DPrivate::boundingRect() const
202 return QRectF(QPointF(0, 0), QSizeF(m_context->m_currentWidth, m_context->m_currentHeight));
205 void GraphicsContext3DPrivate::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
209 QRectF rect = option ? option->rect : boundingRect();
211 m_glWidget->makeCurrent();
212 blitMultisampleFramebuffer();
214 // Use direct texture mapping if WebGL canvas has a shared OpenGL context
215 // with browsers OpenGL context.
216 QGLWidget* viewportGLWidget = getViewportGLWidget();
217 if (viewportGLWidget && viewportGLWidget == m_viewportGLWidget && viewportGLWidget == painter->device()) {
218 viewportGLWidget->drawTexture(rect, m_context->m_texture);
222 // Alternatively read pixels to a memory buffer.
223 QImage offscreenImage(rect.width(), rect.height(), QImage::Format_ARGB32);
224 quint32* imagePixels = reinterpret_cast<quint32*>(offscreenImage.bits());
226 glBindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_context->m_fbo);
227 glReadPixels(/* x */ 0, /* y */ 0, rect.width(), rect.height(), GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, imagePixels);
228 glBindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_context->m_boundFBO);
230 // OpenGL gives us ABGR on 32 bits, and with the origin at the bottom left
231 // We need RGB32 or ARGB32_PM, with the origin at the top left.
232 quint32* pixelsSrc = imagePixels;
233 const int height = static_cast<int>(rect.height());
234 const int width = static_cast<int>(rect.width());
235 const int halfHeight = height / 2;
236 for (int row = 0; row < halfHeight; ++row) {
237 const int targetIdx = (height - 1 - row) * width;
238 quint32* pixelsDst = imagePixels + targetIdx;
239 for (int column = 0; column < width; ++column) {
240 quint32 tempPixel = *pixelsSrc;
241 *pixelsSrc = swapBgrToRgb(*pixelsDst);
242 *pixelsDst = swapBgrToRgb(tempPixel);
247 if (static_cast<int>(height) % 2) {
248 for (int column = 0; column < width; ++column) {
249 *pixelsSrc = swapBgrToRgb(*pixelsSrc);
254 painter->drawImage(/* x */ 0, /* y */ 0, offscreenImage);
257 void GraphicsContext3DPrivate::blitMultisampleFramebuffer() const
259 if (!m_context->m_attrs.antialias)
261 glBindFramebuffer(GL_READ_FRAMEBUFFER_EXT, m_context->m_multisampleFBO);
262 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_EXT, m_context->m_fbo);
263 glBlitFramebuffer(0, 0, m_context->m_currentWidth, m_context->m_currentHeight, 0, 0, m_context->m_currentWidth, m_context->m_currentHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);
264 glBindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_context->m_boundFBO);
267 void GraphicsContext3DPrivate::blitMultisampleFramebufferAndRestoreContext() const
269 if (!m_context->m_attrs.antialias)
272 const QGLContext* currentContext = QGLContext::currentContext();
273 const QGLContext* widgetContext = m_glWidget->context();
274 if (currentContext != widgetContext)
275 m_glWidget->makeCurrent();
276 blitMultisampleFramebuffer();
277 if (currentContext) {
278 if (currentContext != widgetContext)
279 const_cast<QGLContext*>(currentContext)->makeCurrent();
281 m_glWidget->doneCurrent();
284 PassRefPtr<GraphicsContext3D> GraphicsContext3D::create(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, GraphicsContext3D::RenderStyle renderStyle)
286 // This implementation doesn't currently support rendering directly to the HostWindow.
287 if (renderStyle == RenderDirectlyToHostWindow)
289 RefPtr<GraphicsContext3D> context = adoptRef(new GraphicsContext3D(attrs, hostWindow, false));
290 return context->m_private ? context.release() : 0;
293 GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, bool)
298 , m_compositorTexture(0)
300 , m_depthStencilBuffer(0)
301 , m_layerComposited(false)
302 , m_internalColorFormat(0)
304 , m_activeTexture(GL_TEXTURE0)
306 , m_multisampleFBO(0)
307 , m_multisampleDepthStencilBuffer(0)
308 , m_multisampleColorBuffer(0)
309 , m_private(adoptPtr(new GraphicsContext3DPrivate(this, hostWindow)))
311 #if defined(QT_OPENGL_ES_2)
312 m_attrs.stencil = false;
314 validateAttributes();
317 if (!m_private->m_glWidget->isValid()) {
318 LOG_ERROR("GraphicsContext3D: QGLWidget initialization failed.");
323 static bool initialized = false;
324 static bool success = true;
326 success = initializeOpenGLShims();
334 // Create buffers for the canvas FBO.
335 glGenFramebuffers(/* count */ 1, &m_fbo);
337 glGenTextures(1, &m_texture);
338 glBindTexture(GraphicsContext3D::TEXTURE_2D, m_texture);
339 glTexParameterf(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR);
340 glTexParameterf(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR);
341 glTexParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE);
342 glTexParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE);
343 glBindTexture(GraphicsContext3D::TEXTURE_2D, 0);
345 // Create a multisample FBO.
346 if (m_attrs.antialias) {
347 glGenFramebuffers(1, &m_multisampleFBO);
348 glBindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_multisampleFBO);
349 m_boundFBO = m_multisampleFBO;
350 glGenRenderbuffers(1, &m_multisampleColorBuffer);
351 if (m_attrs.stencil || m_attrs.depth)
352 glGenRenderbuffers(1, &m_multisampleDepthStencilBuffer);
355 glBindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo);
357 if (m_attrs.stencil || m_attrs.depth)
358 glGenRenderbuffers(1, &m_depthStencilBuffer);
361 #if !defined(QT_OPENGL_ES_2)
362 // ANGLE initialization.
363 ShBuiltInResources ANGLEResources;
364 ShInitBuiltInResources(&ANGLEResources);
366 getIntegerv(GraphicsContext3D::MAX_VERTEX_ATTRIBS, &ANGLEResources.MaxVertexAttribs);
367 getIntegerv(GraphicsContext3D::MAX_VERTEX_UNIFORM_VECTORS, &ANGLEResources.MaxVertexUniformVectors);
368 getIntegerv(GraphicsContext3D::MAX_VARYING_VECTORS, &ANGLEResources.MaxVaryingVectors);
369 getIntegerv(GraphicsContext3D::MAX_VERTEX_TEXTURE_IMAGE_UNITS, &ANGLEResources.MaxVertexTextureImageUnits);
370 getIntegerv(GraphicsContext3D::MAX_COMBINED_TEXTURE_IMAGE_UNITS, &ANGLEResources.MaxCombinedTextureImageUnits);
371 getIntegerv(GraphicsContext3D::MAX_TEXTURE_IMAGE_UNITS, &ANGLEResources.MaxTextureImageUnits);
372 getIntegerv(GraphicsContext3D::MAX_FRAGMENT_UNIFORM_VECTORS, &ANGLEResources.MaxFragmentUniformVectors);
374 // Always set to 1 for OpenGL ES.
375 ANGLEResources.MaxDrawBuffers = 1;
376 m_compiler.setResources(ANGLEResources);
378 glEnable(GL_POINT_SPRITE);
379 glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
382 glClearColor(0.0, 0.0, 0.0, 0.0);
385 GraphicsContext3D::~GraphicsContext3D()
387 m_private->m_glWidget->makeCurrent();
388 if (!m_private->m_glWidget->isValid())
390 glDeleteTextures(1, &m_texture);
391 glDeleteFramebuffers(1, &m_fbo);
392 if (m_attrs.antialias) {
393 glDeleteRenderbuffers(1, &m_multisampleColorBuffer);
394 glDeleteFramebuffers(1, &m_multisampleFBO);
395 if (m_attrs.stencil || m_attrs.depth)
396 glDeleteRenderbuffers(1, &m_multisampleDepthStencilBuffer);
397 } else if (m_attrs.stencil || m_attrs.depth)
398 glDeleteRenderbuffers(1, &m_depthStencilBuffer);
401 PlatformGraphicsContext3D GraphicsContext3D::platformGraphicsContext3D()
403 return m_private->m_glWidget;
406 Platform3DObject GraphicsContext3D::platformTexture() const
411 #if USE(ACCELERATED_COMPOSITING)
412 PlatformLayer* GraphicsContext3D::platformLayer() const
414 return m_private.get();
418 void GraphicsContext3D::makeContextCurrent()
420 m_private->m_glWidget->makeCurrent();
423 void GraphicsContext3D::paintRenderingResultsToCanvas(CanvasRenderingContext* context)
425 m_private->m_glWidget->makeCurrent();
426 HTMLCanvasElement* canvas = context->canvas();
427 ImageBuffer* imageBuffer = canvas->buffer();
428 QPainter* painter = imageBuffer->context()->platformContext();
429 m_private->paint(painter, 0, 0);
432 #if defined(QT_OPENGL_ES_2)
433 PassRefPtr<ImageData> GraphicsContext3D::paintRenderingResultsToImageData()
435 // FIXME: This needs to be implemented for proper non-premultiplied-alpha
440 void GraphicsContext3D::reshape(int width, int height)
442 if ((width == m_currentWidth && height == m_currentHeight) || (!m_private))
445 m_currentWidth = width;
446 m_currentHeight = height;
448 m_private->m_glWidget->makeCurrent();
450 // Create color buffer
451 glBindTexture(GraphicsContext3D::TEXTURE_2D, m_texture);
453 glTexImage2D(GraphicsContext3D::TEXTURE_2D, /* level */ 0, GraphicsContext3D::RGBA, width, height, /* border */ 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, /* data */ 0);
455 glTexImage2D(GraphicsContext3D::TEXTURE_2D, /* level */ 0, GraphicsContext3D::RGB, width, height, /* border */ 0, GraphicsContext3D::RGB, GraphicsContext3D::UNSIGNED_BYTE, /* data */ 0);
456 glBindTexture(GraphicsContext3D::TEXTURE_2D, 0);
459 // Create depth and stencil buffers.
460 glBindRenderbuffer(GraphicsContext3D::RENDERBUFFER, m_depthStencilBuffer);
461 #if defined(QT_OPENGL_ES_2)
462 glRenderbufferStorage(GraphicsContext3D::RENDERBUFFER, GraphicsContext3D::DEPTH_COMPONENT16, width, height);
465 glRenderbufferStorage(GraphicsContext3D::RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
467 glRenderbufferStorage(GraphicsContext3D::RENDERBUFFER, GraphicsContext3D::DEPTH_COMPONENT, width, height);
469 glBindRenderbuffer(GraphicsContext3D::RENDERBUFFER, 0);
472 // Construct canvas FBO.
473 glBindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo);
474 glFramebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, m_texture, 0);
476 glFramebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::DEPTH_ATTACHMENT, GraphicsContext3D::RENDERBUFFER, m_depthStencilBuffer);
477 #if !defined(QT_OPENGL_ES_2)
479 glFramebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::STENCIL_ATTACHMENT, GraphicsContext3D::RENDERBUFFER, m_depthStencilBuffer);
482 GLenum status = glCheckFramebufferStatus(GraphicsContext3D::FRAMEBUFFER);
483 if (status != GraphicsContext3D::FRAMEBUFFER_COMPLETE) {
484 LOG_ERROR("GraphicsContext3D: Canvas FBO initialization failed.");
488 int clearFlags = GraphicsContext3D::COLOR_BUFFER_BIT;
490 clearFlags |= GraphicsContext3D::DEPTH_BUFFER_BIT;
492 clearFlags |= GraphicsContext3D::STENCIL_BUFFER_BIT;
498 IntSize GraphicsContext3D::getInternalFramebufferSize() const
500 return IntSize(m_currentWidth, m_currentHeight);
503 void GraphicsContext3D::activeTexture(GC3Denum texture)
505 m_private->m_glWidget->makeCurrent();
506 glActiveTexture(texture);
509 void GraphicsContext3D::attachShader(Platform3DObject program, Platform3DObject shader)
513 m_private->m_glWidget->makeCurrent();
514 glAttachShader(program, shader);
517 void GraphicsContext3D::getAttachedShaders(Platform3DObject program, GC3Dsizei maxCount, GC3Dsizei* count, Platform3DObject* shaders)
520 synthesizeGLError(INVALID_VALUE);
524 m_private->m_glWidget->makeCurrent();
525 glGetAttachedShaders(program, maxCount, count, shaders);
528 void GraphicsContext3D::bindAttribLocation(Platform3DObject program, GC3Duint index, const String& name)
531 m_private->m_glWidget->makeCurrent();
532 glBindAttribLocation(program, index, name.utf8().data());
535 void GraphicsContext3D::bindBuffer(GC3Denum target, Platform3DObject buffer)
537 m_private->m_glWidget->makeCurrent();
538 glBindBuffer(target, buffer);
541 void GraphicsContext3D::bindFramebuffer(GC3Denum target, Platform3DObject buffer)
543 m_private->m_glWidget->makeCurrent();
544 m_boundFBO = buffer ? buffer : m_fbo;
545 glBindFramebuffer(target, m_boundFBO);
548 void GraphicsContext3D::bindRenderbuffer(GC3Denum target, Platform3DObject renderbuffer)
550 m_private->m_glWidget->makeCurrent();
551 glBindRenderbuffer(target, renderbuffer);
554 void GraphicsContext3D::bindTexture(GC3Denum target, Platform3DObject texture)
556 m_private->m_glWidget->makeCurrent();
557 glBindTexture(target, texture);
560 void GraphicsContext3D::blendColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha)
562 m_private->m_glWidget->makeCurrent();
563 glBlendColor(red, green, blue, alpha);
566 void GraphicsContext3D::blendEquation(GC3Denum mode)
568 m_private->m_glWidget->makeCurrent();
569 glBlendEquation(mode);
572 void GraphicsContext3D::blendEquationSeparate(GC3Denum modeRGB, GC3Denum modeAlpha)
574 m_private->m_glWidget->makeCurrent();
575 glBlendEquationSeparate(modeRGB, modeAlpha);
578 void GraphicsContext3D::blendFunc(GC3Denum sfactor, GC3Denum dfactor)
580 m_private->m_glWidget->makeCurrent();
581 glBlendFunc(sfactor, dfactor);
584 void GraphicsContext3D::blendFuncSeparate(GC3Denum srcRGB, GC3Denum dstRGB, GC3Denum srcAlpha, GC3Denum dstAlpha)
586 m_private->m_glWidget->makeCurrent();
587 glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
590 void GraphicsContext3D::bufferData(GC3Denum target, GC3Dsizeiptr size, GC3Denum usage)
592 m_private->m_glWidget->makeCurrent();
593 glBufferData(target, size, /* data */ 0, usage);
596 void GraphicsContext3D::bufferData(GC3Denum target, GC3Dsizeiptr size, const void* data, GC3Denum usage)
598 m_private->m_glWidget->makeCurrent();
599 glBufferData(target, size, data, usage);
602 void GraphicsContext3D::bufferSubData(GC3Denum target, GC3Dintptr offset, GC3Dsizeiptr size, const void* data)
604 m_private->m_glWidget->makeCurrent();
605 glBufferSubData(target, offset, size, data);
608 GC3Denum GraphicsContext3D::checkFramebufferStatus(GC3Denum target)
610 m_private->m_glWidget->makeCurrent();
611 return glCheckFramebufferStatus(target);
614 void GraphicsContext3D::clearColor(GC3Dclampf r, GC3Dclampf g, GC3Dclampf b, GC3Dclampf a)
616 m_private->m_glWidget->makeCurrent();
617 glClearColor(r, g, b, a);
620 void GraphicsContext3D::clear(GC3Dbitfield mask)
622 m_private->m_glWidget->makeCurrent();
626 void GraphicsContext3D::clearDepth(GC3Dclampf depth)
628 m_private->m_glWidget->makeCurrent();
629 #if defined(QT_OPENGL_ES_2)
630 glClearDepthf(depth);
636 void GraphicsContext3D::clearStencil(GC3Dint s)
638 m_private->m_glWidget->makeCurrent();
642 void GraphicsContext3D::colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboolean alpha)
644 m_private->m_glWidget->makeCurrent();
645 glColorMask(red, green, blue, alpha);
648 void GraphicsContext3D::compileShader(Platform3DObject shader)
651 m_private->m_glWidget->makeCurrent();
652 glCompileShader(shader);
655 void GraphicsContext3D::copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border)
657 m_private->m_glWidget->makeCurrent();
658 glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
661 void GraphicsContext3D::copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
663 m_private->m_glWidget->makeCurrent();
664 glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
667 void GraphicsContext3D::cullFace(GC3Denum mode)
669 m_private->m_glWidget->makeCurrent();
673 void GraphicsContext3D::depthFunc(GC3Denum func)
675 m_private->m_glWidget->makeCurrent();
679 void GraphicsContext3D::depthMask(GC3Dboolean flag)
681 m_private->m_glWidget->makeCurrent();
685 void GraphicsContext3D::depthRange(GC3Dclampf zNear, GC3Dclampf zFar)
687 m_private->m_glWidget->makeCurrent();
688 #if defined(QT_OPENGL_ES_2)
689 glDepthRangef(zNear, zFar);
691 glDepthRange(zNear, zFar);
695 void GraphicsContext3D::detachShader(Platform3DObject program, Platform3DObject shader)
699 m_private->m_glWidget->makeCurrent();
700 glDetachShader(program, shader);
703 void GraphicsContext3D::disable(GC3Denum cap)
705 m_private->m_glWidget->makeCurrent();
709 void GraphicsContext3D::disableVertexAttribArray(GC3Duint index)
711 m_private->m_glWidget->makeCurrent();
712 glDisableVertexAttribArray(index);
715 void GraphicsContext3D::drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count)
717 m_private->m_glWidget->makeCurrent();
718 glDrawArrays(mode, first, count);
721 void GraphicsContext3D::drawElements(GC3Denum mode, GC3Dsizei count, GC3Denum type, GC3Dintptr offset)
723 m_private->m_glWidget->makeCurrent();
724 glDrawElements(mode, count, type, reinterpret_cast<GLvoid*>(static_cast<intptr_t>(offset)));
727 void GraphicsContext3D::enable(GC3Denum cap)
729 m_private->m_glWidget->makeCurrent();
733 void GraphicsContext3D::enableVertexAttribArray(GC3Duint index)
735 m_private->m_glWidget->makeCurrent();
736 glEnableVertexAttribArray(index);
739 void GraphicsContext3D::finish()
741 m_private->m_glWidget->makeCurrent();
745 void GraphicsContext3D::flush()
747 m_private->m_glWidget->makeCurrent();
751 void GraphicsContext3D::framebufferRenderbuffer(GC3Denum target, GC3Denum attachment, GC3Denum renderbuffertarget, Platform3DObject buffer)
753 m_private->m_glWidget->makeCurrent();
754 glFramebufferRenderbuffer(target, attachment, renderbuffertarget, buffer);
757 void GraphicsContext3D::framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, Platform3DObject texture, GC3Dint level)
759 m_private->m_glWidget->makeCurrent();
760 glFramebufferTexture2D(target, attachment, textarget, texture, level);
763 void GraphicsContext3D::frontFace(GC3Denum mode)
765 m_private->m_glWidget->makeCurrent();
769 void GraphicsContext3D::generateMipmap(GC3Denum target)
771 m_private->m_glWidget->makeCurrent();
772 glGenerateMipmap(target);
775 bool GraphicsContext3D::getActiveAttrib(Platform3DObject program, GC3Duint index, ActiveInfo& info)
778 synthesizeGLError(INVALID_VALUE);
782 m_private->m_glWidget->makeCurrent();
785 glGetProgramiv(program, GraphicsContext3D::ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxLength);
787 GLchar* name = (GLchar*) fastMalloc(maxLength);
788 GLsizei nameLength = 0;
792 glGetActiveAttrib(program, index, maxLength, &nameLength, &size, &type, name);
799 info.name = String(name, nameLength);
807 bool GraphicsContext3D::getActiveUniform(Platform3DObject program, GC3Duint index, ActiveInfo& info)
810 synthesizeGLError(INVALID_VALUE);
814 m_private->m_glWidget->makeCurrent();
817 glGetProgramiv(static_cast<GLuint>(program), GraphicsContext3D::ACTIVE_UNIFORM_MAX_LENGTH, &maxLength);
819 GLchar* name = (GLchar*) fastMalloc(maxLength);
820 GLsizei nameLength = 0;
824 glGetActiveUniform(static_cast<GLuint>(program), index, maxLength, &nameLength, &size, &type, name);
831 info.name = String(name, nameLength);
839 int GraphicsContext3D::getAttribLocation(Platform3DObject program, const String& name)
844 m_private->m_glWidget->makeCurrent();
845 return glGetAttribLocation(program, name.utf8().data());
848 GraphicsContext3D::Attributes GraphicsContext3D::getContextAttributes()
853 GC3Denum GraphicsContext3D::getError()
855 if (m_syntheticErrors.size() > 0) {
856 ListHashSet<GC3Denum>::iterator iter = m_syntheticErrors.begin();
857 GC3Denum err = *iter;
858 m_syntheticErrors.remove(iter);
862 m_private->m_glWidget->makeCurrent();
866 String GraphicsContext3D::getString(GC3Denum name)
868 m_private->m_glWidget->makeCurrent();
869 return String((const char*) glGetString(name));
872 void GraphicsContext3D::hint(GC3Denum target, GC3Denum mode)
874 m_private->m_glWidget->makeCurrent();
875 glHint(target, mode);
878 GC3Dboolean GraphicsContext3D::isBuffer(Platform3DObject buffer)
883 m_private->m_glWidget->makeCurrent();
884 return glIsBuffer(buffer);
887 GC3Dboolean GraphicsContext3D::isEnabled(GC3Denum cap)
889 m_private->m_glWidget->makeCurrent();
890 return glIsEnabled(cap);
893 GC3Dboolean GraphicsContext3D::isFramebuffer(Platform3DObject framebuffer)
898 m_private->m_glWidget->makeCurrent();
899 return glIsFramebuffer(framebuffer);
902 GC3Dboolean GraphicsContext3D::isProgram(Platform3DObject program)
907 m_private->m_glWidget->makeCurrent();
908 return glIsProgram(program);
911 GC3Dboolean GraphicsContext3D::isRenderbuffer(Platform3DObject renderbuffer)
916 m_private->m_glWidget->makeCurrent();
917 return glIsRenderbuffer(renderbuffer);
920 GC3Dboolean GraphicsContext3D::isShader(Platform3DObject shader)
925 m_private->m_glWidget->makeCurrent();
926 return glIsShader(shader);
929 GC3Dboolean GraphicsContext3D::isTexture(Platform3DObject texture)
934 m_private->m_glWidget->makeCurrent();
935 return glIsTexture(texture);
938 void GraphicsContext3D::lineWidth(GC3Dfloat width)
940 m_private->m_glWidget->makeCurrent();
941 glLineWidth(static_cast<float>(width));
944 void GraphicsContext3D::linkProgram(Platform3DObject program)
947 m_private->m_glWidget->makeCurrent();
948 glLinkProgram(program);
951 void GraphicsContext3D::pixelStorei(GC3Denum paramName, GC3Dint param)
953 m_private->m_glWidget->makeCurrent();
954 glPixelStorei(paramName, param);
957 void GraphicsContext3D::polygonOffset(GC3Dfloat factor, GC3Dfloat units)
959 m_private->m_glWidget->makeCurrent();
960 glPolygonOffset(factor, units);
963 void GraphicsContext3D::readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data)
965 m_private->m_glWidget->makeCurrent();
967 if (type != GraphicsContext3D::UNSIGNED_BYTE || format != GraphicsContext3D::RGBA)
970 glReadPixels(x, y, width, height, format, type, data);
973 void GraphicsContext3D::releaseShaderCompiler()
975 m_private->m_glWidget->makeCurrent();
979 void GraphicsContext3D::renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height)
981 m_private->m_glWidget->makeCurrent();
982 #if !defined(QT_OPENGL_ES_2)
983 switch (internalformat) {
985 internalformat = GL_DEPTH24_STENCIL8;
987 case DEPTH_COMPONENT16:
988 internalformat = DEPTH_COMPONENT;
992 internalformat = RGBA;
995 internalformat = RGB;
999 glRenderbufferStorage(target, internalformat, width, height);
1002 void GraphicsContext3D::sampleCoverage(GC3Dclampf value, GC3Dboolean invert)
1004 m_private->m_glWidget->makeCurrent();
1005 glSampleCoverage(value, invert);
1008 void GraphicsContext3D::scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
1010 m_private->m_glWidget->makeCurrent();
1011 glScissor(x, y, width, height);
1014 void GraphicsContext3D::shaderSource(Platform3DObject shader, const String& source)
1018 m_private->m_glWidget->makeCurrent();
1020 String prefixedSource;
1022 #if defined (QT_OPENGL_ES_2)
1023 prefixedSource.append("precision mediump float;\n");
1026 prefixedSource.append(source);
1028 CString sourceCS = prefixedSource.utf8();
1029 const char* data = sourceCS.data();
1030 int length = prefixedSource.length();
1031 glShaderSource((GLuint) shader, /* count */ 1, &data, &length);
1034 void GraphicsContext3D::stencilFunc(GC3Denum func, GC3Dint ref, GC3Duint mask)
1036 m_private->m_glWidget->makeCurrent();
1037 glStencilFunc(func, ref, mask);
1040 void GraphicsContext3D::stencilFuncSeparate(GC3Denum face, GC3Denum func, GC3Dint ref, GC3Duint mask)
1042 m_private->m_glWidget->makeCurrent();
1043 glStencilFuncSeparate(face, func, ref, mask);
1046 void GraphicsContext3D::stencilMask(GC3Duint mask)
1048 m_private->m_glWidget->makeCurrent();
1049 glStencilMask(mask);
1052 void GraphicsContext3D::stencilMaskSeparate(GC3Denum face, GC3Duint mask)
1054 m_private->m_glWidget->makeCurrent();
1055 glStencilMaskSeparate(face, mask);
1058 void GraphicsContext3D::stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zpass)
1060 m_private->m_glWidget->makeCurrent();
1061 glStencilOp(fail, zfail, zpass);
1064 void GraphicsContext3D::stencilOpSeparate(GC3Denum face, GC3Denum fail, GC3Denum zfail, GC3Denum zpass)
1066 m_private->m_glWidget->makeCurrent();
1067 glStencilOpSeparate(face, fail, zfail, zpass);
1070 void GraphicsContext3D::texParameterf(GC3Denum target, GC3Denum paramName, GC3Dfloat value)
1072 m_private->m_glWidget->makeCurrent();
1073 glTexParameterf(target, paramName, value);
1076 void GraphicsContext3D::texParameteri(GC3Denum target, GC3Denum paramName, GC3Dint value)
1078 m_private->m_glWidget->makeCurrent();
1079 glTexParameteri(target, paramName, value);
1082 void GraphicsContext3D::uniform1f(GC3Dint location, GC3Dfloat v0)
1084 m_private->m_glWidget->makeCurrent();
1085 glUniform1f(location, v0);
1088 void GraphicsContext3D::uniform1fv(GC3Dint location, GC3Dfloat* array, GC3Dsizei size)
1090 m_private->m_glWidget->makeCurrent();
1091 glUniform1fv(location, size, array);
1094 void GraphicsContext3D::uniform2f(GC3Dint location, GC3Dfloat v0, GC3Dfloat v1)
1096 m_private->m_glWidget->makeCurrent();
1097 glUniform2f(location, v0, v1);
1100 void GraphicsContext3D::uniform2fv(GC3Dint location, GC3Dfloat* array, GC3Dsizei size)
1102 m_private->m_glWidget->makeCurrent();
1103 glUniform2fv(location, size, array);
1106 void GraphicsContext3D::uniform3f(GC3Dint location, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2)
1108 m_private->m_glWidget->makeCurrent();
1109 glUniform3f(location, v0, v1, v2);
1112 void GraphicsContext3D::uniform3fv(GC3Dint location, GC3Dfloat* array, GC3Dsizei size)
1114 m_private->m_glWidget->makeCurrent();
1115 glUniform3fv(location, size, array);
1118 void GraphicsContext3D::uniform4f(GC3Dint location, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2, GC3Dfloat v3)
1120 m_private->m_glWidget->makeCurrent();
1121 glUniform4f(location, v0, v1, v2, v3);
1124 void GraphicsContext3D::uniform4fv(GC3Dint location, GC3Dfloat* array, GC3Dsizei size)
1126 m_private->m_glWidget->makeCurrent();
1127 glUniform4fv(location, size, array);
1130 void GraphicsContext3D::uniform1i(GC3Dint location, GC3Dint v0)
1132 m_private->m_glWidget->makeCurrent();
1133 glUniform1i(location, v0);
1136 void GraphicsContext3D::uniform1iv(GC3Dint location, GC3Dint* array, GC3Dsizei size)
1138 m_private->m_glWidget->makeCurrent();
1139 glUniform1iv(location, size, array);
1142 void GraphicsContext3D::uniform2i(GC3Dint location, GC3Dint v0, GC3Dint v1)
1144 m_private->m_glWidget->makeCurrent();
1145 glUniform2i(location, v0, v1);
1148 void GraphicsContext3D::uniform2iv(GC3Dint location, GC3Dint* array, GC3Dsizei size)
1150 m_private->m_glWidget->makeCurrent();
1151 glUniform2iv(location, size, array);
1154 void GraphicsContext3D::uniform3i(GC3Dint location, GC3Dint v0, GC3Dint v1, GC3Dint v2)
1156 m_private->m_glWidget->makeCurrent();
1157 glUniform3i(location, v0, v1, v2);
1160 void GraphicsContext3D::uniform3iv(GC3Dint location, GC3Dint* array, GC3Dsizei size)
1162 m_private->m_glWidget->makeCurrent();
1163 glUniform3iv(location, size, array);
1166 void GraphicsContext3D::uniform4i(GC3Dint location, GC3Dint v0, GC3Dint v1, GC3Dint v2, GC3Dint v3)
1168 m_private->m_glWidget->makeCurrent();
1169 glUniform4i(location, v0, v1, v2, v3);
1172 void GraphicsContext3D::uniform4iv(GC3Dint location, GC3Dint* array, GC3Dsizei size)
1174 m_private->m_glWidget->makeCurrent();
1175 glUniform4iv(location, size, array);
1178 void GraphicsContext3D::uniformMatrix2fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* array, GC3Dsizei size)
1180 m_private->m_glWidget->makeCurrent();
1181 glUniformMatrix2fv(location, size, transpose, array);
1184 void GraphicsContext3D::uniformMatrix3fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* array, GC3Dsizei size)
1186 m_private->m_glWidget->makeCurrent();
1187 glUniformMatrix3fv(location, size, transpose, array);
1190 void GraphicsContext3D::uniformMatrix4fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* array, GC3Dsizei size)
1192 m_private->m_glWidget->makeCurrent();
1193 glUniformMatrix4fv(location, size, transpose, array);
1196 void GraphicsContext3D::useProgram(Platform3DObject program)
1198 m_private->m_glWidget->makeCurrent();
1199 glUseProgram(program);
1202 void GraphicsContext3D::validateProgram(Platform3DObject program)
1206 m_private->m_glWidget->makeCurrent();
1207 glValidateProgram(program);
1210 void GraphicsContext3D::vertexAttrib1f(GC3Duint index, GC3Dfloat v0)
1212 m_private->m_glWidget->makeCurrent();
1213 glVertexAttrib1f(index, v0);
1216 void GraphicsContext3D::vertexAttrib1fv(GC3Duint index, GC3Dfloat* array)
1218 m_private->m_glWidget->makeCurrent();
1219 glVertexAttrib1fv(index, array);
1222 void GraphicsContext3D::vertexAttrib2f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1)
1224 m_private->m_glWidget->makeCurrent();
1225 glVertexAttrib2f(index, v0, v1);
1228 void GraphicsContext3D::vertexAttrib2fv(GC3Duint index, GC3Dfloat* array)
1230 m_private->m_glWidget->makeCurrent();
1231 glVertexAttrib2fv(index, array);
1234 void GraphicsContext3D::vertexAttrib3f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2)
1236 m_private->m_glWidget->makeCurrent();
1237 glVertexAttrib3f(index, v0, v1, v2);
1240 void GraphicsContext3D::vertexAttrib3fv(GC3Duint index, GC3Dfloat* array)
1242 m_private->m_glWidget->makeCurrent();
1243 glVertexAttrib3fv(index, array);
1246 void GraphicsContext3D::vertexAttrib4f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2, GC3Dfloat v3)
1248 m_private->m_glWidget->makeCurrent();
1249 glVertexAttrib4f(index, v0, v1, v2, v3);
1252 void GraphicsContext3D::vertexAttrib4fv(GC3Duint index, GC3Dfloat* array)
1254 m_private->m_glWidget->makeCurrent();
1255 glVertexAttrib4fv(index, array);
1258 void GraphicsContext3D::vertexAttribPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dboolean normalized, GC3Dsizei stride, GC3Dintptr offset)
1260 m_private->m_glWidget->makeCurrent();
1261 glVertexAttribPointer(index, size, type, normalized, stride, reinterpret_cast<GLvoid*>(static_cast<intptr_t>(offset)));
1264 void GraphicsContext3D::viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
1266 m_private->m_glWidget->makeCurrent();
1267 glViewport(x, y, width, height);
1270 void GraphicsContext3D::getBooleanv(GC3Denum paramName, GC3Dboolean* value)
1272 m_private->m_glWidget->makeCurrent();
1273 glGetBooleanv(paramName, value);
1276 void GraphicsContext3D::getBufferParameteriv(GC3Denum target, GC3Denum paramName, GC3Dint* value)
1278 m_private->m_glWidget->makeCurrent();
1279 glGetBufferParameteriv(target, paramName, value);
1282 void GraphicsContext3D::getFloatv(GC3Denum paramName, GC3Dfloat* value)
1284 m_private->m_glWidget->makeCurrent();
1285 glGetFloatv(paramName, value);
1288 void GraphicsContext3D::getFramebufferAttachmentParameteriv(GC3Denum target, GC3Denum attachment, GC3Denum paramName, GC3Dint* value)
1290 m_private->m_glWidget->makeCurrent();
1291 glGetFramebufferAttachmentParameteriv(target, attachment, paramName, value);
1294 void GraphicsContext3D::getIntegerv(GC3Denum paramName, GC3Dint* value)
1296 m_private->m_glWidget->makeCurrent();
1297 glGetIntegerv(paramName, value);
1300 void GraphicsContext3D::getProgramiv(Platform3DObject program, GC3Denum paramName, GC3Dint* value)
1302 m_private->m_glWidget->makeCurrent();
1303 glGetProgramiv(program, paramName, value);
1306 String GraphicsContext3D::getProgramInfoLog(Platform3DObject program)
1308 m_private->m_glWidget->makeCurrent();
1311 glGetProgramiv(program, GraphicsContext3D::INFO_LOG_LENGTH, &length);
1315 GLchar* info = (GLchar*) fastMalloc(length);
1319 glGetProgramInfoLog(program, length, &size, info);
1321 String result(info);
1327 void GraphicsContext3D::getRenderbufferParameteriv(GC3Denum target, GC3Denum paramName, GC3Dint* value)
1329 m_private->m_glWidget->makeCurrent();
1330 glGetRenderbufferParameteriv(target, paramName, value);
1333 void GraphicsContext3D::getShaderiv(Platform3DObject shader, GC3Denum paramName, GC3Dint* value)
1336 m_private->m_glWidget->makeCurrent();
1337 glGetShaderiv(shader, paramName, value);
1340 String GraphicsContext3D::getShaderInfoLog(Platform3DObject shader)
1342 m_private->m_glWidget->makeCurrent();
1345 glGetShaderiv(shader, GraphicsContext3D::INFO_LOG_LENGTH, &length);
1348 GLchar* info = (GLchar*) fastMalloc(length);
1352 glGetShaderInfoLog(shader, length, &size, info);
1354 String result(info);
1360 String GraphicsContext3D::getShaderSource(Platform3DObject shader)
1362 m_private->m_glWidget->makeCurrent();
1365 glGetShaderiv(shader, GraphicsContext3D::SHADER_SOURCE_LENGTH, &length);
1368 GLchar* info = (GLchar*) fastMalloc(length);
1372 glGetShaderSource(shader, length, &size, info);
1374 String result(info);
1380 void GraphicsContext3D::getTexParameterfv(GC3Denum target, GC3Denum paramName, GC3Dfloat* value)
1382 m_private->m_glWidget->makeCurrent();
1383 glGetTexParameterfv(target, paramName, value);
1386 void GraphicsContext3D::getTexParameteriv(GC3Denum target, GC3Denum paramName, GC3Dint* value)
1388 m_private->m_glWidget->makeCurrent();
1389 glGetTexParameteriv(target, paramName, value);
1392 void GraphicsContext3D::getUniformfv(Platform3DObject program, GC3Dint location, GC3Dfloat* value)
1394 m_private->m_glWidget->makeCurrent();
1395 glGetUniformfv(program, location, value);
1398 void GraphicsContext3D::getUniformiv(Platform3DObject program, GC3Dint location, GC3Dint* value)
1400 m_private->m_glWidget->makeCurrent();
1401 glGetUniformiv(program, location, value);
1404 GC3Dint GraphicsContext3D::getUniformLocation(Platform3DObject program, const String& name)
1408 m_private->m_glWidget->makeCurrent();
1409 return glGetUniformLocation(program, name.utf8().data());
1412 void GraphicsContext3D::getVertexAttribfv(GC3Duint index, GC3Denum paramName, GC3Dfloat* value)
1414 m_private->m_glWidget->makeCurrent();
1415 glGetVertexAttribfv(index, paramName, value);
1418 void GraphicsContext3D::getVertexAttribiv(GC3Duint index, GC3Denum paramName, GC3Dint* value)
1420 m_private->m_glWidget->makeCurrent();
1421 glGetVertexAttribiv(index, paramName, value);
1424 GC3Dsizeiptr GraphicsContext3D::getVertexAttribOffset(GC3Duint index, GC3Denum paramName)
1426 m_private->m_glWidget->makeCurrent();
1428 GLvoid* pointer = 0;
1429 glGetVertexAttribPointerv(index, paramName, &pointer);
1430 return static_cast<GC3Dsizeiptr>(reinterpret_cast<intptr_t>(pointer));
1433 bool GraphicsContext3D::texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels)
1435 m_private->m_glWidget->makeCurrent();
1436 glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
1440 void GraphicsContext3D::texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoff, GC3Dint yoff, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels)
1442 m_private->m_glWidget->makeCurrent();
1443 glTexSubImage2D(target, level, xoff, yoff, width, height, format, type, pixels);
1446 Platform3DObject GraphicsContext3D::createBuffer()
1448 m_private->m_glWidget->makeCurrent();
1450 glGenBuffers(/* count */ 1, &handle);
1454 Platform3DObject GraphicsContext3D::createFramebuffer()
1456 m_private->m_glWidget->makeCurrent();
1458 glGenFramebuffers(/* count */ 1, &handle);
1462 Platform3DObject GraphicsContext3D::createProgram()
1464 m_private->m_glWidget->makeCurrent();
1465 return glCreateProgram();
1468 Platform3DObject GraphicsContext3D::createRenderbuffer()
1470 m_private->m_glWidget->makeCurrent();
1472 glGenRenderbuffers(/* count */ 1, &handle);
1476 Platform3DObject GraphicsContext3D::createShader(GC3Denum type)
1478 m_private->m_glWidget->makeCurrent();
1479 return glCreateShader(type);
1482 Platform3DObject GraphicsContext3D::createTexture()
1484 m_private->m_glWidget->makeCurrent();
1486 glGenTextures(1, &handle);
1490 void GraphicsContext3D::deleteBuffer(Platform3DObject buffer)
1492 m_private->m_glWidget->makeCurrent();
1493 glDeleteBuffers(1, &buffer);
1496 void GraphicsContext3D::deleteFramebuffer(Platform3DObject framebuffer)
1498 m_private->m_glWidget->makeCurrent();
1499 glDeleteFramebuffers(1, &framebuffer);
1502 void GraphicsContext3D::deleteProgram(Platform3DObject program)
1504 m_private->m_glWidget->makeCurrent();
1505 glDeleteProgram(program);
1508 void GraphicsContext3D::deleteRenderbuffer(Platform3DObject renderbuffer)
1510 m_private->m_glWidget->makeCurrent();
1511 glDeleteRenderbuffers(1, &renderbuffer);
1514 void GraphicsContext3D::deleteShader(Platform3DObject shader)
1516 m_private->m_glWidget->makeCurrent();
1517 glDeleteShader(shader);
1520 void GraphicsContext3D::deleteTexture(Platform3DObject texture)
1522 m_private->m_glWidget->makeCurrent();
1523 glDeleteTextures(1, &texture);
1526 void GraphicsContext3D::synthesizeGLError(GC3Denum error)
1528 m_syntheticErrors.add(error);
1531 void GraphicsContext3D::markLayerComposited()
1533 m_layerComposited = true;
1536 void GraphicsContext3D::markContextChanged()
1538 // FIXME: Any accelerated compositor needs to be told to re-read from here.
1539 m_layerComposited = false;
1542 bool GraphicsContext3D::layerComposited() const
1544 return m_layerComposited;
1547 Extensions3D* GraphicsContext3D::getExtensions()
1550 m_extensions = adoptPtr(new Extensions3DQt);
1551 return m_extensions.get();
1555 bool GraphicsContext3D::getImageData(Image* image,
1558 bool premultiplyAlpha,
1559 bool ignoreGammaAndColorProfile,
1560 Vector<uint8_t>& outputVector)
1562 UNUSED_PARAM(ignoreGammaAndColorProfile);
1566 // Is image already loaded? If not, load it.
1568 nativeImage = QImage::fromData(reinterpret_cast<const uchar*>(image->data()->data()), image->data()->size()).convertToFormat(QImage::Format_ARGB32);
1570 QPixmap* nativePixmap = image->nativeImageForCurrentFrame();
1571 nativeImage = nativePixmap->toImage().convertToFormat(QImage::Format_ARGB32);
1573 AlphaOp neededAlphaOp = AlphaDoNothing;
1574 if (premultiplyAlpha)
1575 neededAlphaOp = AlphaDoPremultiply;
1576 outputVector.resize(nativeImage.byteCount());
1577 return packPixels(nativeImage.bits(), SourceFormatBGRA8, image->width(), image->height(), 0, format, type, neededAlphaOp, outputVector.data());
1580 void GraphicsContext3D::setContextLostCallback(PassOwnPtr<ContextLostCallback>)
1586 #endif // ENABLE(WEBGL)