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_IN_PROCESS_COMMAND_BUFFER_IMPL_H_
6 #define WEBKIT_COMMON_GPU_WEBGRAPHICSCONTEXT3D_IN_PROCESS_COMMAND_BUFFER_IMPL_H_
10 #include "base/compiler_specific.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
13 #include "third_party/WebKit/public/platform/WebString.h"
14 #include "ui/gfx/native_widget_types.h"
15 #include "webkit/common/gpu/webkit_gpu_export.h"
22 class GLES2Implementation;
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;
42 class GLInProcessContext;
43 struct GLInProcessContextAttribs;
49 class WEBKIT_GPU_EXPORT WebGraphicsContext3DInProcessCommandBufferImpl
50 : public NON_EXPORTED_BASE(blink::WebGraphicsContext3D) {
52 static scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
54 const blink::WebGraphicsContext3D::Attributes& attributes,
55 gfx::AcceleratedWidget window);
57 static scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
58 CreateOffscreenContext(
59 const blink::WebGraphicsContext3D::Attributes& attributes);
61 static scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
63 scoped_ptr< ::gpu::GLInProcessContext> context,
64 const blink::WebGraphicsContext3D::Attributes& attributes);
66 virtual ~WebGraphicsContext3DInProcessCommandBufferImpl();
68 // Convert WebGL context creation attributes into GLInProcessContext / EGL
70 static void ConvertAttributes(
71 const blink::WebGraphicsContext3D::Attributes& attributes,
72 ::gpu::GLInProcessContextAttribs* output_attribs);
74 //----------------------------------------------------------------------
75 // WebGraphicsContext3D methods
76 virtual bool makeContextCurrent();
78 virtual uint32_t lastFlushID();
80 virtual void reshapeWithScaleFactor(int width, int height, float scaleFactor);
82 virtual void prepareTexture();
83 virtual void postSubBufferCHROMIUM(int x, int y, int width, int height);
85 virtual void activeTexture(WGC3Denum texture);
86 virtual void attachShader(WebGLId program, WebGLId shader);
87 virtual void bindAttribLocation(WebGLId program, WGC3Duint index,
88 const WGC3Dchar* name);
89 virtual void bindBuffer(WGC3Denum target, WebGLId buffer);
90 virtual void bindFramebuffer(WGC3Denum target, WebGLId framebuffer);
91 virtual void bindRenderbuffer(WGC3Denum target, WebGLId renderbuffer);
92 virtual void bindTexture(WGC3Denum target, WebGLId texture);
93 virtual void blendColor(WGC3Dclampf red, WGC3Dclampf green,
94 WGC3Dclampf blue, WGC3Dclampf alpha);
95 virtual void blendEquation(WGC3Denum mode);
96 virtual void blendEquationSeparate(WGC3Denum modeRGB,
98 virtual void blendFunc(WGC3Denum sfactor, WGC3Denum dfactor);
99 virtual void blendFuncSeparate(WGC3Denum srcRGB,
104 virtual void bufferData(WGC3Denum target, WGC3Dsizeiptr size,
105 const void* data, WGC3Denum usage);
106 virtual void bufferSubData(WGC3Denum target, WGC3Dintptr offset,
107 WGC3Dsizeiptr size, const void* data);
109 virtual WGC3Denum checkFramebufferStatus(WGC3Denum target);
110 virtual void clear(WGC3Dbitfield mask);
111 virtual void clearColor(WGC3Dclampf red, WGC3Dclampf green,
112 WGC3Dclampf blue, WGC3Dclampf alpha);
113 virtual void clearDepth(WGC3Dclampf depth);
114 virtual void clearStencil(WGC3Dint s);
115 virtual void colorMask(WGC3Dboolean red, WGC3Dboolean green,
116 WGC3Dboolean blue, WGC3Dboolean alpha);
117 virtual void compileShader(WebGLId shader);
119 virtual void compressedTexImage2D(WGC3Denum target,
121 WGC3Denum internalformat,
125 WGC3Dsizei imageSize,
127 virtual void compressedTexSubImage2D(WGC3Denum target,
134 WGC3Dsizei imageSize,
136 virtual void copyTexImage2D(WGC3Denum target,
138 WGC3Denum internalformat,
144 virtual void copyTexSubImage2D(WGC3Denum target,
152 virtual void cullFace(WGC3Denum mode);
153 virtual void depthFunc(WGC3Denum func);
154 virtual void depthMask(WGC3Dboolean flag);
155 virtual void depthRange(WGC3Dclampf zNear, WGC3Dclampf zFar);
156 virtual void detachShader(WebGLId program, WebGLId shader);
157 virtual void disable(WGC3Denum cap);
158 virtual void disableVertexAttribArray(WGC3Duint index);
159 virtual void drawArrays(WGC3Denum mode, WGC3Dint first, WGC3Dsizei count);
160 virtual void drawElements(WGC3Denum mode,
165 virtual void enable(WGC3Denum cap);
166 virtual void enableVertexAttribArray(WGC3Duint index);
167 virtual void finish();
168 virtual void flush();
169 virtual void framebufferRenderbuffer(WGC3Denum target,
170 WGC3Denum attachment,
171 WGC3Denum renderbuffertarget,
172 WebGLId renderbuffer);
173 virtual void framebufferTexture2D(WGC3Denum target,
174 WGC3Denum attachment,
178 virtual void frontFace(WGC3Denum mode);
179 virtual void generateMipmap(WGC3Denum target);
181 virtual bool getActiveAttrib(WebGLId program,
184 virtual bool getActiveUniform(WebGLId program,
188 virtual void getAttachedShaders(WebGLId program,
193 virtual WGC3Dint getAttribLocation(WebGLId program, const WGC3Dchar* name);
195 virtual void getBooleanv(WGC3Denum pname, WGC3Dboolean* value);
197 virtual void getBufferParameteriv(WGC3Denum target,
201 virtual Attributes getContextAttributes();
203 virtual WGC3Denum getError();
205 virtual bool isContextLost();
207 virtual void getFloatv(WGC3Denum pname, WGC3Dfloat* value);
209 virtual void getFramebufferAttachmentParameteriv(WGC3Denum target,
210 WGC3Denum attachment,
214 virtual void getIntegerv(WGC3Denum pname, WGC3Dint* value);
216 virtual void getProgramiv(WebGLId program, WGC3Denum pname, WGC3Dint* value);
218 virtual blink::WebString getProgramInfoLog(WebGLId program);
220 virtual void getRenderbufferParameteriv(WGC3Denum target,
224 virtual void getShaderiv(WebGLId shader, WGC3Denum pname, WGC3Dint* value);
226 virtual blink::WebString getShaderInfoLog(WebGLId shader);
228 virtual void getShaderPrecisionFormat(WGC3Denum shadertype,
229 WGC3Denum precisiontype,
231 WGC3Dint* precision);
233 virtual blink::WebString getShaderSource(WebGLId shader);
234 virtual blink::WebString getString(WGC3Denum name);
236 virtual void getTexParameterfv(WGC3Denum target,
239 virtual void getTexParameteriv(WGC3Denum target,
243 virtual void getUniformfv(WebGLId program,
246 virtual void getUniformiv(WebGLId program,
250 virtual WGC3Dint getUniformLocation(WebGLId program, const WGC3Dchar* name);
252 virtual void getVertexAttribfv(WGC3Duint index, WGC3Denum pname,
254 virtual void getVertexAttribiv(WGC3Duint index, WGC3Denum pname,
257 virtual WGC3Dsizeiptr getVertexAttribOffset(WGC3Duint index, WGC3Denum pname);
259 virtual void hint(WGC3Denum target, WGC3Denum mode);
260 virtual WGC3Dboolean isBuffer(WebGLId buffer);
261 virtual WGC3Dboolean isEnabled(WGC3Denum cap);
262 virtual WGC3Dboolean isFramebuffer(WebGLId framebuffer);
263 virtual WGC3Dboolean isProgram(WebGLId program);
264 virtual WGC3Dboolean isRenderbuffer(WebGLId renderbuffer);
265 virtual WGC3Dboolean isShader(WebGLId shader);
266 virtual WGC3Dboolean isTexture(WebGLId texture);
267 virtual void lineWidth(WGC3Dfloat);
268 virtual void linkProgram(WebGLId program);
269 virtual void pixelStorei(WGC3Denum pname, WGC3Dint param);
270 virtual void polygonOffset(WGC3Dfloat factor, WGC3Dfloat units);
272 virtual void readPixels(WGC3Dint x,
280 virtual void releaseShaderCompiler();
281 virtual void renderbufferStorage(WGC3Denum target,
282 WGC3Denum internalformat,
285 virtual void sampleCoverage(WGC3Dfloat value, WGC3Dboolean invert);
286 virtual void scissor(WGC3Dint x, WGC3Dint y,
287 WGC3Dsizei width, WGC3Dsizei height);
288 virtual void shaderSource(WebGLId shader, const WGC3Dchar* string);
289 virtual void stencilFunc(WGC3Denum func, WGC3Dint ref, WGC3Duint mask);
290 virtual void stencilFuncSeparate(WGC3Denum face,
294 virtual void stencilMask(WGC3Duint mask);
295 virtual void stencilMaskSeparate(WGC3Denum face, WGC3Duint mask);
296 virtual void stencilOp(WGC3Denum fail,
299 virtual void stencilOpSeparate(WGC3Denum face,
304 virtual void texImage2D(WGC3Denum target,
306 WGC3Denum internalformat,
314 virtual void texParameterf(WGC3Denum target,
317 virtual void texParameteri(WGC3Denum target,
321 virtual void texSubImage2D(WGC3Denum target,
331 virtual void uniform1f(WGC3Dint location, WGC3Dfloat x);
332 virtual void uniform1fv(WGC3Dint location,
333 WGC3Dsizei count, const WGC3Dfloat* v);
334 virtual void uniform1i(WGC3Dint location, WGC3Dint x);
335 virtual void uniform1iv(WGC3Dint location,
336 WGC3Dsizei count, const WGC3Dint* v);
337 virtual void uniform2f(WGC3Dint location, WGC3Dfloat x, WGC3Dfloat y);
338 virtual void uniform2fv(WGC3Dint location,
339 WGC3Dsizei count, const WGC3Dfloat* v);
340 virtual void uniform2i(WGC3Dint location, WGC3Dint x, WGC3Dint y);
341 virtual void uniform2iv(WGC3Dint location,
342 WGC3Dsizei count, const WGC3Dint* v);
343 virtual void uniform3f(WGC3Dint location,
344 WGC3Dfloat x, WGC3Dfloat y, WGC3Dfloat z);
345 virtual void uniform3fv(WGC3Dint location,
346 WGC3Dsizei count, const WGC3Dfloat* v);
347 virtual void uniform3i(WGC3Dint location,
348 WGC3Dint x, WGC3Dint y, WGC3Dint z);
349 virtual void uniform3iv(WGC3Dint location,
350 WGC3Dsizei count, const WGC3Dint* v);
351 virtual void uniform4f(WGC3Dint location,
352 WGC3Dfloat x, WGC3Dfloat y,
353 WGC3Dfloat z, WGC3Dfloat w);
354 virtual void uniform4fv(WGC3Dint location,
355 WGC3Dsizei count, const WGC3Dfloat* v);
356 virtual void uniform4i(WGC3Dint location,
357 WGC3Dint x, WGC3Dint y, WGC3Dint z, WGC3Dint w);
358 virtual void uniform4iv(WGC3Dint location,
359 WGC3Dsizei count, const WGC3Dint* v);
360 virtual void uniformMatrix2fv(WGC3Dint location,
362 WGC3Dboolean transpose,
363 const WGC3Dfloat* value);
364 virtual void uniformMatrix3fv(WGC3Dint location,
366 WGC3Dboolean transpose,
367 const WGC3Dfloat* value);
368 virtual void uniformMatrix4fv(WGC3Dint location,
370 WGC3Dboolean transpose,
371 const WGC3Dfloat* value);
373 virtual void useProgram(WebGLId program);
374 virtual void validateProgram(WebGLId program);
376 virtual void vertexAttrib1f(WGC3Duint index, WGC3Dfloat x);
377 virtual void vertexAttrib1fv(WGC3Duint index, const WGC3Dfloat* values);
378 virtual void vertexAttrib2f(WGC3Duint index, WGC3Dfloat x, WGC3Dfloat y);
379 virtual void vertexAttrib2fv(WGC3Duint index, const WGC3Dfloat* values);
380 virtual void vertexAttrib3f(WGC3Duint index,
381 WGC3Dfloat x, WGC3Dfloat y, WGC3Dfloat z);
382 virtual void vertexAttrib3fv(WGC3Duint index, const WGC3Dfloat* values);
383 virtual void vertexAttrib4f(WGC3Duint index,
384 WGC3Dfloat x, WGC3Dfloat y,
385 WGC3Dfloat z, WGC3Dfloat w);
386 virtual void vertexAttrib4fv(WGC3Duint index, const WGC3Dfloat* values);
387 virtual void vertexAttribPointer(WGC3Duint index,
390 WGC3Dboolean normalized,
394 virtual void viewport(WGC3Dint x, WGC3Dint y,
395 WGC3Dsizei width, WGC3Dsizei height);
397 // Support for buffer creation and deletion
398 virtual void genBuffers(WGC3Dsizei count, WebGLId* ids);
399 virtual void genFramebuffers(WGC3Dsizei count, WebGLId* ids);
400 virtual void genRenderbuffers(WGC3Dsizei count, WebGLId* ids);
401 virtual void genTextures(WGC3Dsizei count, WebGLId* ids);
403 virtual void deleteBuffers(WGC3Dsizei count, WebGLId* ids);
404 virtual void deleteFramebuffers(WGC3Dsizei count, WebGLId* ids);
405 virtual void deleteRenderbuffers(WGC3Dsizei count, WebGLId* ids);
406 virtual void deleteTextures(WGC3Dsizei count, WebGLId* ids);
408 virtual WebGLId createBuffer();
409 virtual WebGLId createFramebuffer();
410 virtual WebGLId createRenderbuffer();
411 virtual WebGLId createTexture();
413 virtual void deleteBuffer(WebGLId);
414 virtual void deleteFramebuffer(WebGLId);
415 virtual void deleteRenderbuffer(WebGLId);
416 virtual void deleteTexture(WebGLId);
418 virtual WebGLId createProgram();
419 virtual WebGLId createShader(WGC3Denum);
421 virtual void deleteProgram(WebGLId);
422 virtual void deleteShader(WebGLId);
424 virtual void synthesizeGLError(WGC3Denum);
426 virtual void* mapBufferSubDataCHROMIUM(
427 WGC3Denum target, WGC3Dintptr offset,
428 WGC3Dsizeiptr size, WGC3Denum access);
429 virtual void unmapBufferSubDataCHROMIUM(const void*);
430 virtual void* mapTexSubImage2DCHROMIUM(
440 virtual void unmapTexSubImage2DCHROMIUM(const void*);
442 virtual void setVisibilityCHROMIUM(bool visible);
444 virtual void discardFramebufferEXT(WGC3Denum target,
445 WGC3Dsizei numAttachments,
446 const WGC3Denum* attachments);
448 virtual void copyTextureToParentTextureCHROMIUM(
449 WebGLId texture, WebGLId parentTexture);
451 virtual blink::WebString getRequestableExtensionsCHROMIUM();
452 virtual void requestExtensionCHROMIUM(const char*);
454 virtual void blitFramebufferCHROMIUM(
455 WGC3Dint srcX0, WGC3Dint srcY0, WGC3Dint srcX1, WGC3Dint srcY1,
456 WGC3Dint dstX0, WGC3Dint dstY0, WGC3Dint dstX1, WGC3Dint dstY1,
457 WGC3Dbitfield mask, WGC3Denum filter);
458 virtual void renderbufferStorageMultisampleCHROMIUM(
459 WGC3Denum target, WGC3Dsizei samples, WGC3Denum internalformat,
460 WGC3Dsizei width, WGC3Dsizei height);
462 virtual blink::WebString getTranslatedShaderSourceANGLE(WebGLId shader);
464 virtual void setContextLostCallback(
465 WebGraphicsContext3D::WebGraphicsContextLostCallback* callback);
466 virtual WGC3Denum getGraphicsResetStatusARB();
468 virtual void texImageIOSurface2DCHROMIUM(
469 WGC3Denum target, WGC3Dint width, WGC3Dint height,
470 WGC3Duint ioSurfaceId, WGC3Duint plane);
472 virtual void bindTexImage2DCHROMIUM(WGC3Denum target, WGC3Dint imageId);
473 virtual void releaseTexImage2DCHROMIUM(WGC3Denum target, WGC3Dint imageId);
475 virtual void texStorage2DEXT(
476 WGC3Denum target, WGC3Dint levels, WGC3Duint internalformat,
477 WGC3Dint width, WGC3Dint height);
478 virtual WGC3Duint createImageCHROMIUM(
479 WGC3Dsizei width, WGC3Dsizei height, WGC3Denum internalformat);
480 virtual void destroyImageCHROMIUM(WGC3Duint image_id);
481 virtual void getImageParameterivCHROMIUM(
482 WGC3Duint image_id, WGC3Denum pname, WGC3Dint* params);
483 virtual void* mapImageCHROMIUM(WGC3Duint image_id, WGC3Denum access);
484 virtual void unmapImageCHROMIUM(WGC3Duint image_id);
485 virtual WebGLId createQueryEXT();
486 virtual void deleteQueryEXT(WebGLId query);
487 virtual WGC3Dboolean isQueryEXT(WebGLId query);
488 virtual void beginQueryEXT(WGC3Denum target, WebGLId query);
489 virtual void endQueryEXT(WGC3Denum target);
490 virtual void getQueryivEXT(
491 WGC3Denum target, WGC3Denum pname, WGC3Dint* params);
492 virtual void getQueryObjectuivEXT(
493 WebGLId query, WGC3Denum pname, WGC3Duint* params);
495 virtual void copyTextureCHROMIUM(WGC3Denum target, WGC3Duint source_id,
496 WGC3Duint dest_id, WGC3Dint level,
497 WGC3Denum internal_format,
498 WGC3Denum dest_type);
500 virtual void bindUniformLocationCHROMIUM(WebGLId program, WGC3Dint location,
501 const WGC3Dchar* uniform);
503 virtual void shallowFlushCHROMIUM();
504 virtual void shallowFinishCHROMIUM();
506 virtual void genMailboxCHROMIUM(WGC3Dbyte* mailbox);
507 virtual void produceTextureCHROMIUM(WGC3Denum target,
508 const WGC3Dbyte* mailbox);
509 virtual void consumeTextureCHROMIUM(WGC3Denum target,
510 const WGC3Dbyte* mailbox);
512 virtual void insertEventMarkerEXT(const WGC3Dchar* marker);
513 virtual void pushGroupMarkerEXT(const WGC3Dchar* marker);
514 virtual void popGroupMarkerEXT();
516 virtual void* mapBufferCHROMIUM(WGC3Denum target, WGC3Denum access);
517 virtual WGC3Dboolean unmapBufferCHROMIUM(WGC3Denum target);
519 virtual void framebufferTexture2DMultisampleEXT(WGC3Denum target,
520 WGC3Denum attachment,
525 virtual void renderbufferStorageMultisampleEXT(WGC3Denum target,
527 WGC3Denum internalformat,
532 // Async pixel transfer functions.
533 virtual void asyncTexImage2DCHROMIUM(
536 WGC3Denum internalformat,
543 virtual void asyncTexSubImage2DCHROMIUM(
553 virtual void waitAsyncTexImage2DCHROMIUM(WGC3Denum target);
555 virtual void drawBuffersEXT(WGC3Dsizei n, const WGC3Denum* bufs);
557 virtual unsigned insertSyncPoint();
559 virtual void loseContextCHROMIUM(WGC3Denum current, WGC3Denum other);
561 virtual GrGLInterface* createGrGLInterface();
563 ::gpu::gles2::GLES2Interface* GetGLInterface();
564 ::gpu::ContextSupport* GetContextSupport();
566 ::gpu::gles2::GLES2Implementation* GetImplementation() {
571 WebGraphicsContext3DInProcessCommandBufferImpl(
572 scoped_ptr< ::gpu::GLInProcessContext> context,
573 const blink::WebGraphicsContext3D::Attributes& attributes,
575 gfx::AcceleratedWidget window);
577 void OnContextLost();
579 bool MaybeInitializeGL();
581 // Used to try to find bugs in code that calls gl directly through the gl api
582 // instead of going through WebGraphicsContext3D.
586 // Only used when not offscreen.
587 gfx::AcceleratedWidget window_;
590 bool initialize_failed_;
592 // The context we use for OpenGL rendering.
593 scoped_ptr< ::gpu::GLInProcessContext> context_;
594 // The GLES2Implementation we use for OpenGL rendering.
595 ::gpu::gles2::GLES2Implementation* gl_;
597 WebGraphicsContext3D::WebGraphicsContextLostCallback* context_lost_callback_;
598 WGC3Denum context_lost_reason_;
600 blink::WebGraphicsContext3D::Attributes attributes_;
602 // Errors raised by synthesizeGLError().
603 std::vector<WGC3Denum> synthetic_errors_;
609 } // namespace webkit
611 #endif // WEBKIT_COMMON_GPU_WEBGRAPHICSCONTEXT3D_IN_PROCESS_COMMAND_BUFFER_IMPL_H_