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 virtual ~WebGraphicsContext3DImpl();
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;
56 //----------------------------------------------------------------------
57 // WebGraphicsContext3D methods
59 virtual uint32_t lastFlushID();
61 virtual unsigned int insertSyncPoint();
62 virtual void waitSyncPoint(unsigned int sync_point);
64 virtual void loseContextCHROMIUM(WGC3Denum current, WGC3Denum other);
66 virtual void reshapeWithScaleFactor(
67 int width, int height, float scale_factor);
69 virtual void prepareTexture();
70 virtual void postSubBufferCHROMIUM(int x, int y, int width, int height);
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,
85 virtual void blendFunc(WGC3Denum sfactor, WGC3Denum dfactor);
86 virtual void blendFuncSeparate(WGC3Denum srcRGB,
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);
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);
106 virtual void compressedTexImage2D(WGC3Denum target,
108 WGC3Denum internalformat,
112 WGC3Dsizei imageSize,
114 virtual void compressedTexSubImage2D(WGC3Denum target,
121 WGC3Dsizei imageSize,
123 virtual void copyTexImage2D(WGC3Denum target,
125 WGC3Denum internalformat,
131 virtual void copyTexSubImage2D(WGC3Denum target,
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,
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,
165 virtual void frontFace(WGC3Denum mode);
166 virtual void generateMipmap(WGC3Denum target);
168 virtual bool getActiveAttrib(WebGLId program,
171 virtual bool getActiveUniform(WebGLId program,
175 virtual void getAttachedShaders(WebGLId program,
180 virtual WGC3Dint getAttribLocation(WebGLId program, const WGC3Dchar* name);
182 virtual void getBooleanv(WGC3Denum pname, WGC3Dboolean* value);
184 virtual void getBufferParameteriv(WGC3Denum target,
188 virtual WGC3Denum getError();
190 virtual void getFloatv(WGC3Denum pname, WGC3Dfloat* value);
192 virtual void getFramebufferAttachmentParameteriv(WGC3Denum target,
193 WGC3Denum attachment,
197 virtual void getIntegerv(WGC3Denum pname, WGC3Dint* value);
199 virtual void getProgramiv(WebGLId program, WGC3Denum pname, WGC3Dint* value);
201 virtual blink::WebString getProgramInfoLog(WebGLId program);
203 virtual void getRenderbufferParameteriv(WGC3Denum target,
207 virtual void getShaderiv(WebGLId shader, WGC3Denum pname, WGC3Dint* value);
209 virtual blink::WebString getShaderInfoLog(WebGLId shader);
211 virtual void getShaderPrecisionFormat(WGC3Denum shadertype,
212 WGC3Denum precisiontype,
214 WGC3Dint* precision);
216 virtual blink::WebString getShaderSource(WebGLId shader);
217 virtual blink::WebString getString(WGC3Denum name);
219 virtual void getTexParameterfv(WGC3Denum target,
222 virtual void getTexParameteriv(WGC3Denum target,
226 virtual void getUniformfv(WebGLId program,
229 virtual void getUniformiv(WebGLId program,
233 virtual WGC3Dint getUniformLocation(WebGLId program, const WGC3Dchar* name);
235 virtual void getVertexAttribfv(WGC3Duint index, WGC3Denum pname,
237 virtual void getVertexAttribiv(WGC3Duint index, WGC3Denum pname,
240 virtual WGC3Dsizeiptr getVertexAttribOffset(WGC3Duint index, WGC3Denum pname);
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);
255 virtual void readPixels(WGC3Dint x,
263 virtual void releaseShaderCompiler();
264 virtual void renderbufferStorage(WGC3Denum target,
265 WGC3Denum internalformat,
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,
277 virtual void stencilMask(WGC3Duint mask);
278 virtual void stencilMaskSeparate(WGC3Denum face, WGC3Duint mask);
279 virtual void stencilOp(WGC3Denum fail,
282 virtual void stencilOpSeparate(WGC3Denum face,
287 virtual void texImage2D(WGC3Denum target,
289 WGC3Denum internalformat,
297 virtual void texParameterf(WGC3Denum target,
300 virtual void texParameteri(WGC3Denum target,
304 virtual void texSubImage2D(WGC3Denum target,
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,
345 WGC3Dboolean transpose,
346 const WGC3Dfloat* value);
347 virtual void uniformMatrix3fv(WGC3Dint location,
349 WGC3Dboolean transpose,
350 const WGC3Dfloat* value);
351 virtual void uniformMatrix4fv(WGC3Dint location,
353 WGC3Dboolean transpose,
354 const WGC3Dfloat* value);
356 virtual void useProgram(WebGLId program);
357 virtual void validateProgram(WebGLId program);
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,
373 WGC3Dboolean normalized,
377 virtual void viewport(WGC3Dint x, WGC3Dint y,
378 WGC3Dsizei width, WGC3Dsizei height);
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);
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);
391 virtual WebGLId createBuffer();
392 virtual WebGLId createFramebuffer();
393 virtual WebGLId createRenderbuffer();
394 virtual WebGLId createTexture();
396 virtual void deleteBuffer(WebGLId);
397 virtual void deleteFramebuffer(WebGLId);
398 virtual void deleteRenderbuffer(WebGLId);
399 virtual void deleteTexture(WebGLId);
401 virtual WebGLId createProgram();
402 virtual WebGLId createShader(WGC3Denum);
404 virtual void deleteProgram(WebGLId);
405 virtual void deleteShader(WebGLId);
407 virtual void synthesizeGLError(WGC3Denum);
409 virtual void* mapBufferSubDataCHROMIUM(
410 WGC3Denum target, WGC3Dintptr offset,
411 WGC3Dsizeiptr size, WGC3Denum access);
412 virtual void unmapBufferSubDataCHROMIUM(const void*);
413 virtual void* mapTexSubImage2DCHROMIUM(
423 virtual void unmapTexSubImage2DCHROMIUM(const void*);
425 virtual void setVisibilityCHROMIUM(bool visible);
427 virtual void discardFramebufferEXT(WGC3Denum target,
428 WGC3Dsizei numAttachments,
429 const WGC3Denum* attachments);
430 virtual void copyTextureToParentTextureCHROMIUM(
431 WebGLId texture, WebGLId parentTexture);
433 virtual blink::WebString getRequestableExtensionsCHROMIUM();
434 virtual void requestExtensionCHROMIUM(const char*);
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);
444 virtual blink::WebString getTranslatedShaderSourceANGLE(WebGLId shader);
446 virtual void setContextLostCallback(
447 WebGraphicsContext3D::WebGraphicsContextLostCallback* callback);
449 virtual void setErrorMessageCallback(
450 WebGraphicsContext3D::WebGraphicsErrorMessageCallback* callback);
452 virtual void texImageIOSurface2DCHROMIUM(
453 WGC3Denum target, WGC3Dint width, WGC3Dint height,
454 WGC3Duint ioSurfaceId, WGC3Duint plane);
456 virtual void texStorage2DEXT(
457 WGC3Denum target, WGC3Dint levels, WGC3Duint internalformat,
458 WGC3Dint width, WGC3Dint height);
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);
470 virtual void copyTextureCHROMIUM(WGC3Denum target, WebGLId source_id,
471 WebGLId dest_id, WGC3Dint level,
472 WGC3Denum internal_format,
473 WGC3Denum dest_type);
475 virtual void bindUniformLocationCHROMIUM(WebGLId program, WGC3Dint location,
476 const WGC3Dchar* uniform);
478 virtual void shallowFlushCHROMIUM();
479 virtual void shallowFinishCHROMIUM();
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);
491 virtual void insertEventMarkerEXT(const WGC3Dchar* marker);
492 virtual void pushGroupMarkerEXT(const WGC3Dchar* marker);
493 virtual void popGroupMarkerEXT();
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);
501 virtual void bindTexImage2DCHROMIUM(WGC3Denum target, WGC3Dint image_id);
502 virtual void releaseTexImage2DCHROMIUM(WGC3Denum target, WGC3Dint image_id);
504 virtual void* mapBufferCHROMIUM(WGC3Denum target, WGC3Denum access);
505 virtual WGC3Dboolean unmapBufferCHROMIUM(WGC3Denum target);
507 // Async pixel transfer functions.
508 virtual void asyncTexImage2DCHROMIUM(
511 WGC3Denum internalformat,
518 virtual void asyncTexSubImage2DCHROMIUM(
528 virtual void waitAsyncTexImage2DCHROMIUM(WGC3Denum target);
530 // GL_EXT_draw_buffers
531 virtual void drawBuffersEXT(
533 const WGC3Denum* bufs);
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);
542 // GL_CHROMIUM_map_image
543 virtual WGC3Duint createImageCHROMIUM(WGC3Dsizei width,
545 WGC3Denum internalformat,
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);
553 // GL_EXT_multisampled_render_to_texture
554 virtual void framebufferTexture2DMultisampleEXT(WGC3Denum target,
555 WGC3Denum attachment,
560 virtual void renderbufferStorageMultisampleEXT(
561 WGC3Denum target, WGC3Dsizei samples, WGC3Denum internalformat,
562 WGC3Dsizei width, WGC3Dsizei height);
564 virtual GrGLInterface* createGrGLInterface();
566 ::gpu::gles2::GLES2Interface* GetGLInterface() {
570 // Convert WebGL context creation attributes into command buffer / EGL size
572 static void ConvertAttributes(
573 const blink::WebGraphicsContext3D::Attributes& attributes,
574 ::gpu::gles2::ContextCreationAttribHelper* output_attribs);
577 friend class WebGraphicsContext3DErrorMessageCallback;
579 WebGraphicsContext3DImpl();
581 ::gpu::gles2::GLES2ImplementationErrorMessageCallback*
582 getErrorMessageCallback();
583 virtual void OnErrorMessage(const std::string& message, int id);
585 void setGLInterface(::gpu::gles2::GLES2Interface* gl) {
590 bool initialize_failed_;
592 WebGraphicsContext3D::WebGraphicsContextLostCallback* context_lost_callback_;
593 WGC3Denum context_lost_reason_;
595 WebGraphicsContext3D::WebGraphicsErrorMessageCallback*
596 error_message_callback_;
597 scoped_ptr<WebGraphicsContext3DErrorMessageCallback>
598 client_error_message_callback_;
600 // Errors raised by synthesizeGLError().
601 std::vector<WGC3Denum> synthetic_errors_;
603 ::gpu::gles2::GLES2Interface* gl_;
604 bool lose_context_when_out_of_memory_;
609 } // namespace webkit
611 #endif // WEBKIT_COMMON_GPU_WEBGRAPHICSCONTEXT3D_IMPL_H_