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