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.
5 #ifndef WEBKIT_COMMON_GPU_WEBGRAPHICSCONTEXT3D_IMPL_H_
6 #define WEBKIT_COMMON_GPU_WEBGRAPHICSCONTEXT3D_IMPL_H_
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"
21 class GLES2ImplementationErrorMessageCallback;
22 struct ContextCreationAttribHelper;
28 using blink::WGC3Dbyte;
29 using blink::WGC3Dchar;
30 using blink::WGC3Denum;
31 using blink::WGC3Dboolean;
32 using blink::WGC3Dbitfield;
33 using blink::WGC3Dint;
34 using blink::WGC3Dsizei;
35 using blink::WGC3Duint;
36 using blink::WGC3Dfloat;
37 using blink::WGC3Dclampf;
38 using blink::WGC3Dintptr;
39 using blink::WGC3Dsizeiptr;
44 class WebGraphicsContext3DErrorMessageCallback;
46 class WEBKIT_GPU_EXPORT WebGraphicsContext3DImpl
47 : public NON_EXPORTED_BASE(blink::WebGraphicsContext3D) {
49 //----------------------------------------------------------------------
50 // WebGraphicsContext3D methods
52 virtual uint32_t lastFlushID();
54 virtual unsigned int insertSyncPoint();
55 virtual void waitSyncPoint(unsigned int sync_point);
57 virtual void loseContextCHROMIUM(WGC3Denum current, WGC3Denum other);
59 virtual void reshapeWithScaleFactor(
60 int width, int height, float scale_factor);
62 virtual void prepareTexture();
63 virtual void postSubBufferCHROMIUM(int x, int y, int width, int height);
65 virtual void activeTexture(WGC3Denum texture);
66 virtual void attachShader(WebGLId program, WebGLId shader);
67 virtual void bindAttribLocation(WebGLId program, WGC3Duint index,
68 const WGC3Dchar* name);
69 virtual void bindBuffer(WGC3Denum target, WebGLId buffer);
70 virtual void bindFramebuffer(WGC3Denum target, WebGLId framebuffer);
71 virtual void bindRenderbuffer(WGC3Denum target, WebGLId renderbuffer);
72 virtual void bindTexture(WGC3Denum target, WebGLId texture);
73 virtual void blendColor(WGC3Dclampf red, WGC3Dclampf green,
74 WGC3Dclampf blue, WGC3Dclampf alpha);
75 virtual void blendEquation(WGC3Denum mode);
76 virtual void blendEquationSeparate(WGC3Denum modeRGB,
78 virtual void blendFunc(WGC3Denum sfactor, WGC3Denum dfactor);
79 virtual void blendFuncSeparate(WGC3Denum srcRGB,
84 virtual void bufferData(WGC3Denum target, WGC3Dsizeiptr size,
85 const void* data, WGC3Denum usage);
86 virtual void bufferSubData(WGC3Denum target, WGC3Dintptr offset,
87 WGC3Dsizeiptr size, const void* data);
89 virtual WGC3Denum checkFramebufferStatus(WGC3Denum target);
90 virtual void clear(WGC3Dbitfield mask);
91 virtual void clearColor(WGC3Dclampf red, WGC3Dclampf green,
92 WGC3Dclampf blue, WGC3Dclampf alpha);
93 virtual void clearDepth(WGC3Dclampf depth);
94 virtual void clearStencil(WGC3Dint s);
95 virtual void colorMask(WGC3Dboolean red, WGC3Dboolean green,
96 WGC3Dboolean blue, WGC3Dboolean alpha);
97 virtual void compileShader(WebGLId shader);
99 virtual void compressedTexImage2D(WGC3Denum target,
101 WGC3Denum internalformat,
105 WGC3Dsizei imageSize,
107 virtual void compressedTexSubImage2D(WGC3Denum target,
114 WGC3Dsizei imageSize,
116 virtual void copyTexImage2D(WGC3Denum target,
118 WGC3Denum internalformat,
124 virtual void copyTexSubImage2D(WGC3Denum target,
132 virtual void cullFace(WGC3Denum mode);
133 virtual void depthFunc(WGC3Denum func);
134 virtual void depthMask(WGC3Dboolean flag);
135 virtual void depthRange(WGC3Dclampf zNear, WGC3Dclampf zFar);
136 virtual void detachShader(WebGLId program, WebGLId shader);
137 virtual void disable(WGC3Denum cap);
138 virtual void disableVertexAttribArray(WGC3Duint index);
139 virtual void drawArrays(WGC3Denum mode, WGC3Dint first, WGC3Dsizei count);
140 virtual void drawElements(WGC3Denum mode,
145 virtual void enable(WGC3Denum cap);
146 virtual void enableVertexAttribArray(WGC3Duint index);
147 virtual void finish();
148 virtual void flush();
149 virtual void framebufferRenderbuffer(WGC3Denum target,
150 WGC3Denum attachment,
151 WGC3Denum renderbuffertarget,
152 WebGLId renderbuffer);
153 virtual void framebufferTexture2D(WGC3Denum target,
154 WGC3Denum attachment,
158 virtual void frontFace(WGC3Denum mode);
159 virtual void generateMipmap(WGC3Denum target);
161 virtual bool getActiveAttrib(WebGLId program,
164 virtual bool getActiveUniform(WebGLId program,
168 virtual void getAttachedShaders(WebGLId program,
173 virtual WGC3Dint getAttribLocation(WebGLId program, const WGC3Dchar* name);
175 virtual void getBooleanv(WGC3Denum pname, WGC3Dboolean* value);
177 virtual void getBufferParameteriv(WGC3Denum target,
181 virtual WGC3Denum getError();
183 virtual void getFloatv(WGC3Denum pname, WGC3Dfloat* value);
185 virtual void getFramebufferAttachmentParameteriv(WGC3Denum target,
186 WGC3Denum attachment,
190 virtual void getIntegerv(WGC3Denum pname, WGC3Dint* value);
192 virtual void getProgramiv(WebGLId program, WGC3Denum pname, WGC3Dint* value);
194 virtual blink::WebString getProgramInfoLog(WebGLId program);
196 virtual void getRenderbufferParameteriv(WGC3Denum target,
200 virtual void getShaderiv(WebGLId shader, WGC3Denum pname, WGC3Dint* value);
202 virtual blink::WebString getShaderInfoLog(WebGLId shader);
204 virtual void getShaderPrecisionFormat(WGC3Denum shadertype,
205 WGC3Denum precisiontype,
207 WGC3Dint* precision);
209 virtual blink::WebString getShaderSource(WebGLId shader);
210 virtual blink::WebString getString(WGC3Denum name);
212 virtual void getTexParameterfv(WGC3Denum target,
215 virtual void getTexParameteriv(WGC3Denum target,
219 virtual void getUniformfv(WebGLId program,
222 virtual void getUniformiv(WebGLId program,
226 virtual WGC3Dint getUniformLocation(WebGLId program, const WGC3Dchar* name);
228 virtual void getVertexAttribfv(WGC3Duint index, WGC3Denum pname,
230 virtual void getVertexAttribiv(WGC3Duint index, WGC3Denum pname,
233 virtual WGC3Dsizeiptr getVertexAttribOffset(WGC3Duint index, WGC3Denum pname);
235 virtual void hint(WGC3Denum target, WGC3Denum mode);
236 virtual WGC3Dboolean isBuffer(WebGLId buffer);
237 virtual WGC3Dboolean isEnabled(WGC3Denum cap);
238 virtual WGC3Dboolean isFramebuffer(WebGLId framebuffer);
239 virtual WGC3Dboolean isProgram(WebGLId program);
240 virtual WGC3Dboolean isRenderbuffer(WebGLId renderbuffer);
241 virtual WGC3Dboolean isShader(WebGLId shader);
242 virtual WGC3Dboolean isTexture(WebGLId texture);
243 virtual void lineWidth(WGC3Dfloat);
244 virtual void linkProgram(WebGLId program);
245 virtual void pixelStorei(WGC3Denum pname, WGC3Dint param);
246 virtual void polygonOffset(WGC3Dfloat factor, WGC3Dfloat units);
248 virtual void readPixels(WGC3Dint x,
256 virtual void releaseShaderCompiler();
257 virtual void renderbufferStorage(WGC3Denum target,
258 WGC3Denum internalformat,
261 virtual void sampleCoverage(WGC3Dfloat value, WGC3Dboolean invert);
262 virtual void scissor(WGC3Dint x, WGC3Dint y,
263 WGC3Dsizei width, WGC3Dsizei height);
264 virtual void shaderSource(WebGLId shader, const WGC3Dchar* string);
265 virtual void stencilFunc(WGC3Denum func, WGC3Dint ref, WGC3Duint mask);
266 virtual void stencilFuncSeparate(WGC3Denum face,
270 virtual void stencilMask(WGC3Duint mask);
271 virtual void stencilMaskSeparate(WGC3Denum face, WGC3Duint mask);
272 virtual void stencilOp(WGC3Denum fail,
275 virtual void stencilOpSeparate(WGC3Denum face,
280 virtual void texImage2D(WGC3Denum target,
282 WGC3Denum internalformat,
290 virtual void texParameterf(WGC3Denum target,
293 virtual void texParameteri(WGC3Denum target,
297 virtual void texSubImage2D(WGC3Denum target,
307 virtual void uniform1f(WGC3Dint location, WGC3Dfloat x);
308 virtual void uniform1fv(WGC3Dint location,
309 WGC3Dsizei count, const WGC3Dfloat* v);
310 virtual void uniform1i(WGC3Dint location, WGC3Dint x);
311 virtual void uniform1iv(WGC3Dint location,
312 WGC3Dsizei count, const WGC3Dint* v);
313 virtual void uniform2f(WGC3Dint location, WGC3Dfloat x, WGC3Dfloat y);
314 virtual void uniform2fv(WGC3Dint location,
315 WGC3Dsizei count, const WGC3Dfloat* v);
316 virtual void uniform2i(WGC3Dint location, WGC3Dint x, WGC3Dint y);
317 virtual void uniform2iv(WGC3Dint location,
318 WGC3Dsizei count, const WGC3Dint* v);
319 virtual void uniform3f(WGC3Dint location,
320 WGC3Dfloat x, WGC3Dfloat y, WGC3Dfloat z);
321 virtual void uniform3fv(WGC3Dint location,
322 WGC3Dsizei count, const WGC3Dfloat* v);
323 virtual void uniform3i(WGC3Dint location,
324 WGC3Dint x, WGC3Dint y, WGC3Dint z);
325 virtual void uniform3iv(WGC3Dint location,
326 WGC3Dsizei count, const WGC3Dint* v);
327 virtual void uniform4f(WGC3Dint location,
328 WGC3Dfloat x, WGC3Dfloat y,
329 WGC3Dfloat z, WGC3Dfloat w);
330 virtual void uniform4fv(WGC3Dint location,
331 WGC3Dsizei count, const WGC3Dfloat* v);
332 virtual void uniform4i(WGC3Dint location,
333 WGC3Dint x, WGC3Dint y, WGC3Dint z, WGC3Dint w);
334 virtual void uniform4iv(WGC3Dint location,
335 WGC3Dsizei count, const WGC3Dint* v);
336 virtual void uniformMatrix2fv(WGC3Dint location,
338 WGC3Dboolean transpose,
339 const WGC3Dfloat* value);
340 virtual void uniformMatrix3fv(WGC3Dint location,
342 WGC3Dboolean transpose,
343 const WGC3Dfloat* value);
344 virtual void uniformMatrix4fv(WGC3Dint location,
346 WGC3Dboolean transpose,
347 const WGC3Dfloat* value);
349 virtual void useProgram(WebGLId program);
350 virtual void validateProgram(WebGLId program);
352 virtual void vertexAttrib1f(WGC3Duint index, WGC3Dfloat x);
353 virtual void vertexAttrib1fv(WGC3Duint index, const WGC3Dfloat* values);
354 virtual void vertexAttrib2f(WGC3Duint index, WGC3Dfloat x, WGC3Dfloat y);
355 virtual void vertexAttrib2fv(WGC3Duint index, const WGC3Dfloat* values);
356 virtual void vertexAttrib3f(WGC3Duint index,
357 WGC3Dfloat x, WGC3Dfloat y, WGC3Dfloat z);
358 virtual void vertexAttrib3fv(WGC3Duint index, const WGC3Dfloat* values);
359 virtual void vertexAttrib4f(WGC3Duint index,
360 WGC3Dfloat x, WGC3Dfloat y,
361 WGC3Dfloat z, WGC3Dfloat w);
362 virtual void vertexAttrib4fv(WGC3Duint index, const WGC3Dfloat* values);
363 virtual void vertexAttribPointer(WGC3Duint index,
366 WGC3Dboolean normalized,
370 virtual void viewport(WGC3Dint x, WGC3Dint y,
371 WGC3Dsizei width, WGC3Dsizei height);
373 // Support for buffer creation and deletion
374 virtual void genBuffers(WGC3Dsizei count, WebGLId* ids);
375 virtual void genFramebuffers(WGC3Dsizei count, WebGLId* ids);
376 virtual void genRenderbuffers(WGC3Dsizei count, WebGLId* ids);
377 virtual void genTextures(WGC3Dsizei count, WebGLId* ids);
379 virtual void deleteBuffers(WGC3Dsizei count, WebGLId* ids);
380 virtual void deleteFramebuffers(WGC3Dsizei count, WebGLId* ids);
381 virtual void deleteRenderbuffers(WGC3Dsizei count, WebGLId* ids);
382 virtual void deleteTextures(WGC3Dsizei count, WebGLId* ids);
384 virtual WebGLId createBuffer();
385 virtual WebGLId createFramebuffer();
386 virtual WebGLId createRenderbuffer();
387 virtual WebGLId createTexture();
389 virtual void deleteBuffer(WebGLId);
390 virtual void deleteFramebuffer(WebGLId);
391 virtual void deleteRenderbuffer(WebGLId);
392 virtual void deleteTexture(WebGLId);
394 virtual WebGLId createProgram();
395 virtual WebGLId createShader(WGC3Denum);
397 virtual void deleteProgram(WebGLId);
398 virtual void deleteShader(WebGLId);
400 virtual void synthesizeGLError(WGC3Denum);
402 virtual void* mapBufferSubDataCHROMIUM(
403 WGC3Denum target, WGC3Dintptr offset,
404 WGC3Dsizeiptr size, WGC3Denum access);
405 virtual void unmapBufferSubDataCHROMIUM(const void*);
406 virtual void* mapTexSubImage2DCHROMIUM(
416 virtual void unmapTexSubImage2DCHROMIUM(const void*);
418 virtual void setVisibilityCHROMIUM(bool visible);
420 virtual void discardFramebufferEXT(WGC3Denum target,
421 WGC3Dsizei numAttachments,
422 const WGC3Denum* attachments);
423 virtual void copyTextureToParentTextureCHROMIUM(
424 WebGLId texture, WebGLId parentTexture);
426 virtual blink::WebString getRequestableExtensionsCHROMIUM();
427 virtual void requestExtensionCHROMIUM(const char*);
429 virtual void blitFramebufferCHROMIUM(
430 WGC3Dint srcX0, WGC3Dint srcY0, WGC3Dint srcX1, WGC3Dint srcY1,
431 WGC3Dint dstX0, WGC3Dint dstY0, WGC3Dint dstX1, WGC3Dint dstY1,
432 WGC3Dbitfield mask, WGC3Denum filter);
433 virtual void renderbufferStorageMultisampleCHROMIUM(
434 WGC3Denum target, WGC3Dsizei samples, WGC3Denum internalformat,
435 WGC3Dsizei width, WGC3Dsizei height);
437 virtual blink::WebString getTranslatedShaderSourceANGLE(WebGLId shader);
439 virtual void setContextLostCallback(
440 WebGraphicsContext3D::WebGraphicsContextLostCallback* callback);
442 virtual void setErrorMessageCallback(
443 WebGraphicsContext3D::WebGraphicsErrorMessageCallback* callback);
445 virtual void texImageIOSurface2DCHROMIUM(
446 WGC3Denum target, WGC3Dint width, WGC3Dint height,
447 WGC3Duint ioSurfaceId, WGC3Duint plane);
449 virtual void texStorage2DEXT(
450 WGC3Denum target, WGC3Dint levels, WGC3Duint internalformat,
451 WGC3Dint width, WGC3Dint height);
453 virtual WebGLId createQueryEXT();
454 virtual void deleteQueryEXT(WebGLId query);
455 virtual WGC3Dboolean isQueryEXT(WGC3Duint query);
456 virtual void beginQueryEXT(WGC3Denum target, WebGLId query);
457 virtual void endQueryEXT(WGC3Denum target);
458 virtual void getQueryivEXT(
459 WGC3Denum target, WGC3Denum pname, WGC3Dint* params);
460 virtual void getQueryObjectuivEXT(
461 WebGLId query, WGC3Denum pname, WGC3Duint* params);
463 virtual void copyTextureCHROMIUM(WGC3Denum target, WebGLId source_id,
464 WebGLId dest_id, WGC3Dint level,
465 WGC3Denum internal_format,
466 WGC3Denum dest_type);
468 virtual void bindUniformLocationCHROMIUM(WebGLId program, WGC3Dint location,
469 const WGC3Dchar* uniform);
471 virtual void shallowFlushCHROMIUM();
472 virtual void shallowFinishCHROMIUM();
474 virtual void genMailboxCHROMIUM(WGC3Dbyte* mailbox);
475 virtual void produceTextureCHROMIUM(WGC3Denum target,
476 const WGC3Dbyte* mailbox);
477 virtual void produceTextureDirectCHROMIUM(WebGLId texture, WGC3Denum target,
478 const WGC3Dbyte* mailbox);
479 virtual void consumeTextureCHROMIUM(WGC3Denum target,
480 const WGC3Dbyte* mailbox);
481 virtual WebGLId createAndConsumeTextureCHROMIUM(WGC3Denum target,
482 const WGC3Dbyte* mailbox);
484 virtual void insertEventMarkerEXT(const WGC3Dchar* marker);
485 virtual void pushGroupMarkerEXT(const WGC3Dchar* marker);
486 virtual void popGroupMarkerEXT();
488 // GL_OES_vertex_array_object
489 virtual WebGLId createVertexArrayOES();
490 virtual void deleteVertexArrayOES(WebGLId array);
491 virtual WGC3Dboolean isVertexArrayOES(WebGLId array);
492 virtual void bindVertexArrayOES(WebGLId array);
494 virtual void bindTexImage2DCHROMIUM(WGC3Denum target, WGC3Dint image_id);
495 virtual void releaseTexImage2DCHROMIUM(WGC3Denum target, WGC3Dint image_id);
497 virtual void* mapBufferCHROMIUM(WGC3Denum target, WGC3Denum access);
498 virtual WGC3Dboolean unmapBufferCHROMIUM(WGC3Denum target);
500 // Async pixel transfer functions.
501 virtual void asyncTexImage2DCHROMIUM(
504 WGC3Denum internalformat,
511 virtual void asyncTexSubImage2DCHROMIUM(
521 virtual void waitAsyncTexImage2DCHROMIUM(WGC3Denum target);
523 // GL_EXT_draw_buffers
524 virtual void drawBuffersEXT(
526 const WGC3Denum* bufs);
528 // GL_ANGLE_instanced_arrays
529 virtual void drawArraysInstancedANGLE(WGC3Denum mode, WGC3Dint first,
530 WGC3Dsizei count, WGC3Dsizei primcount);
531 virtual void drawElementsInstancedANGLE(WGC3Denum mode, WGC3Dsizei count,
532 WGC3Denum type, WGC3Dintptr offset, WGC3Dsizei primcount);
533 virtual void vertexAttribDivisorANGLE(WGC3Duint index, WGC3Duint divisor);
535 // GL_CHROMIUM_map_image
536 virtual WGC3Duint createImageCHROMIUM(WGC3Dsizei width,
538 WGC3Denum internalformat,
540 virtual void destroyImageCHROMIUM(WGC3Duint image_id);
541 virtual void getImageParameterivCHROMIUM(
542 WGC3Duint image_id, WGC3Denum pname, WGC3Dint* params);
543 virtual void* mapImageCHROMIUM(WGC3Duint image_id);
544 virtual void unmapImageCHROMIUM(WGC3Duint image_id);
546 // GL_EXT_multisampled_render_to_texture
547 virtual void framebufferTexture2DMultisampleEXT(WGC3Denum target,
548 WGC3Denum attachment,
553 virtual void renderbufferStorageMultisampleEXT(
554 WGC3Denum target, WGC3Dsizei samples, WGC3Denum internalformat,
555 WGC3Dsizei width, WGC3Dsizei height);
557 virtual GrGLInterface* createGrGLInterface();
559 ::gpu::gles2::GLES2Interface* GetGLInterface() {
563 // Convert WebGL context creation attributes into command buffer / EGL size
565 static void ConvertAttributes(
566 const blink::WebGraphicsContext3D::Attributes& attributes,
567 ::gpu::gles2::ContextCreationAttribHelper* output_attribs);
570 friend class WebGraphicsContext3DErrorMessageCallback;
572 WebGraphicsContext3DImpl();
573 virtual ~WebGraphicsContext3DImpl();
575 ::gpu::gles2::GLES2ImplementationErrorMessageCallback*
576 getErrorMessageCallback();
577 virtual void OnErrorMessage(const std::string& message, int id);
579 void setGLInterface(::gpu::gles2::GLES2Interface* gl) {
584 bool initialize_failed_;
586 WebGraphicsContext3D::WebGraphicsContextLostCallback* context_lost_callback_;
587 WGC3Denum context_lost_reason_;
589 WebGraphicsContext3D::WebGraphicsErrorMessageCallback*
590 error_message_callback_;
591 scoped_ptr<WebGraphicsContext3DErrorMessageCallback>
592 client_error_message_callback_;
594 // Errors raised by synthesizeGLError().
595 std::vector<WGC3Denum> synthetic_errors_;
597 ::gpu::gles2::GLES2Interface* gl_;
598 bool lose_context_when_out_of_memory_;
603 } // namespace webkit
605 #endif // WEBKIT_COMMON_GPU_WEBGRAPHICSCONTEXT3D_IMPL_H_