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 //----------------------------------------------------------------------
52 // WebGraphicsContext3D methods
54 virtual uint32_t lastFlushID();
56 virtual unsigned int insertSyncPoint();
57 virtual void waitSyncPoint(unsigned int sync_point);
59 virtual void loseContextCHROMIUM(WGC3Denum current, WGC3Denum other);
61 virtual void reshapeWithScaleFactor(
62 int width, int height, float scale_factor);
64 virtual void prepareTexture();
65 virtual void postSubBufferCHROMIUM(int x, int y, int width, int height);
67 virtual void activeTexture(WGC3Denum texture);
68 virtual void attachShader(WebGLId program, WebGLId shader);
69 virtual void bindAttribLocation(WebGLId program, WGC3Duint index,
70 const WGC3Dchar* name);
71 virtual void bindBuffer(WGC3Denum target, WebGLId buffer);
72 virtual void bindFramebuffer(WGC3Denum target, WebGLId framebuffer);
73 virtual void bindRenderbuffer(WGC3Denum target, WebGLId renderbuffer);
74 virtual void bindTexture(WGC3Denum target, WebGLId texture);
75 virtual void blendColor(WGC3Dclampf red, WGC3Dclampf green,
76 WGC3Dclampf blue, WGC3Dclampf alpha);
77 virtual void blendEquation(WGC3Denum mode);
78 virtual void blendEquationSeparate(WGC3Denum modeRGB,
80 virtual void blendFunc(WGC3Denum sfactor, WGC3Denum dfactor);
81 virtual void blendFuncSeparate(WGC3Denum srcRGB,
86 virtual void bufferData(WGC3Denum target, WGC3Dsizeiptr size,
87 const void* data, WGC3Denum usage);
88 virtual void bufferSubData(WGC3Denum target, WGC3Dintptr offset,
89 WGC3Dsizeiptr size, const void* data);
91 virtual WGC3Denum checkFramebufferStatus(WGC3Denum target);
92 virtual void clear(WGC3Dbitfield mask);
93 virtual void clearColor(WGC3Dclampf red, WGC3Dclampf green,
94 WGC3Dclampf blue, WGC3Dclampf alpha);
95 virtual void clearDepth(WGC3Dclampf depth);
96 virtual void clearStencil(WGC3Dint s);
97 virtual void colorMask(WGC3Dboolean red, WGC3Dboolean green,
98 WGC3Dboolean blue, WGC3Dboolean alpha);
99 virtual void compileShader(WebGLId shader);
101 virtual void compressedTexImage2D(WGC3Denum target,
103 WGC3Denum internalformat,
107 WGC3Dsizei imageSize,
109 virtual void compressedTexSubImage2D(WGC3Denum target,
116 WGC3Dsizei imageSize,
118 virtual void copyTexImage2D(WGC3Denum target,
120 WGC3Denum internalformat,
126 virtual void copyTexSubImage2D(WGC3Denum target,
134 virtual void cullFace(WGC3Denum mode);
135 virtual void depthFunc(WGC3Denum func);
136 virtual void depthMask(WGC3Dboolean flag);
137 virtual void depthRange(WGC3Dclampf zNear, WGC3Dclampf zFar);
138 virtual void detachShader(WebGLId program, WebGLId shader);
139 virtual void disable(WGC3Denum cap);
140 virtual void disableVertexAttribArray(WGC3Duint index);
141 virtual void drawArrays(WGC3Denum mode, WGC3Dint first, WGC3Dsizei count);
142 virtual void drawElements(WGC3Denum mode,
147 virtual void enable(WGC3Denum cap);
148 virtual void enableVertexAttribArray(WGC3Duint index);
149 virtual void finish();
150 virtual void flush();
151 virtual void framebufferRenderbuffer(WGC3Denum target,
152 WGC3Denum attachment,
153 WGC3Denum renderbuffertarget,
154 WebGLId renderbuffer);
155 virtual void framebufferTexture2D(WGC3Denum target,
156 WGC3Denum attachment,
160 virtual void frontFace(WGC3Denum mode);
161 virtual void generateMipmap(WGC3Denum target);
163 virtual bool getActiveAttrib(WebGLId program,
166 virtual bool getActiveUniform(WebGLId program,
170 virtual void getAttachedShaders(WebGLId program,
175 virtual WGC3Dint getAttribLocation(WebGLId program, const WGC3Dchar* name);
177 virtual void getBooleanv(WGC3Denum pname, WGC3Dboolean* value);
179 virtual void getBufferParameteriv(WGC3Denum target,
183 virtual WGC3Denum getError();
185 virtual void getFloatv(WGC3Denum pname, WGC3Dfloat* value);
187 virtual void getFramebufferAttachmentParameteriv(WGC3Denum target,
188 WGC3Denum attachment,
192 virtual void getIntegerv(WGC3Denum pname, WGC3Dint* value);
194 virtual void getProgramiv(WebGLId program, WGC3Denum pname, WGC3Dint* value);
196 virtual blink::WebString getProgramInfoLog(WebGLId program);
198 virtual void getRenderbufferParameteriv(WGC3Denum target,
202 virtual void getShaderiv(WebGLId shader, WGC3Denum pname, WGC3Dint* value);
204 virtual blink::WebString getShaderInfoLog(WebGLId shader);
206 virtual void getShaderPrecisionFormat(WGC3Denum shadertype,
207 WGC3Denum precisiontype,
209 WGC3Dint* precision);
211 virtual blink::WebString getShaderSource(WebGLId shader);
212 virtual blink::WebString getString(WGC3Denum name);
214 virtual void getTexParameterfv(WGC3Denum target,
217 virtual void getTexParameteriv(WGC3Denum target,
221 virtual void getUniformfv(WebGLId program,
224 virtual void getUniformiv(WebGLId program,
228 virtual WGC3Dint getUniformLocation(WebGLId program, const WGC3Dchar* name);
230 virtual void getVertexAttribfv(WGC3Duint index, WGC3Denum pname,
232 virtual void getVertexAttribiv(WGC3Duint index, WGC3Denum pname,
235 virtual WGC3Dsizeiptr getVertexAttribOffset(WGC3Duint index, WGC3Denum pname);
237 virtual void hint(WGC3Denum target, WGC3Denum mode);
238 virtual WGC3Dboolean isBuffer(WebGLId buffer);
239 virtual WGC3Dboolean isEnabled(WGC3Denum cap);
240 virtual WGC3Dboolean isFramebuffer(WebGLId framebuffer);
241 virtual WGC3Dboolean isProgram(WebGLId program);
242 virtual WGC3Dboolean isRenderbuffer(WebGLId renderbuffer);
243 virtual WGC3Dboolean isShader(WebGLId shader);
244 virtual WGC3Dboolean isTexture(WebGLId texture);
245 virtual void lineWidth(WGC3Dfloat);
246 virtual void linkProgram(WebGLId program);
247 virtual void pixelStorei(WGC3Denum pname, WGC3Dint param);
248 virtual void polygonOffset(WGC3Dfloat factor, WGC3Dfloat units);
250 virtual void readPixels(WGC3Dint x,
258 virtual void releaseShaderCompiler();
259 virtual void renderbufferStorage(WGC3Denum target,
260 WGC3Denum internalformat,
263 virtual void sampleCoverage(WGC3Dfloat value, WGC3Dboolean invert);
264 virtual void scissor(WGC3Dint x, WGC3Dint y,
265 WGC3Dsizei width, WGC3Dsizei height);
266 virtual void shaderSource(WebGLId shader, const WGC3Dchar* string);
267 virtual void stencilFunc(WGC3Denum func, WGC3Dint ref, WGC3Duint mask);
268 virtual void stencilFuncSeparate(WGC3Denum face,
272 virtual void stencilMask(WGC3Duint mask);
273 virtual void stencilMaskSeparate(WGC3Denum face, WGC3Duint mask);
274 virtual void stencilOp(WGC3Denum fail,
277 virtual void stencilOpSeparate(WGC3Denum face,
282 virtual void texImage2D(WGC3Denum target,
284 WGC3Denum internalformat,
292 virtual void texParameterf(WGC3Denum target,
295 virtual void texParameteri(WGC3Denum target,
299 virtual void texSubImage2D(WGC3Denum target,
309 virtual void uniform1f(WGC3Dint location, WGC3Dfloat x);
310 virtual void uniform1fv(WGC3Dint location,
311 WGC3Dsizei count, const WGC3Dfloat* v);
312 virtual void uniform1i(WGC3Dint location, WGC3Dint x);
313 virtual void uniform1iv(WGC3Dint location,
314 WGC3Dsizei count, const WGC3Dint* v);
315 virtual void uniform2f(WGC3Dint location, WGC3Dfloat x, WGC3Dfloat y);
316 virtual void uniform2fv(WGC3Dint location,
317 WGC3Dsizei count, const WGC3Dfloat* v);
318 virtual void uniform2i(WGC3Dint location, WGC3Dint x, WGC3Dint y);
319 virtual void uniform2iv(WGC3Dint location,
320 WGC3Dsizei count, const WGC3Dint* v);
321 virtual void uniform3f(WGC3Dint location,
322 WGC3Dfloat x, WGC3Dfloat y, WGC3Dfloat z);
323 virtual void uniform3fv(WGC3Dint location,
324 WGC3Dsizei count, const WGC3Dfloat* v);
325 virtual void uniform3i(WGC3Dint location,
326 WGC3Dint x, WGC3Dint y, WGC3Dint z);
327 virtual void uniform3iv(WGC3Dint location,
328 WGC3Dsizei count, const WGC3Dint* v);
329 virtual void uniform4f(WGC3Dint location,
330 WGC3Dfloat x, WGC3Dfloat y,
331 WGC3Dfloat z, WGC3Dfloat w);
332 virtual void uniform4fv(WGC3Dint location,
333 WGC3Dsizei count, const WGC3Dfloat* v);
334 virtual void uniform4i(WGC3Dint location,
335 WGC3Dint x, WGC3Dint y, WGC3Dint z, WGC3Dint w);
336 virtual void uniform4iv(WGC3Dint location,
337 WGC3Dsizei count, const WGC3Dint* v);
338 virtual void uniformMatrix2fv(WGC3Dint location,
340 WGC3Dboolean transpose,
341 const WGC3Dfloat* value);
342 virtual void uniformMatrix3fv(WGC3Dint location,
344 WGC3Dboolean transpose,
345 const WGC3Dfloat* value);
346 virtual void uniformMatrix4fv(WGC3Dint location,
348 WGC3Dboolean transpose,
349 const WGC3Dfloat* value);
351 virtual void useProgram(WebGLId program);
352 virtual void validateProgram(WebGLId program);
354 virtual void vertexAttrib1f(WGC3Duint index, WGC3Dfloat x);
355 virtual void vertexAttrib1fv(WGC3Duint index, const WGC3Dfloat* values);
356 virtual void vertexAttrib2f(WGC3Duint index, WGC3Dfloat x, WGC3Dfloat y);
357 virtual void vertexAttrib2fv(WGC3Duint index, const WGC3Dfloat* values);
358 virtual void vertexAttrib3f(WGC3Duint index,
359 WGC3Dfloat x, WGC3Dfloat y, WGC3Dfloat z);
360 virtual void vertexAttrib3fv(WGC3Duint index, const WGC3Dfloat* values);
361 virtual void vertexAttrib4f(WGC3Duint index,
362 WGC3Dfloat x, WGC3Dfloat y,
363 WGC3Dfloat z, WGC3Dfloat w);
364 virtual void vertexAttrib4fv(WGC3Duint index, const WGC3Dfloat* values);
365 virtual void vertexAttribPointer(WGC3Duint index,
368 WGC3Dboolean normalized,
372 virtual void viewport(WGC3Dint x, WGC3Dint y,
373 WGC3Dsizei width, WGC3Dsizei height);
375 // Support for buffer creation and deletion
376 virtual void genBuffers(WGC3Dsizei count, WebGLId* ids);
377 virtual void genFramebuffers(WGC3Dsizei count, WebGLId* ids);
378 virtual void genRenderbuffers(WGC3Dsizei count, WebGLId* ids);
379 virtual void genTextures(WGC3Dsizei count, WebGLId* ids);
381 virtual void deleteBuffers(WGC3Dsizei count, WebGLId* ids);
382 virtual void deleteFramebuffers(WGC3Dsizei count, WebGLId* ids);
383 virtual void deleteRenderbuffers(WGC3Dsizei count, WebGLId* ids);
384 virtual void deleteTextures(WGC3Dsizei count, WebGLId* ids);
386 virtual WebGLId createBuffer();
387 virtual WebGLId createFramebuffer();
388 virtual WebGLId createRenderbuffer();
389 virtual WebGLId createTexture();
391 virtual void deleteBuffer(WebGLId);
392 virtual void deleteFramebuffer(WebGLId);
393 virtual void deleteRenderbuffer(WebGLId);
394 virtual void deleteTexture(WebGLId);
396 virtual WebGLId createProgram();
397 virtual WebGLId createShader(WGC3Denum);
399 virtual void deleteProgram(WebGLId);
400 virtual void deleteShader(WebGLId);
402 virtual void synthesizeGLError(WGC3Denum);
404 virtual void* mapBufferSubDataCHROMIUM(
405 WGC3Denum target, WGC3Dintptr offset,
406 WGC3Dsizeiptr size, WGC3Denum access);
407 virtual void unmapBufferSubDataCHROMIUM(const void*);
408 virtual void* mapTexSubImage2DCHROMIUM(
418 virtual void unmapTexSubImage2DCHROMIUM(const void*);
420 virtual void setVisibilityCHROMIUM(bool visible);
422 virtual void discardFramebufferEXT(WGC3Denum target,
423 WGC3Dsizei numAttachments,
424 const WGC3Denum* attachments);
425 virtual void copyTextureToParentTextureCHROMIUM(
426 WebGLId texture, WebGLId parentTexture);
428 virtual blink::WebString getRequestableExtensionsCHROMIUM();
429 virtual void requestExtensionCHROMIUM(const char*);
431 virtual void blitFramebufferCHROMIUM(
432 WGC3Dint srcX0, WGC3Dint srcY0, WGC3Dint srcX1, WGC3Dint srcY1,
433 WGC3Dint dstX0, WGC3Dint dstY0, WGC3Dint dstX1, WGC3Dint dstY1,
434 WGC3Dbitfield mask, WGC3Denum filter);
435 virtual void renderbufferStorageMultisampleCHROMIUM(
436 WGC3Denum target, WGC3Dsizei samples, WGC3Denum internalformat,
437 WGC3Dsizei width, WGC3Dsizei height);
439 virtual blink::WebString getTranslatedShaderSourceANGLE(WebGLId shader);
441 virtual void setContextLostCallback(
442 WebGraphicsContext3D::WebGraphicsContextLostCallback* callback);
444 virtual void setErrorMessageCallback(
445 WebGraphicsContext3D::WebGraphicsErrorMessageCallback* callback);
447 virtual void texImageIOSurface2DCHROMIUM(
448 WGC3Denum target, WGC3Dint width, WGC3Dint height,
449 WGC3Duint ioSurfaceId, WGC3Duint plane);
451 virtual void texStorage2DEXT(
452 WGC3Denum target, WGC3Dint levels, WGC3Duint internalformat,
453 WGC3Dint width, WGC3Dint height);
455 virtual WebGLId createQueryEXT();
456 virtual void deleteQueryEXT(WebGLId query);
457 virtual WGC3Dboolean isQueryEXT(WGC3Duint query);
458 virtual void beginQueryEXT(WGC3Denum target, WebGLId query);
459 virtual void endQueryEXT(WGC3Denum target);
460 virtual void getQueryivEXT(
461 WGC3Denum target, WGC3Denum pname, WGC3Dint* params);
462 virtual void getQueryObjectuivEXT(
463 WebGLId query, WGC3Denum pname, WGC3Duint* params);
465 virtual void copyTextureCHROMIUM(WGC3Denum target, WebGLId source_id,
466 WebGLId dest_id, WGC3Dint level,
467 WGC3Denum internal_format,
468 WGC3Denum dest_type);
470 virtual void bindUniformLocationCHROMIUM(WebGLId program, WGC3Dint location,
471 const WGC3Dchar* uniform);
473 virtual void shallowFlushCHROMIUM();
474 virtual void shallowFinishCHROMIUM();
476 virtual void genMailboxCHROMIUM(WGC3Dbyte* mailbox);
477 virtual void produceTextureCHROMIUM(WGC3Denum target,
478 const WGC3Dbyte* mailbox);
479 virtual void produceTextureDirectCHROMIUM(WebGLId texture, WGC3Denum target,
480 const WGC3Dbyte* mailbox);
481 virtual void consumeTextureCHROMIUM(WGC3Denum target,
482 const WGC3Dbyte* mailbox);
483 virtual WebGLId createAndConsumeTextureCHROMIUM(WGC3Denum target,
484 const WGC3Dbyte* mailbox);
486 virtual void genValuebuffersCHROMIUM(WGC3Dsizei count, WebGLId* ids);
487 virtual WebGLId createValuebufferCHROMIUM();
488 virtual void deleteValuebuffersCHROMIUM(WGC3Dsizei count, WebGLId* ids);
489 virtual void deleteValuebufferCHROMIUM(WebGLId);
490 virtual void bindValuebufferCHROMIUM(WGC3Denum target, WebGLId valuebuffer);
491 virtual WGC3Dboolean isValuebufferCHROMIUM(WebGLId renderbuffer);
492 virtual void subscribeValueCHROMIUM(WGC3Denum target, WGC3Denum subscription);
493 virtual void populateSubscribedValuesCHROMIUM(WGC3Denum target);
494 virtual void uniformValuebufferCHROMIUM(WGC3Dint location,
496 WGC3Denum subscription);
498 virtual void insertEventMarkerEXT(const WGC3Dchar* marker);
499 virtual void pushGroupMarkerEXT(const WGC3Dchar* marker);
500 virtual void popGroupMarkerEXT();
502 // GL_OES_vertex_array_object
503 virtual WebGLId createVertexArrayOES();
504 virtual void deleteVertexArrayOES(WebGLId array);
505 virtual WGC3Dboolean isVertexArrayOES(WebGLId array);
506 virtual void bindVertexArrayOES(WebGLId array);
508 virtual void bindTexImage2DCHROMIUM(WGC3Denum target, WGC3Dint image_id);
509 virtual void releaseTexImage2DCHROMIUM(WGC3Denum target, WGC3Dint image_id);
511 virtual void* mapBufferCHROMIUM(WGC3Denum target, WGC3Denum access);
512 virtual WGC3Dboolean unmapBufferCHROMIUM(WGC3Denum target);
514 // Async pixel transfer functions.
515 virtual void asyncTexImage2DCHROMIUM(
518 WGC3Denum internalformat,
525 virtual void asyncTexSubImage2DCHROMIUM(
535 virtual void waitAsyncTexImage2DCHROMIUM(WGC3Denum target);
537 // GL_EXT_draw_buffers
538 virtual void drawBuffersEXT(
540 const WGC3Denum* bufs);
542 // GL_ANGLE_instanced_arrays
543 virtual void drawArraysInstancedANGLE(WGC3Denum mode, WGC3Dint first,
544 WGC3Dsizei count, WGC3Dsizei primcount);
545 virtual void drawElementsInstancedANGLE(WGC3Denum mode, WGC3Dsizei count,
546 WGC3Denum type, WGC3Dintptr offset, WGC3Dsizei primcount);
547 virtual void vertexAttribDivisorANGLE(WGC3Duint index, WGC3Duint divisor);
549 // GL_CHROMIUM_gpu_memory_buffer_image
550 virtual WGC3Duint createGpuMemoryBufferImageCHROMIUM(WGC3Dsizei width,
552 WGC3Denum internalformat,
554 virtual void destroyImageCHROMIUM(WGC3Duint image_id);
556 // GL_EXT_multisampled_render_to_texture
557 virtual void framebufferTexture2DMultisampleEXT(WGC3Denum target,
558 WGC3Denum attachment,
563 virtual void renderbufferStorageMultisampleEXT(
564 WGC3Denum target, WGC3Dsizei samples, WGC3Denum internalformat,
565 WGC3Dsizei width, WGC3Dsizei height);
567 virtual GrGLInterface* createGrGLInterface();
569 ::gpu::gles2::GLES2Interface* GetGLInterface() {
573 // Convert WebGL context creation attributes into command buffer / EGL size
575 static void ConvertAttributes(
576 const blink::WebGraphicsContext3D::Attributes& attributes,
577 ::gpu::gles2::ContextCreationAttribHelper* output_attribs);
580 friend class WebGraphicsContext3DErrorMessageCallback;
582 WebGraphicsContext3DImpl();
584 ::gpu::gles2::GLES2ImplementationErrorMessageCallback*
585 getErrorMessageCallback();
586 virtual void OnErrorMessage(const std::string& message, int id);
588 void setGLInterface(::gpu::gles2::GLES2Interface* gl) {
593 bool initialize_failed_;
595 WebGraphicsContext3D::WebGraphicsContextLostCallback* context_lost_callback_;
596 WGC3Denum context_lost_reason_;
598 WebGraphicsContext3D::WebGraphicsErrorMessageCallback*
599 error_message_callback_;
600 scoped_ptr<WebGraphicsContext3DErrorMessageCallback>
601 client_error_message_callback_;
603 // Errors raised by synthesizeGLError().
604 std::vector<WGC3Denum> synthetic_errors_;
606 ::gpu::gles2::GLES2Interface* gl_;
607 bool lose_context_when_out_of_memory_;
612 } // namespace webkit
614 #endif // WEBKIT_COMMON_GPU_WEBGRAPHICSCONTEXT3D_IMPL_H_