Part 2 of removing PlatformString.h, remove PlatformString.h
[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 <wtf/HashMap.h>
33 #include <wtf/ListHashSet.h>
34 #include <wtf/Noncopyable.h>
35 #include <wtf/RefCounted.h>
36 #include <wtf/text/WTFString.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         BGRA = 0x80E1,
254         LUMINANCE = 0x1909,
255         LUMINANCE_ALPHA = 0x190A,
256         UNSIGNED_SHORT_4_4_4_4 = 0x8033,
257         UNSIGNED_SHORT_5_5_5_1 = 0x8034,
258         UNSIGNED_SHORT_5_6_5 = 0x8363,
259         FRAGMENT_SHADER = 0x8B30,
260         VERTEX_SHADER = 0x8B31,
261         MAX_VERTEX_ATTRIBS = 0x8869,
262         MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB,
263         MAX_VARYING_VECTORS = 0x8DFC,
264         MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D,
265         MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C,
266         MAX_TEXTURE_IMAGE_UNITS = 0x8872,
267         MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD,
268         SHADER_TYPE = 0x8B4F,
269         DELETE_STATUS = 0x8B80,
270         LINK_STATUS = 0x8B82,
271         VALIDATE_STATUS = 0x8B83,
272         ATTACHED_SHADERS = 0x8B85,
273         ACTIVE_UNIFORMS = 0x8B86,
274         ACTIVE_UNIFORM_MAX_LENGTH = 0x8B87,
275         ACTIVE_ATTRIBUTES = 0x8B89,
276         ACTIVE_ATTRIBUTE_MAX_LENGTH = 0x8B8A,
277         SHADING_LANGUAGE_VERSION = 0x8B8C,
278         CURRENT_PROGRAM = 0x8B8D,
279         NEVER = 0x0200,
280         LESS = 0x0201,
281         EQUAL = 0x0202,
282         LEQUAL = 0x0203,
283         GREATER = 0x0204,
284         NOTEQUAL = 0x0205,
285         GEQUAL = 0x0206,
286         ALWAYS = 0x0207,
287         KEEP = 0x1E00,
288         REPLACE = 0x1E01,
289         INCR = 0x1E02,
290         DECR = 0x1E03,
291         INVERT = 0x150A,
292         INCR_WRAP = 0x8507,
293         DECR_WRAP = 0x8508,
294         VENDOR = 0x1F00,
295         RENDERER = 0x1F01,
296         VERSION = 0x1F02,
297         EXTENSIONS = 0x1F03,
298         NEAREST = 0x2600,
299         LINEAR = 0x2601,
300         NEAREST_MIPMAP_NEAREST = 0x2700,
301         LINEAR_MIPMAP_NEAREST = 0x2701,
302         NEAREST_MIPMAP_LINEAR = 0x2702,
303         LINEAR_MIPMAP_LINEAR = 0x2703,
304         TEXTURE_MAG_FILTER = 0x2800,
305         TEXTURE_MIN_FILTER = 0x2801,
306         TEXTURE_WRAP_S = 0x2802,
307         TEXTURE_WRAP_T = 0x2803,
308         TEXTURE = 0x1702,
309         TEXTURE_CUBE_MAP = 0x8513,
310         TEXTURE_BINDING_CUBE_MAP = 0x8514,
311         TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515,
312         TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516,
313         TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517,
314         TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518,
315         TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519,
316         TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A,
317         MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C,
318         TEXTURE0 = 0x84C0,
319         TEXTURE1 = 0x84C1,
320         TEXTURE2 = 0x84C2,
321         TEXTURE3 = 0x84C3,
322         TEXTURE4 = 0x84C4,
323         TEXTURE5 = 0x84C5,
324         TEXTURE6 = 0x84C6,
325         TEXTURE7 = 0x84C7,
326         TEXTURE8 = 0x84C8,
327         TEXTURE9 = 0x84C9,
328         TEXTURE10 = 0x84CA,
329         TEXTURE11 = 0x84CB,
330         TEXTURE12 = 0x84CC,
331         TEXTURE13 = 0x84CD,
332         TEXTURE14 = 0x84CE,
333         TEXTURE15 = 0x84CF,
334         TEXTURE16 = 0x84D0,
335         TEXTURE17 = 0x84D1,
336         TEXTURE18 = 0x84D2,
337         TEXTURE19 = 0x84D3,
338         TEXTURE20 = 0x84D4,
339         TEXTURE21 = 0x84D5,
340         TEXTURE22 = 0x84D6,
341         TEXTURE23 = 0x84D7,
342         TEXTURE24 = 0x84D8,
343         TEXTURE25 = 0x84D9,
344         TEXTURE26 = 0x84DA,
345         TEXTURE27 = 0x84DB,
346         TEXTURE28 = 0x84DC,
347         TEXTURE29 = 0x84DD,
348         TEXTURE30 = 0x84DE,
349         TEXTURE31 = 0x84DF,
350         ACTIVE_TEXTURE = 0x84E0,
351         REPEAT = 0x2901,
352         CLAMP_TO_EDGE = 0x812F,
353         MIRRORED_REPEAT = 0x8370,
354         FLOAT_VEC2 = 0x8B50,
355         FLOAT_VEC3 = 0x8B51,
356         FLOAT_VEC4 = 0x8B52,
357         INT_VEC2 = 0x8B53,
358         INT_VEC3 = 0x8B54,
359         INT_VEC4 = 0x8B55,
360         BOOL = 0x8B56,
361         BOOL_VEC2 = 0x8B57,
362         BOOL_VEC3 = 0x8B58,
363         BOOL_VEC4 = 0x8B59,
364         FLOAT_MAT2 = 0x8B5A,
365         FLOAT_MAT3 = 0x8B5B,
366         FLOAT_MAT4 = 0x8B5C,
367         SAMPLER_2D = 0x8B5E,
368         SAMPLER_CUBE = 0x8B60,
369         VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622,
370         VERTEX_ATTRIB_ARRAY_SIZE = 0x8623,
371         VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624,
372         VERTEX_ATTRIB_ARRAY_TYPE = 0x8625,
373         VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A,
374         VERTEX_ATTRIB_ARRAY_POINTER = 0x8645,
375         VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F,
376         COMPILE_STATUS = 0x8B81,
377         INFO_LOG_LENGTH = 0x8B84,
378         SHADER_SOURCE_LENGTH = 0x8B88,
379         SHADER_COMPILER = 0x8DFA,
380         SHADER_BINARY_FORMATS = 0x8DF8,
381         NUM_SHADER_BINARY_FORMATS = 0x8DF9,
382         LOW_FLOAT = 0x8DF0,
383         MEDIUM_FLOAT = 0x8DF1,
384         HIGH_FLOAT = 0x8DF2,
385         LOW_INT = 0x8DF3,
386         MEDIUM_INT = 0x8DF4,
387         HIGH_INT = 0x8DF5,
388         FRAMEBUFFER = 0x8D40,
389         RENDERBUFFER = 0x8D41,
390         RGBA4 = 0x8056,
391         RGB5_A1 = 0x8057,
392         RGB565 = 0x8D62,
393         DEPTH_COMPONENT16 = 0x81A5,
394         STENCIL_INDEX = 0x1901,
395         STENCIL_INDEX8 = 0x8D48,
396         DEPTH_STENCIL = 0x84F9,
397         UNSIGNED_INT_24_8 = 0x84FA,
398         RENDERBUFFER_WIDTH = 0x8D42,
399         RENDERBUFFER_HEIGHT = 0x8D43,
400         RENDERBUFFER_INTERNAL_FORMAT = 0x8D44,
401         RENDERBUFFER_RED_SIZE = 0x8D50,
402         RENDERBUFFER_GREEN_SIZE = 0x8D51,
403         RENDERBUFFER_BLUE_SIZE = 0x8D52,
404         RENDERBUFFER_ALPHA_SIZE = 0x8D53,
405         RENDERBUFFER_DEPTH_SIZE = 0x8D54,
406         RENDERBUFFER_STENCIL_SIZE = 0x8D55,
407         FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0,
408         FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1,
409         FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2,
410         FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3,
411         COLOR_ATTACHMENT0 = 0x8CE0,
412         DEPTH_ATTACHMENT = 0x8D00,
413         STENCIL_ATTACHMENT = 0x8D20,
414         DEPTH_STENCIL_ATTACHMENT = 0x821A,
415         NONE = 0,
416         FRAMEBUFFER_COMPLETE = 0x8CD5,
417         FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6,
418         FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7,
419         FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9,
420         FRAMEBUFFER_UNSUPPORTED = 0x8CDD,
421         FRAMEBUFFER_BINDING = 0x8CA6,
422         RENDERBUFFER_BINDING = 0x8CA7,
423         MAX_RENDERBUFFER_SIZE = 0x84E8,
424         INVALID_FRAMEBUFFER_OPERATION = 0x0506,
425
426         // WebGL-specific enums
427         UNPACK_FLIP_Y_WEBGL = 0x9240,
428         UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241,
429         CONTEXT_LOST_WEBGL = 0x9242,
430         UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243,
431         BROWSER_DEFAULT_WEBGL = 0x9244
432     };
433
434     // Context creation attributes.
435     struct Attributes {
436         Attributes()
437             : alpha(true)
438             , depth(true)
439             , stencil(false)
440             , antialias(true)
441             , premultipliedAlpha(true)
442             , preserveDrawingBuffer(false)
443             , noExtensions(false)
444             , shareResources(true)
445             , preferDiscreteGPU(false)
446         {
447         }
448
449         bool alpha;
450         bool depth;
451         bool stencil;
452         bool antialias;
453         bool premultipliedAlpha;
454         bool preserveDrawingBuffer;
455         bool noExtensions;
456         bool shareResources;
457         bool preferDiscreteGPU;
458     };
459
460     enum RenderStyle {
461         RenderOffscreen,
462         RenderDirectlyToHostWindow,
463         RenderToCurrentGLContext
464     };
465
466     class ContextLostCallback {
467     public:
468         virtual void onContextLost() = 0;
469         virtual ~ContextLostCallback() {}
470     };
471
472     class ErrorMessageCallback {
473     public:
474         virtual void onErrorMessage(const String& message, GC3Dint id) = 0;
475         virtual ~ErrorMessageCallback() { }
476     };
477
478     void setContextLostCallback(PassOwnPtr<ContextLostCallback>);
479     void setErrorMessageCallback(PassOwnPtr<ErrorMessageCallback>);
480
481     static PassRefPtr<GraphicsContext3D> create(Attributes, HostWindow*, RenderStyle = RenderOffscreen);
482     static PassRefPtr<GraphicsContext3D> createForCurrentGLContext();
483     ~GraphicsContext3D();
484
485 #if PLATFORM(MAC)
486     PlatformGraphicsContext3D platformGraphicsContext3D() const { return m_contextObj; }
487     Platform3DObject platformTexture() const { return m_compositorTexture; }
488     CALayer* platformLayer() const { return reinterpret_cast<CALayer*>(m_webGLLayer.get()); }
489 #elif PLATFORM(CHROMIUM) || PLATFORM(BLACKBERRY)
490     PlatformGraphicsContext3D platformGraphicsContext3D() const;
491     Platform3DObject platformTexture() const;
492 #if USE(SKIA)
493     GrContext* grContext();
494 #endif
495 #if USE(ACCELERATED_COMPOSITING)
496     PlatformLayer* platformLayer() const;
497 #endif
498 #elif PLATFORM(QT)
499     PlatformGraphicsContext3D platformGraphicsContext3D();
500     Platform3DObject platformTexture() const;
501 #if USE(ACCELERATED_COMPOSITING)
502     PlatformLayer* platformLayer() const;
503 #endif
504 #elif PLATFORM(GTK)
505     PlatformGraphicsContext3D platformGraphicsContext3D();
506     Platform3DObject platformTexture() const { return m_texture; }
507 #if USE(ACCELERATED_COMPOSITING)
508     PlatformLayer* platformLayer() const;
509 #endif
510 #elif PLATFORM(EFL)
511     PlatformGraphicsContext3D platformGraphicsContext3D();
512     Platform3DObject platformTexture() const { return m_texture; }
513 #if USE(ACCELERATED_COMPOSITING)
514     PlatformLayer* platformLayer() const;
515 #endif
516 #else
517     PlatformGraphicsContext3D platformGraphicsContext3D() const { return NullPlatformGraphicsContext3D; }
518     Platform3DObject platformTexture() const { return NullPlatform3DObject; }
519 #if USE(ACCELERATED_COMPOSITING)
520     PlatformLayer* platformLayer() const { return 0; }
521 #endif
522 #endif
523     bool makeContextCurrent();
524
525 #if PLATFORM(MAC) || PLATFORM(CHROMIUM) || PLATFORM(GTK) || PLATFORM(QT) || PLATFORM(EFL) || PLATFORM(BLACKBERRY)
526     // With multisampling on, blit from multisampleFBO to regular FBO.
527     void prepareTexture();
528 #endif
529
530     // Equivalent to ::glTexImage2D(). Allows pixels==0 with no allocation.
531     void texImage2DDirect(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels);
532
533     // Helper to texImage2D with pixel==0 case: pixels are initialized to 0.
534     // Return true if no GL error is synthesized.
535     // By default, alignment is 4, the OpenGL default setting.
536     bool texImage2DResourceSafe(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, GC3Dint alignment = 4);
537
538     bool isGLES2Compliant() const;
539
540     //----------------------------------------------------------------------
541     // Helpers for texture uploading and pixel readback.
542     //
543
544     // Computes the components per pixel and bytes per component
545     // for the given format and type combination. Returns false if
546     // either was an invalid enum.
547     static bool computeFormatAndTypeParameters(GC3Denum format,
548                                                GC3Denum type,
549                                                unsigned int* componentsPerPixel,
550                                                unsigned int* bytesPerComponent);
551
552     // Computes the image size in bytes. If paddingInBytes is not null, padding
553     // is also calculated in return. Returns NO_ERROR if succeed, otherwise
554     // return the suggested GL error indicating the cause of the failure:
555     //   INVALID_VALUE if width/height is negative or overflow happens.
556     //   INVALID_ENUM if format/type is illegal.
557     static GC3Denum computeImageSizeInBytes(GC3Denum format,
558                                      GC3Denum type,
559                                      GC3Dsizei width,
560                                      GC3Dsizei height,
561                                      GC3Dint alignment,
562                                      unsigned int* imageSizeInBytes,
563                                      unsigned int* paddingInBytes);
564
565     // Extracts the contents of the given Image into the passed Vector,
566     // packing the pixel data according to the given format and type,
567     // and obeying the flipY, premultiplyAlpha, and ignoreGammaAndColorProfile
568     // flags. Returns true upon success.
569     static bool extractImageData(Image*,
570                           GC3Denum format,
571                           GC3Denum type,
572                           bool flipY,
573                           bool premultiplyAlpha,
574                           bool ignoreGammaAndColorProfile,
575                           Vector<uint8_t>& data);
576
577     // Extracts the contents of the given ImageData into the passed Vector,
578     // packing the pixel data according to the given format and type,
579     // and obeying the flipY and premultiplyAlpha flags. Returns true
580     // upon success.
581     static bool extractImageData(ImageData*,
582                           GC3Denum format,
583                           GC3Denum type,
584                           bool flipY,
585                           bool premultiplyAlpha,
586                           Vector<uint8_t>& data);
587
588     // Helper function which extracts the user-supplied texture
589     // data, applying the flipY and premultiplyAlpha parameters.
590     // If the data is not tightly packed according to the passed
591     // unpackAlignment, the output data will be tightly packed.
592     // Returns true if successful, false if any error occurred.
593     static bool extractTextureData(unsigned int width, unsigned int height,
594                             GC3Denum format, GC3Denum type,
595                             unsigned int unpackAlignment,
596                             bool flipY, bool premultiplyAlpha,
597                             const void* pixels,
598                             Vector<uint8_t>& data);
599
600     // Flips the given image data vertically, in-place.
601     static void flipVertically(void* imageData,
602                         unsigned int width,
603                         unsigned int height,
604                         unsigned int bytesPerPixel,
605                         unsigned int unpackAlignment);
606
607     // Attempt to enumerate all possible native image formats to
608     // reduce the amount of temporary allocations during texture
609     // uploading. This enum must be public because it is accessed
610     // by non-member functions.
611     enum SourceDataFormat {
612         SourceFormatRGBA8 = 0,
613         SourceFormatRGBA16Little,
614         SourceFormatRGBA16Big,
615         SourceFormatRGBA32F,
616         SourceFormatRGB8,
617         SourceFormatRGB16Little,
618         SourceFormatRGB16Big,
619         SourceFormatRGB32F,
620         SourceFormatBGR8,
621         SourceFormatBGRA8,
622         SourceFormatBGRA16Little,
623         SourceFormatBGRA16Big,
624         SourceFormatARGB8,
625         SourceFormatARGB16Little,
626         SourceFormatARGB16Big,
627         SourceFormatABGR8,
628         SourceFormatRGBA5551,
629         SourceFormatRGBA4444,
630         SourceFormatRGB565,
631         SourceFormatR8,
632         SourceFormatR16Little,
633         SourceFormatR16Big,
634         SourceFormatR32F,
635         SourceFormatRA8,
636         SourceFormatRA16Little,
637         SourceFormatRA16Big,
638         SourceFormatRA32F,
639         SourceFormatAR8,
640         SourceFormatAR16Little,
641         SourceFormatAR16Big,
642         SourceFormatA8,
643         SourceFormatA16Little,
644         SourceFormatA16Big,
645         SourceFormatA32F,
646         SourceFormatNumFormats
647     };
648
649     //----------------------------------------------------------------------
650     // Entry points for WebGL.
651     //
652
653     void activeTexture(GC3Denum texture);
654     void attachShader(Platform3DObject program, Platform3DObject shader);
655     void bindAttribLocation(Platform3DObject, GC3Duint index, const String& name);
656     void bindBuffer(GC3Denum target, Platform3DObject);
657     void bindFramebuffer(GC3Denum target, Platform3DObject);
658     void bindRenderbuffer(GC3Denum target, Platform3DObject);
659     void bindTexture(GC3Denum target, Platform3DObject);
660     void blendColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha);
661     void blendEquation(GC3Denum mode);
662     void blendEquationSeparate(GC3Denum modeRGB, GC3Denum modeAlpha);
663     void blendFunc(GC3Denum sfactor, GC3Denum dfactor);
664     void blendFuncSeparate(GC3Denum srcRGB, GC3Denum dstRGB, GC3Denum srcAlpha, GC3Denum dstAlpha);
665
666     void bufferData(GC3Denum target, GC3Dsizeiptr size, GC3Denum usage);
667     void bufferData(GC3Denum target, GC3Dsizeiptr size, const void* data, GC3Denum usage);
668     void bufferSubData(GC3Denum target, GC3Dintptr offset, GC3Dsizeiptr size, const void* data);
669
670     GC3Denum checkFramebufferStatus(GC3Denum target);
671     void clear(GC3Dbitfield mask);
672     void clearColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha);
673     void clearDepth(GC3Dclampf depth);
674     void clearStencil(GC3Dint s);
675     void colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboolean alpha);
676     void compileShader(Platform3DObject);
677
678     void compressedTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Dsizei imageSize, const void* data);
679     void compressedTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Dsizei imageSize, const void* data);
680     void copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border);
681     void copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
682     void cullFace(GC3Denum mode);
683     void depthFunc(GC3Denum func);
684     void depthMask(GC3Dboolean flag);
685     void depthRange(GC3Dclampf zNear, GC3Dclampf zFar);
686     void detachShader(Platform3DObject, Platform3DObject);
687     void disable(GC3Denum cap);
688     void disableVertexAttribArray(GC3Duint index);
689     void drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count);
690     void drawElements(GC3Denum mode, GC3Dsizei count, GC3Denum type, GC3Dintptr offset);
691
692     void enable(GC3Denum cap);
693     void enableVertexAttribArray(GC3Duint index);
694     void finish();
695     void flush();
696     void framebufferRenderbuffer(GC3Denum target, GC3Denum attachment, GC3Denum renderbuffertarget, Platform3DObject);
697     void framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, Platform3DObject, GC3Dint level);
698     void frontFace(GC3Denum mode);
699     void generateMipmap(GC3Denum target);
700
701     bool getActiveAttrib(Platform3DObject program, GC3Duint index, ActiveInfo&);
702     bool getActiveUniform(Platform3DObject program, GC3Duint index, ActiveInfo&);
703     void getAttachedShaders(Platform3DObject program, GC3Dsizei maxCount, GC3Dsizei* count, Platform3DObject* shaders);
704     GC3Dint getAttribLocation(Platform3DObject, const String& name);
705     void getBooleanv(GC3Denum pname, GC3Dboolean* value);
706     void getBufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
707     Attributes getContextAttributes();
708     GC3Denum getError();
709     void getFloatv(GC3Denum pname, GC3Dfloat* value);
710     void getFramebufferAttachmentParameteriv(GC3Denum target, GC3Denum attachment, GC3Denum pname, GC3Dint* value);
711     void getIntegerv(GC3Denum pname, GC3Dint* value);
712     void getProgramiv(Platform3DObject program, GC3Denum pname, GC3Dint* value);
713     String getProgramInfoLog(Platform3DObject);
714     void getRenderbufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
715     void getShaderiv(Platform3DObject, GC3Denum pname, GC3Dint* value);
716     String getShaderInfoLog(Platform3DObject);
717     void getShaderPrecisionFormat(GC3Denum shaderType, GC3Denum precisionType, GC3Dint* range, GC3Dint* precision);
718     String getShaderSource(Platform3DObject);
719     String getString(GC3Denum name);
720     void getTexParameterfv(GC3Denum target, GC3Denum pname, GC3Dfloat* value);
721     void getTexParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
722     void getUniformfv(Platform3DObject program, GC3Dint location, GC3Dfloat* value);
723     void getUniformiv(Platform3DObject program, GC3Dint location, GC3Dint* value);
724     GC3Dint getUniformLocation(Platform3DObject, const String& name);
725     void getVertexAttribfv(GC3Duint index, GC3Denum pname, GC3Dfloat* value);
726     void getVertexAttribiv(GC3Duint index, GC3Denum pname, GC3Dint* value);
727     GC3Dsizeiptr getVertexAttribOffset(GC3Duint index, GC3Denum pname);
728
729     void hint(GC3Denum target, GC3Denum mode);
730     GC3Dboolean isBuffer(Platform3DObject);
731     GC3Dboolean isEnabled(GC3Denum cap);
732     GC3Dboolean isFramebuffer(Platform3DObject);
733     GC3Dboolean isProgram(Platform3DObject);
734     GC3Dboolean isRenderbuffer(Platform3DObject);
735     GC3Dboolean isShader(Platform3DObject);
736     GC3Dboolean isTexture(Platform3DObject);
737     void lineWidth(GC3Dfloat);
738     void linkProgram(Platform3DObject);
739     void pixelStorei(GC3Denum pname, GC3Dint param);
740     void polygonOffset(GC3Dfloat factor, GC3Dfloat units);
741
742     void readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data);
743
744     void releaseShaderCompiler();
745
746     void renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height);
747     void sampleCoverage(GC3Dclampf value, GC3Dboolean invert);
748     void scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
749     void shaderSource(Platform3DObject, const String& string);
750     void stencilFunc(GC3Denum func, GC3Dint ref, GC3Duint mask);
751     void stencilFuncSeparate(GC3Denum face, GC3Denum func, GC3Dint ref, GC3Duint mask);
752     void stencilMask(GC3Duint mask);
753     void stencilMaskSeparate(GC3Denum face, GC3Duint mask);
754     void stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zpass);
755     void stencilOpSeparate(GC3Denum face, GC3Denum fail, GC3Denum zfail, GC3Denum zpass);
756
757     bool texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels);
758     void texParameterf(GC3Denum target, GC3Denum pname, GC3Dfloat param);
759     void texParameteri(GC3Denum target, GC3Denum pname, GC3Dint param);
760     void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels);
761
762     void uniform1f(GC3Dint location, GC3Dfloat x);
763     void uniform1fv(GC3Dint location, GC3Dsizei, GC3Dfloat* v);
764     void uniform1i(GC3Dint location, GC3Dint x);
765     void uniform1iv(GC3Dint location, GC3Dsizei, GC3Dint* v);
766     void uniform2f(GC3Dint location, GC3Dfloat x, GC3Dfloat y);
767     void uniform2fv(GC3Dint location, GC3Dsizei, GC3Dfloat* v);
768     void uniform2i(GC3Dint location, GC3Dint x, GC3Dint y);
769     void uniform2iv(GC3Dint location, GC3Dsizei, GC3Dint* v);
770     void uniform3f(GC3Dint location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z);
771     void uniform3fv(GC3Dint location, GC3Dsizei, GC3Dfloat* v);
772     void uniform3i(GC3Dint location, GC3Dint x, GC3Dint y, GC3Dint z);
773     void uniform3iv(GC3Dint location, GC3Dsizei, GC3Dint* v);
774     void uniform4f(GC3Dint location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w);
775     void uniform4fv(GC3Dint location, GC3Dsizei, GC3Dfloat* v);
776     void uniform4i(GC3Dint location, GC3Dint x, GC3Dint y, GC3Dint z, GC3Dint w);
777     void uniform4iv(GC3Dint location, GC3Dsizei, GC3Dint* v);
778     void uniformMatrix2fv(GC3Dint location, GC3Dsizei, GC3Dboolean transpose, GC3Dfloat* value);
779     void uniformMatrix3fv(GC3Dint location, GC3Dsizei, GC3Dboolean transpose, GC3Dfloat* value);
780     void uniformMatrix4fv(GC3Dint location, GC3Dsizei, GC3Dboolean transpose, GC3Dfloat* value);
781
782     void useProgram(Platform3DObject);
783     void validateProgram(Platform3DObject);
784
785     void vertexAttrib1f(GC3Duint index, GC3Dfloat x);
786     void vertexAttrib1fv(GC3Duint index, GC3Dfloat* values);
787     void vertexAttrib2f(GC3Duint index, GC3Dfloat x, GC3Dfloat y);
788     void vertexAttrib2fv(GC3Duint index, GC3Dfloat* values);
789     void vertexAttrib3f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z);
790     void vertexAttrib3fv(GC3Duint index, GC3Dfloat* values);
791     void vertexAttrib4f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w);
792     void vertexAttrib4fv(GC3Duint index, GC3Dfloat* values);
793     void vertexAttribPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dboolean normalized,
794                              GC3Dsizei stride, GC3Dintptr offset);
795
796     void viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
797
798     void reshape(int width, int height);
799
800 #if USE(CG)
801     static void paintToCanvas(const unsigned char* imagePixels, int imageWidth, int imageHeight,
802                               int canvasWidth, int canvasHeight, CGContextRef);
803 #elif PLATFORM(GTK) || PLATFORM(EFL)
804     void paintToCanvas(const unsigned char* imagePixels, int imageWidth, int imageHeight,
805                        int canvasWidth, int canvasHeight, PlatformContextCairo* context);
806 #elif PLATFORM(QT)
807     void paintToCanvas(const unsigned char* imagePixels, int imageWidth, int imageHeight,
808                        int canvasWidth, int canvasHeight, QPainter* context);
809 #elif PLATFORM(BLACKBERRY)
810     void paintToCanvas(const unsigned char* imagePixels, int imageWidth, int imageHeight,
811                        int canvasWidth, int canvasHeight, GraphicsContext*);
812 #endif
813
814     void markContextChanged();
815     void markLayerComposited();
816     bool layerComposited() const;
817
818     void paintRenderingResultsToCanvas(ImageBuffer*, DrawingBuffer*);
819     PassRefPtr<ImageData> paintRenderingResultsToImageData(DrawingBuffer*);
820     bool paintCompositedResultsToCanvas(ImageBuffer*);
821
822 #if PLATFORM(BLACKBERRY)
823     bool paintsIntoCanvasBuffer() const;
824 #endif
825
826     // Support for buffer creation and deletion
827     Platform3DObject createBuffer();
828     Platform3DObject createFramebuffer();
829     Platform3DObject createProgram();
830     Platform3DObject createRenderbuffer();
831     Platform3DObject createShader(GC3Denum);
832     Platform3DObject createTexture();
833
834     void deleteBuffer(Platform3DObject);
835     void deleteFramebuffer(Platform3DObject);
836     void deleteProgram(Platform3DObject);
837     void deleteRenderbuffer(Platform3DObject);
838     void deleteShader(Platform3DObject);
839     void deleteTexture(Platform3DObject);
840
841     // Synthesizes an OpenGL error which will be returned from a
842     // later call to getError. This is used to emulate OpenGL ES
843     // 2.0 behavior on the desktop and to enforce additional error
844     // checking mandated by WebGL.
845     //
846     // Per the behavior of glGetError, this stores at most one
847     // instance of any given error, and returns them from calls to
848     // getError in the order they were added.
849     void synthesizeGLError(GC3Denum error);
850
851     // Support for extensions. Returns a non-null object, though not
852     // all methods it contains may necessarily be supported on the
853     // current hardware. Must call Extensions3D::supports() to
854     // determine this.
855     Extensions3D* getExtensions();
856
857     IntSize getInternalFramebufferSize() const;
858
859     static unsigned getClearBitsByAttachmentType(GC3Denum);
860     static unsigned getClearBitsByFormat(GC3Denum);
861
862     enum ChannelBits {
863         ChannelRed = 1,
864         ChannelGreen = 2,
865         ChannelBlue = 4,
866         ChannelAlpha = 8,
867         ChannelDepth = 16,
868         ChannelStencil = 32,
869         ChannelRGB = ChannelRed | ChannelGreen | ChannelBlue,
870         ChannelRGBA = ChannelRGB | ChannelAlpha,
871     };
872
873     static unsigned getChannelBitsByFormat(GC3Denum);
874
875   private:
876     GraphicsContext3D(Attributes, HostWindow*, RenderStyle = RenderOffscreen);
877
878     // Each platform must provide an implementation of this method.
879     //
880     // Gets the data for the given Image into outputVector in the
881     // format specified by the (OpenGL-style) format and type
882     // arguments. Despite the fact that the outputVector contains
883     // uint8_t, if the format and type specify packed pixels, then
884     // it will essentially contain uint16_t after the extraction
885     // process.
886     //
887     // If premultiplyAlpha is true, the alpha channel, if any,
888     // will be multiplied into the color channels during the
889     // extraction process. This premultiplication occurs before
890     // any packing of pixel data.
891     //
892     // If ignoreGammaAndColorProfile is true, gamma correction and ICC
893     // profile won't be applied.
894     //
895     // No vertical flip of the image data is performed by this
896     // method.
897     static bool getImageData(Image*,
898                       GC3Denum format,
899                       GC3Denum type,
900                       bool premultiplyAlpha,
901                       bool ignoreGammaAndColorProfile,
902                       Vector<uint8_t>& outputVector);
903
904     // Possible alpha operations that may need to occur during
905     // pixel packing. FIXME: kAlphaDoUnmultiply is lossy and must
906     // be removed.
907     enum AlphaOp {
908         AlphaDoNothing = 0,
909         AlphaDoPremultiply = 1,
910         AlphaDoUnmultiply = 2
911     };
912
913     // Helper for getImageData which implements packing of pixel
914     // data into the specified OpenGL destination format and type.
915     // A sourceUnpackAlignment of zero indicates that the source
916     // data is tightly packed. Non-zero values may take a slow path.
917     // Destination data will have no gaps between rows.
918     static bool packPixels(const uint8_t* sourceData,
919                     SourceDataFormat sourceDataFormat,
920                     unsigned int width,
921                     unsigned int height,
922                     unsigned int sourceUnpackAlignment,
923                     unsigned int destinationFormat,
924                     unsigned int destinationType,
925                     AlphaOp alphaOp,
926                     void* destinationData);
927
928 #if PLATFORM(MAC) || PLATFORM(GTK) || PLATFORM(QT) || PLATFORM(EFL) || PLATFORM(BLACKBERRY)
929     // Take into account the user's requested context creation attributes,
930     // in particular stencil and antialias, and determine which could or
931     // could not be honored based on the capabilities of the OpenGL
932     // implementation.
933     void validateDepthStencil(const char* packedDepthStencilExtension);
934     void validateAttributes();
935
936     // Read rendering results into a pixel array with the same format as the
937     // backbuffer.
938     void readRenderingResults(unsigned char* pixels, int pixelsSize);
939     void readPixelsAndConvertToBGRAIfNecessary(int x, int y, int width, int height, unsigned char* pixels);
940 #endif
941
942 #if PLATFORM(BLACKBERRY)
943     void logFrameBufferStatus(int line);
944     void readPixelsIMG(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data);
945 #endif
946
947     bool reshapeFBOs(const IntSize&);
948     void resolveMultisamplingIfNecessary(const IntRect& = IntRect());
949 #if PLATFORM(QT) && USE(GRAPHICS_SURFACE)
950     void createGraphicsSurfaces(const IntSize&);
951 #endif
952
953     int m_currentWidth, m_currentHeight;
954     bool isResourceSafe();
955
956 #if PLATFORM(MAC)
957     CGLContextObj m_contextObj;
958     RetainPtr<WebGLLayer> m_webGLLayer;
959 #elif PLATFORM(BLACKBERRY)
960 #if USE(ACCELERATED_COMPOSITING)
961     RefPtr<PlatformLayer> m_compositingLayer;
962 #endif
963     void* m_context;
964 #endif
965
966 #if PLATFORM(MAC) || PLATFORM(GTK) || PLATFORM(QT) || PLATFORM(EFL) || PLATFORM(BLACKBERRY)
967     struct ShaderSourceEntry {
968         String source;
969         String log;
970         bool isValid;
971         ShaderSourceEntry()
972             : isValid(0)
973         {
974         }
975     };
976     HashMap<Platform3DObject, ShaderSourceEntry> m_shaderSourceMap;
977
978     ANGLEWebKitBridge m_compiler;
979 #endif
980
981 #if PLATFORM(BLACKBERRY) || (PLATFORM(QT) && defined(QT_OPENGL_ES_2))
982     friend class Extensions3DOpenGLES;
983     OwnPtr<Extensions3DOpenGLES> m_extensions;
984 #elif !PLATFORM(CHROMIUM)
985     friend class Extensions3DOpenGL;
986     OwnPtr<Extensions3DOpenGL> m_extensions;
987 #endif
988     friend class Extensions3DOpenGLCommon;
989
990     Attributes m_attrs;
991     RenderStyle m_renderStyle;
992     Vector<Vector<float> > m_vertexArray;
993
994     GC3Duint m_texture;
995 #if !PLATFORM(BLACKBERRY)
996     GC3Duint m_compositorTexture;
997 #endif
998     GC3Duint m_fbo;
999
1000 #if !PLATFORM(BLACKBERRY)
1001     GC3Duint m_depthBuffer;
1002     GC3Duint m_stencilBuffer;
1003 #endif
1004     GC3Duint m_depthStencilBuffer;
1005
1006     bool m_layerComposited;
1007     GC3Duint m_internalColorFormat;
1008
1009     // For tracking which FBO/texture is bound
1010     GC3Duint m_boundFBO;
1011     GC3Denum m_activeTexture;
1012     GC3Duint m_boundTexture0;
1013
1014     // For multisampling
1015     GC3Duint m_multisampleFBO;
1016     GC3Duint m_multisampleDepthStencilBuffer;
1017     GC3Duint m_multisampleColorBuffer;
1018
1019     // Errors raised by synthesizeGLError().
1020     ListHashSet<GC3Denum> m_syntheticErrors;
1021
1022 #if PLATFORM(BLACKBERRY)
1023     bool m_isImaginationHardware;
1024 #endif
1025
1026 #if !PLATFORM(BLACKBERRY)
1027     friend class GraphicsContext3DPrivate;
1028     OwnPtr<GraphicsContext3DPrivate> m_private;
1029 #endif
1030     bool systemAllowsMultisamplingOnATICards() const;
1031 };
1032
1033 } // namespace WebCore
1034
1035 #endif // GraphicsContext3D_h