webgraphicscontext3d_impl.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef WEBKIT_COMMON_GPU_WEBGRAPHICSCONTEXT3D_IMPL_H_
6#define WEBKIT_COMMON_GPU_WEBGRAPHICSCONTEXT3D_IMPL_H_
7
8#include <string>
9#include <vector>
10
11#include "base/callback.h"
12#include "base/memory/scoped_ptr.h"
13#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
14#include "third_party/WebKit/public/platform/WebString.h"
15#include "webkit/common/gpu/webkit_gpu_export.h"
16
17namespace gpu {
18
19namespace gles2 {
20class GLES2Interface;
21class GLES2ImplementationErrorMessageCallback;
22struct ContextCreationAttribHelper;
23}
24}
25
26using blink::WebGLId;
27
28using blink::WGC3Dbyte;
29using blink::WGC3Dchar;
30using blink::WGC3Denum;
31using blink::WGC3Dboolean;
32using blink::WGC3Dbitfield;
33using blink::WGC3Dint;
34using blink::WGC3Dsizei;
35using blink::WGC3Duint;
36using blink::WGC3Dfloat;
37using blink::WGC3Dclampf;
38using blink::WGC3Dintptr;
39using blink::WGC3Dsizeiptr;
40
41namespace webkit {
42namespace gpu {
43
44class WebGraphicsContext3DErrorMessageCallback;
45
46class WEBKIT_GPU_EXPORT WebGraphicsContext3DImpl
47    : public NON_EXPORTED_BASE(blink::WebGraphicsContext3D) {
48 public:
49  virtual ~WebGraphicsContext3DImpl();
50
51  // Must be called before any of the following methods. Permanently binds to
52  // the first calling thread. Returns false if the graphics context fails to
53  // initialize. Do not call from more than one thread.
54  virtual bool InitializeOnCurrentThread() = 0;
55
56  //----------------------------------------------------------------------
57  // WebGraphicsContext3D methods
58
59  virtual uint32_t lastFlushID();
60
61  virtual unsigned int insertSyncPoint();
62  virtual void waitSyncPoint(unsigned int sync_point);
63
64  virtual void loseContextCHROMIUM(WGC3Denum current, WGC3Denum other);
65
66  virtual void reshapeWithScaleFactor(
67      int width, int height, float scale_factor);
68
69  virtual void prepareTexture();
70  virtual void postSubBufferCHROMIUM(int x, int y, int width, int height);
71
72  virtual void activeTexture(WGC3Denum texture);
73  virtual void attachShader(WebGLId program, WebGLId shader);
74  virtual void bindAttribLocation(WebGLId program, WGC3Duint index,
75                                  const WGC3Dchar* name);
76  virtual void bindBuffer(WGC3Denum target, WebGLId buffer);
77  virtual void bindFramebuffer(WGC3Denum target, WebGLId framebuffer);
78  virtual void bindRenderbuffer(WGC3Denum target, WebGLId renderbuffer);
79  virtual void bindTexture(WGC3Denum target, WebGLId texture);
80  virtual void blendColor(WGC3Dclampf red, WGC3Dclampf green,
81                          WGC3Dclampf blue, WGC3Dclampf alpha);
82  virtual void blendEquation(WGC3Denum mode);
83  virtual void blendEquationSeparate(WGC3Denum modeRGB,
84                                     WGC3Denum modeAlpha);
85  virtual void blendFunc(WGC3Denum sfactor, WGC3Denum dfactor);
86  virtual void blendFuncSeparate(WGC3Denum srcRGB,
87                                 WGC3Denum dstRGB,
88                                 WGC3Denum srcAlpha,
89                                 WGC3Denum dstAlpha);
90
91  virtual void bufferData(WGC3Denum target, WGC3Dsizeiptr size,
92                          const void* data, WGC3Denum usage);
93  virtual void bufferSubData(WGC3Denum target, WGC3Dintptr offset,
94                             WGC3Dsizeiptr size, const void* data);
95
96  virtual WGC3Denum checkFramebufferStatus(WGC3Denum target);
97  virtual void clear(WGC3Dbitfield mask);
98  virtual void clearColor(WGC3Dclampf red, WGC3Dclampf green,
99                          WGC3Dclampf blue, WGC3Dclampf alpha);
100  virtual void clearDepth(WGC3Dclampf depth);
101  virtual void clearStencil(WGC3Dint s);
102  virtual void colorMask(WGC3Dboolean red, WGC3Dboolean green,
103                         WGC3Dboolean blue, WGC3Dboolean alpha);
104  virtual void compileShader(WebGLId shader);
105
106  virtual void compressedTexImage2D(WGC3Denum target,
107                                    WGC3Dint level,
108                                    WGC3Denum internalformat,
109                                    WGC3Dsizei width,
110                                    WGC3Dsizei height,
111                                    WGC3Dint border,
112                                    WGC3Dsizei imageSize,
113                                    const void* data);
114  virtual void compressedTexSubImage2D(WGC3Denum target,
115                                       WGC3Dint level,
116                                       WGC3Dint xoffset,
117                                       WGC3Dint yoffset,
118                                       WGC3Dsizei width,
119                                       WGC3Dsizei height,
120                                       WGC3Denum format,
121                                       WGC3Dsizei imageSize,
122                                       const void* data);
123  virtual void copyTexImage2D(WGC3Denum target,
124                              WGC3Dint level,
125                              WGC3Denum internalformat,
126                              WGC3Dint x,
127                              WGC3Dint y,
128                              WGC3Dsizei width,
129                              WGC3Dsizei height,
130                              WGC3Dint border);
131  virtual void copyTexSubImage2D(WGC3Denum target,
132                                 WGC3Dint level,
133                                 WGC3Dint xoffset,
134                                 WGC3Dint yoffset,
135                                 WGC3Dint x,
136                                 WGC3Dint y,
137                                 WGC3Dsizei width,
138                                 WGC3Dsizei height);
139  virtual void cullFace(WGC3Denum mode);
140  virtual void depthFunc(WGC3Denum func);
141  virtual void depthMask(WGC3Dboolean flag);
142  virtual void depthRange(WGC3Dclampf zNear, WGC3Dclampf zFar);
143  virtual void detachShader(WebGLId program, WebGLId shader);
144  virtual void disable(WGC3Denum cap);
145  virtual void disableVertexAttribArray(WGC3Duint index);
146  virtual void drawArrays(WGC3Denum mode, WGC3Dint first, WGC3Dsizei count);
147  virtual void drawElements(WGC3Denum mode,
148                            WGC3Dsizei count,
149                            WGC3Denum type,
150                            WGC3Dintptr offset);
151
152  virtual void enable(WGC3Denum cap);
153  virtual void enableVertexAttribArray(WGC3Duint index);
154  virtual void finish();
155  virtual void flush();
156  virtual void framebufferRenderbuffer(WGC3Denum target,
157                                       WGC3Denum attachment,
158                                       WGC3Denum renderbuffertarget,
159                                       WebGLId renderbuffer);
160  virtual void framebufferTexture2D(WGC3Denum target,
161                                    WGC3Denum attachment,
162                                    WGC3Denum textarget,
163                                    WebGLId texture,
164                                    WGC3Dint level);
165  virtual void frontFace(WGC3Denum mode);
166  virtual void generateMipmap(WGC3Denum target);
167
168  virtual bool getActiveAttrib(WebGLId program,
169                               WGC3Duint index,
170                               ActiveInfo&);
171  virtual bool getActiveUniform(WebGLId program,
172                                WGC3Duint index,
173                                ActiveInfo&);
174
175  virtual void getAttachedShaders(WebGLId program,
176                                  WGC3Dsizei maxCount,
177                                  WGC3Dsizei* count,
178                                  WebGLId* shaders);
179
180  virtual WGC3Dint  getAttribLocation(WebGLId program, const WGC3Dchar* name);
181
182  virtual void getBooleanv(WGC3Denum pname, WGC3Dboolean* value);
183
184  virtual void getBufferParameteriv(WGC3Denum target,
185                                    WGC3Denum pname,
186                                    WGC3Dint* value);
187
188  virtual WGC3Denum getError();
189
190  virtual void getFloatv(WGC3Denum pname, WGC3Dfloat* value);
191
192  virtual void getFramebufferAttachmentParameteriv(WGC3Denum target,
193                                                   WGC3Denum attachment,
194                                                   WGC3Denum pname,
195                                                   WGC3Dint* value);
196
197  virtual void getIntegerv(WGC3Denum pname, WGC3Dint* value);
198
199  virtual void getProgramiv(WebGLId program, WGC3Denum pname, WGC3Dint* value);
200
201  virtual blink::WebString getProgramInfoLog(WebGLId program);
202
203  virtual void getRenderbufferParameteriv(WGC3Denum target,
204                                          WGC3Denum pname,
205                                          WGC3Dint* value);
206
207  virtual void getShaderiv(WebGLId shader, WGC3Denum pname, WGC3Dint* value);
208
209  virtual blink::WebString getShaderInfoLog(WebGLId shader);
210
211  virtual void getShaderPrecisionFormat(WGC3Denum shadertype,
212                                        WGC3Denum precisiontype,
213                                        WGC3Dint* range,
214                                        WGC3Dint* precision);
215
216  virtual blink::WebString getShaderSource(WebGLId shader);
217  virtual blink::WebString getString(WGC3Denum name);
218
219  virtual void getTexParameterfv(WGC3Denum target,
220                                 WGC3Denum pname,
221                                 WGC3Dfloat* value);
222  virtual void getTexParameteriv(WGC3Denum target,
223                                 WGC3Denum pname,
224                                 WGC3Dint* value);
225
226  virtual void getUniformfv(WebGLId program,
227                            WGC3Dint location,
228                            WGC3Dfloat* value);
229  virtual void getUniformiv(WebGLId program,
230                            WGC3Dint location,
231                            WGC3Dint* value);
232
233  virtual WGC3Dint getUniformLocation(WebGLId program, const WGC3Dchar* name);
234
235  virtual void getVertexAttribfv(WGC3Duint index, WGC3Denum pname,
236                                 WGC3Dfloat* value);
237  virtual void getVertexAttribiv(WGC3Duint index, WGC3Denum pname,
238                                 WGC3Dint* value);
239
240  virtual WGC3Dsizeiptr getVertexAttribOffset(WGC3Duint index, WGC3Denum pname);
241
242  virtual void hint(WGC3Denum target, WGC3Denum mode);
243  virtual WGC3Dboolean isBuffer(WebGLId buffer);
244  virtual WGC3Dboolean isEnabled(WGC3Denum cap);
245  virtual WGC3Dboolean isFramebuffer(WebGLId framebuffer);
246  virtual WGC3Dboolean isProgram(WebGLId program);
247  virtual WGC3Dboolean isRenderbuffer(WebGLId renderbuffer);
248  virtual WGC3Dboolean isShader(WebGLId shader);
249  virtual WGC3Dboolean isTexture(WebGLId texture);
250  virtual void lineWidth(WGC3Dfloat);
251  virtual void linkProgram(WebGLId program);
252  virtual void pixelStorei(WGC3Denum pname, WGC3Dint param);
253  virtual void polygonOffset(WGC3Dfloat factor, WGC3Dfloat units);
254
255  virtual void readPixels(WGC3Dint x,
256                          WGC3Dint y,
257                          WGC3Dsizei width,
258                          WGC3Dsizei height,
259                          WGC3Denum format,
260                          WGC3Denum type,
261                          void* pixels);
262
263  virtual void releaseShaderCompiler();
264  virtual void renderbufferStorage(WGC3Denum target,
265                                   WGC3Denum internalformat,
266                                   WGC3Dsizei width,
267                                   WGC3Dsizei height);
268  virtual void sampleCoverage(WGC3Dfloat value, WGC3Dboolean invert);
269  virtual void scissor(WGC3Dint x, WGC3Dint y,
270                       WGC3Dsizei width, WGC3Dsizei height);
271  virtual void shaderSource(WebGLId shader, const WGC3Dchar* string);
272  virtual void stencilFunc(WGC3Denum func, WGC3Dint ref, WGC3Duint mask);
273  virtual void stencilFuncSeparate(WGC3Denum face,
274                                   WGC3Denum func,
275                                   WGC3Dint ref,
276                                   WGC3Duint mask);
277  virtual void stencilMask(WGC3Duint mask);
278  virtual void stencilMaskSeparate(WGC3Denum face, WGC3Duint mask);
279  virtual void stencilOp(WGC3Denum fail,
280                         WGC3Denum zfail,
281                         WGC3Denum zpass);
282  virtual void stencilOpSeparate(WGC3Denum face,
283                                 WGC3Denum fail,
284                                 WGC3Denum zfail,
285                                 WGC3Denum zpass);
286
287  virtual void texImage2D(WGC3Denum target,
288                          WGC3Dint level,
289                          WGC3Denum internalformat,
290                          WGC3Dsizei width,
291                          WGC3Dsizei height,
292                          WGC3Dint border,
293                          WGC3Denum format,
294                          WGC3Denum type,
295                          const void* pixels);
296
297  virtual void texParameterf(WGC3Denum target,
298                             WGC3Denum pname,
299                             WGC3Dfloat param);
300  virtual void texParameteri(WGC3Denum target,
301                             WGC3Denum pname,
302                             WGC3Dint param);
303
304  virtual void texSubImage2D(WGC3Denum target,
305                             WGC3Dint level,
306                             WGC3Dint xoffset,
307                             WGC3Dint yoffset,
308                             WGC3Dsizei width,
309                             WGC3Dsizei height,
310                             WGC3Denum format,
311                             WGC3Denum type,
312                             const void* pixels);
313
314  virtual void uniform1f(WGC3Dint location, WGC3Dfloat x);
315  virtual void uniform1fv(WGC3Dint location,
316                          WGC3Dsizei count, const WGC3Dfloat* v);
317  virtual void uniform1i(WGC3Dint location, WGC3Dint x);
318  virtual void uniform1iv(WGC3Dint location,
319                          WGC3Dsizei count, const WGC3Dint* v);
320  virtual void uniform2f(WGC3Dint location, WGC3Dfloat x, WGC3Dfloat y);
321  virtual void uniform2fv(WGC3Dint location,
322                          WGC3Dsizei count, const WGC3Dfloat* v);
323  virtual void uniform2i(WGC3Dint location, WGC3Dint x, WGC3Dint y);
324  virtual void uniform2iv(WGC3Dint location,
325                          WGC3Dsizei count, const WGC3Dint* v);
326  virtual void uniform3f(WGC3Dint location,
327                         WGC3Dfloat x, WGC3Dfloat y, WGC3Dfloat z);
328  virtual void uniform3fv(WGC3Dint location,
329                          WGC3Dsizei count, const WGC3Dfloat* v);
330  virtual void uniform3i(WGC3Dint location,
331                         WGC3Dint x, WGC3Dint y, WGC3Dint z);
332  virtual void uniform3iv(WGC3Dint location,
333                          WGC3Dsizei count, const WGC3Dint* v);
334  virtual void uniform4f(WGC3Dint location,
335                         WGC3Dfloat x, WGC3Dfloat y,
336                         WGC3Dfloat z, WGC3Dfloat w);
337  virtual void uniform4fv(WGC3Dint location,
338                          WGC3Dsizei count, const WGC3Dfloat* v);
339  virtual void uniform4i(WGC3Dint location,
340                         WGC3Dint x, WGC3Dint y, WGC3Dint z, WGC3Dint w);
341  virtual void uniform4iv(WGC3Dint location,
342                          WGC3Dsizei count, const WGC3Dint* v);
343  virtual void uniformMatrix2fv(WGC3Dint location,
344                                WGC3Dsizei count,
345                                WGC3Dboolean transpose,
346                                const WGC3Dfloat* value);
347  virtual void uniformMatrix3fv(WGC3Dint location,
348                                WGC3Dsizei count,
349                                WGC3Dboolean transpose,
350                                const WGC3Dfloat* value);
351  virtual void uniformMatrix4fv(WGC3Dint location,
352                                WGC3Dsizei count,
353                                WGC3Dboolean transpose,
354                                const WGC3Dfloat* value);
355
356  virtual void useProgram(WebGLId program);
357  virtual void validateProgram(WebGLId program);
358
359  virtual void vertexAttrib1f(WGC3Duint index, WGC3Dfloat x);
360  virtual void vertexAttrib1fv(WGC3Duint index, const WGC3Dfloat* values);
361  virtual void vertexAttrib2f(WGC3Duint index, WGC3Dfloat x, WGC3Dfloat y);
362  virtual void vertexAttrib2fv(WGC3Duint index, const WGC3Dfloat* values);
363  virtual void vertexAttrib3f(WGC3Duint index,
364                              WGC3Dfloat x, WGC3Dfloat y, WGC3Dfloat z);
365  virtual void vertexAttrib3fv(WGC3Duint index, const WGC3Dfloat* values);
366  virtual void vertexAttrib4f(WGC3Duint index,
367                              WGC3Dfloat x, WGC3Dfloat y,
368                              WGC3Dfloat z, WGC3Dfloat w);
369  virtual void vertexAttrib4fv(WGC3Duint index, const WGC3Dfloat* values);
370  virtual void vertexAttribPointer(WGC3Duint index,
371                                   WGC3Dint size,
372                                   WGC3Denum type,
373                                   WGC3Dboolean normalized,
374                                   WGC3Dsizei stride,
375                                   WGC3Dintptr offset);
376
377  virtual void viewport(WGC3Dint x, WGC3Dint y,
378                        WGC3Dsizei width, WGC3Dsizei height);
379
380  // Support for buffer creation and deletion
381  virtual void genBuffers(WGC3Dsizei count, WebGLId* ids);
382  virtual void genFramebuffers(WGC3Dsizei count, WebGLId* ids);
383  virtual void genRenderbuffers(WGC3Dsizei count, WebGLId* ids);
384  virtual void genTextures(WGC3Dsizei count, WebGLId* ids);
385
386  virtual void deleteBuffers(WGC3Dsizei count, WebGLId* ids);
387  virtual void deleteFramebuffers(WGC3Dsizei count, WebGLId* ids);
388  virtual void deleteRenderbuffers(WGC3Dsizei count, WebGLId* ids);
389  virtual void deleteTextures(WGC3Dsizei count, WebGLId* ids);
390
391  virtual WebGLId createBuffer();
392  virtual WebGLId createFramebuffer();
393  virtual WebGLId createRenderbuffer();
394  virtual WebGLId createTexture();
395
396  virtual void deleteBuffer(WebGLId);
397  virtual void deleteFramebuffer(WebGLId);
398  virtual void deleteRenderbuffer(WebGLId);
399  virtual void deleteTexture(WebGLId);
400
401  virtual WebGLId createProgram();
402  virtual WebGLId createShader(WGC3Denum);
403
404  virtual void deleteProgram(WebGLId);
405  virtual void deleteShader(WebGLId);
406
407  virtual void synthesizeGLError(WGC3Denum);
408
409  virtual void* mapBufferSubDataCHROMIUM(
410      WGC3Denum target, WGC3Dintptr offset,
411      WGC3Dsizeiptr size, WGC3Denum access);
412  virtual void unmapBufferSubDataCHROMIUM(const void*);
413  virtual void* mapTexSubImage2DCHROMIUM(
414      WGC3Denum target,
415      WGC3Dint level,
416      WGC3Dint xoffset,
417      WGC3Dint yoffset,
418      WGC3Dsizei width,
419      WGC3Dsizei height,
420      WGC3Denum format,
421      WGC3Denum type,
422      WGC3Denum access);
423  virtual void unmapTexSubImage2DCHROMIUM(const void*);
424
425  virtual void setVisibilityCHROMIUM(bool visible);
426
427  virtual void discardFramebufferEXT(WGC3Denum target,
428                                     WGC3Dsizei numAttachments,
429                                     const WGC3Denum* attachments);
430  virtual void copyTextureToParentTextureCHROMIUM(
431      WebGLId texture, WebGLId parentTexture);
432
433  virtual blink::WebString getRequestableExtensionsCHROMIUM();
434  virtual void requestExtensionCHROMIUM(const char*);
435
436  virtual void blitFramebufferCHROMIUM(
437      WGC3Dint srcX0, WGC3Dint srcY0, WGC3Dint srcX1, WGC3Dint srcY1,
438      WGC3Dint dstX0, WGC3Dint dstY0, WGC3Dint dstX1, WGC3Dint dstY1,
439      WGC3Dbitfield mask, WGC3Denum filter);
440  virtual void renderbufferStorageMultisampleCHROMIUM(
441      WGC3Denum target, WGC3Dsizei samples, WGC3Denum internalformat,
442      WGC3Dsizei width, WGC3Dsizei height);
443
444  virtual blink::WebString getTranslatedShaderSourceANGLE(WebGLId shader);
445
446  virtual void setContextLostCallback(
447      WebGraphicsContext3D::WebGraphicsContextLostCallback* callback);
448
449  virtual void setErrorMessageCallback(
450      WebGraphicsContext3D::WebGraphicsErrorMessageCallback* callback);
451
452  virtual void texImageIOSurface2DCHROMIUM(
453      WGC3Denum target, WGC3Dint width, WGC3Dint height,
454      WGC3Duint ioSurfaceId, WGC3Duint plane);
455
456  virtual void texStorage2DEXT(
457      WGC3Denum target, WGC3Dint levels, WGC3Duint internalformat,
458      WGC3Dint width, WGC3Dint height);
459
460  virtual WebGLId createQueryEXT();
461  virtual void deleteQueryEXT(WebGLId query);
462  virtual WGC3Dboolean isQueryEXT(WGC3Duint query);
463  virtual void beginQueryEXT(WGC3Denum target, WebGLId query);
464  virtual void endQueryEXT(WGC3Denum target);
465  virtual void getQueryivEXT(
466      WGC3Denum target, WGC3Denum pname, WGC3Dint* params);
467  virtual void getQueryObjectuivEXT(
468      WebGLId query, WGC3Denum pname, WGC3Duint* params);
469
470  virtual void copyTextureCHROMIUM(WGC3Denum target, WebGLId source_id,
471                                   WebGLId dest_id, WGC3Dint level,
472                                   WGC3Denum internal_format,
473                                   WGC3Denum dest_type);
474
475  virtual void bindUniformLocationCHROMIUM(WebGLId program, WGC3Dint location,
476                                           const WGC3Dchar* uniform);
477
478  virtual void shallowFlushCHROMIUM();
479  virtual void shallowFinishCHROMIUM();
480
481  virtual void genMailboxCHROMIUM(WGC3Dbyte* mailbox);
482  virtual void produceTextureCHROMIUM(WGC3Denum target,
483                                      const WGC3Dbyte* mailbox);
484  virtual void produceTextureDirectCHROMIUM(WebGLId texture, WGC3Denum target,
485                                      const WGC3Dbyte* mailbox);
486  virtual void consumeTextureCHROMIUM(WGC3Denum target,
487                                      const WGC3Dbyte* mailbox);
488  virtual WebGLId createAndConsumeTextureCHROMIUM(WGC3Denum target,
489                                      const WGC3Dbyte* mailbox);
490
491  virtual void insertEventMarkerEXT(const WGC3Dchar* marker);
492  virtual void pushGroupMarkerEXT(const WGC3Dchar* marker);
493  virtual void popGroupMarkerEXT();
494
495  // GL_OES_vertex_array_object
496  virtual WebGLId createVertexArrayOES();
497  virtual void deleteVertexArrayOES(WebGLId array);
498  virtual WGC3Dboolean isVertexArrayOES(WebGLId array);
499  virtual void bindVertexArrayOES(WebGLId array);
500
501  virtual void bindTexImage2DCHROMIUM(WGC3Denum target, WGC3Dint image_id);
502  virtual void releaseTexImage2DCHROMIUM(WGC3Denum target, WGC3Dint image_id);
503
504  virtual void* mapBufferCHROMIUM(WGC3Denum target, WGC3Denum access);
505  virtual WGC3Dboolean unmapBufferCHROMIUM(WGC3Denum target);
506
507  // Async pixel transfer functions.
508  virtual void asyncTexImage2DCHROMIUM(
509      WGC3Denum target,
510      WGC3Dint level,
511      WGC3Denum internalformat,
512      WGC3Dsizei width,
513      WGC3Dsizei height,
514      WGC3Dint border,
515      WGC3Denum format,
516      WGC3Denum type,
517      const void* pixels);
518  virtual void asyncTexSubImage2DCHROMIUM(
519      WGC3Denum target,
520      WGC3Dint level,
521      WGC3Dint xoffset,
522      WGC3Dint yoffset,
523      WGC3Dsizei width,
524      WGC3Dsizei height,
525      WGC3Denum format,
526      WGC3Denum type,
527      const void* pixels);
528  virtual void waitAsyncTexImage2DCHROMIUM(WGC3Denum target);
529
530  // GL_EXT_draw_buffers
531  virtual void drawBuffersEXT(
532      WGC3Dsizei n,
533      const WGC3Denum* bufs);
534
535  // GL_ANGLE_instanced_arrays
536  virtual void drawArraysInstancedANGLE(WGC3Denum mode, WGC3Dint first,
537      WGC3Dsizei count, WGC3Dsizei primcount);
538  virtual void drawElementsInstancedANGLE(WGC3Denum mode, WGC3Dsizei count,
539      WGC3Denum type, WGC3Dintptr offset, WGC3Dsizei primcount);
540  virtual void vertexAttribDivisorANGLE(WGC3Duint index, WGC3Duint divisor);
541
542  // GL_CHROMIUM_map_image
543  virtual WGC3Duint createImageCHROMIUM(WGC3Dsizei width,
544                                        WGC3Dsizei height,
545                                        WGC3Denum internalformat,
546                                        WGC3Denum usage);
547  virtual void destroyImageCHROMIUM(WGC3Duint image_id);
548  virtual void getImageParameterivCHROMIUM(
549      WGC3Duint image_id, WGC3Denum pname, WGC3Dint* params);
550  virtual void* mapImageCHROMIUM(WGC3Duint image_id);
551  virtual void unmapImageCHROMIUM(WGC3Duint image_id);
552
553  // GL_EXT_multisampled_render_to_texture
554  virtual void framebufferTexture2DMultisampleEXT(WGC3Denum target,
555                                    WGC3Denum attachment,
556                                    WGC3Denum textarget,
557                                    WebGLId texture,
558                                    WGC3Dint level,
559                                    WGC3Dsizei samples);
560  virtual void renderbufferStorageMultisampleEXT(
561      WGC3Denum target, WGC3Dsizei samples, WGC3Denum internalformat,
562      WGC3Dsizei width, WGC3Dsizei height);
563
564  virtual GrGLInterface* createGrGLInterface();
565
566  ::gpu::gles2::GLES2Interface* GetGLInterface() {
567    return gl_;
568  }
569
570  // Convert WebGL context creation attributes into command buffer / EGL size
571  // requests.
572  static void ConvertAttributes(
573      const blink::WebGraphicsContext3D::Attributes& attributes,
574      ::gpu::gles2::ContextCreationAttribHelper* output_attribs);
575
576 protected:
577  friend class WebGraphicsContext3DErrorMessageCallback;
578
579  WebGraphicsContext3DImpl();
580
581  ::gpu::gles2::GLES2ImplementationErrorMessageCallback*
582      getErrorMessageCallback();
583  virtual void OnErrorMessage(const std::string& message, int id);
584
585  void setGLInterface(::gpu::gles2::GLES2Interface* gl) {
586    gl_ = gl;
587  }
588
589  bool initialized_;
590  bool initialize_failed_;
591
592  WebGraphicsContext3D::WebGraphicsContextLostCallback* context_lost_callback_;
593  WGC3Denum context_lost_reason_;
594
595  WebGraphicsContext3D::WebGraphicsErrorMessageCallback*
596      error_message_callback_;
597  scoped_ptr<WebGraphicsContext3DErrorMessageCallback>
598      client_error_message_callback_;
599
600  // Errors raised by synthesizeGLError().
601  std::vector<WGC3Denum> synthetic_errors_;
602
603  ::gpu::gles2::GLES2Interface* gl_;
604  bool lose_context_when_out_of_memory_;
605  uint32_t flush_id_;
606};
607
608}  // namespace gpu
609}  // namespace webkit
610
611#endif  // WEBKIT_COMMON_GPU_WEBGRAPHICSCONTEXT3D_IMPL_H_
612