1231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block/*
2231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2009 Apple Inc. All rights reserved.
3231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *
4231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Redistribution and use in source and binary forms, with or without
5231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * modification, are permitted provided that the following conditions
6231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * are met:
7231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * 1. Redistributions of source code must retain the above copyright
8231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *    notice, this list of conditions and the following disclaimer.
9231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * 2. Redistributions in binary form must reproduce the above copyright
10231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *    notice, this list of conditions and the following disclaimer in the
11231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *    documentation and/or other materials provided with the distribution.
12231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *
13231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block */
25231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
26231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef GraphicsContext3D_h
27231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#define GraphicsContext3D_h
28231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
29cad810f21b803229eb11403f9209855525a25d57Steve Block#include "IntSize.h"
3006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "GraphicsLayer.h"
3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "GraphicsTypes3D.h"
32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "PlatformString.h"
33231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
34f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/HashMap.h>
35643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <wtf/ListHashSet.h>
36231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <wtf/Noncopyable.h>
37231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
38643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// FIXME: Find a better way to avoid the name confliction for NO_ERROR.
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ((PLATFORM(CHROMIUM) && OS(WINDOWS)) || PLATFORM(WIN) || (PLATFORM(QT) && OS(WINDOWS)))
40643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#undef NO_ERROR
41cad810f21b803229eb11403f9209855525a25d57Steve Block#elif PLATFORM(GTK)
42cad810f21b803229eb11403f9209855525a25d57Steve Block// This define is from the X11 headers, but it's used below, so we must undefine it.
43cad810f21b803229eb11403f9209855525a25d57Steve Block#undef VERSION
44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(MAC) || PLATFORM(GTK)
47a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "ANGLEWebKitBridge.h"
482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(MAC)
51231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <OpenGL/OpenGL.h>
5206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <wtf/RetainPtr.h>
5306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#ifdef __OBJC__
5406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen@class CALayer;
5506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen@class WebGLLayer;
5606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#else
572bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass CALayer;
582bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass WebGLLayer;
5906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#elif PLATFORM(QT)
61cad810f21b803229eb11403f9209855525a25d57Steve BlockQT_BEGIN_NAMESPACE
62545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochclass QPainter;
63545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochclass QRect;
64cad810f21b803229eb11403f9209855525a25d57Steve BlockQT_END_NAMESPACE
65cad810f21b803229eb11403f9209855525a25d57Steve Block#elif PLATFORM(GTK)
66cad810f21b803229eb11403f9209855525a25d57Steve Blocktypedef unsigned int GLuint;
67cad810f21b803229eb11403f9209855525a25d57Steve Block#endif
68cad810f21b803229eb11403f9209855525a25d57Steve Block
69cad810f21b803229eb11403f9209855525a25d57Steve Block#if PLATFORM(MAC)
70cad810f21b803229eb11403f9209855525a25d57Steve Blocktypedef CGLContextObj PlatformGraphicsContext3D;
71231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else
72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blocktypedef void* PlatformGraphicsContext3D;
73cad810f21b803229eb11403f9209855525a25d57Steve Block#endif
74cad810f21b803229eb11403f9209855525a25d57Steve Block
75cad810f21b803229eb11403f9209855525a25d57Steve Block// These are currently the same among all implementations.
76dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochconst PlatformGraphicsContext3D NullPlatformGraphicsContext3D = 0;
77231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockconst Platform3DObject NullPlatform3DObject = 0;
78231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CG)
80967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include <CoreGraphics/CGContext.h>
81967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif
82967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blocknamespace WebCore {
84dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochclass CanvasRenderingContext;
85a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochclass DrawingBuffer;
8628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuclass Extensions3D;
872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(MAC) || PLATFORM(GTK)
8828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuclass Extensions3DOpenGL;
8928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#endif
90dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochclass HostWindow;
91dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochclass Image;
92dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochclass ImageData;
932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CAIRO)
942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochclass PlatformContextCairo;
952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
96dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
97dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochstruct ActiveInfo {
98dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    String name;
99cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Denum type;
100cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Dint size;
101dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch};
102dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
103dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch// FIXME: ideally this would be used on all platforms.
1042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(CHROMIUM) || PLATFORM(QT) || PLATFORM(GTK)
105dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochclass GraphicsContext3DInternal;
106231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
107231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
108a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochclass GraphicsContext3D : public RefCounted<GraphicsContext3D> {
109dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochpublic:
1102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    enum {
111dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DEPTH_BUFFER_BIT = 0x00000100,
112dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_BUFFER_BIT = 0x00000400,
113dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        COLOR_BUFFER_BIT = 0x00004000,
114dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        POINTS = 0x0000,
115dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        LINES = 0x0001,
116dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        LINE_LOOP = 0x0002,
117dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        LINE_STRIP = 0x0003,
118dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TRIANGLES = 0x0004,
119dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TRIANGLE_STRIP = 0x0005,
120dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TRIANGLE_FAN = 0x0006,
121dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ZERO = 0,
122dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ONE = 1,
123dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SRC_COLOR = 0x0300,
124dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ONE_MINUS_SRC_COLOR = 0x0301,
125dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SRC_ALPHA = 0x0302,
126dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ONE_MINUS_SRC_ALPHA = 0x0303,
127dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DST_ALPHA = 0x0304,
128dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ONE_MINUS_DST_ALPHA = 0x0305,
129dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DST_COLOR = 0x0306,
130dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ONE_MINUS_DST_COLOR = 0x0307,
131dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SRC_ALPHA_SATURATE = 0x0308,
132dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FUNC_ADD = 0x8006,
133dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BLEND_EQUATION = 0x8009,
134dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BLEND_EQUATION_RGB = 0x8009,
135dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BLEND_EQUATION_ALPHA = 0x883D,
136dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FUNC_SUBTRACT = 0x800A,
137dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FUNC_REVERSE_SUBTRACT = 0x800B,
138dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BLEND_DST_RGB = 0x80C8,
139dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BLEND_SRC_RGB = 0x80C9,
140dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BLEND_DST_ALPHA = 0x80CA,
141dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BLEND_SRC_ALPHA = 0x80CB,
142dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        CONSTANT_COLOR = 0x8001,
143dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ONE_MINUS_CONSTANT_COLOR = 0x8002,
144dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        CONSTANT_ALPHA = 0x8003,
145dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ONE_MINUS_CONSTANT_ALPHA = 0x8004,
146dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BLEND_COLOR = 0x8005,
147dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ARRAY_BUFFER = 0x8892,
148dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ELEMENT_ARRAY_BUFFER = 0x8893,
149dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ARRAY_BUFFER_BINDING = 0x8894,
150dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ELEMENT_ARRAY_BUFFER_BINDING = 0x8895,
151dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STREAM_DRAW = 0x88E0,
152dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STATIC_DRAW = 0x88E4,
153dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DYNAMIC_DRAW = 0x88E8,
154dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BUFFER_SIZE = 0x8764,
155dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BUFFER_USAGE = 0x8765,
156dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        CURRENT_VERTEX_ATTRIB = 0x8626,
157dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FRONT = 0x0404,
158dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BACK = 0x0405,
159dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FRONT_AND_BACK = 0x0408,
160dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE_2D = 0x0DE1,
161dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        CULL_FACE = 0x0B44,
162dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BLEND = 0x0BE2,
163dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DITHER = 0x0BD0,
164dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_TEST = 0x0B90,
165dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DEPTH_TEST = 0x0B71,
166dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SCISSOR_TEST = 0x0C11,
167dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        POLYGON_OFFSET_FILL = 0x8037,
168dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SAMPLE_ALPHA_TO_COVERAGE = 0x809E,
169dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SAMPLE_COVERAGE = 0x80A0,
170dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        NO_ERROR = 0,
171dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        INVALID_ENUM = 0x0500,
172dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        INVALID_VALUE = 0x0501,
173dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        INVALID_OPERATION = 0x0502,
174dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        OUT_OF_MEMORY = 0x0505,
175dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        CW = 0x0900,
176dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        CCW = 0x0901,
177dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        LINE_WIDTH = 0x0B21,
178dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ALIASED_POINT_SIZE_RANGE = 0x846D,
179dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ALIASED_LINE_WIDTH_RANGE = 0x846E,
180dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        CULL_FACE_MODE = 0x0B45,
181dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FRONT_FACE = 0x0B46,
182dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DEPTH_RANGE = 0x0B70,
183dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DEPTH_WRITEMASK = 0x0B72,
184dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DEPTH_CLEAR_VALUE = 0x0B73,
185dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DEPTH_FUNC = 0x0B74,
186dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_CLEAR_VALUE = 0x0B91,
187dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_FUNC = 0x0B92,
188dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_FAIL = 0x0B94,
189dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_PASS_DEPTH_FAIL = 0x0B95,
190dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_PASS_DEPTH_PASS = 0x0B96,
191dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_REF = 0x0B97,
192dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_VALUE_MASK = 0x0B93,
193dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_WRITEMASK = 0x0B98,
194dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_BACK_FUNC = 0x8800,
195dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_BACK_FAIL = 0x8801,
196dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802,
197dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_BACK_PASS_DEPTH_PASS = 0x8803,
198dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_BACK_REF = 0x8CA3,
199dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_BACK_VALUE_MASK = 0x8CA4,
200dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_BACK_WRITEMASK = 0x8CA5,
201dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        VIEWPORT = 0x0BA2,
202dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SCISSOR_BOX = 0x0C10,
203dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        COLOR_CLEAR_VALUE = 0x0C22,
204dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        COLOR_WRITEMASK = 0x0C23,
205dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        UNPACK_ALIGNMENT = 0x0CF5,
206dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        PACK_ALIGNMENT = 0x0D05,
207dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        MAX_TEXTURE_SIZE = 0x0D33,
208dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        MAX_VIEWPORT_DIMS = 0x0D3A,
209dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SUBPIXEL_BITS = 0x0D50,
210dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RED_BITS = 0x0D52,
211dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        GREEN_BITS = 0x0D53,
212dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BLUE_BITS = 0x0D54,
213dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ALPHA_BITS = 0x0D55,
214dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DEPTH_BITS = 0x0D56,
215dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_BITS = 0x0D57,
216dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        POLYGON_OFFSET_UNITS = 0x2A00,
217dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        POLYGON_OFFSET_FACTOR = 0x8038,
218dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE_BINDING_2D = 0x8069,
219dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SAMPLE_BUFFERS = 0x80A8,
220dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SAMPLES = 0x80A9,
221dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SAMPLE_COVERAGE_VALUE = 0x80AA,
222dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SAMPLE_COVERAGE_INVERT = 0x80AB,
223dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        NUM_COMPRESSED_TEXTURE_FORMATS = 0x86A2,
224dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        COMPRESSED_TEXTURE_FORMATS = 0x86A3,
225dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DONT_CARE = 0x1100,
226dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FASTEST = 0x1101,
227dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        NICEST = 0x1102,
228dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        GENERATE_MIPMAP_HINT = 0x8192,
229dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BYTE = 0x1400,
230dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        UNSIGNED_BYTE = 0x1401,
231dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SHORT = 0x1402,
232dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        UNSIGNED_SHORT = 0x1403,
233dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        INT = 0x1404,
234dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        UNSIGNED_INT = 0x1405,
235dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FLOAT = 0x1406,
236dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FIXED = 0x140C,
237dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DEPTH_COMPONENT = 0x1902,
238dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ALPHA = 0x1906,
239dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RGB = 0x1907,
240dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RGBA = 0x1908,
241dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        LUMINANCE = 0x1909,
242dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        LUMINANCE_ALPHA = 0x190A,
243dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        UNSIGNED_SHORT_4_4_4_4 = 0x8033,
244dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        UNSIGNED_SHORT_5_5_5_1 = 0x8034,
245dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        UNSIGNED_SHORT_5_6_5 = 0x8363,
246dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FRAGMENT_SHADER = 0x8B30,
247dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        VERTEX_SHADER = 0x8B31,
248dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        MAX_VERTEX_ATTRIBS = 0x8869,
249dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB,
250dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        MAX_VARYING_VECTORS = 0x8DFC,
251dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D,
252dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C,
253dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        MAX_TEXTURE_IMAGE_UNITS = 0x8872,
254dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD,
255dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SHADER_TYPE = 0x8B4F,
256dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DELETE_STATUS = 0x8B80,
257dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        LINK_STATUS = 0x8B82,
258dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        VALIDATE_STATUS = 0x8B83,
259dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ATTACHED_SHADERS = 0x8B85,
260dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ACTIVE_UNIFORMS = 0x8B86,
261dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ACTIVE_UNIFORM_MAX_LENGTH = 0x8B87,
262dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ACTIVE_ATTRIBUTES = 0x8B89,
263dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ACTIVE_ATTRIBUTE_MAX_LENGTH = 0x8B8A,
264dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SHADING_LANGUAGE_VERSION = 0x8B8C,
265dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        CURRENT_PROGRAM = 0x8B8D,
266dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        NEVER = 0x0200,
267dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        LESS = 0x0201,
268dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        EQUAL = 0x0202,
269dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        LEQUAL = 0x0203,
270dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        GREATER = 0x0204,
271dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        NOTEQUAL = 0x0205,
272dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        GEQUAL = 0x0206,
273dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ALWAYS = 0x0207,
274dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        KEEP = 0x1E00,
275dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        REPLACE = 0x1E01,
276dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        INCR = 0x1E02,
277dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DECR = 0x1E03,
278dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        INVERT = 0x150A,
279dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        INCR_WRAP = 0x8507,
280dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DECR_WRAP = 0x8508,
281dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        VENDOR = 0x1F00,
282dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RENDERER = 0x1F01,
283dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        VERSION = 0x1F02,
284dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        EXTENSIONS = 0x1F03,
285dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        NEAREST = 0x2600,
286dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        LINEAR = 0x2601,
287dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        NEAREST_MIPMAP_NEAREST = 0x2700,
288dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        LINEAR_MIPMAP_NEAREST = 0x2701,
289dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        NEAREST_MIPMAP_LINEAR = 0x2702,
290dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        LINEAR_MIPMAP_LINEAR = 0x2703,
291dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE_MAG_FILTER = 0x2800,
292dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE_MIN_FILTER = 0x2801,
293dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE_WRAP_S = 0x2802,
294dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE_WRAP_T = 0x2803,
295dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE = 0x1702,
296dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE_CUBE_MAP = 0x8513,
297dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE_BINDING_CUBE_MAP = 0x8514,
298dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515,
299dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516,
300dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517,
301dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518,
302dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519,
303dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A,
304dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C,
305dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE0 = 0x84C0,
306dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE1 = 0x84C1,
307dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE2 = 0x84C2,
308dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE3 = 0x84C3,
309dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE4 = 0x84C4,
310dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE5 = 0x84C5,
311dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE6 = 0x84C6,
312dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE7 = 0x84C7,
313dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE8 = 0x84C8,
314dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE9 = 0x84C9,
315dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE10 = 0x84CA,
316dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE11 = 0x84CB,
317dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE12 = 0x84CC,
318dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE13 = 0x84CD,
319dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE14 = 0x84CE,
320dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE15 = 0x84CF,
321dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE16 = 0x84D0,
322dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE17 = 0x84D1,
323dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE18 = 0x84D2,
324dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE19 = 0x84D3,
325dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE20 = 0x84D4,
326dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE21 = 0x84D5,
327dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE22 = 0x84D6,
328dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE23 = 0x84D7,
329dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE24 = 0x84D8,
330dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE25 = 0x84D9,
331dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE26 = 0x84DA,
332dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE27 = 0x84DB,
333dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE28 = 0x84DC,
334dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE29 = 0x84DD,
335dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE30 = 0x84DE,
336dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        TEXTURE31 = 0x84DF,
337dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ACTIVE_TEXTURE = 0x84E0,
338dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        REPEAT = 0x2901,
339dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        CLAMP_TO_EDGE = 0x812F,
340dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        MIRRORED_REPEAT = 0x8370,
341dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FLOAT_VEC2 = 0x8B50,
342dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FLOAT_VEC3 = 0x8B51,
343dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FLOAT_VEC4 = 0x8B52,
344dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        INT_VEC2 = 0x8B53,
345dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        INT_VEC3 = 0x8B54,
346dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        INT_VEC4 = 0x8B55,
347dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BOOL = 0x8B56,
348dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BOOL_VEC2 = 0x8B57,
349dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BOOL_VEC3 = 0x8B58,
350dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        BOOL_VEC4 = 0x8B59,
351dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FLOAT_MAT2 = 0x8B5A,
352dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FLOAT_MAT3 = 0x8B5B,
353dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FLOAT_MAT4 = 0x8B5C,
354dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SAMPLER_2D = 0x8B5E,
355dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SAMPLER_CUBE = 0x8B60,
356dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622,
357dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        VERTEX_ATTRIB_ARRAY_SIZE = 0x8623,
358dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624,
359dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        VERTEX_ATTRIB_ARRAY_TYPE = 0x8625,
360dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A,
361dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        VERTEX_ATTRIB_ARRAY_POINTER = 0x8645,
362dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F,
363dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        COMPILE_STATUS = 0x8B81,
364dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        INFO_LOG_LENGTH = 0x8B84,
365dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SHADER_SOURCE_LENGTH = 0x8B88,
366dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SHADER_COMPILER = 0x8DFA,
367dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        SHADER_BINARY_FORMATS = 0x8DF8,
368dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        NUM_SHADER_BINARY_FORMATS = 0x8DF9,
369dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        LOW_FLOAT = 0x8DF0,
370dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        MEDIUM_FLOAT = 0x8DF1,
371dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        HIGH_FLOAT = 0x8DF2,
372dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        LOW_INT = 0x8DF3,
373dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        MEDIUM_INT = 0x8DF4,
374dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        HIGH_INT = 0x8DF5,
375dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FRAMEBUFFER = 0x8D40,
376dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RENDERBUFFER = 0x8D41,
377dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RGBA4 = 0x8056,
378dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RGB5_A1 = 0x8057,
379dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RGB565 = 0x8D62,
380dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DEPTH_COMPONENT16 = 0x81A5,
381dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_INDEX = 0x1901,
382dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_INDEX8 = 0x8D48,
383dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DEPTH_STENCIL = 0x84F9,
384dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RENDERBUFFER_WIDTH = 0x8D42,
385dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RENDERBUFFER_HEIGHT = 0x8D43,
386dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RENDERBUFFER_INTERNAL_FORMAT = 0x8D44,
387dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RENDERBUFFER_RED_SIZE = 0x8D50,
388dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RENDERBUFFER_GREEN_SIZE = 0x8D51,
389dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RENDERBUFFER_BLUE_SIZE = 0x8D52,
390dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RENDERBUFFER_ALPHA_SIZE = 0x8D53,
391dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RENDERBUFFER_DEPTH_SIZE = 0x8D54,
392dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RENDERBUFFER_STENCIL_SIZE = 0x8D55,
393dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0,
394dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1,
395dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2,
396dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3,
397dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        COLOR_ATTACHMENT0 = 0x8CE0,
398dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DEPTH_ATTACHMENT = 0x8D00,
399dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        STENCIL_ATTACHMENT = 0x8D20,
400dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        DEPTH_STENCIL_ATTACHMENT = 0x821A,
401dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        NONE = 0,
402dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FRAMEBUFFER_COMPLETE = 0x8CD5,
403dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6,
404dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7,
405dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9,
406dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FRAMEBUFFER_UNSUPPORTED = 0x8CDD,
407dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FRAMEBUFFER_BINDING = 0x8CA6,
408dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        RENDERBUFFER_BINDING = 0x8CA7,
409dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        MAX_RENDERBUFFER_SIZE = 0x84E8,
410dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        INVALID_FRAMEBUFFER_OPERATION = 0x0506,
411dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
412dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        // WebGL-specific enums
413dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        UNPACK_FLIP_Y_WEBGL = 0x9240,
414f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241,
41528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        CONTEXT_LOST_WEBGL = 0x9242,
4166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243,
4176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        BROWSER_DEFAULT_WEBGL = 0x9244
418dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    };
419dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
420dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Context creation attributes.
421dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    struct Attributes {
422dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        Attributes()
423dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            : alpha(true)
424dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            , depth(true)
425dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            , stencil(false)
426dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            , antialias(true)
427dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            , premultipliedAlpha(true)
42828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            , canRecoverFromContextLoss(true)
4292bde8e466a4451c7319e3a072d118917957d6554Steve Block            , preserveDrawingBuffer(false)
430dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        {
431dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        }
432dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
433dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        bool alpha;
434dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        bool depth;
435dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        bool stencil;
436dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        bool antialias;
437dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        bool premultipliedAlpha;
43828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        bool canRecoverFromContextLoss;
4392bde8e466a4451c7319e3a072d118917957d6554Steve Block        bool preserveDrawingBuffer;
440dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    };
441dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
44268513a70bcd92384395513322f1b801e7bf9c729Steve Block    enum RenderStyle {
44368513a70bcd92384395513322f1b801e7bf9c729Steve Block        RenderOffscreen,
44468513a70bcd92384395513322f1b801e7bf9c729Steve Block        RenderDirectlyToHostWindow
44568513a70bcd92384395513322f1b801e7bf9c729Steve Block    };
44668513a70bcd92384395513322f1b801e7bf9c729Steve Block
4472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    class ContextLostCallback {
4482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    public:
4492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        virtual void onContextLost() = 0;
4502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        virtual ~ContextLostCallback() {}
4512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    };
4522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void setContextLostCallback(PassOwnPtr<ContextLostCallback>);
4542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
455a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    static PassRefPtr<GraphicsContext3D> create(Attributes, HostWindow*, RenderStyle = RenderOffscreen);
456a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ~GraphicsContext3D();
457231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
458231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if PLATFORM(MAC)
459dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    PlatformGraphicsContext3D platformGraphicsContext3D() const { return m_contextObj; }
4602bde8e466a4451c7319e3a072d118917957d6554Steve Block    Platform3DObject platformTexture() const { return m_compositorTexture; }
4612bde8e466a4451c7319e3a072d118917957d6554Steve Block    CALayer* platformLayer() const { return reinterpret_cast<CALayer*>(m_webGLLayer.get()); }
462231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#elif PLATFORM(CHROMIUM)
463dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    PlatformGraphicsContext3D platformGraphicsContext3D() const;
464dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    Platform3DObject platformTexture() const;
46506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if USE(ACCELERATED_COMPOSITING)
466dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    PlatformLayer* platformLayer() const;
46706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
468dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#elif PLATFORM(QT)
469dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    PlatformGraphicsContext3D platformGraphicsContext3D();
470dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    Platform3DObject platformTexture() const;
47106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if USE(ACCELERATED_COMPOSITING)
4722bde8e466a4451c7319e3a072d118917957d6554Steve Block    PlatformLayer* platformLayer() const;
47306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
4742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif PLATFORM(GTK)
4752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    PlatformGraphicsContext3D platformGraphicsContext3D();
4762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    Platform3DObject platformTexture() const { return m_texture; }
477231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else
478dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    PlatformGraphicsContext3D platformGraphicsContext3D() const { return NullPlatformGraphicsContext3D; }
479dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    Platform3DObject platformTexture() const { return NullPlatform3DObject; }
48006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if USE(ACCELERATED_COMPOSITING)
481dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    PlatformLayer* platformLayer() const { return 0; }
48206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
483231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
484dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void makeContextCurrent();
485dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
486a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    PassRefPtr<DrawingBuffer> createDrawingBuffer(const IntSize& = IntSize());
487a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
4882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(MAC) || PLATFORM(CHROMIUM) || PLATFORM(GTK)
489dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // With multisampling on, blit from multisampleFBO to regular FBO.
490dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void prepareTexture();
491dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
492dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
493f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Helper to texImage2D with pixel==0 case: pixels are initialized to 0.
494f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Return true if no GL error is synthesized.
49565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // By default, alignment is 4, the OpenGL default setting.
49665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool texImage2DResourceSafe(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, GC3Dint alignment = 4);
497f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
498dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    bool isGLES2Compliant() const;
499dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
500dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    //----------------------------------------------------------------------
501dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Helpers for texture uploading and pixel readback.
502dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    //
503dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
504dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Computes the components per pixel and bytes per component
505dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // for the given format and type combination. Returns false if
506dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // either was an invalid enum.
507cad810f21b803229eb11403f9209855525a25d57Steve Block    bool computeFormatAndTypeParameters(GC3Denum format,
508cad810f21b803229eb11403f9209855525a25d57Steve Block                                        GC3Denum type,
509cad810f21b803229eb11403f9209855525a25d57Steve Block                                        unsigned int* componentsPerPixel,
510cad810f21b803229eb11403f9209855525a25d57Steve Block                                        unsigned int* bytesPerComponent);
511dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
51265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Computes the image size in bytes. If paddingInBytes is not null, padding
51365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // is also calculated in return. Returns NO_ERROR if succeed, otherwise
51465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // return the suggested GL error indicating the cause of the failure:
51565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    //   INVALID_VALUE if width/height is negative or overflow happens.
51665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    //   INVALID_ENUM if format/type is illegal.
51765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    GC3Denum computeImageSizeInBytes(GC3Denum format,
51865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                     GC3Denum type,
51965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                     GC3Dsizei width,
52065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                     GC3Dsizei height,
52165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                     GC3Dint alignment,
52265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                     unsigned int* imageSizeInBytes,
52365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                     unsigned int* paddingInBytes);
52465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
525dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Extracts the contents of the given Image into the passed Vector,
526dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // packing the pixel data according to the given format and type,
5276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // and obeying the flipY, premultiplyAlpha, and ignoreGammaAndColorProfile
5286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // flags. Returns true upon success.
529dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    bool extractImageData(Image* image,
530cad810f21b803229eb11403f9209855525a25d57Steve Block                          GC3Denum format,
531cad810f21b803229eb11403f9209855525a25d57Steve Block                          GC3Denum type,
532dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                          bool flipY,
533dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                          bool premultiplyAlpha,
5346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                          bool ignoreGammaAndColorProfile,
535dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                          Vector<uint8_t>& data);
536dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
537dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Extracts the contents of the given ImageData into the passed Vector,
538dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // packing the pixel data according to the given format and type,
539dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // and obeying the flipY and premultiplyAlpha flags. Returns true
540dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // upon success.
541dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    bool extractImageData(ImageData*,
542cad810f21b803229eb11403f9209855525a25d57Steve Block                          GC3Denum format,
543cad810f21b803229eb11403f9209855525a25d57Steve Block                          GC3Denum type,
544dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                          bool flipY,
545dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                          bool premultiplyAlpha,
546dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                          Vector<uint8_t>& data);
547dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
548dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Helper function which extracts the user-supplied texture
549dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // data, applying the flipY and premultiplyAlpha parameters.
550dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // If the data is not tightly packed according to the passed
551dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // unpackAlignment, the output data will be tightly packed.
552dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Returns true if successful, false if any error occurred.
553dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    bool extractTextureData(unsigned int width, unsigned int height,
554cad810f21b803229eb11403f9209855525a25d57Steve Block                            GC3Denum format, GC3Denum type,
555dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                            unsigned int unpackAlignment,
556dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                            bool flipY, bool premultiplyAlpha,
557e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block                            const void* pixels,
558dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                            Vector<uint8_t>& data);
559dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
560dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Flips the given image data vertically, in-place.
561dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void flipVertically(void* imageData,
562dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                        unsigned int width,
563dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                        unsigned int height,
564dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                        unsigned int bytesPerPixel,
565dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                        unsigned int unpackAlignment);
566dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
567dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Attempt to enumerate all possible native image formats to
568dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // reduce the amount of temporary allocations during texture
569dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // uploading. This enum must be public because it is accessed
570dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // by non-member functions.
571dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    enum SourceDataFormat {
57228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatRGBA8 = 0,
57328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatRGBA16Little,
57428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatRGBA16Big,
575f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        SourceFormatRGBA32F,
57628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatRGB8,
57728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatRGB16Little,
57828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatRGB16Big,
579f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        SourceFormatRGB32F,
58028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatBGR8,
58128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatBGRA8,
58228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatBGRA16Little,
58328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatBGRA16Big,
58428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatARGB8,
58528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatARGB16Little,
58628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatARGB16Big,
58728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatABGR8,
58828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatRGBA5551,
58928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatRGBA4444,
59028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatRGB565,
59128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatR8,
59228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatR16Little,
59328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatR16Big,
594f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        SourceFormatR32F,
59528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatRA8,
59628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatRA16Little,
59728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatRA16Big,
598f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        SourceFormatRA32F,
59928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatAR8,
60028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatAR16Little,
60128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatAR16Big,
60228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatA8,
60328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatA16Little,
60428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatA16Big,
605f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        SourceFormatA32F,
60628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SourceFormatNumFormats
607dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    };
608dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
609dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    //----------------------------------------------------------------------
610dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Entry points for WebGL.
611dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    //
612dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
613cad810f21b803229eb11403f9209855525a25d57Steve Block    void activeTexture(GC3Denum texture);
614dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void attachShader(Platform3DObject program, Platform3DObject shader);
615cad810f21b803229eb11403f9209855525a25d57Steve Block    void bindAttribLocation(Platform3DObject, GC3Duint index, const String& name);
616cad810f21b803229eb11403f9209855525a25d57Steve Block    void bindBuffer(GC3Denum target, Platform3DObject);
617cad810f21b803229eb11403f9209855525a25d57Steve Block    void bindFramebuffer(GC3Denum target, Platform3DObject);
618cad810f21b803229eb11403f9209855525a25d57Steve Block    void bindRenderbuffer(GC3Denum target, Platform3DObject);
619cad810f21b803229eb11403f9209855525a25d57Steve Block    void bindTexture(GC3Denum target, Platform3DObject);
620cad810f21b803229eb11403f9209855525a25d57Steve Block    void blendColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha);
621cad810f21b803229eb11403f9209855525a25d57Steve Block    void blendEquation(GC3Denum mode);
622cad810f21b803229eb11403f9209855525a25d57Steve Block    void blendEquationSeparate(GC3Denum modeRGB, GC3Denum modeAlpha);
623cad810f21b803229eb11403f9209855525a25d57Steve Block    void blendFunc(GC3Denum sfactor, GC3Denum dfactor);
624cad810f21b803229eb11403f9209855525a25d57Steve Block    void blendFuncSeparate(GC3Denum srcRGB, GC3Denum dstRGB, GC3Denum srcAlpha, GC3Denum dstAlpha);
625cad810f21b803229eb11403f9209855525a25d57Steve Block
626cad810f21b803229eb11403f9209855525a25d57Steve Block    void bufferData(GC3Denum target, GC3Dsizeiptr size, GC3Denum usage);
627cad810f21b803229eb11403f9209855525a25d57Steve Block    void bufferData(GC3Denum target, GC3Dsizeiptr size, const void* data, GC3Denum usage);
628cad810f21b803229eb11403f9209855525a25d57Steve Block    void bufferSubData(GC3Denum target, GC3Dintptr offset, GC3Dsizeiptr size, const void* data);
629cad810f21b803229eb11403f9209855525a25d57Steve Block
630cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Denum checkFramebufferStatus(GC3Denum target);
631cad810f21b803229eb11403f9209855525a25d57Steve Block    void clear(GC3Dbitfield mask);
632cad810f21b803229eb11403f9209855525a25d57Steve Block    void clearColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha);
633cad810f21b803229eb11403f9209855525a25d57Steve Block    void clearDepth(GC3Dclampf depth);
634cad810f21b803229eb11403f9209855525a25d57Steve Block    void clearStencil(GC3Dint s);
635cad810f21b803229eb11403f9209855525a25d57Steve Block    void colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboolean alpha);
636dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void compileShader(Platform3DObject);
637dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
638cad810f21b803229eb11403f9209855525a25d57Steve Block    // void compressedTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Dsizei imageSize, const void* data);
639cad810f21b803229eb11403f9209855525a25d57Steve Block    // void compressedTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Dsizei imageSize, const void* data);
640dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
641cad810f21b803229eb11403f9209855525a25d57Steve Block    void copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border);
642cad810f21b803229eb11403f9209855525a25d57Steve Block    void copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
643cad810f21b803229eb11403f9209855525a25d57Steve Block    void cullFace(GC3Denum mode);
644cad810f21b803229eb11403f9209855525a25d57Steve Block    void depthFunc(GC3Denum func);
645cad810f21b803229eb11403f9209855525a25d57Steve Block    void depthMask(GC3Dboolean flag);
646cad810f21b803229eb11403f9209855525a25d57Steve Block    void depthRange(GC3Dclampf zNear, GC3Dclampf zFar);
647dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void detachShader(Platform3DObject, Platform3DObject);
648cad810f21b803229eb11403f9209855525a25d57Steve Block    void disable(GC3Denum cap);
649cad810f21b803229eb11403f9209855525a25d57Steve Block    void disableVertexAttribArray(GC3Duint index);
650cad810f21b803229eb11403f9209855525a25d57Steve Block    void drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count);
651cad810f21b803229eb11403f9209855525a25d57Steve Block    void drawElements(GC3Denum mode, GC3Dsizei count, GC3Denum type, GC3Dintptr offset);
652231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
653cad810f21b803229eb11403f9209855525a25d57Steve Block    void enable(GC3Denum cap);
654cad810f21b803229eb11403f9209855525a25d57Steve Block    void enableVertexAttribArray(GC3Duint index);
655dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void finish();
656dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void flush();
657cad810f21b803229eb11403f9209855525a25d57Steve Block    void framebufferRenderbuffer(GC3Denum target, GC3Denum attachment, GC3Denum renderbuffertarget, Platform3DObject);
658cad810f21b803229eb11403f9209855525a25d57Steve Block    void framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, Platform3DObject, GC3Dint level);
659cad810f21b803229eb11403f9209855525a25d57Steve Block    void frontFace(GC3Denum mode);
660cad810f21b803229eb11403f9209855525a25d57Steve Block    void generateMipmap(GC3Denum target);
661cad810f21b803229eb11403f9209855525a25d57Steve Block
662cad810f21b803229eb11403f9209855525a25d57Steve Block    bool getActiveAttrib(Platform3DObject program, GC3Duint index, ActiveInfo&);
663cad810f21b803229eb11403f9209855525a25d57Steve Block    bool getActiveUniform(Platform3DObject program, GC3Duint index, ActiveInfo&);
664cad810f21b803229eb11403f9209855525a25d57Steve Block    void getAttachedShaders(Platform3DObject program, GC3Dsizei maxCount, GC3Dsizei* count, Platform3DObject* shaders);
665cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Dint getAttribLocation(Platform3DObject, const String& name);
666cad810f21b803229eb11403f9209855525a25d57Steve Block    void getBooleanv(GC3Denum pname, GC3Dboolean* value);
667cad810f21b803229eb11403f9209855525a25d57Steve Block    void getBufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
668dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    Attributes getContextAttributes();
669cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Denum getError();
670cad810f21b803229eb11403f9209855525a25d57Steve Block    void getFloatv(GC3Denum pname, GC3Dfloat* value);
671cad810f21b803229eb11403f9209855525a25d57Steve Block    void getFramebufferAttachmentParameteriv(GC3Denum target, GC3Denum attachment, GC3Denum pname, GC3Dint* value);
672cad810f21b803229eb11403f9209855525a25d57Steve Block    void getIntegerv(GC3Denum pname, GC3Dint* value);
673cad810f21b803229eb11403f9209855525a25d57Steve Block    void getProgramiv(Platform3DObject program, GC3Denum pname, GC3Dint* value);
674dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    String getProgramInfoLog(Platform3DObject);
675cad810f21b803229eb11403f9209855525a25d57Steve Block    void getRenderbufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
676cad810f21b803229eb11403f9209855525a25d57Steve Block    void getShaderiv(Platform3DObject, GC3Denum pname, GC3Dint* value);
677dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    String getShaderInfoLog(Platform3DObject);
678dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
679dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // TBD
680cad810f21b803229eb11403f9209855525a25d57Steve Block    // void glGetShaderPrecisionFormat (GC3Denum shadertype, GC3Denum precisiontype, GC3Dint* range, GC3Dint* precision);
681dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
682dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    String getShaderSource(Platform3DObject);
683cad810f21b803229eb11403f9209855525a25d57Steve Block    String getString(GC3Denum name);
684cad810f21b803229eb11403f9209855525a25d57Steve Block    void getTexParameterfv(GC3Denum target, GC3Denum pname, GC3Dfloat* value);
685cad810f21b803229eb11403f9209855525a25d57Steve Block    void getTexParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
686cad810f21b803229eb11403f9209855525a25d57Steve Block    void getUniformfv(Platform3DObject program, GC3Dint location, GC3Dfloat* value);
687cad810f21b803229eb11403f9209855525a25d57Steve Block    void getUniformiv(Platform3DObject program, GC3Dint location, GC3Dint* value);
688cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Dint getUniformLocation(Platform3DObject, const String& name);
689cad810f21b803229eb11403f9209855525a25d57Steve Block    void getVertexAttribfv(GC3Duint index, GC3Denum pname, GC3Dfloat* value);
690cad810f21b803229eb11403f9209855525a25d57Steve Block    void getVertexAttribiv(GC3Duint index, GC3Denum pname, GC3Dint* value);
691cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Dsizeiptr getVertexAttribOffset(GC3Duint index, GC3Denum pname);
692cad810f21b803229eb11403f9209855525a25d57Steve Block
693cad810f21b803229eb11403f9209855525a25d57Steve Block    void hint(GC3Denum target, GC3Denum mode);
694cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Dboolean isBuffer(Platform3DObject);
695cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Dboolean isEnabled(GC3Denum cap);
696cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Dboolean isFramebuffer(Platform3DObject);
697cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Dboolean isProgram(Platform3DObject);
698cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Dboolean isRenderbuffer(Platform3DObject);
699cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Dboolean isShader(Platform3DObject);
700cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Dboolean isTexture(Platform3DObject);
701cad810f21b803229eb11403f9209855525a25d57Steve Block    void lineWidth(GC3Dfloat);
702dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void linkProgram(Platform3DObject);
703cad810f21b803229eb11403f9209855525a25d57Steve Block    void pixelStorei(GC3Denum pname, GC3Dint param);
704cad810f21b803229eb11403f9209855525a25d57Steve Block    void polygonOffset(GC3Dfloat factor, GC3Dfloat units);
705dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
706cad810f21b803229eb11403f9209855525a25d57Steve Block    void readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data);
707dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
708dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void releaseShaderCompiler();
709cad810f21b803229eb11403f9209855525a25d57Steve Block
710cad810f21b803229eb11403f9209855525a25d57Steve Block    void renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height);
711cad810f21b803229eb11403f9209855525a25d57Steve Block    void sampleCoverage(GC3Dclampf value, GC3Dboolean invert);
712cad810f21b803229eb11403f9209855525a25d57Steve Block    void scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
713dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void shaderSource(Platform3DObject, const String& string);
714cad810f21b803229eb11403f9209855525a25d57Steve Block    void stencilFunc(GC3Denum func, GC3Dint ref, GC3Duint mask);
715cad810f21b803229eb11403f9209855525a25d57Steve Block    void stencilFuncSeparate(GC3Denum face, GC3Denum func, GC3Dint ref, GC3Duint mask);
716cad810f21b803229eb11403f9209855525a25d57Steve Block    void stencilMask(GC3Duint mask);
717cad810f21b803229eb11403f9209855525a25d57Steve Block    void stencilMaskSeparate(GC3Denum face, GC3Duint mask);
718cad810f21b803229eb11403f9209855525a25d57Steve Block    void stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zpass);
719cad810f21b803229eb11403f9209855525a25d57Steve Block    void stencilOpSeparate(GC3Denum face, GC3Denum fail, GC3Denum zfail, GC3Denum zpass);
720cad810f21b803229eb11403f9209855525a25d57Steve Block
721cad810f21b803229eb11403f9209855525a25d57Steve Block    bool texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels);
722cad810f21b803229eb11403f9209855525a25d57Steve Block    void texParameterf(GC3Denum target, GC3Denum pname, GC3Dfloat param);
723cad810f21b803229eb11403f9209855525a25d57Steve Block    void texParameteri(GC3Denum target, GC3Denum pname, GC3Dint param);
724cad810f21b803229eb11403f9209855525a25d57Steve Block    void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels);
725cad810f21b803229eb11403f9209855525a25d57Steve Block
726cad810f21b803229eb11403f9209855525a25d57Steve Block    // FIXME: change the argument orders to match OpenGL's.
727cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniform1f(GC3Dint location, GC3Dfloat x);
728cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniform1fv(GC3Dint location, GC3Dfloat* v, GC3Dsizei size);
729cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniform1i(GC3Dint location, GC3Dint x);
730cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniform1iv(GC3Dint location, GC3Dint* v, GC3Dsizei size);
731cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniform2f(GC3Dint location, GC3Dfloat x, float y);
732cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniform2fv(GC3Dint location, GC3Dfloat* v, GC3Dsizei size);
733cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniform2i(GC3Dint location, GC3Dint x, GC3Dint y);
734cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniform2iv(GC3Dint location, GC3Dint* v, GC3Dsizei size);
735cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniform3f(GC3Dint location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z);
736cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniform3fv(GC3Dint location, GC3Dfloat* v, GC3Dsizei size);
737cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniform3i(GC3Dint location, GC3Dint x, GC3Dint y, GC3Dint z);
738cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniform3iv(GC3Dint location, GC3Dint* v, GC3Dsizei size);
739cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniform4f(GC3Dint location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w);
740cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniform4fv(GC3Dint location, GC3Dfloat* v, GC3Dsizei size);
741cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniform4i(GC3Dint location, GC3Dint x, GC3Dint y, GC3Dint z, GC3Dint w);
742cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniform4iv(GC3Dint location, GC3Dint* v, GC3Dsizei size);
743cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniformMatrix2fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size);
744cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniformMatrix3fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size);
745cad810f21b803229eb11403f9209855525a25d57Steve Block    void uniformMatrix4fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size);
746dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
747dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void useProgram(Platform3DObject);
748dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void validateProgram(Platform3DObject);
749dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
750cad810f21b803229eb11403f9209855525a25d57Steve Block    void vertexAttrib1f(GC3Duint index, GC3Dfloat x);
751cad810f21b803229eb11403f9209855525a25d57Steve Block    void vertexAttrib1fv(GC3Duint index, GC3Dfloat* values);
752cad810f21b803229eb11403f9209855525a25d57Steve Block    void vertexAttrib2f(GC3Duint index, GC3Dfloat x, GC3Dfloat y);
753cad810f21b803229eb11403f9209855525a25d57Steve Block    void vertexAttrib2fv(GC3Duint index, GC3Dfloat* values);
754cad810f21b803229eb11403f9209855525a25d57Steve Block    void vertexAttrib3f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z);
755cad810f21b803229eb11403f9209855525a25d57Steve Block    void vertexAttrib3fv(GC3Duint index, GC3Dfloat* values);
756cad810f21b803229eb11403f9209855525a25d57Steve Block    void vertexAttrib4f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w);
757cad810f21b803229eb11403f9209855525a25d57Steve Block    void vertexAttrib4fv(GC3Duint index, GC3Dfloat* values);
758cad810f21b803229eb11403f9209855525a25d57Steve Block    void vertexAttribPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dboolean normalized,
759cad810f21b803229eb11403f9209855525a25d57Steve Block                             GC3Dsizei stride, GC3Dintptr offset);
760dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
761cad810f21b803229eb11403f9209855525a25d57Steve Block    void viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
762dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
763dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void reshape(int width, int height);
764967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
7652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CG)
766dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void paintToCanvas(const unsigned char* imagePixels, int imageWidth, int imageHeight,
767dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                       int canvasWidth, int canvasHeight, CGContextRef context);
7682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif PLATFORM(GTK)
7692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void paintToCanvas(const unsigned char* imagePixels, int imageWidth, int imageHeight,
7702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                       int canvasWidth, int canvasHeight, PlatformContextCairo* context);
771967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif
772967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
7732bde8e466a4451c7319e3a072d118917957d6554Steve Block    void markContextChanged();
7742bde8e466a4451c7319e3a072d118917957d6554Steve Block    void markLayerComposited();
7752bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool layerComposited() const;
7762bde8e466a4451c7319e3a072d118917957d6554Steve Block
777dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void paintRenderingResultsToCanvas(CanvasRenderingContext* context);
7782bde8e466a4451c7319e3a072d118917957d6554Steve Block    PassRefPtr<ImageData> paintRenderingResultsToImageData();
779967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
78021939df44de1705786c545cd1bf519d47250322dBen Murdoch#if PLATFORM(QT)
781f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    bool paintsIntoCanvasBuffer() const { return true; }
782f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#elif PLATFORM(CHROMIUM)
783f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    bool paintsIntoCanvasBuffer() const;
7842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif PLATFORM(GTK)
7852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool paintsIntoCanvasBuffer() const { return true; }
786f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#else
787f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    bool paintsIntoCanvasBuffer() const { return false; }
78821939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif
789231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
790dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Support for buffer creation and deletion
791cad810f21b803229eb11403f9209855525a25d57Steve Block    Platform3DObject createBuffer();
792cad810f21b803229eb11403f9209855525a25d57Steve Block    Platform3DObject createFramebuffer();
793cad810f21b803229eb11403f9209855525a25d57Steve Block    Platform3DObject createProgram();
794cad810f21b803229eb11403f9209855525a25d57Steve Block    Platform3DObject createRenderbuffer();
795cad810f21b803229eb11403f9209855525a25d57Steve Block    Platform3DObject createShader(GC3Denum);
796cad810f21b803229eb11403f9209855525a25d57Steve Block    Platform3DObject createTexture();
797cad810f21b803229eb11403f9209855525a25d57Steve Block
798cad810f21b803229eb11403f9209855525a25d57Steve Block    void deleteBuffer(Platform3DObject);
799cad810f21b803229eb11403f9209855525a25d57Steve Block    void deleteFramebuffer(Platform3DObject);
800cad810f21b803229eb11403f9209855525a25d57Steve Block    void deleteProgram(Platform3DObject);
801cad810f21b803229eb11403f9209855525a25d57Steve Block    void deleteRenderbuffer(Platform3DObject);
802cad810f21b803229eb11403f9209855525a25d57Steve Block    void deleteShader(Platform3DObject);
803cad810f21b803229eb11403f9209855525a25d57Steve Block    void deleteTexture(Platform3DObject);
804dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
805dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Synthesizes an OpenGL error which will be returned from a
806dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // later call to getError. This is used to emulate OpenGL ES
807dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // 2.0 behavior on the desktop and to enforce additional error
808dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // checking mandated by WebGL.
809dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    //
810dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Per the behavior of glGetError, this stores at most one
811dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // instance of any given error, and returns them from calls to
812dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // getError in the order they were added.
813cad810f21b803229eb11403f9209855525a25d57Steve Block    void synthesizeGLError(GC3Denum error);
814dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
81528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // Support for extensions. Returns a non-null object, though not
81628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // all methods it contains may necessarily be supported on the
81728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // current hardware. Must call Extensions3D::supports() to
81828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // determine this.
81928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    Extensions3D* getExtensions();
820a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
821cad810f21b803229eb11403f9209855525a25d57Steve Block    IntSize getInternalFramebufferSize();
822cad810f21b803229eb11403f9209855525a25d57Steve Block
823dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch  private:
82468513a70bcd92384395513322f1b801e7bf9c729Steve Block    GraphicsContext3D(Attributes attrs, HostWindow* hostWindow, bool renderDirectlyToHostWindow);
825dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
826dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Each platform must provide an implementation of this method.
827dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    //
828dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Gets the data for the given Image into outputVector in the
829dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // format specified by the (OpenGL-style) format and type
830dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // arguments. Despite the fact that the outputVector contains
831dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // uint8_t, if the format and type specify packed pixels, then
832dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // it will essentially contain uint16_t after the extraction
833dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // process.
834dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    //
835dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // If premultiplyAlpha is true, the alpha channel, if any,
836dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // will be multiplied into the color channels during the
837dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // extraction process. This premultiplication occurs before
838dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // any packing of pixel data.
839dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    //
8406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // If ignoreGammaAndColorProfile is true, gamma correction and ICC
8416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // profile won't be applied.
8426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    //
843dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // No vertical flip of the image data is performed by this
844dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // method.
845dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    bool getImageData(Image* image,
846cad810f21b803229eb11403f9209855525a25d57Steve Block                      GC3Denum format,
847cad810f21b803229eb11403f9209855525a25d57Steve Block                      GC3Denum type,
848dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                      bool premultiplyAlpha,
8496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                      bool ignoreGammaAndColorProfile,
850dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                      Vector<uint8_t>& outputVector);
851dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
852dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Possible alpha operations that may need to occur during
853dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // pixel packing. FIXME: kAlphaDoUnmultiply is lossy and must
854dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // be removed.
855dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    enum AlphaOp {
85628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        AlphaDoNothing = 0,
85728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        AlphaDoPremultiply = 1,
85828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        AlphaDoUnmultiply = 2
859dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    };
860dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
861dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Helper for getImageData which implements packing of pixel
862dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // data into the specified OpenGL destination format and type.
863dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // A sourceUnpackAlignment of zero indicates that the source
864dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // data is tightly packed. Non-zero values may take a slow path.
865dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Destination data will have no gaps between rows.
866dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    bool packPixels(const uint8_t* sourceData,
867dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                    SourceDataFormat sourceDataFormat,
868dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                    unsigned int width,
869dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                    unsigned int height,
870dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                    unsigned int sourceUnpackAlignment,
871dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                    unsigned int destinationFormat,
872dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                    unsigned int destinationType,
873dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                    AlphaOp alphaOp,
874dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                    void* destinationData);
875692e5dbf12901edacf14812a6fae25462920af42Steve Block
8762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(MAC) || PLATFORM(GTK)
877dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Take into account the user's requested context creation attributes,
878dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // in particular stencil and antialias, and determine which could or
879dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // could not be honored based on the capabilities of the OpenGL
880dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // implementation.
881dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void validateAttributes();
8822bde8e466a4451c7319e3a072d118917957d6554Steve Block
8832bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Read rendering results into a pixel array with the same format as the
8842bde8e466a4451c7319e3a072d118917957d6554Steve Block    // backbuffer.
8852bde8e466a4451c7319e3a072d118917957d6554Steve Block    void readRenderingResults(unsigned char* pixels, int pixelsSize);
886dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
887dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
888dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    int m_currentWidth, m_currentHeight;
889dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
890bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if PLATFORM(MAC)
8912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CGLContextObj m_contextObj;
8922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RetainPtr<WebGLLayer> m_webGLLayer;
8932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
8942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(MAC) || PLATFORM(GTK)
896bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    typedef struct {
897bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        String source;
898bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        String log;
899f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        bool isValid;
900f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    } ShaderSourceEntry;
901f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    HashMap<Platform3DObject, ShaderSourceEntry> m_shaderSourceMap;
902f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
903ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    friend class Extensions3DOpenGL;
904f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    ANGLEWebKitBridge m_compiler;
905f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
90628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    OwnPtr<Extensions3DOpenGL> m_extensions;
90728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
908dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    Attributes m_attrs;
909dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    Vector<Vector<float> > m_vertexArray;
910dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
9112bde8e466a4451c7319e3a072d118917957d6554Steve Block    GC3Duint m_texture, m_compositorTexture;
912cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Duint m_fbo;
913cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Duint m_depthStencilBuffer;
9142bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_layerComposited;
9152bde8e466a4451c7319e3a072d118917957d6554Steve Block    GC3Duint m_internalColorFormat;
916dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
9172bde8e466a4451c7319e3a072d118917957d6554Steve Block    // For tracking which FBO/texture is bound
918cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Duint m_boundFBO;
9192bde8e466a4451c7319e3a072d118917957d6554Steve Block    GC3Denum m_activeTexture;
9202bde8e466a4451c7319e3a072d118917957d6554Steve Block    GC3Duint m_boundTexture0;
921dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
922dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // For multisampling
923cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Duint m_multisampleFBO;
924cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Duint m_multisampleDepthStencilBuffer;
925cad810f21b803229eb11403f9209855525a25d57Steve Block    GC3Duint m_multisampleColorBuffer;
926dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
927dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Errors raised by synthesizeGLError().
928cad810f21b803229eb11403f9209855525a25d57Steve Block    ListHashSet<GC3Denum> m_syntheticErrors;
929dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#endif
930dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
931dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // FIXME: ideally this would be used on all platforms.
9322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(CHROMIUM) || PLATFORM(QT) || PLATFORM(GTK)
933dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    friend class GraphicsContext3DInternal;
934dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    OwnPtr<GraphicsContext3DInternal> m_internal;
935231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
936dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch};
937231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
938231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} // namespace WebCore
939231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
940231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif // GraphicsContext3D_h
941