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