Unreviewed, rolling out r126694 and r126731.
[WebKit-https.git] / Source / WebCore / platform / graphics / GraphicsContext3D.h
1 /*
2  * Copyright (C) 2009 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef GraphicsContext3D_h
27 #define GraphicsContext3D_h
28
29 #include "IntRect.h"
30 #include "GraphicsLayer.h"
31 #include "GraphicsTypes3D.h"
32 #include "PlatformString.h"
33 #include <wtf/HashMap.h>
34 #include <wtf/ListHashSet.h>
35 #include <wtf/Noncopyable.h>
36 #include <wtf/RefCounted.h>
37
38 // FIXME: Find a better way to avoid the name confliction for NO_ERROR.
39 #if ((PLATFORM(CHROMIUM) && OS(WINDOWS)) || PLATFORM(WIN) || (PLATFORM(QT) && OS(WINDOWS)))
40 #undef NO_ERROR
41 #elif PLATFORM(GTK)
42 // This define is from the X11 headers, but it's used below, so we must undefine it.
43 #undef VERSION
44 #endif
45
46 #if PLATFORM(MAC) || PLATFORM(GTK) || PLATFORM(QT) || PLATFORM(EFL) || PLATFORM(BLACKBERRY)
47 #include "ANGLEWebKitBridge.h"
48 #endif
49
50 #if PLATFORM(MAC)
51 #include <OpenGL/OpenGL.h>
52 #include <wtf/RetainPtr.h>
53 OBJC_CLASS CALayer;
54 OBJC_CLASS WebGLLayer;
55 #elif PLATFORM(QT)
56 QT_BEGIN_NAMESPACE
57 class QPainter;
58 class QRect;
59 class QGLWidget;
60 class QGLContext;
61 class QOpenGLContext;
62 class QSurface;
63 QT_END_NAMESPACE
64 #elif PLATFORM(GTK) || PLATFORM(EFL)
65 typedef unsigned int GLuint;
66 #endif
67
68 #if PLATFORM(MAC)
69 typedef CGLContextObj PlatformGraphicsContext3D;
70 #elif PLATFORM(QT)
71 typedef QOpenGLContext* PlatformGraphicsContext3D;
72 typedef QSurface* PlatformGraphicsSurface3D;
73 #else
74 typedef void* PlatformGraphicsContext3D;
75 #endif
76
77 #if (PLATFORM(CHROMIUM) || PLATFORM(BLACKBERRY)) && USE(SKIA)
78 class GrContext;
79 #endif
80
81 // These are currently the same among all implementations.
82 const PlatformGraphicsContext3D NullPlatformGraphicsContext3D = 0;
83 const Platform3DObject NullPlatform3DObject = 0;
84
85 #if USE(CG)
86 #include <CoreGraphics/CGContext.h>
87 #endif
88
89 namespace WebCore {
90 class DrawingBuffer;
91 class Extensions3D;
92 #if USE(OPENGL_ES_2)
93 class Extensions3DOpenGLES;
94 #else
95 class Extensions3DOpenGL;
96 #endif
97 #if PLATFORM(QT)
98 class Extensions3DQt;
99 #endif
100 class HostWindow;
101 class Image;
102 class ImageBuffer;
103 class ImageData;
104 class IntRect;
105 class IntSize;
106 #if USE(CAIRO)
107 class PlatformContextCairo;
108 #elif PLATFORM(BLACKBERRY)
109 class GraphicsContext;
110 #endif
111
112 struct ActiveInfo {
113     String name;
114     GC3Denum type;
115     GC3Dint size;
116 };
117
118 class GraphicsContext3DPrivate;
119
120 class GraphicsContext3D : public RefCounted<GraphicsContext3D> {
121 public:
122     enum {
123         DEPTH_BUFFER_BIT = 0x00000100,
124         STENCIL_BUFFER_BIT = 0x00000400,
125         COLOR_BUFFER_BIT = 0x00004000,
126         POINTS = 0x0000,
127         LINES = 0x0001,
128         LINE_LOOP = 0x0002,
129         LINE_STRIP = 0x0003,
130         TRIANGLES = 0x0004,
131         TRIANGLE_STRIP = 0x0005,
132         TRIANGLE_FAN = 0x0006,
133         ZERO = 0,
134         ONE = 1,
135         SRC_COLOR = 0x0300,
136         ONE_MINUS_SRC_COLOR = 0x0301,
137         SRC_ALPHA = 0x0302,
138         ONE_MINUS_SRC_ALPHA = 0x0303,
139         DST_ALPHA = 0x0304,
140         ONE_MINUS_DST_ALPHA = 0x0305,
141         DST_COLOR = 0x0306,
142         ONE_MINUS_DST_COLOR = 0x0307,
143         SRC_ALPHA_SATURATE = 0x0308,
144         FUNC_ADD = 0x8006,
145         BLEND_EQUATION = 0x8009,
146         BLEND_EQUATION_RGB = 0x8009,
147         BLEND_EQUATION_ALPHA = 0x883D,
148         FUNC_SUBTRACT = 0x800A,
149         FUNC_REVERSE_SUBTRACT = 0x800B,
150         BLEND_DST_RGB = 0x80C8,
151         BLEND_SRC_RGB = 0x80C9,
152         BLEND_DST_ALPHA = 0x80CA,
153         BLEND_SRC_ALPHA = 0x80CB,
154         CONSTANT_COLOR = 0x8001,
155         ONE_MINUS_CONSTANT_COLOR = 0x8002,
156         CONSTANT_ALPHA = 0x8003,
157         ONE_MINUS_CONSTANT_ALPHA = 0x8004,
158         BLEND_COLOR = 0x8005,
159         ARRAY_BUFFER = 0x8892,
160         ELEMENT_ARRAY_BUFFER = 0x8893,
161         ARRAY_BUFFER_BINDING = 0x8894,
162         ELEMENT_ARRAY_BUFFER_BINDING = 0x8895,
163         STREAM_DRAW = 0x88E0,
164         STATIC_DRAW = 0x88E4,
165         DYNAMIC_DRAW = 0x88E8,
166         BUFFER_SIZE = 0x8764,
167         BUFFER_USAGE = 0x8765,
168         CURRENT_VERTEX_ATTRIB = 0x8626,
169         FRONT = 0x0404,
170         BACK = 0x0405,
171         FRONT_AND_BACK = 0x0408,
172         TEXTURE_2D = 0x0DE1,
173         CULL_FACE = 0x0B44,
174         BLEND = 0x0BE2,
175         DITHER = 0x0BD0,
176         STENCIL_TEST = 0x0B90,
177         DEPTH_TEST = 0x0B71,
178         SCISSOR_TEST = 0x0C11,
179         POLYGON_OFFSET_FILL = 0x8037,
180         SAMPLE_ALPHA_TO_COVERAGE = 0x809E,
181         SAMPLE_COVERAGE = 0x80A0,
182         NO_ERROR = 0,
183         INVALID_ENUM = 0x0500,
184         INVALID_VALUE = 0x0501,
185         INVALID_OPERATION = 0x0502,
186         OUT_OF_MEMORY = 0x0505,
187         CW = 0x0900,
188         CCW = 0x0901,
189         LINE_WIDTH = 0x0B21,
190         ALIASED_POINT_SIZE_RANGE = 0x846D,
191         ALIASED_LINE_WIDTH_RANGE = 0x846E,
192         CULL_FACE_MODE = 0x0B45,
193         FRONT_FACE = 0x0B46,
194         DEPTH_RANGE = 0x0B70,
195         DEPTH_WRITEMASK = 0x0B72,
196         DEPTH_CLEAR_VALUE = 0x0B73,
197         DEPTH_FUNC = 0x0B74,
198         STENCIL_CLEAR_VALUE = 0x0B91,
199         STENCIL_FUNC = 0x0B92,
200         STENCIL_FAIL = 0x0B94,
201         STENCIL_PASS_DEPTH_FAIL = 0x0B95,
202         STENCIL_PASS_DEPTH_PASS = 0x0B96,
203         STENCIL_REF = 0x0B97,
204         STENCIL_VALUE_MASK = 0x0B93,
205         STENCIL_WRITEMASK = 0x0B98,
206         STENCIL_BACK_FUNC = 0x8800,
207         STENCIL_BACK_FAIL = 0x8801,
208         STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802,
209         STENCIL_BACK_PASS_DEPTH_PASS = 0x8803,
210         STENCIL_BACK_REF = 0x8CA3,
211         STENCIL_BACK_VALUE_MASK = 0x8CA4,
212         STENCIL_BACK_WRITEMASK = 0x8CA5,
213         VIEWPORT = 0x0BA2,
214         SCISSOR_BOX = 0x0C10,
215         COLOR_CLEAR_VALUE = 0x0C22,
216         COLOR_WRITEMASK = 0x0C23,
217         UNPACK_ALIGNMENT = 0x0CF5,
218         PACK_ALIGNMENT = 0x0D05,
219         MAX_TEXTURE_SIZE = 0x0D33,
220         MAX_VIEWPORT_DIMS = 0x0D3A,
221         SUBPIXEL_BITS = 0x0D50,
222         RED_BITS = 0x0D52,
223         GREEN_BITS = 0x0D53,
224         BLUE_BITS = 0x0D54,
225         ALPHA_BITS = 0x0D55,
226         DEPTH_BITS = 0x0D56,
227         STENCIL_BITS = 0x0D57,
228         POLYGON_OFFSET_UNITS = 0x2A00,
229         POLYGON_OFFSET_FACTOR = 0x8038,
230         TEXTURE_BINDING_2D = 0x8069,
231         SAMPLE_BUFFERS = 0x80A8,
232         SAMPLES = 0x80A9,
233         SAMPLE_COVERAGE_VALUE = 0x80AA,
234         SAMPLE_COVERAGE_INVERT = 0x80AB,
235         NUM_COMPRESSED_TEXTURE_FORMATS = 0x86A2,
236         COMPRESSED_TEXTURE_FORMATS = 0x86A3,
237         DONT_CARE = 0x1100,
238         FASTEST = 0x1101,
239         NICEST = 0x1102,
240         GENERATE_MIPMAP_HINT = 0x8192,
241         BYTE = 0x1400,
242         UNSIGNED_BYTE = 0x1401,
243         SHORT = 0x1402,
244         UNSIGNED_SHORT = 0x1403,
245         INT = 0x1404,
246         UNSIGNED_INT = 0x1405,
247         FLOAT = 0x1406,
248         FIXED = 0x140C,
249         DEPTH_COMPONENT = 0x1902,
250         ALPHA = 0x1906,
251         RGB = 0x1907,
252         RGBA = 0x1908,
253         LUMINANCE = 0x1909,
254         LUMINANCE_ALPHA = 0x190A,
255         UNSIGNED_SHORT_4_4_4_4 = 0x8033,
256         UNSIGNED_SHORT_5_5_5_1 = 0x8034,
257         UNSIGNED_SHORT_5_6_5 = 0x8363,
258         FRAGMENT_SHADER = 0x8B30,
259         VERTEX_SHADER = 0x8B31,
260         MAX_VERTEX_ATTRIBS = 0x8869,
261         MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB,
262         MAX_VARYING_VECTORS = 0x8DFC,
263         MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D,
264         MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C,
265         MAX_TEXTURE_IMAGE_UNITS = 0x8872,
266         MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD,
267         SHADER_TYPE = 0x8B4F,
268         DELETE_STATUS = 0x8B80,
269         LINK_STATUS = 0x8B82,
270         VALIDATE_STATUS = 0x8B83,
271         ATTACHED_SHADERS = 0x8B85,
272         ACTIVE_UNIFORMS = 0x8B86,
273         ACTIVE_UNIFORM_MAX_LENGTH = 0x8B87,
274         ACTIVE_ATTRIBUTES = 0x8B89,
275         ACTIVE_ATTRIBUTE_MAX_LENGTH = 0x8B8A,
276         SHADING_LANGUAGE_VERSION = 0x8B8C,
277         CURRENT_PROGRAM = 0x8B8D,
278         NEVER = 0x0200,
279         LESS = 0x0201,
280         EQUAL = 0x0202,
281         LEQUAL = 0x0203,
282         GREATER = 0x0204,
283         NOTEQUAL = 0x0205,
284         GEQUAL = 0x0206,
285         ALWAYS = 0x0207,
286         KEEP = 0x1E00,
287         REPLACE = 0x1E01,
288         INCR = 0x1E02,
289         DECR = 0x1E03,
290         INVERT = 0x150A,
291         INCR_WRAP = 0x8507,
292         DECR_WRAP = 0x8508,
293         VENDOR = 0x1F00,
294         RENDERER = 0x1F01,
295         VERSION = 0x1F02,
296         EXTENSIONS = 0x1F03,
297         NEAREST = 0x2600,
298         LINEAR = 0x2601,
299         NEAREST_MIPMAP_NEAREST = 0x2700,
300         LINEAR_MIPMAP_NEAREST = 0x2701,
301         NEAREST_MIPMAP_LINEAR = 0x2702,
302         LINEAR_MIPMAP_LINEAR = 0x2703,
303         TEXTURE_MAG_FILTER = 0x2800,
304         TEXTURE_MIN_FILTER = 0x2801,
305         TEXTURE_WRAP_S = 0x2802,
306         TEXTURE_WRAP_T = 0x2803,
307         TEXTURE = 0x1702,
308         TEXTURE_CUBE_MAP = 0x8513,
309         TEXTURE_BINDING_CUBE_MAP = 0x8514,
310         TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515,
311         TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516,
312         TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517,
313         TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518,
314         TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519,
315         TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A,
316         MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C,
317         TEXTURE0 = 0x84C0,
318         TEXTURE1 = 0x84C1,
319         TEXTURE2 = 0x84C2,
320         TEXTURE3 = 0x84C3,
321         TEXTURE4 = 0x84C4,
322         TEXTURE5 = 0x84C5,
323         TEXTURE6 = 0x84C6,
324         TEXTURE7 = 0x84C7,
325         TEXTURE8 = 0x84C8,
326         TEXTURE9 = 0x84C9,
327         TEXTURE10 = 0x84CA,
328         TEXTURE11 = 0x84CB,
329         TEXTURE12 = 0x84CC,
330         TEXTURE13 = 0x84CD,
331         TEXTURE14 = 0x84CE,
332         TEXTURE15 = 0x84CF,
333         TEXTURE16 = 0x84D0,
334         TEXTURE17 = 0x84D1,
335         TEXTURE18 = 0x84D2,
336         TEXTURE19 = 0x84D3,
337         TEXTURE20 = 0x84D4,
338         TEXTURE21 = 0x84D5,
339         TEXTURE22 = 0x84D6,
340         TEXTURE23 = 0x84D7,
341         TEXTURE24 = 0x84D8,
342         TEXTURE25 = 0x84D9,
343         TEXTURE26 = 0x84DA,
344         TEXTURE27 = 0x84DB,
345         TEXTURE28 = 0x84DC,
346         TEXTURE29 = 0x84DD,
347         TEXTURE30 = 0x84DE,
348         TEXTURE31 = 0x84DF,
349         ACTIVE_TEXTURE = 0x84E0,
350         REPEAT = 0x2901,
351         CLAMP_TO_EDGE = 0x812F,
352         MIRRORED_REPEAT = 0x8370,
353         FLOAT_VEC2 = 0x8B50,
354         FLOAT_VEC3 = 0x8B51,
355         FLOAT_VEC4 = 0x8B52,
356         INT_VEC2 = 0x8B53,
357         INT_VEC3 = 0x8B54,
358         INT_VEC4 = 0x8B55,
359         BOOL = 0x8B56,
360         BOOL_VEC2 = 0x8B57,
361         BOOL_VEC3 = 0x8B58,
362         BOOL_VEC4 = 0x8B59,
363         FLOAT_MAT2 = 0x8B5A,
364         FLOAT_MAT3 = 0x8B5B,
365         FLOAT_MAT4 = 0x8B5C,
366         SAMPLER_2D = 0x8B5E,
367         SAMPLER_CUBE = 0x8B60,
368         VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622,
369         VERTEX_ATTRIB_ARRAY_SIZE = 0x8623,
370         VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624,
371         VERTEX_ATTRIB_ARRAY_TYPE = 0x8625,
372         VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A,
373         VERTEX_ATTRIB_ARRAY_POINTER = 0x8645,
374         VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F,
375         COMPILE_STATUS = 0x8B81,
376         INFO_LOG_LENGTH = 0x8B84,
377         SHADER_SOURCE_LENGTH = 0x8B88,
378         SHADER_COMPILER = 0x8DFA,
379         SHADER_BINARY_FORMATS = 0x8DF8,
380         NUM_SHADER_BINARY_FORMATS = 0x8DF9,
381         LOW_FLOAT = 0x8DF0,
382         MEDIUM_FLOAT = 0x8DF1,
383         HIGH_FLOAT = 0x8DF2,
384         LOW_INT = 0x8DF3,
385         MEDIUM_INT = 0x8DF4,
386         HIGH_INT = 0x8DF5,
387         FRAMEBUFFER = 0x8D40,
388         RENDERBUFFER = 0x8D41,
389         RGBA4 = 0x8056,
390         RGB5_A1 = 0x8057,
391         RGB565 = 0x8D62,
392         DEPTH_COMPONENT16 = 0x81A5,
393         STENCIL_INDEX = 0x1901,
394         STENCIL_INDEX8 = 0x8D48,
395         DEPTH_STENCIL = 0x84F9,
396         UNSIGNED_INT_24_8 = 0x84FA,
397         RENDERBUFFER_WIDTH = 0x8D42,
398         RENDERBUFFER_HEIGHT = 0x8D43,
399         RENDERBUFFER_INTERNAL_FORMAT = 0x8D44,
400         RENDERBUFFER_RED_SIZE = 0x8D50,
401         RENDERBUFFER_GREEN_SIZE = 0x8D51,
402         RENDERBUFFER_BLUE_SIZE = 0x8D52,
403         RENDERBUFFER_ALPHA_SIZE = 0x8D53,
404         RENDERBUFFER_DEPTH_SIZE = 0x8D54,
405         RENDERBUFFER_STENCIL_SIZE = 0x8D55,
406         FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0,
407         FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1,
408         FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2,
409         FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3,
410         COLOR_ATTACHMENT0 = 0x8CE0,
411         DEPTH_ATTACHMENT = 0x8D00,
412         STENCIL_ATTACHMENT = 0x8D20,
413         DEPTH_STENCIL_ATTACHMENT = 0x821A,
414         NONE = 0,
415         FRAMEBUFFER_COMPLETE = 0x8CD5,
416         FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6,
417         FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7,
418         FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9,
419         FRAMEBUFFER_UNSUPPORTED = 0x8CDD,
420         FRAMEBUFFER_BINDING = 0x8CA6,
421         RENDERBUFFER_BINDING = 0x8CA7,
422         MAX_RENDERBUFFER_SIZE = 0x84E8,
423         INVALID_FRAMEBUFFER_OPERATION = 0x0506,
424
425         // WebGL-specific enums
426         UNPACK_FLIP_Y_WEBGL = 0x9240,
427         UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241,
428         CONTEXT_LOST_WEBGL = 0x9242,
429         UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243,
430         BROWSER_DEFAULT_WEBGL = 0x9244
431     };
432
433     // Context creation attributes.
434     struct Attributes {
435         Attributes()
436             : alpha(true)
437             , depth(true)
438             , stencil(false)
439             , antialias(true)
440             , premultipliedAlpha(true)
441             , preserveDrawingBuffer(false)
442             , noExtensions(false)
443             , shareResources(true)
444             , preferDiscreteGPU(false)
445         {
446         }
447
448         bool alpha;
449         bool depth;
450         bool stencil;
451         bool antialias;
452         bool premultipliedAlpha;
453         bool preserveDrawingBuffer;
454         bool noExtensions;
455         bool shareResources;
456         bool preferDiscreteGPU;
457     };
458
459     enum RenderStyle {
460         RenderOffscreen,
461         RenderDirectlyToHostWindow,
462         RenderToCurrentGLContext
463     };
464
465     class ContextLostCallback {
466     public:
467         virtual void onContextLost() = 0;
468         virtual ~ContextLostCallback() {}
469     };
470
471     class ErrorMessageCallback {
472     public:
473         virtual void onErrorMessage(const String& message, GC3Dint id) = 0;
474         virtual ~ErrorMessageCallback() { }
475     };
476
477     void setContextLostCallback(PassOwnPtr<ContextLostCallback>);
478     void setErrorMessageCallback(PassOwnPtr<ErrorMessageCallback>);
479
480     static PassRefPtr<GraphicsContext3D> create(Attributes, HostWindow*, RenderStyle = RenderOffscreen);
481     static PassRefPtr<GraphicsContext3D> createForCurrentGLContext();
482     ~GraphicsContext3D();
483
484 #if PLATFORM(MAC)
485     PlatformGraphicsContext3D platformGraphicsContext3D() const { return m_contextObj; }
486     Platform3DObject platformTexture() const { return m_compositorTexture; }
487     CALayer* platformLayer() const { return reinterpret_cast<CALayer*>(m_webGLLayer.get()); }
488 #elif PLATFORM(CHROMIUM) || PLATFORM(BLACKBERRY)
489     PlatformGraphicsContext3D platformGraphicsContext3D() const;
490     Platform3DObject platformTexture() const;
491 #if USE(SKIA)
492     GrContext* grContext();
493 #endif
494 #if USE(ACCELERATED_COMPOSITING)
495     PlatformLayer* platformLayer() const;
496 #endif
497 #elif PLATFORM(QT)
498     PlatformGraphicsContext3D platformGraphicsContext3D();
499     Platform3DObject platformTexture() const;
500 #if USE(ACCELERATED_COMPOSITING)
501     PlatformLayer* platformLayer() const;
502 #endif
503 #elif PLATFORM(GTK)
504     PlatformGraphicsContext3D platformGraphicsContext3D();
505     Platform3DObject platformTexture() const { return m_texture; }
506 #if USE(ACCELERATED_COMPOSITING)
507     PlatformLayer* platformLayer() const;
508 #endif
509 #elif PLATFORM(EFL)
510     PlatformGraphicsContext3D platformGraphicsContext3D();
511     Platform3DObject platformTexture() const { return m_texture; }
512 #if USE(ACCELERATED_COMPOSITING)
513     PlatformLayer* platformLayer() const;
514 #endif
515 #else
516     PlatformGraphicsContext3D platformGraphicsContext3D() const { return NullPlatformGraphicsContext3D; }
517     Platform3DObject platformTexture() const { return NullPlatform3DObject; }
518 #if USE(ACCELERATED_COMPOSITING)
519     PlatformLayer* platformLayer() const { return 0; }
520 #endif
521 #endif
522     bool makeContextCurrent();
523
524 #if PLATFORM(MAC) || PLATFORM(CHROMIUM) || PLATFORM(GTK) || PLATFORM(QT) || PLATFORM(EFL) || PLATFORM(BLACKBERRY)
525     // With multisampling on, blit from multisampleFBO to regular FBO.
526     void prepareTexture();
527 #endif
528
529     // Equivalent to ::glTexImage2D(). Allows pixels==0 with no allocation.
530     void texImage2DDirect(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels);
531
532     // Helper to texImage2D with pixel==0 case: pixels are initialized to 0.
533     // Return true if no GL error is synthesized.
534     // By default, alignment is 4, the OpenGL default setting.
535     bool texImage2DResourceSafe(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, GC3Dint alignment = 4);
536
537     bool isGLES2Compliant() const;
538
539     //----------------------------------------------------------------------
540     // Helpers for texture uploading and pixel readback.
541     //
542
543     // Computes the components per pixel and bytes per component
544     // for the given format and type combination. Returns false if
545     // either was an invalid enum.
546     static bool computeFormatAndTypeParameters(GC3Denum format,
547                                                GC3Denum type,
548                                                unsigned int* componentsPerPixel,
549                                                unsigned int* bytesPerComponent);
550
551     // Computes the image size in bytes. If paddingInBytes is not null, padding
552     // is also calculated in return. Returns NO_ERROR if succeed, otherwise
553     // return the suggested GL error indicating the cause of the failure:
554     //   INVALID_VALUE if width/height is negative or overflow happens.
555     //   INVALID_ENUM if format/type is illegal.
556     static GC3Denum computeImageSizeInBytes(GC3Denum format,
557                                      GC3Denum type,
558                                      GC3Dsizei width,
559                                      GC3Dsizei height,
560                                      GC3Dint alignment,
561                                      unsigned int* imageSizeInBytes,
562                                      unsigned int* paddingInBytes);
563
564     // Extracts the contents of the given Image into the passed Vector,
565     // packing the pixel data according to the given format and type,
566     // and obeying the flipY, premultiplyAlpha, and ignoreGammaAndColorProfile
567     // flags. Returns true upon success.
568     static bool extractImageData(Image*,
569                           GC3Denum format,
570                           GC3Denum type,
571                           bool flipY,
572                           bool premultiplyAlpha,
573                           bool ignoreGammaAndColorProfile,
574                           Vector<uint8_t>& data);
575
576     // Extracts the contents of the given ImageData into the passed Vector,
577     // packing the pixel data according to the given format and type,
578     // and obeying the flipY and premultiplyAlpha flags. Returns true
579     // upon success.
580     static bool extractImageData(ImageData*,
581                           GC3Denum format,
582                           GC3Denum type,
583                           bool flipY,
584                           bool premultiplyAlpha,
585                           Vector<uint8_t>& data);
586
587     // Helper function which extracts the user-supplied texture
588     // data, applying the flipY and premultiplyAlpha parameters.
589     // If the data is not tightly packed according to the passed
590     // unpackAlignment, the output data will be tightly packed.
591     // Returns true if successful, false if any error occurred.
592     static bool extractTextureData(unsigned int width, unsigned int height,
593                             GC3Denum format, GC3Denum type,
594                             unsigned int unpackAlignment,
595                             bool flipY, bool premultiplyAlpha,
596                             const void* pixels,
597                             Vector<uint8_t>& data);
598
599     // Flips the given image data vertically, in-place.
600     static void flipVertically(void* imageData,
601                         unsigned int width,
602                         unsigned int height,
603                         unsigned int bytesPerPixel,
604                         unsigned int unpackAlignment);
605
606     // Attempt to enumerate all possible native image formats to
607     // reduce the amount of temporary allocations during texture
608     // uploading. This enum must be public because it is accessed
609     // by non-member functions.
610     enum SourceDataFormat {
611         SourceFormatRGBA8 = 0,
612         SourceFormatRGBA16Little,
613         SourceFormatRGBA16Big,
614         SourceFormatRGBA32F,
615         SourceFormatRGB8,
616         SourceFormatRGB16Little,
617         SourceFormatRGB16Big,
618         SourceFormatRGB32F,
619         SourceFormatBGR8,
620         SourceFormatBGRA8,
621         SourceFormatBGRA16Little,
622         SourceFormatBGRA16Big,
623         SourceFormatARGB8,
624         SourceFormatARGB16Little,
625         SourceFormatARGB16Big,
626         SourceFormatABGR8,
627         SourceFormatRGBA5551,
628         SourceFormatRGBA4444,
629         SourceFormatRGB565,
630         SourceFormatR8,
631         SourceFormatR16Little,
632         SourceFormatR16Big,
633         SourceFormatR32F,
634         SourceFormatRA8,
635         SourceFormatRA16Little,
636         SourceFormatRA16Big,
637         SourceFormatRA32F,
638         SourceFormatAR8,
639         SourceFormatAR16Little,
640         SourceFormatAR16Big,
641         SourceFormatA8,
642         SourceFormatA16Little,
643         SourceFormatA16Big,
644         SourceFormatA32F,
645         SourceFormatNumFormats
646     };
647
648     //----------------------------------------------------------------------
649     // Entry points for WebGL.
650     //
651
652     void activeTexture(GC3Denum texture);
653     void attachShader(Platform3DObject program, Platform3DObject shader);
654     void bindAttribLocation(Platform3DObject, GC3Duint index, const String& name);
655     void bindBuffer(GC3Denum target, Platform3DObject);
656     void bindFramebuffer(GC3Denum target, Platform3DObject);
657     void bindRenderbuffer(GC3Denum target, Platform3DObject);
658     void bindTexture(GC3Denum target, Platform3DObject);
659     void blendColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha);
660     void blendEquation(GC3Denum mode);
661     void blendEquationSeparate(GC3Denum modeRGB, GC3Denum modeAlpha);
662     void blendFunc(GC3Denum sfactor, GC3Denum dfactor);
663     void blendFuncSeparate(GC3Denum srcRGB, GC3Denum dstRGB, GC3Denum srcAlpha, GC3Denum dstAlpha);
664
665     void bufferData(GC3Denum target, GC3Dsizeiptr size, GC3Denum usage);
666     void bufferData(GC3Denum target, GC3Dsizeiptr size, const void* data, GC3Denum usage);
667     void bufferSubData(GC3Denum target, GC3Dintptr offset, GC3Dsizeiptr size, const void* data);
668
669     GC3Denum checkFramebufferStatus(GC3Denum target);
670     void clear(GC3Dbitfield mask);
671     void clearColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha);
672     void clearDepth(GC3Dclampf depth);
673     void clearStencil(GC3Dint s);
674     void colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboolean alpha);
675     void compileShader(Platform3DObject);
676
677     void compressedTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Dsizei imageSize, const void* data);
678     void compressedTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Dsizei imageSize, const void* data);
679     void copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border);
680     void copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
681     void cullFace(GC3Denum mode);
682     void depthFunc(GC3Denum func);
683     void depthMask(GC3Dboolean flag);
684     void depthRange(GC3Dclampf zNear, GC3Dclampf zFar);
685     void detachShader(Platform3DObject, Platform3DObject);
686     void disable(GC3Denum cap);
687     void disableVertexAttribArray(GC3Duint index);
688     void drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count);
689     void drawElements(GC3Denum mode, GC3Dsizei count, GC3Denum type, GC3Dintptr offset);
690
691     void enable(GC3Denum cap);
692     void enableVertexAttribArray(GC3Duint index);
693     void finish();
694     void flush();
695     void framebufferRenderbuffer(GC3Denum target, GC3Denum attachment, GC3Denum renderbuffertarget, Platform3DObject);
696     void framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, Platform3DObject, GC3Dint level);
697     void frontFace(GC3Denum mode);
698     void generateMipmap(GC3Denum target);
699
700     bool getActiveAttrib(Platform3DObject program, GC3Duint index, ActiveInfo&);
701     bool getActiveUniform(Platform3DObject program, GC3Duint index, ActiveInfo&);
702     void getAttachedShaders(Platform3DObject program, GC3Dsizei maxCount, GC3Dsizei* count, Platform3DObject* shaders);
703     GC3Dint getAttribLocation(Platform3DObject, const String& name);
704     void getBooleanv(GC3Denum pname, GC3Dboolean* value);
705     void getBufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
706     Attributes getContextAttributes();
707     GC3Denum getError();
708     void getFloatv(GC3Denum pname, GC3Dfloat* value);
709     void getFramebufferAttachmentParameteriv(GC3Denum target, GC3Denum attachment, GC3Denum pname, GC3Dint* value);
710     void getIntegerv(GC3Denum pname, GC3Dint* value);
711     void getProgramiv(Platform3DObject program, GC3Denum pname, GC3Dint* value);
712     String getProgramInfoLog(Platform3DObject);
713     void getRenderbufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
714     void getShaderiv(Platform3DObject, GC3Denum pname, GC3Dint* value);
715     String getShaderInfoLog(Platform3DObject);
716     void getShaderPrecisionFormat(GC3Denum shaderType, GC3Denum precisionType, GC3Dint* range, GC3Dint* precision);
717     String getShaderSource(Platform3DObject);
718     String getString(GC3Denum name);
719     void getTexParameterfv(GC3Denum target, GC3Denum pname, GC3Dfloat* value);
720     void getTexParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
721     void getUniformfv(Platform3DObject program, GC3Dint location, GC3Dfloat* value);
722     void getUniformiv(Platform3DObject program, GC3Dint location, GC3Dint* value);
723     GC3Dint getUniformLocation(Platform3DObject, const String& name);
724     void getVertexAttribfv(GC3Duint index, GC3Denum pname, GC3Dfloat* value);
725     void getVertexAttribiv(GC3Duint index, GC3Denum pname, GC3Dint* value);
726     GC3Dsizeiptr getVertexAttribOffset(GC3Duint index, GC3Denum pname);
727
728     void hint(GC3Denum target, GC3Denum mode);
729     GC3Dboolean isBuffer(Platform3DObject);
730     GC3Dboolean isEnabled(GC3Denum cap);
731     GC3Dboolean isFramebuffer(Platform3DObject);
732     GC3Dboolean isProgram(Platform3DObject);
733     GC3Dboolean isRenderbuffer(Platform3DObject);
734     GC3Dboolean isShader(Platform3DObject);
735     GC3Dboolean isTexture(Platform3DObject);
736     void lineWidth(GC3Dfloat);
737     void linkProgram(Platform3DObject);
738     void pixelStorei(GC3Denum pname, GC3Dint param);
739     void polygonOffset(GC3Dfloat factor, GC3Dfloat units);
740
741     void readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data);
742
743     void releaseShaderCompiler();
744
745     void renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height);
746     void sampleCoverage(GC3Dclampf value, GC3Dboolean invert);
747     void scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
748     void shaderSource(Platform3DObject, const String& string);
749     void stencilFunc(GC3Denum func, GC3Dint ref, GC3Duint mask);
750     void stencilFuncSeparate(GC3Denum face, GC3Denum func, GC3Dint ref, GC3Duint mask);
751     void stencilMask(GC3Duint mask);
752     void stencilMaskSeparate(GC3Denum face, GC3Duint mask);
753     void stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zpass);
754     void stencilOpSeparate(GC3Denum face, GC3Denum fail, GC3Denum zfail, GC3Denum zpass);
755
756     bool texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels);
757     void texParameterf(GC3Denum target, GC3Denum pname, GC3Dfloat param);
758     void texParameteri(GC3Denum target, GC3Denum pname, GC3Dint param);
759     void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels);
760
761     void uniform1f(GC3Dint location, GC3Dfloat x);
762     void uniform1fv(GC3Dint location, GC3Dsizei, GC3Dfloat* v);
763     void uniform1i(GC3Dint location, GC3Dint x);
764     void uniform1iv(GC3Dint location, GC3Dsizei, GC3Dint* v);
765     void uniform2f(GC3Dint location, GC3Dfloat x, GC3Dfloat y);
766     void uniform2fv(GC3Dint location, GC3Dsizei, GC3Dfloat* v);
767     void uniform2i(GC3Dint location, GC3Dint x, GC3Dint y);
768     void uniform2iv(GC3Dint location, GC3Dsizei, GC3Dint* v);
769     void uniform3f(GC3Dint location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z);
770     void uniform3fv(GC3Dint location, GC3Dsizei, GC3Dfloat* v);
771     void uniform3i(GC3Dint location, GC3Dint x, GC3Dint y, GC3Dint z);
772     void uniform3iv(GC3Dint location, GC3Dsizei, GC3Dint* v);
773     void uniform4f(GC3Dint location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w);
774     void uniform4fv(GC3Dint location, GC3Dsizei, GC3Dfloat* v);
775     void uniform4i(GC3Dint location, GC3Dint x, GC3Dint y, GC3Dint z, GC3Dint w);
776     void uniform4iv(GC3Dint location, GC3Dsizei, GC3Dint* v);
777     void uniformMatrix2fv(GC3Dint location, GC3Dsizei, GC3Dboolean transpose, GC3Dfloat* value);
778     void uniformMatrix3fv(GC3Dint location, GC3Dsizei, GC3Dboolean transpose, GC3Dfloat* value);
779     void uniformMatrix4fv(GC3Dint location, GC3Dsizei, GC3Dboolean transpose, GC3Dfloat* value);
780
781     void useProgram(Platform3DObject);
782     void validateProgram(Platform3DObject);
783
784     void vertexAttrib1f(GC3Duint index, GC3Dfloat x);
785     void vertexAttrib1fv(GC3Duint index, GC3Dfloat* values);
786     void vertexAttrib2f(GC3Duint index, GC3Dfloat x, GC3Dfloat y);
787     void vertexAttrib2fv(GC3Duint index, GC3Dfloat* values);
788     void vertexAttrib3f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z);
789     void vertexAttrib3fv(GC3Duint index, GC3Dfloat* values);
790     void vertexAttrib4f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w);
791     void vertexAttrib4fv(GC3Duint index, GC3Dfloat* values);
792     void vertexAttribPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dboolean normalized,
793                              GC3Dsizei stride, GC3Dintptr offset);
794
795     void viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
796
797     void reshape(int width, int height);
798
799 #if USE(CG)
800     static void paintToCanvas(const unsigned char* imagePixels, int imageWidth, int imageHeight,
801                               int canvasWidth, int canvasHeight, CGContextRef);
802 #elif PLATFORM(GTK) || PLATFORM(EFL)
803     void paintToCanvas(const unsigned char* imagePixels, int imageWidth, int imageHeight,
804                        int canvasWidth, int canvasHeight, PlatformContextCairo* context);
805 #elif PLATFORM(QT)
806     void paintToCanvas(const unsigned char* imagePixels, int imageWidth, int imageHeight,
807                        int canvasWidth, int canvasHeight, QPainter* context);
808 #elif PLATFORM(BLACKBERRY)
809     void paintToCanvas(const unsigned char* imagePixels, int imageWidth, int imageHeight,
810                        int canvasWidth, int canvasHeight, GraphicsContext*);
811 #endif
812
813     void markContextChanged();
814     void markLayerComposited();
815     bool layerComposited() const;
816
817     void paintRenderingResultsToCanvas(ImageBuffer*, DrawingBuffer*);
818     PassRefPtr<ImageData> paintRenderingResultsToImageData(DrawingBuffer*);
819     bool paintCompositedResultsToCanvas(ImageBuffer*);
820
821 #if PLATFORM(BLACKBERRY)
822     bool paintsIntoCanvasBuffer() const;
823 #endif
824
825     // Support for buffer creation and deletion
826     Platform3DObject createBuffer();
827     Platform3DObject createFramebuffer();
828     Platform3DObject createProgram();
829     Platform3DObject createRenderbuffer();
830     Platform3DObject createShader(GC3Denum);
831     Platform3DObject createTexture();
832
833     void deleteBuffer(Platform3DObject);
834     void deleteFramebuffer(Platform3DObject);
835     void deleteProgram(Platform3DObject);
836     void deleteRenderbuffer(Platform3DObject);
837     void deleteShader(Platform3DObject);
838     void deleteTexture(Platform3DObject);
839
840     // Synthesizes an OpenGL error which will be returned from a
841     // later call to getError. This is used to emulate OpenGL ES
842     // 2.0 behavior on the desktop and to enforce additional error
843     // checking mandated by WebGL.
844     //
845     // Per the behavior of glGetError, this stores at most one
846     // instance of any given error, and returns them from calls to
847     // getError in the order they were added.
848     void synthesizeGLError(GC3Denum error);
849
850     // Support for extensions. Returns a non-null object, though not
851     // all methods it contains may necessarily be supported on the
852     // current hardware. Must call Extensions3D::supports() to
853     // determine this.
854     Extensions3D* getExtensions();
855
856     IntSize getInternalFramebufferSize() const;
857
858     static unsigned getClearBitsByAttachmentType(GC3Denum);
859     static unsigned getClearBitsByFormat(GC3Denum);
860
861     enum ChannelBits {
862         ChannelRed = 1,
863         ChannelGreen = 2,
864         ChannelBlue = 4,
865         ChannelAlpha = 8,
866         ChannelDepth = 16,
867         ChannelStencil = 32,
868         ChannelRGB = ChannelRed | ChannelGreen | ChannelBlue,
869         ChannelRGBA = ChannelRGB | ChannelAlpha,
870     };
871
872     static unsigned getChannelBitsByFormat(GC3Denum);
873
874   private:
875     GraphicsContext3D(Attributes, HostWindow*, RenderStyle = RenderOffscreen);
876
877     // Each platform must provide an implementation of this method.
878     //
879     // Gets the data for the given Image into outputVector in the
880     // format specified by the (OpenGL-style) format and type
881     // arguments. Despite the fact that the outputVector contains
882     // uint8_t, if the format and type specify packed pixels, then
883     // it will essentially contain uint16_t after the extraction
884     // process.
885     //
886     // If premultiplyAlpha is true, the alpha channel, if any,
887     // will be multiplied into the color channels during the
888     // extraction process. This premultiplication occurs before
889     // any packing of pixel data.
890     //
891     // If ignoreGammaAndColorProfile is true, gamma correction and ICC
892     // profile won't be applied.
893     //
894     // No vertical flip of the image data is performed by this
895     // method.
896     static bool getImageData(Image*,
897                       GC3Denum format,
898                       GC3Denum type,
899                       bool premultiplyAlpha,
900                       bool ignoreGammaAndColorProfile,
901                       Vector<uint8_t>& outputVector);
902
903     // Possible alpha operations that may need to occur during
904     // pixel packing. FIXME: kAlphaDoUnmultiply is lossy and must
905     // be removed.
906     enum AlphaOp {
907         AlphaDoNothing = 0,
908         AlphaDoPremultiply = 1,
909         AlphaDoUnmultiply = 2
910     };
911
912     // Helper for getImageData which implements packing of pixel
913     // data into the specified OpenGL destination format and type.
914     // A sourceUnpackAlignment of zero indicates that the source
915     // data is tightly packed. Non-zero values may take a slow path.
916     // Destination data will have no gaps between rows.
917     static bool packPixels(const uint8_t* sourceData,
918                     SourceDataFormat sourceDataFormat,
919                     unsigned int width,
920                     unsigned int height,
921                     unsigned int sourceUnpackAlignment,
922                     unsigned int destinationFormat,
923                     unsigned int destinationType,
924                     AlphaOp alphaOp,
925                     void* destinationData);
926
927 #if PLATFORM(MAC) || PLATFORM(GTK) || PLATFORM(QT) || PLATFORM(EFL) || PLATFORM(BLACKBERRY)
928     // Take into account the user's requested context creation attributes,
929     // in particular stencil and antialias, and determine which could or
930     // could not be honored based on the capabilities of the OpenGL
931     // implementation.
932     void validateDepthStencil(const char* packedDepthStencilExtension);
933     void validateAttributes();
934
935     // Read rendering results into a pixel array with the same format as the
936     // backbuffer.
937     void readRenderingResults(unsigned char* pixels, int pixelsSize);
938     void readPixelsAndConvertToBGRAIfNecessary(int x, int y, int width, int height, unsigned char* pixels);
939 #endif
940
941 #if PLATFORM(BLACKBERRY)
942     void logFrameBufferStatus(int line);
943     void readPixelsIMG(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data);
944 #endif
945
946     bool reshapeFBOs(const IntSize&);
947     void resolveMultisamplingIfNecessary(const IntRect& = IntRect());
948 #if PLATFORM(QT) && USE(GRAPHICS_SURFACE)
949     void createGraphicsSurfaces(const IntSize&);
950 #endif
951
952     int m_currentWidth, m_currentHeight;
953     bool isResourceSafe();
954
955 #if PLATFORM(MAC)
956     CGLContextObj m_contextObj;
957     RetainPtr<WebGLLayer> m_webGLLayer;
958 #elif PLATFORM(BLACKBERRY)
959 #if USE(ACCELERATED_COMPOSITING)
960     RefPtr<PlatformLayer> m_compositingLayer;
961 #endif
962     void* m_context;
963 #endif
964
965 #if PLATFORM(MAC) || PLATFORM(GTK) || PLATFORM(QT) || PLATFORM(EFL) || PLATFORM(BLACKBERRY)
966     struct ShaderSourceEntry {
967         String source;
968         String log;
969         bool isValid;
970         ShaderSourceEntry()
971             : isValid(0)
972         {
973         }
974     };
975     HashMap<Platform3DObject, ShaderSourceEntry> m_shaderSourceMap;
976
977     ANGLEWebKitBridge m_compiler;
978 #endif
979
980 #if PLATFORM(BLACKBERRY) || (PLATFORM(QT) && defined(QT_OPENGL_ES_2))
981     friend class Extensions3DOpenGLES;
982     OwnPtr<Extensions3DOpenGLES> m_extensions;
983 #elif !PLATFORM(CHROMIUM)
984     friend class Extensions3DOpenGL;
985     OwnPtr<Extensions3DOpenGL> m_extensions;
986 #endif
987     friend class Extensions3DOpenGLCommon;
988
989     Attributes m_attrs;
990     RenderStyle m_renderStyle;
991     Vector<Vector<float> > m_vertexArray;
992
993     GC3Duint m_texture;
994 #if !PLATFORM(BLACKBERRY)
995     GC3Duint m_compositorTexture;
996 #endif
997     GC3Duint m_fbo;
998
999 #if !PLATFORM(BLACKBERRY)
1000     GC3Duint m_depthBuffer;
1001     GC3Duint m_stencilBuffer;
1002 #endif
1003     GC3Duint m_depthStencilBuffer;
1004
1005     bool m_layerComposited;
1006     GC3Duint m_internalColorFormat;
1007
1008     // For tracking which FBO/texture is bound
1009     GC3Duint m_boundFBO;
1010     GC3Denum m_activeTexture;
1011     GC3Duint m_boundTexture0;
1012
1013     // For multisampling
1014     GC3Duint m_multisampleFBO;
1015     GC3Duint m_multisampleDepthStencilBuffer;
1016     GC3Duint m_multisampleColorBuffer;
1017
1018     // Errors raised by synthesizeGLError().
1019     ListHashSet<GC3Denum> m_syntheticErrors;
1020
1021 #if PLATFORM(BLACKBERRY)
1022     bool m_isImaginationHardware;
1023 #endif
1024
1025 #if !PLATFORM(BLACKBERRY)
1026     friend class GraphicsContext3DPrivate;
1027     OwnPtr<GraphicsContext3DPrivate> m_private;
1028 #endif
1029     bool systemAllowsMultisamplingOnATICards() const;
1030 };
1031
1032 } // namespace WebCore
1033
1034 #endif // GraphicsContext3D_h