1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Copyright (C) 2010 Tieto Corporation.
3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    This library is free software; you can redistribute it and/or
5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    modify it under the terms of the GNU Lesser General Public
6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    License as published by the Free Software Foundation; either
7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    version 2.1 of the License, or (at your option) any later version.
8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    This library is distributed in the hope that it will be useful,
10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    but WITHOUT ANY WARRANTY; without even the implied warranty of
11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Lesser General Public License for more details.
13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    You should have received a copy of the GNU Lesser General Public
15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    License along with this library; if not, write to the Free Software
16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block*/
18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "config.h"
20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "GraphicsContext3D.h"
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
23dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "WebGLObject.h"
24dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "CanvasRenderingContext.h"
2528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "Extensions3DQt.h"
26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "GraphicsContext.h"
27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "HTMLCanvasElement.h"
28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "HostWindow.h"
29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ImageBuffer.h"
302bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "ImageData.h"
31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "NotImplemented.h"
32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "QWebPageClient.h"
332bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "qwebpage.h"
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QAbstractScrollArea>
352bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <QGraphicsObject>
36545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include <QGLContext>
372bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <QStyleOptionGraphicsItem>
38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/UnusedParam.h>
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/text/CString.h>
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WEBGL)
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocknamespace WebCore {
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if !defined(GLchar)
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef char GLchar;
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
492bde8e466a4451c7319e3a072d118917957d6554Steve Block#if !defined(GL_DEPTH24_STENCIL8)
502bde8e466a4451c7319e3a072d118917957d6554Steve Block#define GL_DEPTH24_STENCIL8 0x88F0
512bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
522bde8e466a4451c7319e3a072d118917957d6554Steve Block
53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if !defined(APIENTRY)
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define APIENTRY
55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#ifdef QT_OPENGL_ES_2
5806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsentypedef GLsizeiptr GLsizeiptrType;
5906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsentypedef GLintptr GLintptrType;
6006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#else
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef ptrdiff_t GLsizeiptrType;
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef ptrdiff_t GLintptrType;
6306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glActiveTextureType) (GLenum);
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glAttachShaderType) (GLuint, GLuint);
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glBindAttribLocationType) (GLuint, GLuint, const char*);
68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glBindBufferType) (GLenum, GLuint);
69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glBindFramebufferType) (GLenum, GLuint);
70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glBindRenderbufferType) (GLenum, GLuint);
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glBlendColorType) (GLclampf, GLclampf, GLclampf, GLclampf);
72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glBlendEquationType) (GLenum);
73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glBlendEquationSeparateType)(GLenum, GLenum);
74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glBlendFuncSeparateType)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glBufferDataType) (GLenum, GLsizeiptrType, const GLvoid*, GLenum);
76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glBufferSubDataType) (GLenum, GLintptrType, GLsizeiptrType, const GLvoid*);
77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef GLenum (APIENTRY* glCheckFramebufferStatusType) (GLenum);
78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glCompileShaderType) (GLuint);
79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef GLuint (APIENTRY* glCreateProgramType) ();
80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef GLuint (APIENTRY* glCreateShaderType) (GLenum);
81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glDeleteBuffersType) (GLsizei, const GLuint*);
82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glDeleteFramebuffersType) (GLsizei n, const GLuint*);
83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glDeleteProgramType) (GLuint);
84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glDeleteRenderbuffersType) (GLsizei n, const GLuint*);
85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glDeleteShaderType) (GLuint);
86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glDetachShaderType) (GLuint, GLuint);
87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glDisableVertexAttribArrayType) (GLuint);
88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glEnableVertexAttribArrayType) (GLuint);
89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glFramebufferRenderbufferType) (GLenum, GLenum, GLenum, GLuint);
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glFramebufferTexture2DType) (GLenum, GLenum, GLenum, GLuint, GLint);
91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGenBuffersType) (GLsizei, GLuint*);
92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGenerateMipmapType) (GLenum target);
93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGenFramebuffersType) (GLsizei, GLuint*);
94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGenRenderbuffersType) (GLsizei, GLuint*);
95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGetActiveAttribType) (GLuint, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLchar*);
96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGetActiveUniformType) (GLuint, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLchar*);
97e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blocktypedef void (APIENTRY* glGetAttachedShadersType) (GLuint, GLsizei, GLsizei*, GLuint*);
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef GLint (APIENTRY* glGetAttribLocationType) (GLuint, const char*);
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGetBufferParameterivType) (GLenum, GLenum, GLint*);
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGetFramebufferAttachmentParameterivType) (GLenum, GLenum, GLenum, GLint* params);
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGetProgramInfoLogType) (GLuint, GLsizei, GLsizei*, char*);
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGetProgramivType) (GLuint, GLenum, GLint*);
103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGetRenderbufferParameterivType) (GLenum, GLenum, GLint*);
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGetShaderInfoLogType) (GLuint, GLsizei, GLsizei*, char*);
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGetShaderivType) (GLuint, GLenum, GLint*);
106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGetShaderSourceType) (GLuint, GLsizei, GLsizei*, char*);
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef GLint (APIENTRY* glGetUniformLocationType) (GLuint, const char*);
108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGetUniformfvType) (GLuint, GLint, GLfloat*);
109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGetUniformivType) (GLuint, GLint, GLint*);
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGetVertexAttribfvType) (GLuint, GLenum, GLfloat*);
111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGetVertexAttribivType) (GLuint, GLenum, GLint*);
112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glGetVertexAttribPointervType) (GLuint, GLenum, GLvoid**);
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef GLboolean (APIENTRY* glIsBufferType) (GLuint);
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef GLboolean (APIENTRY* glIsFramebufferType) (GLuint);
115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef GLboolean (APIENTRY* glIsProgramType) (GLuint);
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef GLboolean (APIENTRY* glIsRenderbufferType) (GLuint);
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef GLboolean (APIENTRY* glIsShaderType) (GLuint);
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glLinkProgramType) (GLuint);
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glRenderbufferStorageType) (GLenum, GLenum, GLsizei, GLsizei);
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glSampleCoverageType) (GLclampf, GLboolean);
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glShaderSourceType) (GLuint, GLsizei, const char**, const GLint*);
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glStencilFuncSeparateType) (GLenum, GLenum, GLint, GLuint);
123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glStencilMaskSeparateType) (GLenum, GLuint);
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glStencilOpSeparateType) (GLenum, GLenum, GLenum, GLenum);
125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniform1fType) (GLint, GLfloat);
126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniform1fvType) (GLint, GLsizei, const GLfloat*);
127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniform1iType) (GLint, GLint);
128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniform1ivType) (GLint, GLsizei, const GLint*);
129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniform2fType) (GLint, GLfloat, GLfloat);
130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniform2fvType) (GLint, GLsizei, const GLfloat*);
131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniform2iType) (GLint, GLint, GLint);
132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniform2ivType) (GLint, GLsizei, const GLint*);
133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniform3fType) (GLint, GLfloat, GLfloat, GLfloat);
134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniform3fvType) (GLint, GLsizei, const GLfloat*);
135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniform3iType) (GLint, GLint, GLint, GLint);
136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniform3ivType) (GLint, GLsizei, const GLint*);
137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniform4fType) (GLint, GLfloat, GLfloat, GLfloat, GLfloat);
138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniform4fvType) (GLint, GLsizei, const GLfloat*);
139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniform4iType) (GLint, GLint, GLint, GLint, GLint);
140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniform4ivType) (GLint, GLsizei, const GLint*);
141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniformMatrix2fvType) (GLint, GLsizei, GLboolean, const GLfloat*);
142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniformMatrix3fvType) (GLint, GLsizei, GLboolean, const GLfloat*);
143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUniformMatrix4fvType) (GLint, GLsizei, GLboolean, const GLfloat*);
144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glUseProgramType) (GLuint);
145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glValidateProgramType) (GLuint);
146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glVertexAttrib1fType) (GLuint, const GLfloat);
147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glVertexAttrib1fvType) (GLuint, const GLfloat*);
148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glVertexAttrib2fType) (GLuint, const GLfloat, const GLfloat);
149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glVertexAttrib2fvType) (GLuint, const GLfloat*);
150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glVertexAttrib3fType) (GLuint, const GLfloat, const GLfloat, const GLfloat);
151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glVertexAttrib3fvType) (GLuint, const GLfloat*);
152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glVertexAttrib4fType) (GLuint, const GLfloat, const GLfloat, const GLfloat, const GLfloat);
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glVertexAttrib4fvType) (GLuint, const GLfloat*);
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (APIENTRY* glVertexAttribPointerType) (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid*);
155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1562bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass GraphicsContext3DInternal : public QGraphicsObject {
157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpublic:
158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    GraphicsContext3DInternal(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow);
159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ~GraphicsContext3DInternal();
160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1612bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool isValid() { return m_valid; }
1622bde8e466a4451c7319e3a072d118917957d6554Steve Block
1632bde8e466a4451c7319e3a072d118917957d6554Steve Block    QGLWidget* getViewportGLWidget();
1642bde8e466a4451c7319e3a072d118917957d6554Steve Block    void reshape(int width, int height);
1652bde8e466a4451c7319e3a072d118917957d6554Steve Block    void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
1662bde8e466a4451c7319e3a072d118917957d6554Steve Block    QRectF boundingRect() const;
167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glActiveTextureType activeTexture;
169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glAttachShaderType attachShader;
170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glBindAttribLocationType bindAttribLocation;
171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glBindBufferType bindBuffer;
172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glBindFramebufferType bindFramebuffer;
173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glBindRenderbufferType bindRenderbuffer;
174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glBlendColorType blendColor;
175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glBlendEquationType blendEquation;
176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glBlendEquationSeparateType blendEquationSeparate;
177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glBlendFuncSeparateType blendFuncSeparate;
178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glBufferDataType bufferData;
179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glBufferSubDataType bufferSubData;
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glCheckFramebufferStatusType checkFramebufferStatus;
181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glCompileShaderType compileShader;
182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glCreateProgramType createProgram;
183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glCreateShaderType createShader;
184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glDeleteBuffersType deleteBuffers;
185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glDeleteFramebuffersType deleteFramebuffers;
186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glDeleteProgramType deleteProgram;
187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glDeleteRenderbuffersType deleteRenderbuffers;
188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glDeleteShaderType deleteShader;
189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glDetachShaderType detachShader;
190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glDisableVertexAttribArrayType disableVertexAttribArray;
191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glEnableVertexAttribArrayType enableVertexAttribArray;
192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glFramebufferRenderbufferType framebufferRenderbuffer;
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glFramebufferTexture2DType framebufferTexture2D;
194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGenBuffersType genBuffers;
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGenerateMipmapType generateMipmap;
196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGenFramebuffersType genFramebuffers;
197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGenRenderbuffersType genRenderbuffers;
198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetActiveAttribType getActiveAttrib;
199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetActiveUniformType getActiveUniform;
200e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    glGetAttachedShadersType getAttachedShaders;
201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetAttribLocationType getAttribLocation;
202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetBufferParameterivType getBufferParameteriv;
203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetFramebufferAttachmentParameterivType getFramebufferAttachmentParameteriv;
204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetProgramInfoLogType getProgramInfoLog;
205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetProgramivType getProgramiv;
206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetRenderbufferParameterivType getRenderbufferParameteriv;
207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetShaderInfoLogType getShaderInfoLog;
208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetShaderivType getShaderiv;
209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetShaderSourceType getShaderSource;
210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetUniformfvType getUniformfv;
211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetUniformivType getUniformiv;
212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetUniformLocationType getUniformLocation;
213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetVertexAttribfvType getVertexAttribfv;
214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetVertexAttribivType getVertexAttribiv;
215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetVertexAttribPointervType getVertexAttribPointerv;
216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glIsBufferType isBuffer;
217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glIsFramebufferType isFramebuffer;
218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glIsProgramType isProgram;
219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glIsRenderbufferType isRenderbuffer;
220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glIsShaderType isShader;
221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glLinkProgramType linkProgram;
222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glRenderbufferStorageType renderbufferStorage;
223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glSampleCoverageType sampleCoverage;
224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glShaderSourceType shaderSource;
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glStencilFuncSeparateType stencilFuncSeparate;
226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glStencilMaskSeparateType stencilMaskSeparate;
227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glStencilOpSeparateType stencilOpSeparate;
228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniform1fType uniform1f;
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniform1fvType uniform1fv;
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniform1iType uniform1i;
231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniform1ivType uniform1iv;
232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniform2fType uniform2f;
233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniform2fvType uniform2fv;
234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniform2iType uniform2i;
235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniform2ivType uniform2iv;
236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniform3fType uniform3f;
237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniform3fvType uniform3fv;
238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniform3iType uniform3i;
239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniform3ivType uniform3iv;
240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniform4fType uniform4f;
241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniform4fvType uniform4fv;
242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniform4iType uniform4i;
243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniform4ivType uniform4iv;
244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniformMatrix2fvType uniformMatrix2fv;
245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniformMatrix3fvType uniformMatrix3fv;
246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUniformMatrix4fvType uniformMatrix4fv;
247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glUseProgramType useProgram;
248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glValidateProgramType validateProgram;
249dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glVertexAttrib1fType vertexAttrib1f;
250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glVertexAttrib1fvType vertexAttrib1fv;
251dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glVertexAttrib2fType vertexAttrib2f;
252dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glVertexAttrib2fvType vertexAttrib2fv;
253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glVertexAttrib3fType vertexAttrib3f;
254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glVertexAttrib3fvType vertexAttrib3fv;
255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glVertexAttrib4fType vertexAttrib4f;
256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glVertexAttrib4fvType vertexAttrib4fv;
257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glVertexAttribPointerType vertexAttribPointer;
258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    GraphicsContext3D::Attributes m_attrs;
26021939df44de1705786c545cd1bf519d47250322dBen Murdoch    HostWindow* m_hostWindow;
261dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QGLWidget* m_glWidget;
2622bde8e466a4451c7319e3a072d118917957d6554Steve Block    QGLWidget* m_viewportGLWidget;
2632bde8e466a4451c7319e3a072d118917957d6554Steve Block    QRectF m_boundingRect;
264dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    GLuint m_texture;
2652bde8e466a4451c7319e3a072d118917957d6554Steve Block    GLuint m_canvasFbo;
266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    GLuint m_currentFbo;
267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    GLuint m_depthBuffer;
2682bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_layerComposited;
26981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ListHashSet<unsigned int> m_syntheticErrors;
270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
27128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    OwnPtr<Extensions3DQt> m_extensions;
27228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockprivate:
274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void* getProcAddress(const String& proc);
2762bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_valid;
277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block};
278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if defined (QT_OPENGL_ES_2)
280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define GET_PROC_ADDRESS(Proc) Proc
281dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else
282dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define GET_PROC_ADDRESS(Proc) reinterpret_cast<Proc##Type>(getProcAddress(#Proc));
283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
28421939df44de1705786c545cd1bf519d47250322dBen Murdoch
28521939df44de1705786c545cd1bf519d47250322dBen Murdochbool GraphicsContext3D::isGLES2Compliant() const
28621939df44de1705786c545cd1bf519d47250322dBen Murdoch{
28721939df44de1705786c545cd1bf519d47250322dBen Murdoch#if defined (QT_OPENGL_ES_2)
28821939df44de1705786c545cd1bf519d47250322dBen Murdoch    return true;
28921939df44de1705786c545cd1bf519d47250322dBen Murdoch#else
29021939df44de1705786c545cd1bf519d47250322dBen Murdoch    return false;
29121939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif
29221939df44de1705786c545cd1bf519d47250322dBen Murdoch}
29321939df44de1705786c545cd1bf519d47250322dBen Murdoch
294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockGraphicsContext3DInternal::GraphicsContext3DInternal(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow)
295dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    : m_attrs(attrs)
29621939df44de1705786c545cd1bf519d47250322dBen Murdoch    , m_hostWindow(hostWindow)
297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_glWidget(0)
2982bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_viewportGLWidget(0)
299dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_texture(0)
3002bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_canvasFbo(0)
301dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_currentFbo(0)
302dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_depthBuffer(0)
3032bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_layerComposited(false)
3042bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_valid(true)
305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
3062bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_viewportGLWidget = getViewportGLWidget();
307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3082bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_viewportGLWidget)
3092bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_glWidget = new QGLWidget(0, m_viewportGLWidget);
3102bde8e466a4451c7319e3a072d118917957d6554Steve Block    else
3112bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_glWidget = new QGLWidget();
312dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
313dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!m_glWidget->isValid()) {
3142bde8e466a4451c7319e3a072d118917957d6554Steve Block        LOG_ERROR("GraphicsContext3D: QGLWidget initialization failed.");
3152bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_valid = false;
316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3192bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Geometry can be set to zero because m_glWidget is used only for its QGLContext.
3202bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_glWidget->setGeometry(0, 0, 0, 0);
3212bde8e466a4451c7319e3a072d118917957d6554Steve Block
3222bde8e466a4451c7319e3a072d118917957d6554Steve Block#if defined(QT_OPENGL_ES_2)
3232bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_attrs.stencil = false;
3242bde8e466a4451c7319e3a072d118917957d6554Steve Block#else
3252bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_attrs.stencil)
3262bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_attrs.depth = true;
3272bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_attrs.antialias = false;
329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_glWidget->makeCurrent();
331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    activeTexture = GET_PROC_ADDRESS(glActiveTexture);
333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    attachShader = GET_PROC_ADDRESS(glAttachShader);
334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bindAttribLocation = GET_PROC_ADDRESS(glBindAttribLocation);
335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bindBuffer = GET_PROC_ADDRESS(glBindBuffer);
336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bindFramebuffer = GET_PROC_ADDRESS(glBindFramebuffer);
337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bindRenderbuffer = GET_PROC_ADDRESS(glBindRenderbuffer);
338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    blendColor = GET_PROC_ADDRESS(glBlendColor);
339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    blendEquation = GET_PROC_ADDRESS(glBlendEquation);
340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    blendEquationSeparate = GET_PROC_ADDRESS(glBlendEquationSeparate);
341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    blendFuncSeparate = GET_PROC_ADDRESS(glBlendFuncSeparate);
342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bufferData = GET_PROC_ADDRESS(glBufferData);
343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bufferSubData = GET_PROC_ADDRESS(glBufferSubData);
344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    checkFramebufferStatus = GET_PROC_ADDRESS(glCheckFramebufferStatus);
345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    compileShader = GET_PROC_ADDRESS(glCompileShader);
346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    createProgram = GET_PROC_ADDRESS(glCreateProgram);
347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    createShader = GET_PROC_ADDRESS(glCreateShader);
348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    deleteBuffers = GET_PROC_ADDRESS(glDeleteBuffers);
349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    deleteFramebuffers = GET_PROC_ADDRESS(glDeleteFramebuffers);
350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    deleteProgram = GET_PROC_ADDRESS(glDeleteProgram);
351dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    deleteRenderbuffers = GET_PROC_ADDRESS(glDeleteRenderbuffers);
352dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    deleteShader = GET_PROC_ADDRESS(glDeleteShader);
353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    detachShader = GET_PROC_ADDRESS(glDetachShader);
354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    disableVertexAttribArray = GET_PROC_ADDRESS(glDisableVertexAttribArray);
355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    enableVertexAttribArray = GET_PROC_ADDRESS(glEnableVertexAttribArray);
356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    framebufferRenderbuffer = GET_PROC_ADDRESS(glFramebufferRenderbuffer);
357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    framebufferTexture2D = GET_PROC_ADDRESS(glFramebufferTexture2D);
358dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    genBuffers = GET_PROC_ADDRESS(glGenBuffers);
359dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    generateMipmap = GET_PROC_ADDRESS(glGenerateMipmap);
360dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    genFramebuffers = GET_PROC_ADDRESS(glGenFramebuffers);
361dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    genRenderbuffers = GET_PROC_ADDRESS(glGenRenderbuffers);
362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getActiveAttrib = GET_PROC_ADDRESS(glGetActiveAttrib);
363dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getActiveUniform = GET_PROC_ADDRESS(glGetActiveUniform);
364e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    getAttachedShaders = GET_PROC_ADDRESS(glGetAttachedShaders);
365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getAttribLocation = GET_PROC_ADDRESS(glGetAttribLocation);
366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getBufferParameteriv = GET_PROC_ADDRESS(glGetBufferParameteriv);
367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getFramebufferAttachmentParameteriv = GET_PROC_ADDRESS(glGetFramebufferAttachmentParameteriv);
368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getProgramInfoLog = GET_PROC_ADDRESS(glGetProgramInfoLog);
369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getProgramiv = GET_PROC_ADDRESS(glGetProgramiv);
370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getRenderbufferParameteriv = GET_PROC_ADDRESS(glGetRenderbufferParameteriv);
371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getShaderInfoLog = GET_PROC_ADDRESS(glGetShaderInfoLog);
372dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getShaderiv = GET_PROC_ADDRESS(glGetShaderiv);
373dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getShaderSource = GET_PROC_ADDRESS(glGetShaderSource);
374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getUniformfv = GET_PROC_ADDRESS(glGetUniformfv);
375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getUniformiv = GET_PROC_ADDRESS(glGetUniformiv);
376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getUniformLocation = GET_PROC_ADDRESS(glGetUniformLocation);
377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getVertexAttribfv = GET_PROC_ADDRESS(glGetVertexAttribfv);
378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getVertexAttribiv = GET_PROC_ADDRESS(glGetVertexAttribiv);
379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    getVertexAttribPointerv = GET_PROC_ADDRESS(glGetVertexAttribPointerv);
380dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    isBuffer = GET_PROC_ADDRESS(glIsBuffer);
381dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    isFramebuffer = GET_PROC_ADDRESS(glIsFramebuffer);
382dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    isProgram = GET_PROC_ADDRESS(glIsProgram);
383dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    isRenderbuffer = GET_PROC_ADDRESS(glIsRenderbuffer);
384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    isShader = GET_PROC_ADDRESS(glIsShader);
385dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    linkProgram = GET_PROC_ADDRESS(glLinkProgram);
386dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    renderbufferStorage = GET_PROC_ADDRESS(glRenderbufferStorage);
387dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sampleCoverage = GET_PROC_ADDRESS(glSampleCoverage);
388dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    shaderSource = GET_PROC_ADDRESS(glShaderSource);
389dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    stencilFuncSeparate = GET_PROC_ADDRESS(glStencilFuncSeparate);
390dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    stencilMaskSeparate = GET_PROC_ADDRESS(glStencilMaskSeparate);
391dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    stencilOpSeparate = GET_PROC_ADDRESS(glStencilOpSeparate);
392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniform1f = GET_PROC_ADDRESS(glUniform1f);
393dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniform1fv = GET_PROC_ADDRESS(glUniform1fv);
394dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniform1i = GET_PROC_ADDRESS(glUniform1i);
395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniform1iv = GET_PROC_ADDRESS(glUniform1iv);
396dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniform2f = GET_PROC_ADDRESS(glUniform2f);
397dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniform2fv = GET_PROC_ADDRESS(glUniform2fv);
398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniform2i = GET_PROC_ADDRESS(glUniform2i);
399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniform2iv = GET_PROC_ADDRESS(glUniform2iv);
400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniform3f = GET_PROC_ADDRESS(glUniform3f);
401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniform3fv = GET_PROC_ADDRESS(glUniform3fv);
402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniform3i = GET_PROC_ADDRESS(glUniform3i);
403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniform3iv = GET_PROC_ADDRESS(glUniform3iv);
404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniform4f = GET_PROC_ADDRESS(glUniform4f);
405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniform4fv = GET_PROC_ADDRESS(glUniform4fv);
406dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniform4i = GET_PROC_ADDRESS(glUniform4i);
407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniform4iv = GET_PROC_ADDRESS(glUniform4iv);
408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniformMatrix2fv = GET_PROC_ADDRESS(glUniformMatrix2fv);
409dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniformMatrix3fv = GET_PROC_ADDRESS(glUniformMatrix3fv);
410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uniformMatrix4fv = GET_PROC_ADDRESS(glUniformMatrix4fv);
411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    useProgram = GET_PROC_ADDRESS(glUseProgram);
412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    validateProgram = GET_PROC_ADDRESS(glValidateProgram);
413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    vertexAttrib1f = GET_PROC_ADDRESS(glVertexAttrib1f);
414dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    vertexAttrib1fv = GET_PROC_ADDRESS(glVertexAttrib1fv);
415dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    vertexAttrib2f = GET_PROC_ADDRESS(glVertexAttrib2f);
416dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    vertexAttrib2fv = GET_PROC_ADDRESS(glVertexAttrib2fv);
417dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    vertexAttrib3f = GET_PROC_ADDRESS(glVertexAttrib3f);
418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    vertexAttrib3fv = GET_PROC_ADDRESS(glVertexAttrib3fv);
419dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    vertexAttrib4f = GET_PROC_ADDRESS(glVertexAttrib4f);
420dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    vertexAttrib4fv = GET_PROC_ADDRESS(glVertexAttrib4fv);
421dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    vertexAttribPointer = GET_PROC_ADDRESS(glVertexAttribPointer);
422dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4232bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_valid) {
424dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("GraphicsContext3D: All needed OpenGL extensions are not available");
425dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
426dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
427dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4282bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Create buffers for the canvas FBO.
4292bde8e466a4451c7319e3a072d118917957d6554Steve Block    genFramebuffers(/* count */ 1, &m_canvasFbo);
4302bde8e466a4451c7319e3a072d118917957d6554Steve Block
431dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGenTextures(1, &m_texture);
432dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glBindTexture(GraphicsContext3D::TEXTURE_2D, m_texture);
433dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glTexParameterf(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR);
434dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glTexParameterf(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR);
435dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glTexParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE);
436dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glTexParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE);
437dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glBindTexture(GraphicsContext3D::TEXTURE_2D, 0);
438dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4392bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_attrs.depth)
4402bde8e466a4451c7319e3a072d118917957d6554Steve Block        genRenderbuffers(/* count */ 1, &m_depthBuffer);
4412bde8e466a4451c7319e3a072d118917957d6554Steve Block
4422bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Bind canvas FBO and set initial clear color to black.
4432bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_currentFbo = m_canvasFbo;
4442bde8e466a4451c7319e3a072d118917957d6554Steve Block    bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_canvasFbo);
4452bde8e466a4451c7319e3a072d118917957d6554Steve Block    glClearColor(0.0, 0.0, 0.0, 0.0);
4462bde8e466a4451c7319e3a072d118917957d6554Steve Block}
4472bde8e466a4451c7319e3a072d118917957d6554Steve Block
4482bde8e466a4451c7319e3a072d118917957d6554Steve BlockGraphicsContext3DInternal::~GraphicsContext3DInternal()
4492bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_glWidget->makeCurrent();
4512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (m_glWidget->isValid()) {
4522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ::glDeleteTextures(1, &m_texture);
4532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        deleteRenderbuffers(1, &m_depthBuffer);
4542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        deleteFramebuffers(1, &m_canvasFbo);
4552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4562bde8e466a4451c7319e3a072d118917957d6554Steve Block    delete m_glWidget;
4572bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_glWidget = 0;
4582bde8e466a4451c7319e3a072d118917957d6554Steve Block}
4592bde8e466a4451c7319e3a072d118917957d6554Steve Block
4602bde8e466a4451c7319e3a072d118917957d6554Steve BlockQGLWidget* GraphicsContext3DInternal::getViewportGLWidget()
4612bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4622bde8e466a4451c7319e3a072d118917957d6554Steve Block    QWebPageClient* webPageClient = m_hostWindow->platformPageClient();
4632bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!webPageClient)
4642bde8e466a4451c7319e3a072d118917957d6554Steve Block        return 0;
4652bde8e466a4451c7319e3a072d118917957d6554Steve Block
4662bde8e466a4451c7319e3a072d118917957d6554Steve Block    QAbstractScrollArea* scrollArea = qobject_cast<QAbstractScrollArea*>(webPageClient->ownerWidget());
4672bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (scrollArea)
4682bde8e466a4451c7319e3a072d118917957d6554Steve Block        return qobject_cast<QGLWidget*>(scrollArea->viewport());
4692bde8e466a4451c7319e3a072d118917957d6554Steve Block
4702bde8e466a4451c7319e3a072d118917957d6554Steve Block    return 0;
4712bde8e466a4451c7319e3a072d118917957d6554Steve Block}
4722bde8e466a4451c7319e3a072d118917957d6554Steve Block
4732bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic inline quint32 swapBgrToRgb(quint32 pixel)
4742bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4752bde8e466a4451c7319e3a072d118917957d6554Steve Block    return ((pixel << 16) & 0xff0000) | ((pixel >> 16) & 0xff) | (pixel & 0xff00ff00);
4762bde8e466a4451c7319e3a072d118917957d6554Steve Block}
4772bde8e466a4451c7319e3a072d118917957d6554Steve Block
4782bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid GraphicsContext3DInternal::reshape(int width, int height)
4792bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4802bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (width == m_boundingRect.width() && height == m_boundingRect.height())
4812bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
4822bde8e466a4451c7319e3a072d118917957d6554Steve Block
4832bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_boundingRect = QRectF(QPointF(0, 0), QSizeF(width, height));
4842bde8e466a4451c7319e3a072d118917957d6554Steve Block
4852bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_glWidget->makeCurrent();
486dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4872bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Create color buffer
4882bde8e466a4451c7319e3a072d118917957d6554Steve Block    glBindTexture(GraphicsContext3D::TEXTURE_2D, m_texture);
4892bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_attrs.alpha)
4902bde8e466a4451c7319e3a072d118917957d6554Steve Block        glTexImage2D(GraphicsContext3D::TEXTURE_2D, /* level */ 0, GraphicsContext3D::RGBA, width, height, /* border */ 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, /* data */ 0);
4912bde8e466a4451c7319e3a072d118917957d6554Steve Block    else
4922bde8e466a4451c7319e3a072d118917957d6554Steve Block        glTexImage2D(GraphicsContext3D::TEXTURE_2D, /* level */ 0, GraphicsContext3D::RGB, width, height, /* border */ 0, GraphicsContext3D::RGB, GraphicsContext3D::UNSIGNED_BYTE, /* data */ 0);
4932bde8e466a4451c7319e3a072d118917957d6554Steve Block    glBindTexture(GraphicsContext3D::TEXTURE_2D, 0);
494dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4952bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_attrs.depth) {
4962bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Create depth and stencil buffers.
4972bde8e466a4451c7319e3a072d118917957d6554Steve Block        bindRenderbuffer(GraphicsContext3D::RENDERBUFFER, m_depthBuffer);
498dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if defined(QT_OPENGL_ES_2)
4992bde8e466a4451c7319e3a072d118917957d6554Steve Block        renderbufferStorage(GraphicsContext3D::RENDERBUFFER, GraphicsContext3D::DEPTH_COMPONENT16, width, height);
500dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else
5012bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (m_attrs.stencil)
5022bde8e466a4451c7319e3a072d118917957d6554Steve Block            renderbufferStorage(GraphicsContext3D::RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
5032bde8e466a4451c7319e3a072d118917957d6554Steve Block        else
5042bde8e466a4451c7319e3a072d118917957d6554Steve Block            renderbufferStorage(GraphicsContext3D::RENDERBUFFER, GraphicsContext3D::DEPTH_COMPONENT, width, height);
505dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
5062bde8e466a4451c7319e3a072d118917957d6554Steve Block        bindRenderbuffer(GraphicsContext3D::RENDERBUFFER, 0);
5072bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
508dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5092bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Construct canvas FBO.
5102bde8e466a4451c7319e3a072d118917957d6554Steve Block    bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_canvasFbo);
511dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, m_texture, 0);
5122bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_attrs.depth)
5132bde8e466a4451c7319e3a072d118917957d6554Steve Block        framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::DEPTH_ATTACHMENT, GraphicsContext3D::RENDERBUFFER, m_depthBuffer);
5142bde8e466a4451c7319e3a072d118917957d6554Steve Block#if !defined(QT_OPENGL_ES_2)
5152bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_attrs.stencil)
5162bde8e466a4451c7319e3a072d118917957d6554Steve Block        framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::STENCIL_ATTACHMENT, GraphicsContext3D::RENDERBUFFER, m_depthBuffer);
5172bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
518dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5192bde8e466a4451c7319e3a072d118917957d6554Steve Block    GLenum status = checkFramebufferStatus(GraphicsContext3D::FRAMEBUFFER);
5202bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (status != GraphicsContext3D::FRAMEBUFFER_COMPLETE) {
5212bde8e466a4451c7319e3a072d118917957d6554Steve Block        LOG_ERROR("GraphicsContext3D: Canvas FBO initialization failed.");
5222bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
523dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
524dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5252bde8e466a4451c7319e3a072d118917957d6554Steve Block    int clearFlags = GraphicsContext3D::COLOR_BUFFER_BIT;
5262bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_attrs.depth)
5272bde8e466a4451c7319e3a072d118917957d6554Steve Block        clearFlags |= GraphicsContext3D::DEPTH_BUFFER_BIT;
5282bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_attrs.stencil)
5292bde8e466a4451c7319e3a072d118917957d6554Steve Block        clearFlags |= GraphicsContext3D::STENCIL_BUFFER_BIT;
5302bde8e466a4451c7319e3a072d118917957d6554Steve Block
5312bde8e466a4451c7319e3a072d118917957d6554Steve Block    glClear(clearFlags);
5322bde8e466a4451c7319e3a072d118917957d6554Steve Block    glFlush();
533dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
534dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5352bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid GraphicsContext3DInternal::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
536dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
5372bde8e466a4451c7319e3a072d118917957d6554Steve Block    Q_UNUSED(widget);
538dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5392bde8e466a4451c7319e3a072d118917957d6554Steve Block    QRectF rect = option ? option->rect : boundingRect();
540dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5412bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Use direct texture mapping if WebGL canvas has a shared OpenGL context
5422bde8e466a4451c7319e3a072d118917957d6554Steve Block    // with browsers OpenGL context.
5432bde8e466a4451c7319e3a072d118917957d6554Steve Block    QGLWidget* viewportGLWidget = getViewportGLWidget();
5442bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (viewportGLWidget && viewportGLWidget == m_viewportGLWidget && viewportGLWidget == painter->device()) {
5452bde8e466a4451c7319e3a072d118917957d6554Steve Block        viewportGLWidget->drawTexture(rect, m_texture);
5462bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
5472bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
5482bde8e466a4451c7319e3a072d118917957d6554Steve Block
5492bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Alternatively read pixels to a memory buffer.
5502bde8e466a4451c7319e3a072d118917957d6554Steve Block    QImage offscreenImage(rect.width(), rect.height(), QImage::Format_ARGB32);
5512bde8e466a4451c7319e3a072d118917957d6554Steve Block    quint32* imagePixels = reinterpret_cast<quint32*>(offscreenImage.bits());
5522bde8e466a4451c7319e3a072d118917957d6554Steve Block
5532bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_glWidget->makeCurrent();
5542bde8e466a4451c7319e3a072d118917957d6554Steve Block    bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_canvasFbo);
5552bde8e466a4451c7319e3a072d118917957d6554Steve Block    glReadPixels(/* x */ 0, /* y */ 0, rect.width(), rect.height(), GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, imagePixels);
5562bde8e466a4451c7319e3a072d118917957d6554Steve Block
5572bde8e466a4451c7319e3a072d118917957d6554Steve Block    bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_currentFbo);
5582bde8e466a4451c7319e3a072d118917957d6554Steve Block
5592bde8e466a4451c7319e3a072d118917957d6554Steve Block    // OpenGL gives us ABGR on 32 bits, and with the origin at the bottom left
5602bde8e466a4451c7319e3a072d118917957d6554Steve Block    // We need RGB32 or ARGB32_PM, with the origin at the top left.
5612bde8e466a4451c7319e3a072d118917957d6554Steve Block    quint32* pixelsSrc = imagePixels;
5622bde8e466a4451c7319e3a072d118917957d6554Steve Block    const int height = static_cast<int>(rect.height());
5632bde8e466a4451c7319e3a072d118917957d6554Steve Block    const int width = static_cast<int>(rect.width());
5642bde8e466a4451c7319e3a072d118917957d6554Steve Block    const int halfHeight = height / 2;
5652bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (int row = 0; row < halfHeight; ++row) {
5662bde8e466a4451c7319e3a072d118917957d6554Steve Block        const int targetIdx = (height - 1 - row) * width;
5672bde8e466a4451c7319e3a072d118917957d6554Steve Block        quint32* pixelsDst = imagePixels + targetIdx;
5682bde8e466a4451c7319e3a072d118917957d6554Steve Block        for (int column = 0; column < width; ++column) {
5692bde8e466a4451c7319e3a072d118917957d6554Steve Block            quint32 tempPixel = *pixelsSrc;
5702bde8e466a4451c7319e3a072d118917957d6554Steve Block            *pixelsSrc = swapBgrToRgb(*pixelsDst);
5712bde8e466a4451c7319e3a072d118917957d6554Steve Block            *pixelsDst = swapBgrToRgb(tempPixel);
5722bde8e466a4451c7319e3a072d118917957d6554Steve Block            ++pixelsSrc;
5732bde8e466a4451c7319e3a072d118917957d6554Steve Block            ++pixelsDst;
5742bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
5752bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
5762bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (static_cast<int>(height) % 2) {
5772bde8e466a4451c7319e3a072d118917957d6554Steve Block        for (int column = 0; column < width; ++column) {
5782bde8e466a4451c7319e3a072d118917957d6554Steve Block            *pixelsSrc = swapBgrToRgb(*pixelsSrc);
5792bde8e466a4451c7319e3a072d118917957d6554Steve Block            ++pixelsSrc;
5802bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
5812bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
5822bde8e466a4451c7319e3a072d118917957d6554Steve Block    painter->drawImage(/* x */ 0, /* y */ 0, offscreenImage);
5832bde8e466a4451c7319e3a072d118917957d6554Steve Block}
5842bde8e466a4451c7319e3a072d118917957d6554Steve Block
5852bde8e466a4451c7319e3a072d118917957d6554Steve BlockQRectF GraphicsContext3DInternal::boundingRect() const
5862bde8e466a4451c7319e3a072d118917957d6554Steve Block{
5872bde8e466a4451c7319e3a072d118917957d6554Steve Block    return m_boundingRect;
588dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
589dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
590dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid* GraphicsContext3DInternal::getProcAddress(const String& proc)
591dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
592dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    String ext[3] = { "", "ARB", "EXT" };
593dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
594dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (int i = 0; i < 3; i++) {
595dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        String nameWithExt = proc + ext[i];
596dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        void* addr = m_glWidget->context()->getProcAddress(QString(nameWithExt));
598dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (addr)
599dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return addr;
600dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
601dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
602dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    LOG_ERROR("GraphicsContext3D: Did not find GL function %s", proc.utf8().data());
6032bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_valid = false;
604dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 0;
605dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
606dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
60781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochPassRefPtr<GraphicsContext3D> GraphicsContext3D::create(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, GraphicsContext3D::RenderStyle renderStyle)
608dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
60968513a70bcd92384395513322f1b801e7bf9c729Steve Block    // This implementation doesn't currently support rendering directly to the HostWindow.
61068513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (renderStyle == RenderDirectlyToHostWindow)
61168513a70bcd92384395513322f1b801e7bf9c729Steve Block        return 0;
61281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<GraphicsContext3D> context = adoptRef(new GraphicsContext3D(attrs, hostWindow, false));
613dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return context->m_internal ? context.release() : 0;
614dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
615dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
61668513a70bcd92384395513322f1b801e7bf9c729Steve BlockGraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, bool)
617dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    : m_internal(new GraphicsContext3DInternal(attrs, hostWindow))
618dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6192bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_internal->isValid())
620dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_internal = 0;
621dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
622dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
623dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockGraphicsContext3D::~GraphicsContext3D()
624dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
625dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
626dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
627dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockPlatformGraphicsContext3D GraphicsContext3D::platformGraphicsContext3D()
628dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
629dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_internal->m_glWidget;
630dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
631dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
632dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockPlatform3DObject GraphicsContext3D::platformTexture() const
633dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
634dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_internal->m_texture;
635dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
636dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6372bde8e466a4451c7319e3a072d118917957d6554Steve BlockPlatformLayer* GraphicsContext3D::platformLayer() const
6382bde8e466a4451c7319e3a072d118917957d6554Steve Block{
6392bde8e466a4451c7319e3a072d118917957d6554Steve Block    return m_internal.get();
6402bde8e466a4451c7319e3a072d118917957d6554Steve Block}
6412bde8e466a4451c7319e3a072d118917957d6554Steve Block
642dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid GraphicsContext3D::makeContextCurrent()
643dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
644dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
645dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
646dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
647dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid GraphicsContext3D::paintRenderingResultsToCanvas(CanvasRenderingContext* context)
648967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
649dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
650dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    HTMLCanvasElement* canvas = context->canvas();
651dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ImageBuffer* imageBuffer = canvas->buffer();
65206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    QPainter* painter = imageBuffer->context()->platformContext();
6532bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_internal->paint(painter, 0, 0);
654dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
655dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6562bde8e466a4451c7319e3a072d118917957d6554Steve BlockPassRefPtr<ImageData> GraphicsContext3D::paintRenderingResultsToImageData()
65721939df44de1705786c545cd1bf519d47250322dBen Murdoch{
6582bde8e466a4451c7319e3a072d118917957d6554Steve Block    // FIXME: This needs to be implemented for proper non-premultiplied-alpha
6592bde8e466a4451c7319e3a072d118917957d6554Steve Block    // support.
6602bde8e466a4451c7319e3a072d118917957d6554Steve Block    return 0;
66121939df44de1705786c545cd1bf519d47250322dBen Murdoch}
66221939df44de1705786c545cd1bf519d47250322dBen Murdoch
663dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid GraphicsContext3D::reshape(int width, int height)
664dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if ((width == m_currentWidth && height == m_currentHeight) || (!m_internal))
666dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
6672bde8e466a4451c7319e3a072d118917957d6554Steve Block
668dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_currentWidth = width;
669dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_currentHeight = height;
670dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6712bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_internal->reshape(width, height);
672dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
673dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
674cad810f21b803229eb11403f9209855525a25d57Steve BlockIntSize GraphicsContext3D::getInternalFramebufferSize()
675cad810f21b803229eb11403f9209855525a25d57Steve Block{
676cad810f21b803229eb11403f9209855525a25d57Steve Block    return IntSize(m_currentWidth, m_currentHeight);
677cad810f21b803229eb11403f9209855525a25d57Steve Block}
678cad810f21b803229eb11403f9209855525a25d57Steve Block
679cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::activeTexture(GC3Denum texture)
680dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
681dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
682dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->activeTexture(texture);
683dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
684dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
685e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid GraphicsContext3D::attachShader(Platform3DObject program, Platform3DObject shader)
686dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
687dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(program);
688dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(shader);
689dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
690cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->attachShader(program, shader);
691dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
692dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
693cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getAttachedShaders(Platform3DObject program, GC3Dsizei maxCount, GC3Dsizei* count, Platform3DObject* shaders)
694e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
695e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (!program) {
696e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        synthesizeGLError(INVALID_VALUE);
697e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return;
698e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    }
699e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
700e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    m_internal->m_glWidget->makeCurrent();
701cad810f21b803229eb11403f9209855525a25d57Steve Block    getAttachedShaders(program, maxCount, count, shaders);
702e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
703e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
704cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::bindAttribLocation(Platform3DObject program, GC3Duint index, const String& name)
705dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
706dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(program);
707dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
708cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->bindAttribLocation(program, index, name.utf8().data());
709dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
710dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
711cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::bindBuffer(GC3Denum target, Platform3DObject buffer)
712dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
713dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
714cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->bindBuffer(target, buffer);
715dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
716dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
717cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::bindFramebuffer(GC3Denum target, Platform3DObject buffer)
718dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
719dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
7202bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_internal->m_currentFbo = buffer ? buffer : m_internal->m_canvasFbo;
721dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->bindFramebuffer(target, m_internal->m_currentFbo);
722dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
723dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
724cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::bindRenderbuffer(GC3Denum target, Platform3DObject renderbuffer)
725dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
726dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
727cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->bindRenderbuffer(target, renderbuffer);
728dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
729dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
730cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::bindTexture(GC3Denum target, Platform3DObject texture)
731dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
732dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
733cad810f21b803229eb11403f9209855525a25d57Steve Block    glBindTexture(target, texture);
734dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
735dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
736cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::blendColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha)
737dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
738dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
739cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->blendColor(red, green, blue, alpha);
740dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
741dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
742cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::blendEquation(GC3Denum mode)
743dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
744dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
745dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->blendEquation(mode);
746dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
747dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
748cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::blendEquationSeparate(GC3Denum modeRGB, GC3Denum modeAlpha)
749dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
750dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
751dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->blendEquationSeparate(modeRGB, modeAlpha);
752dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
753dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
754cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::blendFunc(GC3Denum sfactor, GC3Denum dfactor)
755dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
756dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
757dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glBlendFunc(sfactor, dfactor);
758dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
759dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
760cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::blendFuncSeparate(GC3Denum srcRGB, GC3Denum dstRGB, GC3Denum srcAlpha, GC3Denum dstAlpha)
761dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
762dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
763dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
764dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
765dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
766cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::bufferData(GC3Denum target, GC3Dsizeiptr size, GC3Denum usage)
767dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
768dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
769dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->bufferData(target, size, /* data */ 0, usage);
770dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
771dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
772cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::bufferData(GC3Denum target, GC3Dsizeiptr size, const void* data, GC3Denum usage)
773dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
774dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
775e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    m_internal->bufferData(target, size, data, usage);
776dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
777dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
778cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::bufferSubData(GC3Denum target, GC3Dintptr offset, GC3Dsizeiptr size, const void* data)
779dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
780dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
781e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    m_internal->bufferSubData(target, offset, size, data);
782dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
783dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
784cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Denum GraphicsContext3D::checkFramebufferStatus(GC3Denum target)
785dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
786dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
787dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_internal->checkFramebufferStatus(target);
788dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
789dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
790cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::clearColor(GC3Dclampf r, GC3Dclampf g, GC3Dclampf b, GC3Dclampf a)
791dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
792dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
793cad810f21b803229eb11403f9209855525a25d57Steve Block    glClearColor(r, g, b, a);
794dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
795dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
796cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::clear(GC3Dbitfield mask)
797dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
798dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
799dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glClear(mask);
800dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
801dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
802cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::clearDepth(GC3Dclampf depth)
803dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
804dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
805dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if defined(QT_OPENGL_ES_2)
806dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glClearDepthf(depth);
807dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else
808dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glClearDepth(depth);
809dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
810dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
811dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
812cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::clearStencil(GC3Dint s)
813dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
814dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
815dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glClearStencil(s);
816dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
817dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
818cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboolean alpha)
819dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
820dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
821dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glColorMask(red, green, blue, alpha);
822dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
823dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
824e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid GraphicsContext3D::compileShader(Platform3DObject shader)
825dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
826dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(shader);
827dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
828cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->compileShader(shader);
829dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
830dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
831cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border)
832dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
833dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
834dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
835dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
836dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
837cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
838dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
839dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
840dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
841dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
842dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
843cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::cullFace(GC3Denum mode)
844dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
845dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
846dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glCullFace(mode);
847dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
848dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
849cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::depthFunc(GC3Denum func)
850dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
851dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
852dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glDepthFunc(func);
853dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
854dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
855cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::depthMask(GC3Dboolean flag)
856dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
857dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
858dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glDepthMask(flag);
859dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
860dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
861cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::depthRange(GC3Dclampf zNear, GC3Dclampf zFar)
862dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
863dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
864dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if defined(QT_OPENGL_ES_2)
865dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glDepthRangef(zNear, zFar);
866dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else
867dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glDepthRange(zNear, zFar);
868dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
869dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
870dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
871e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid GraphicsContext3D::detachShader(Platform3DObject program, Platform3DObject shader)
872dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
873dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(program);
874dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(shader);
875dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
876cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->detachShader(program, shader);
877dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
878dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
879cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::disable(GC3Denum cap)
880dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
881dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
882dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glDisable(cap);
883dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
884dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
885cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::disableVertexAttribArray(GC3Duint index)
886dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
887dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
888dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->disableVertexAttribArray(index);
889dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
890dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
891cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count)
892dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
893dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
894dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glDrawArrays(mode, first, count);
895dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
896dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
897cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::drawElements(GC3Denum mode, GC3Dsizei count, GC3Denum type, GC3Dintptr offset)
898dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
899dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
900cad810f21b803229eb11403f9209855525a25d57Steve Block    glDrawElements(mode, count, type, reinterpret_cast<GLvoid*>(static_cast<intptr_t>(offset)));
901dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
902dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
903cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::enable(GC3Denum cap)
904dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
905dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
906dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glEnable(cap);
907dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
908dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
909cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::enableVertexAttribArray(GC3Duint index)
910dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
911dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
912dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->enableVertexAttribArray(index);
913dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
914dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
915dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid GraphicsContext3D::finish()
916dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
917dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
918dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glFinish();
919dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
920dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
921dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid GraphicsContext3D::flush()
922dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
923dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
924dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glFlush();
925dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
926dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
927cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::framebufferRenderbuffer(GC3Denum target, GC3Denum attachment, GC3Denum renderbuffertarget, Platform3DObject buffer)
928dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
929dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
930cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->framebufferRenderbuffer(target, attachment, renderbuffertarget, buffer);
931dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
932dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
933cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, Platform3DObject texture, GC3Dint level)
934dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
935dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
936cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->framebufferTexture2D(target, attachment, textarget, texture, level);
937dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
938dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
939cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::frontFace(GC3Denum mode)
940dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
941dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
942dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glFrontFace(mode);
943dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
944dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
945cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::generateMipmap(GC3Denum target)
946dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
947dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
948dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->generateMipmap(target);
949dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
950dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
951cad810f21b803229eb11403f9209855525a25d57Steve Blockbool GraphicsContext3D::getActiveAttrib(Platform3DObject program, GC3Duint index, ActiveInfo& info)
952dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
953dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (!program) {
954dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        synthesizeGLError(INVALID_VALUE);
955dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
956dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
957dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
958dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
959dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
960cad810f21b803229eb11403f9209855525a25d57Steve Block    GLint maxLength = 0;
961cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->getProgramiv(program, GraphicsContext3D::ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxLength);
962dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
963dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    GLchar* name = (GLchar*) fastMalloc(maxLength);
964cad810f21b803229eb11403f9209855525a25d57Steve Block    GLsizei nameLength = 0;
965cad810f21b803229eb11403f9209855525a25d57Steve Block    GLint size = 0;
966cad810f21b803229eb11403f9209855525a25d57Steve Block    GLenum type = 0;
967dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
968cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->getActiveAttrib(program, index, maxLength, &nameLength, &size, &type, name);
969dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
970dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!nameLength) {
971dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        fastFree(name);
972dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
973dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
974dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
975dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    info.name = String(name, nameLength);
976dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    info.type = type;
977dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    info.size = size;
978dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
979dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    fastFree(name);
980dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return true;
981dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
982dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
983cad810f21b803229eb11403f9209855525a25d57Steve Blockbool GraphicsContext3D::getActiveUniform(Platform3DObject program, GC3Duint index, ActiveInfo& info)
984dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
985dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (!program) {
986dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        synthesizeGLError(INVALID_VALUE);
987dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
988dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
989dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
990dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
991dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
992cad810f21b803229eb11403f9209855525a25d57Steve Block    GLint maxLength = 0;
993dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_internal->getProgramiv(static_cast<GLuint>(program), GraphicsContext3D::ACTIVE_UNIFORM_MAX_LENGTH, &maxLength);
994dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
995dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    GLchar* name = (GLchar*) fastMalloc(maxLength);
996cad810f21b803229eb11403f9209855525a25d57Steve Block    GLsizei nameLength = 0;
997cad810f21b803229eb11403f9209855525a25d57Steve Block    GLint size = 0;
998cad810f21b803229eb11403f9209855525a25d57Steve Block    GLenum type = 0;
999dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1000dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_internal->getActiveUniform(static_cast<GLuint>(program), index, maxLength, &nameLength, &size, &type, name);
1001dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1002dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!nameLength) {
1003dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        fastFree(name);
1004dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
1005dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1006dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1007dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    info.name = String(name, nameLength);
1008dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    info.type = type;
1009dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    info.size = size;
1010dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1011dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    fastFree(name);
1012dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return true;
1013dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1014dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1015e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockint GraphicsContext3D::getAttribLocation(Platform3DObject program, const String& name)
1016dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1017dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!program)
1018dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return -1;
1019dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1020dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1021cad810f21b803229eb11403f9209855525a25d57Steve Block    return m_internal->getAttribLocation(program, name.utf8().data());
1022dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1023dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1024dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockGraphicsContext3D::Attributes GraphicsContext3D::getContextAttributes()
1025dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1026dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_internal->m_attrs;
1027dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1028dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1029cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Denum GraphicsContext3D::getError()
1030dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1031dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_internal->m_syntheticErrors.size() > 0) {
1032cad810f21b803229eb11403f9209855525a25d57Steve Block        ListHashSet<GC3Denum>::iterator iter = m_internal->m_syntheticErrors.begin();
1033cad810f21b803229eb11403f9209855525a25d57Steve Block        GC3Denum err = *iter;
1034dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_internal->m_syntheticErrors.remove(iter);
1035dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return err;
1036dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1037dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1038dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1039dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return glGetError();
1040dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1041dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1042cad810f21b803229eb11403f9209855525a25d57Steve BlockString GraphicsContext3D::getString(GC3Denum name)
1043dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1044dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1045dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return String((const char*) glGetString(name));
1046dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1047dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1048cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::hint(GC3Denum target, GC3Denum mode)
1049dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1050dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1051dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glHint(target, mode);
1052dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1053dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1054cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dboolean GraphicsContext3D::isBuffer(Platform3DObject buffer)
1055dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1056dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!buffer)
1057cad810f21b803229eb11403f9209855525a25d57Steve Block        return GL_FALSE;
1058dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1059dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1060cad810f21b803229eb11403f9209855525a25d57Steve Block    return m_internal->isBuffer(buffer);
1061dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1062dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1063cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dboolean GraphicsContext3D::isEnabled(GC3Denum cap)
1064dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1065dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1066dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return glIsEnabled(cap);
1067dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1068dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1069cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dboolean GraphicsContext3D::isFramebuffer(Platform3DObject framebuffer)
1070dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1071dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!framebuffer)
1072cad810f21b803229eb11403f9209855525a25d57Steve Block        return GL_FALSE;
1073dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1074dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1075cad810f21b803229eb11403f9209855525a25d57Steve Block    return m_internal->isFramebuffer(framebuffer);
1076dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1077dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1078cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dboolean GraphicsContext3D::isProgram(Platform3DObject program)
1079dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1080dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!program)
1081cad810f21b803229eb11403f9209855525a25d57Steve Block        return GL_FALSE;
1082dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1083dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1084cad810f21b803229eb11403f9209855525a25d57Steve Block    return m_internal->isProgram(program);
1085dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1086dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1087cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dboolean GraphicsContext3D::isRenderbuffer(Platform3DObject renderbuffer)
1088dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1089dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!renderbuffer)
1090cad810f21b803229eb11403f9209855525a25d57Steve Block        return GL_FALSE;
1091dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1092dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1093cad810f21b803229eb11403f9209855525a25d57Steve Block    return m_internal->isRenderbuffer(renderbuffer);
1094dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1095dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1096cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dboolean GraphicsContext3D::isShader(Platform3DObject shader)
1097dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1098dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!shader)
1099cad810f21b803229eb11403f9209855525a25d57Steve Block        return GL_FALSE;
1100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1102cad810f21b803229eb11403f9209855525a25d57Steve Block    return m_internal->isShader(shader);
1103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1105cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dboolean GraphicsContext3D::isTexture(Platform3DObject texture)
1106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!texture)
1108cad810f21b803229eb11403f9209855525a25d57Steve Block        return GL_FALSE;
1109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1111cad810f21b803229eb11403f9209855525a25d57Steve Block    return glIsTexture(texture);
1112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
111481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid GraphicsContext3D::lineWidth(GC3Dfloat width)
1115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glLineWidth(static_cast<float>(width));
1118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1120e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid GraphicsContext3D::linkProgram(Platform3DObject program)
1121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(program);
1123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1124cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->linkProgram(program);
1125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1127cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::pixelStorei(GC3Denum paramName, GC3Dint param)
1128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glPixelStorei(paramName, param);
1131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1133cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::polygonOffset(GC3Dfloat factor, GC3Dfloat units)
1134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1136cad810f21b803229eb11403f9209855525a25d57Steve Block    glPolygonOffset(factor, units);
1137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1139cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data)
1140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (type != GraphicsContext3D::UNSIGNED_BYTE || format != GraphicsContext3D::RGBA)
1144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
1145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1146cad810f21b803229eb11403f9209855525a25d57Steve Block    glReadPixels(x, y, width, height, format, type, data);
1147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid GraphicsContext3D::releaseShaderCompiler()
1150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    notImplemented();
1153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1155cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height)
1156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
11582bde8e466a4451c7319e3a072d118917957d6554Steve Block#if !defined(QT_OPENGL_ES_2)
11592bde8e466a4451c7319e3a072d118917957d6554Steve Block    switch (internalformat) {
11602bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DEPTH_STENCIL:
11612bde8e466a4451c7319e3a072d118917957d6554Steve Block        internalformat = GL_DEPTH24_STENCIL8;
11622bde8e466a4451c7319e3a072d118917957d6554Steve Block        break;
11632bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DEPTH_COMPONENT16:
11642bde8e466a4451c7319e3a072d118917957d6554Steve Block        internalformat = DEPTH_COMPONENT;
11652bde8e466a4451c7319e3a072d118917957d6554Steve Block        break;
11662bde8e466a4451c7319e3a072d118917957d6554Steve Block    case RGBA4:
11672bde8e466a4451c7319e3a072d118917957d6554Steve Block    case RGB5_A1:
11682bde8e466a4451c7319e3a072d118917957d6554Steve Block        internalformat = RGBA;
11692bde8e466a4451c7319e3a072d118917957d6554Steve Block        break;
11702bde8e466a4451c7319e3a072d118917957d6554Steve Block    case RGB565:
11712bde8e466a4451c7319e3a072d118917957d6554Steve Block        internalformat = RGB;
11722bde8e466a4451c7319e3a072d118917957d6554Steve Block        break;
11732bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
11742bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
1175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->renderbufferStorage(target, internalformat, width, height);
1176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1178cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::sampleCoverage(GC3Dclampf value, GC3Dboolean invert)
1179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1181cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->sampleCoverage(value, invert);
1182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1184cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
1185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glScissor(x, y, width, height);
1188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1190e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid GraphicsContext3D::shaderSource(Platform3DObject shader, const String& source)
1191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(shader);
119306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
1194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
119606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    String prefixedSource;
119706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
119806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if defined (QT_OPENGL_ES_2)
119906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    prefixedSource.append("precision mediump float;\n");
120006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
120106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
120206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    prefixedSource.append(source);
120306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
120406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    CString sourceCS = prefixedSource.utf8();
1205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const char* data = sourceCS.data();
120606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int length = prefixedSource.length();
1207dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_internal->shaderSource((GLuint) shader, /* count */ 1, &data, &length);
1208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1210cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::stencilFunc(GC3Denum func, GC3Dint ref, GC3Duint mask)
1211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glStencilFunc(func, ref, mask);
1214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1216cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::stencilFuncSeparate(GC3Denum face, GC3Denum func, GC3Dint ref, GC3Duint mask)
1217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->stencilFuncSeparate(face, func, ref, mask);
1220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1222cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::stencilMask(GC3Duint mask)
1223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glStencilMask(mask);
1226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1228cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::stencilMaskSeparate(GC3Denum face, GC3Duint mask)
1229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->stencilMaskSeparate(face, mask);
1232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1234cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zpass)
1235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glStencilOp(fail, zfail, zpass);
1238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1240cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::stencilOpSeparate(GC3Denum face, GC3Denum fail, GC3Denum zfail, GC3Denum zpass)
1241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->stencilOpSeparate(face, fail, zfail, zpass);
1244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1246cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::texParameterf(GC3Denum target, GC3Denum paramName, GC3Dfloat value)
1247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1249cad810f21b803229eb11403f9209855525a25d57Steve Block    glTexParameterf(target, paramName, value);
1250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1251dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1252cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::texParameteri(GC3Denum target, GC3Denum paramName, GC3Dint value)
1253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1255cad810f21b803229eb11403f9209855525a25d57Steve Block    glTexParameteri(target, paramName, value);
1256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1258cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform1f(GC3Dint location, GC3Dfloat v0)
1259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1261dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniform1f(location, v0);
1262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1264cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform1fv(GC3Dint location, GC3Dfloat* array, GC3Dsizei size)
1265dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniform1fv(location, size, array);
1268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1269dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1270cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform2f(GC3Dint location, GC3Dfloat v0, GC3Dfloat v1)
1271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniform2f(location, v0, v1);
1274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1276cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform2fv(GC3Dint location, GC3Dfloat* array, GC3Dsizei size)
1277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniform2fv(location, size, array);
1280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1281dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1282cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform3f(GC3Dint location, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2)
1283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1284dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1285dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniform3f(location, v0, v1, v2);
1286dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1288cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform3fv(GC3Dint location, GC3Dfloat* array, GC3Dsizei size)
1289dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniform3fv(location, size, array);
1292dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1294cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform4f(GC3Dint location, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2, GC3Dfloat v3)
1295dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniform4f(location, v0, v1, v2, v3);
1298dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1299dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1300cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform4fv(GC3Dint location, GC3Dfloat* array, GC3Dsizei size)
1301dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1302dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1303dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniform4fv(location, size, array);
1304dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1306cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform1i(GC3Dint location, GC3Dint v0)
1307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1308dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1309dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniform1i(location, v0);
1310dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1311dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1312cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform1iv(GC3Dint location, GC3Dint* array, GC3Dsizei size)
1313dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1314dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniform1iv(location, size, array);
1316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1318cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform2i(GC3Dint location, GC3Dint v0, GC3Dint v1)
1319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1321dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniform2i(location, v0, v1);
1322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1323dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1324cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform2iv(GC3Dint location, GC3Dint* array, GC3Dsizei size)
1325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniform2iv(location, size, array);
1328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1330cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform3i(GC3Dint location, GC3Dint v0, GC3Dint v1, GC3Dint v2)
1331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniform3i(location, v0, v1, v2);
1334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1336cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform3iv(GC3Dint location, GC3Dint* array, GC3Dsizei size)
1337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniform3iv(location, size, array);
1340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1342cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform4i(GC3Dint location, GC3Dint v0, GC3Dint v1, GC3Dint v2, GC3Dint v3)
1343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniform4i(location, v0, v1, v2, v3);
1346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1348cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniform4iv(GC3Dint location, GC3Dint* array, GC3Dsizei size)
1349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1351dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniform4iv(location, size, array);
1352dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1354cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniformMatrix2fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* array, GC3Dsizei size)
1355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniformMatrix2fv(location, size, transpose, array);
1358dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1359dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1360cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniformMatrix3fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* array, GC3Dsizei size)
1361dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1363dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniformMatrix3fv(location, size, transpose, array);
1364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1366cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::uniformMatrix4fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* array, GC3Dsizei size)
1367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->uniformMatrix4fv(location, size, transpose, array);
1370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1372e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid GraphicsContext3D::useProgram(Platform3DObject program)
1373dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(program);
1375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1377cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->useProgram(program);
1378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1380e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid GraphicsContext3D::validateProgram(Platform3DObject program)
1381dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1382dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(program);
1383dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1385cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->validateProgram(program);
1386dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1387dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1388cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttrib1f(GC3Duint index, GC3Dfloat v0)
1389dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1390dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1391cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->vertexAttrib1f(index, v0);
1392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1393dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1394cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttrib1fv(GC3Duint index, GC3Dfloat* array)
1395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1396dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1397cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->vertexAttrib1fv(index, array);
1398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1400cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttrib2f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1)
1401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1403cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->vertexAttrib2f(index, v0, v1);
1404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1406cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttrib2fv(GC3Duint index, GC3Dfloat* array)
1407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1409cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->vertexAttrib2fv(index, array);
1410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1412cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttrib3f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2)
1413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1414dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1415cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->vertexAttrib3f(index, v0, v1, v2);
1416dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1417dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1418cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttrib3fv(GC3Duint index, GC3Dfloat* array)
1419dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1420dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1421cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->vertexAttrib3fv(index, array);
1422dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1423dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1424cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttrib4f(GC3Duint index, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2, GC3Dfloat v3)
1425dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1426dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1427cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->vertexAttrib4f(index, v0, v1, v2, v3);
1428dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1429dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1430cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttrib4fv(GC3Duint index, GC3Dfloat* array)
1431dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1432dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1433cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->vertexAttrib4fv(index, array);
1434dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1435dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1436cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::vertexAttribPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dboolean normalized, GC3Dsizei stride, GC3Dintptr offset)
1437dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1438dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1439cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->vertexAttribPointer(index, size, type, normalized, stride, reinterpret_cast<GLvoid*>(static_cast<intptr_t>(offset)));
1440dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1441dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1442cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height)
1443dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1444dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1445cad810f21b803229eb11403f9209855525a25d57Steve Block    glViewport(x, y, width, height);
1446dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1447dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1448cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getBooleanv(GC3Denum paramName, GC3Dboolean* value)
1449dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1450dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1451dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetBooleanv(paramName, value);
1452dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1453dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1454cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getBufferParameteriv(GC3Denum target, GC3Denum paramName, GC3Dint* value)
1455dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1456dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1457dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->getBufferParameteriv(target, paramName, value);
1458dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1459dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1460cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getFloatv(GC3Denum paramName, GC3Dfloat* value)
1461dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1462dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1463dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetFloatv(paramName, value);
1464dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1465dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1466cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getFramebufferAttachmentParameteriv(GC3Denum target, GC3Denum attachment, GC3Denum paramName, GC3Dint* value)
1467dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1468dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->getFramebufferAttachmentParameteriv(target, attachment, paramName, value);
1470dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1471dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1472cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getIntegerv(GC3Denum paramName, GC3Dint* value)
1473dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1474dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1475dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetIntegerv(paramName, value);
1476dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1477dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1478cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getProgramiv(Platform3DObject program, GC3Denum paramName, GC3Dint* value)
1479dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1480dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1481cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->getProgramiv(program, paramName, value);
1482dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1483dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1484e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockString GraphicsContext3D::getProgramInfoLog(Platform3DObject program)
1485dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1486dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1487dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1488cad810f21b803229eb11403f9209855525a25d57Steve Block    GLint length = 0;
1489cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->getProgramiv(program, GraphicsContext3D::INFO_LOG_LENGTH, &length);
1490dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1491cad810f21b803229eb11403f9209855525a25d57Steve Block    GLsizei size = 0;
1492dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1493dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    GLchar* info = (GLchar*) fastMalloc(length);
1494dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!info)
1495dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return "";
1496dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1497cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->getProgramInfoLog(program, length, &size, info);
1498dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1499dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    String result(info);
1500dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    fastFree(info);
1501dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1502dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return result;
1503dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1504dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1505cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getRenderbufferParameteriv(GC3Denum target, GC3Denum paramName, GC3Dint* value)
1506dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1507dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1508dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->getRenderbufferParameteriv(target, paramName, value);
1509dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1510dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1511cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getShaderiv(Platform3DObject shader, GC3Denum paramName, GC3Dint* value)
1512dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1513dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(shader);
1514dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1515cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->getShaderiv(shader, paramName, value);
1516dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1517dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1518e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockString GraphicsContext3D::getShaderInfoLog(Platform3DObject shader)
1519dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1522cad810f21b803229eb11403f9209855525a25d57Steve Block    GLint length = 0;
1523cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->getShaderiv(shader, GraphicsContext3D::INFO_LOG_LENGTH, &length);
1524dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1525cad810f21b803229eb11403f9209855525a25d57Steve Block    GLsizei size = 0;
1526dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    GLchar* info = (GLchar*) fastMalloc(length);
1527dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!info)
1528dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return "";
1529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1530cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->getShaderInfoLog(shader, length, &size, info);
1531dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    String result(info);
1533dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    fastFree(info);
1534dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1535dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return result;
1536dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1537dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1538e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockString GraphicsContext3D::getShaderSource(Platform3DObject shader)
1539dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1540dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1541dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1542cad810f21b803229eb11403f9209855525a25d57Steve Block    GLint length = 0;
1543cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->getShaderiv(shader, GraphicsContext3D::SHADER_SOURCE_LENGTH, &length);
1544dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1545cad810f21b803229eb11403f9209855525a25d57Steve Block    GLsizei size = 0;
1546dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    GLchar* info = (GLchar*) fastMalloc(length);
1547dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!info)
1548dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return "";
1549dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1550cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->getShaderSource(shader, length, &size, info);
1551dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1552dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    String result(info);
1553dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    fastFree(info);
1554dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1555dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return result;
1556dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1557dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1558cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getTexParameterfv(GC3Denum target, GC3Denum paramName, GC3Dfloat* value)
1559dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1560dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1561dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetTexParameterfv(target, paramName, value);
1562dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1563dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1564cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getTexParameteriv(GC3Denum target, GC3Denum paramName, GC3Dint* value)
1565dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1566dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1567dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGetTexParameteriv(target, paramName, value);
1568dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1569dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1570cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getUniformfv(Platform3DObject program, GC3Dint location, GC3Dfloat* value)
1571dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1572dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1573cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->getUniformfv(program, location, value);
1574dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1575dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1576cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getUniformiv(Platform3DObject program, GC3Dint location, GC3Dint* value)
1577dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1578dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1579cad810f21b803229eb11403f9209855525a25d57Steve Block    m_internal->getUniformiv(program, location, value);
1580dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1581dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
158281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochGC3Dint GraphicsContext3D::getUniformLocation(Platform3DObject program, const String& name)
1583dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1584dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(program);
1585dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1586dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1587cad810f21b803229eb11403f9209855525a25d57Steve Block    return m_internal->getUniformLocation(program, name.utf8().data());
1588dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1589dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1590cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getVertexAttribfv(GC3Duint index, GC3Denum paramName, GC3Dfloat* value)
1591dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1592dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1593dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->getVertexAttribfv(index, paramName, value);
1594dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1595dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1596cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::getVertexAttribiv(GC3Duint index, GC3Denum paramName, GC3Dint* value)
1597dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1598dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1599dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->getVertexAttribiv(index, paramName, value);
1600dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1601dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1602cad810f21b803229eb11403f9209855525a25d57Steve BlockGC3Dsizeiptr GraphicsContext3D::getVertexAttribOffset(GC3Duint index, GC3Denum paramName)
1603dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1604dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1605dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1606cad810f21b803229eb11403f9209855525a25d57Steve Block    GLvoid* pointer = 0;
1607dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->getVertexAttribPointerv(index, paramName, &pointer);
1608cad810f21b803229eb11403f9209855525a25d57Steve Block    return static_cast<GC3Dsizeiptr>(reinterpret_cast<intptr_t>(pointer));
1609dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1610dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1611cad810f21b803229eb11403f9209855525a25d57Steve Blockbool GraphicsContext3D::texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels)
1612dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
161321939df44de1705786c545cd1bf519d47250322dBen Murdoch    m_internal->m_glWidget->makeCurrent();
1614dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
1615cad810f21b803229eb11403f9209855525a25d57Steve Block    return true;
1616dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1617dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1618cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoff, GC3Dint yoff, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels)
1619dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
162021939df44de1705786c545cd1bf519d47250322dBen Murdoch    m_internal->m_glWidget->makeCurrent();
1621dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glTexSubImage2D(target, level, xoff, yoff, width, height, format, type, pixels);
1622dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1623dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1624cad810f21b803229eb11403f9209855525a25d57Steve BlockPlatform3DObject GraphicsContext3D::createBuffer()
1625dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1626dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1627cad810f21b803229eb11403f9209855525a25d57Steve Block    GLuint handle = 0;
1628dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->genBuffers(/* count */ 1, &handle);
1629dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return handle;
1630dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1631dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1632cad810f21b803229eb11403f9209855525a25d57Steve BlockPlatform3DObject GraphicsContext3D::createFramebuffer()
1633dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1634dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1635cad810f21b803229eb11403f9209855525a25d57Steve Block    GLuint handle = 0;
1636dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->genFramebuffers(/* count */ 1, &handle);
1637dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return handle;
1638dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1639dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1640cad810f21b803229eb11403f9209855525a25d57Steve BlockPlatform3DObject GraphicsContext3D::createProgram()
1641dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1642dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1643dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_internal->createProgram();
1644dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1645dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1646cad810f21b803229eb11403f9209855525a25d57Steve BlockPlatform3DObject GraphicsContext3D::createRenderbuffer()
1647dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1648dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1649cad810f21b803229eb11403f9209855525a25d57Steve Block    GLuint handle = 0;
1650dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->genRenderbuffers(/* count */ 1, &handle);
1651dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return handle;
1652dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1653dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1654cad810f21b803229eb11403f9209855525a25d57Steve BlockPlatform3DObject GraphicsContext3D::createShader(GC3Denum type)
1655dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1656dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1657cad810f21b803229eb11403f9209855525a25d57Steve Block    return m_internal->createShader(type);
1658dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1659dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1660cad810f21b803229eb11403f9209855525a25d57Steve BlockPlatform3DObject GraphicsContext3D::createTexture()
1661dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1662dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1663cad810f21b803229eb11403f9209855525a25d57Steve Block    GLuint handle = 0;
1664dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glGenTextures(1, &handle);
1665dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return handle;
1666dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1667dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1668cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::deleteBuffer(Platform3DObject buffer)
1669dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1670dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1671dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->deleteBuffers(1, &buffer);
1672dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1673dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1674cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::deleteFramebuffer(Platform3DObject framebuffer)
1675dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1676dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1677dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->deleteFramebuffers(1, &framebuffer);
1678dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1679dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1680cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::deleteProgram(Platform3DObject program)
1681dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1682dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1683dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->deleteProgram(program);
1684dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1685dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1686cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::deleteRenderbuffer(Platform3DObject renderbuffer)
1687dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1688dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1689dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->deleteRenderbuffers(1, &renderbuffer);
1690dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1691dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1692cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::deleteShader(Platform3DObject shader)
1693dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1694dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1695dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->deleteShader(shader);
1696dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1697dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1698cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::deleteTexture(Platform3DObject texture)
1699dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1700dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_glWidget->makeCurrent();
1701dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    glDeleteTextures(1, &texture);
1702dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1703dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1704cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid GraphicsContext3D::synthesizeGLError(GC3Denum error)
1705dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1706dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_internal->m_syntheticErrors.add(error);
1707dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1708dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
17092bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid GraphicsContext3D::markLayerComposited()
17102bde8e466a4451c7319e3a072d118917957d6554Steve Block{
17112bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_internal->m_layerComposited = true;
17122bde8e466a4451c7319e3a072d118917957d6554Steve Block}
17132bde8e466a4451c7319e3a072d118917957d6554Steve Block
17142bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid GraphicsContext3D::markContextChanged()
17152bde8e466a4451c7319e3a072d118917957d6554Steve Block{
17162bde8e466a4451c7319e3a072d118917957d6554Steve Block    // FIXME: Any accelerated compositor needs to be told to re-read from here.
17172bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_internal->m_layerComposited = false;
17182bde8e466a4451c7319e3a072d118917957d6554Steve Block}
17192bde8e466a4451c7319e3a072d118917957d6554Steve Block
17202bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool GraphicsContext3D::layerComposited() const
17212bde8e466a4451c7319e3a072d118917957d6554Steve Block{
17222bde8e466a4451c7319e3a072d118917957d6554Steve Block    return m_internal->m_layerComposited;
17232bde8e466a4451c7319e3a072d118917957d6554Steve Block}
17242bde8e466a4451c7319e3a072d118917957d6554Steve Block
172528040489d744e0c5d475a88663056c9040ed5320Teng-Hui ZhuExtensions3D* GraphicsContext3D::getExtensions()
172628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
172728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (!m_internal->m_extensions)
172828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        m_internal->m_extensions = adoptPtr(new Extensions3DQt);
172981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return m_internal->m_extensions.get();
173028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
173128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
1732dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool GraphicsContext3D::getImageData(Image* image,
1733cad810f21b803229eb11403f9209855525a25d57Steve Block                                     GC3Denum format,
1734cad810f21b803229eb11403f9209855525a25d57Steve Block                                     GC3Denum type,
1735dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                     bool premultiplyAlpha,
17366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                     bool ignoreGammaAndColorProfile,
173706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                                     Vector<uint8_t>& outputVector)
1738dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
17396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    UNUSED_PARAM(ignoreGammaAndColorProfile);
1740545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (!image)
1741545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return false;
1742545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QPixmap* nativePixmap = image->nativeImageForCurrentFrame();
1743545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (!nativePixmap)
1744545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return false;
1745dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
174681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    AlphaOp neededAlphaOp = AlphaDoNothing;
1747e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (!premultiplyAlpha)
174806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // FIXME: must fetch the image data before the premultiplication step
174981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        neededAlphaOp = AlphaDoUnmultiply;
175021939df44de1705786c545cd1bf519d47250322dBen Murdoch    QImage nativeImage = nativePixmap->toImage().convertToFormat(QImage::Format_ARGB32);
175106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    outputVector.resize(nativeImage.byteCount());
175281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return packPixels(nativeImage.rgbSwapped().bits(), SourceFormatRGBA8, image->width(), image->height(), 0,
175306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                      format, type, neededAlphaOp, outputVector.data());
1754dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1755dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
17562fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid GraphicsContext3D::setContextLostCallback(PassOwnPtr<ContextLostCallback>)
17572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
17582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
17592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1760dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1761dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
17622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ENABLE(WEBGL)
1763