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 bool lose_context_when_out_of_memory,
56 gfx::AcceleratedWidget window);
58 static scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
59 CreateOffscreenContext(
60 const blink::WebGraphicsContext3D::Attributes& attributes,
61 bool lose_context_when_out_of_memory);
63 static scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
65 scoped_ptr< ::gpu::GLInProcessContext> context,
66 const blink::WebGraphicsContext3D::Attributes& attributes);
68 virtual ~WebGraphicsContext3DInProcessCommandBufferImpl();
70 // Convert WebGL context creation attributes into GLInProcessContext / EGL
72 static void ConvertAttributes(
73 const blink::WebGraphicsContext3D::Attributes& attributes,
74 ::gpu::GLInProcessContextAttribs* output_attribs);
76 //----------------------------------------------------------------------
77 // WebGraphicsContext3D methods
78 virtual bool makeContextCurrent();
80 virtual uint32_t lastFlushID();
82 virtual void reshapeWithScaleFactor(int width, int height, float scaleFactor);
84 virtual void prepareTexture();
85 virtual void postSubBufferCHROMIUM(int x, int y, int width, int height);
87 virtual void activeTexture(WGC3Denum texture);
88 virtual void attachShader(WebGLId program, WebGLId shader);
89 virtual void bindAttribLocation(WebGLId program, WGC3Duint index,
90 const WGC3Dchar* name);
91 virtual void bindBuffer(WGC3Denum target, WebGLId buffer);
92 virtual void bindFramebuffer(WGC3Denum target, WebGLId framebuffer);
93 virtual void bindRenderbuffer(WGC3Denum target, WebGLId renderbuffer);
94 virtual void bindTexture(WGC3Denum target, WebGLId texture);
95 virtual void blendColor(WGC3Dclampf red, WGC3Dclampf green,
96 WGC3Dclampf blue, WGC3Dclampf alpha);
97 virtual void blendEquation(WGC3Denum mode);
98 virtual void blendEquationSeparate(WGC3Denum modeRGB,
100 virtual void blendFunc(WGC3Denum sfactor, WGC3Denum dfactor);
101 virtual void blendFuncSeparate(WGC3Denum srcRGB,
106 virtual void bufferData(WGC3Denum target, WGC3Dsizeiptr size,
107 const void* data, WGC3Denum usage);
108 virtual void bufferSubData(WGC3Denum target, WGC3Dintptr offset,
109 WGC3Dsizeiptr size, const void* data);
111 virtual WGC3Denum checkFramebufferStatus(WGC3Denum target);
112 virtual void clear(WGC3Dbitfield mask);
113 virtual void clearColor(WGC3Dclampf red, WGC3Dclampf green,
114 WGC3Dclampf blue, WGC3Dclampf alpha);
115 virtual void clearDepth(WGC3Dclampf depth);
116 virtual void clearStencil(WGC3Dint s);
117 virtual void colorMask(WGC3Dboolean red, WGC3Dboolean green,
118 WGC3Dboolean blue, WGC3Dboolean alpha);
119 virtual void compileShader(WebGLId shader);
121 virtual void compressedTexImage2D(WGC3Denum target,
123 WGC3Denum internalformat,
127 WGC3Dsizei imageSize,
129 virtual void compressedTexSubImage2D(WGC3Denum target,
136 WGC3Dsizei imageSize,
138 virtual void copyTexImage2D(WGC3Denum target,
140 WGC3Denum internalformat,
146 virtual void copyTexSubImage2D(WGC3Denum target,
154 virtual void cullFace(WGC3Denum mode);
155 virtual void depthFunc(WGC3Denum func);
156 virtual void depthMask(WGC3Dboolean flag);
157 virtual void depthRange(WGC3Dclampf zNear, WGC3Dclampf zFar);
158 virtual void detachShader(WebGLId program, WebGLId shader);
159 virtual void disable(WGC3Denum cap);
160 virtual void disableVertexAttribArray(WGC3Duint index);
161 virtual void drawArrays(WGC3Denum mode, WGC3Dint first, WGC3Dsizei count);
162 virtual void drawElements(WGC3Denum mode,
167 virtual void enable(WGC3Denum cap);
168 virtual void enableVertexAttribArray(WGC3Duint index);
169 virtual void finish();
170 virtual void flush();
171 virtual void framebufferRenderbuffer(WGC3Denum target,
172 WGC3Denum attachment,
173 WGC3Denum renderbuffertarget,
174 WebGLId renderbuffer);
175 virtual void framebufferTexture2D(WGC3Denum target,
176 WGC3Denum attachment,
180 virtual void frontFace(WGC3Denum mode);
181 virtual void generateMipmap(WGC3Denum target);
183 virtual bool getActiveAttrib(WebGLId program,
186 virtual bool getActiveUniform(WebGLId program,
190 virtual void getAttachedShaders(WebGLId program,
195 virtual WGC3Dint getAttribLocation(WebGLId program, const WGC3Dchar* name);
197 virtual void getBooleanv(WGC3Denum pname, WGC3Dboolean* value);
199 virtual void getBufferParameteriv(WGC3Denum target,
203 virtual Attributes getContextAttributes();
205 virtual WGC3Denum getError();
207 virtual bool isContextLost();
209 virtual void getFloatv(WGC3Denum pname, WGC3Dfloat* value);
211 virtual void getFramebufferAttachmentParameteriv(WGC3Denum target,
212 WGC3Denum attachment,
216 virtual void getIntegerv(WGC3Denum pname, WGC3Dint* value);
218 virtual void getProgramiv(WebGLId program, WGC3Denum pname, WGC3Dint* value);
220 virtual blink::WebString getProgramInfoLog(WebGLId program);
222 virtual void getRenderbufferParameteriv(WGC3Denum target,
226 virtual void getShaderiv(WebGLId shader, WGC3Denum pname, WGC3Dint* value);
228 virtual blink::WebString getShaderInfoLog(WebGLId shader);
230 virtual void getShaderPrecisionFormat(WGC3Denum shadertype,
231 WGC3Denum precisiontype,
233 WGC3Dint* precision);
235 virtual blink::WebString getShaderSource(WebGLId shader);
236 virtual blink::WebString getString(WGC3Denum name);
238 virtual void getTexParameterfv(WGC3Denum target,
241 virtual void getTexParameteriv(WGC3Denum target,
245 virtual void getUniformfv(WebGLId program,
248 virtual void getUniformiv(WebGLId program,
252 virtual WGC3Dint getUniformLocation(WebGLId program, const WGC3Dchar* name);
254 virtual void getVertexAttribfv(WGC3Duint index, WGC3Denum pname,
256 virtual void getVertexAttribiv(WGC3Duint index, WGC3Denum pname,
259 virtual WGC3Dsizeiptr getVertexAttribOffset(WGC3Duint index, WGC3Denum pname);
261 virtual void hint(WGC3Denum target, WGC3Denum mode);
262 virtual WGC3Dboolean isBuffer(WebGLId buffer);
263 virtual WGC3Dboolean isEnabled(WGC3Denum cap);
264 virtual WGC3Dboolean isFramebuffer(WebGLId framebuffer);
265 virtual WGC3Dboolean isProgram(WebGLId program);
266 virtual WGC3Dboolean isRenderbuffer(WebGLId renderbuffer);
267 virtual WGC3Dboolean isShader(WebGLId shader);
268 virtual WGC3Dboolean isTexture(WebGLId texture);
269 virtual void lineWidth(WGC3Dfloat);
270 virtual void linkProgram(WebGLId program);
271 virtual void pixelStorei(WGC3Denum pname, WGC3Dint param);
272 virtual void polygonOffset(WGC3Dfloat factor, WGC3Dfloat units);
274 virtual void readPixels(WGC3Dint x,
282 virtual void releaseShaderCompiler();
283 virtual void renderbufferStorage(WGC3Denum target,
284 WGC3Denum internalformat,
287 virtual void sampleCoverage(WGC3Dfloat value, WGC3Dboolean invert);
288 virtual void scissor(WGC3Dint x, WGC3Dint y,
289 WGC3Dsizei width, WGC3Dsizei height);
290 virtual void shaderSource(WebGLId shader, const WGC3Dchar* string);
291 virtual void stencilFunc(WGC3Denum func, WGC3Dint ref, WGC3Duint mask);
292 virtual void stencilFuncSeparate(WGC3Denum face,
296 virtual void stencilMask(WGC3Duint mask);
297 virtual void stencilMaskSeparate(WGC3Denum face, WGC3Duint mask);
298 virtual void stencilOp(WGC3Denum fail,
301 virtual void stencilOpSeparate(WGC3Denum face,
306 virtual void texImage2D(WGC3Denum target,
308 WGC3Denum internalformat,
316 virtual void texParameterf(WGC3Denum target,
319 virtual void texParameteri(WGC3Denum target,
323 virtual void texSubImage2D(WGC3Denum target,
333 virtual void uniform1f(WGC3Dint location, WGC3Dfloat x);
334 virtual void uniform1fv(WGC3Dint location,
335 WGC3Dsizei count, const WGC3Dfloat* v);
336 virtual void uniform1i(WGC3Dint location, WGC3Dint x);
337 virtual void uniform1iv(WGC3Dint location,
338 WGC3Dsizei count, const WGC3Dint* v);
339 virtual void uniform2f(WGC3Dint location, WGC3Dfloat x, WGC3Dfloat y);
340 virtual void uniform2fv(WGC3Dint location,
341 WGC3Dsizei count, const WGC3Dfloat* v);
342 virtual void uniform2i(WGC3Dint location, WGC3Dint x, WGC3Dint y);
343 virtual void uniform2iv(WGC3Dint location,
344 WGC3Dsizei count, const WGC3Dint* v);
345 virtual void uniform3f(WGC3Dint location,
346 WGC3Dfloat x, WGC3Dfloat y, WGC3Dfloat z);
347 virtual void uniform3fv(WGC3Dint location,
348 WGC3Dsizei count, const WGC3Dfloat* v);
349 virtual void uniform3i(WGC3Dint location,
350 WGC3Dint x, WGC3Dint y, WGC3Dint z);
351 virtual void uniform3iv(WGC3Dint location,
352 WGC3Dsizei count, const WGC3Dint* v);
353 virtual void uniform4f(WGC3Dint location,
354 WGC3Dfloat x, WGC3Dfloat y,
355 WGC3Dfloat z, WGC3Dfloat w);
356 virtual void uniform4fv(WGC3Dint location,
357 WGC3Dsizei count, const WGC3Dfloat* v);
358 virtual void uniform4i(WGC3Dint location,
359 WGC3Dint x, WGC3Dint y, WGC3Dint z, WGC3Dint w);
360 virtual void uniform4iv(WGC3Dint location,
361 WGC3Dsizei count, const WGC3Dint* v);
362 virtual void uniformMatrix2fv(WGC3Dint location,
364 WGC3Dboolean transpose,
365 const WGC3Dfloat* value);
366 virtual void uniformMatrix3fv(WGC3Dint location,
368 WGC3Dboolean transpose,
369 const WGC3Dfloat* value);
370 virtual void uniformMatrix4fv(WGC3Dint location,
372 WGC3Dboolean transpose,
373 const WGC3Dfloat* value);
375 virtual void useProgram(WebGLId program);
376 virtual void validateProgram(WebGLId program);
378 virtual void vertexAttrib1f(WGC3Duint index, WGC3Dfloat x);
379 virtual void vertexAttrib1fv(WGC3Duint index, const WGC3Dfloat* values);
380 virtual void vertexAttrib2f(WGC3Duint index, WGC3Dfloat x, WGC3Dfloat y);
381 virtual void vertexAttrib2fv(WGC3Duint index, const WGC3Dfloat* values);
382 virtual void vertexAttrib3f(WGC3Duint index,
383 WGC3Dfloat x, WGC3Dfloat y, WGC3Dfloat z);
384 virtual void vertexAttrib3fv(WGC3Duint index, const WGC3Dfloat* values);
385 virtual void vertexAttrib4f(WGC3Duint index,
386 WGC3Dfloat x, WGC3Dfloat y,
387 WGC3Dfloat z, WGC3Dfloat w);
388 virtual void vertexAttrib4fv(WGC3Duint index, const WGC3Dfloat* values);
389 virtual void vertexAttribPointer(WGC3Duint index,
392 WGC3Dboolean normalized,
396 virtual void viewport(WGC3Dint x, WGC3Dint y,
397 WGC3Dsizei width, WGC3Dsizei height);
399 // Support for buffer creation and deletion
400 virtual void genBuffers(WGC3Dsizei count, WebGLId* ids);
401 virtual void genFramebuffers(WGC3Dsizei count, WebGLId* ids);
402 virtual void genRenderbuffers(WGC3Dsizei count, WebGLId* ids);
403 virtual void genTextures(WGC3Dsizei count, WebGLId* ids);
405 virtual void deleteBuffers(WGC3Dsizei count, WebGLId* ids);
406 virtual void deleteFramebuffers(WGC3Dsizei count, WebGLId* ids);
407 virtual void deleteRenderbuffers(WGC3Dsizei count, WebGLId* ids);
408 virtual void deleteTextures(WGC3Dsizei count, WebGLId* ids);
410 virtual WebGLId createBuffer();
411 virtual WebGLId createFramebuffer();
412 virtual WebGLId createRenderbuffer();
413 virtual WebGLId createTexture();
415 virtual void deleteBuffer(WebGLId);
416 virtual void deleteFramebuffer(WebGLId);
417 virtual void deleteRenderbuffer(WebGLId);
418 virtual void deleteTexture(WebGLId);
420 virtual WebGLId createProgram();
421 virtual WebGLId createShader(WGC3Denum);
423 virtual void deleteProgram(WebGLId);
424 virtual void deleteShader(WebGLId);
426 virtual void synthesizeGLError(WGC3Denum);
428 virtual void* mapBufferSubDataCHROMIUM(
429 WGC3Denum target, WGC3Dintptr offset,
430 WGC3Dsizeiptr size, WGC3Denum access);
431 virtual void unmapBufferSubDataCHROMIUM(const void*);
432 virtual void* mapTexSubImage2DCHROMIUM(
442 virtual void unmapTexSubImage2DCHROMIUM(const void*);
444 virtual void setVisibilityCHROMIUM(bool visible);
446 virtual void discardFramebufferEXT(WGC3Denum target,
447 WGC3Dsizei numAttachments,
448 const WGC3Denum* attachments);
450 virtual void copyTextureToParentTextureCHROMIUM(
451 WebGLId texture, WebGLId parentTexture);
453 virtual blink::WebString getRequestableExtensionsCHROMIUM();
454 virtual void requestExtensionCHROMIUM(const char*);
456 virtual void blitFramebufferCHROMIUM(
457 WGC3Dint srcX0, WGC3Dint srcY0, WGC3Dint srcX1, WGC3Dint srcY1,
458 WGC3Dint dstX0, WGC3Dint dstY0, WGC3Dint dstX1, WGC3Dint dstY1,
459 WGC3Dbitfield mask, WGC3Denum filter);
460 virtual void renderbufferStorageMultisampleCHROMIUM(
461 WGC3Denum target, WGC3Dsizei samples, WGC3Denum internalformat,
462 WGC3Dsizei width, WGC3Dsizei height);
464 virtual blink::WebString getTranslatedShaderSourceANGLE(WebGLId shader);
466 virtual void setContextLostCallback(
467 WebGraphicsContext3D::WebGraphicsContextLostCallback* callback);
468 virtual WGC3Denum getGraphicsResetStatusARB();
470 virtual void texImageIOSurface2DCHROMIUM(
471 WGC3Denum target, WGC3Dint width, WGC3Dint height,
472 WGC3Duint ioSurfaceId, WGC3Duint plane);
474 virtual void bindTexImage2DCHROMIUM(WGC3Denum target, WGC3Dint imageId);
475 virtual void releaseTexImage2DCHROMIUM(WGC3Denum target, WGC3Dint imageId);
477 virtual void texStorage2DEXT(
478 WGC3Denum target, WGC3Dint levels, WGC3Duint internalformat,
479 WGC3Dint width, WGC3Dint height);
480 virtual WGC3Duint createImageCHROMIUM(
481 WGC3Dsizei width, WGC3Dsizei height, WGC3Denum internalformat);
482 virtual void destroyImageCHROMIUM(WGC3Duint image_id);
483 virtual void getImageParameterivCHROMIUM(
484 WGC3Duint image_id, WGC3Denum pname, WGC3Dint* params);
485 virtual void* mapImageCHROMIUM(WGC3Duint image_id, WGC3Denum access);
486 virtual void unmapImageCHROMIUM(WGC3Duint image_id);
487 virtual WebGLId createQueryEXT();
488 virtual void deleteQueryEXT(WebGLId query);
489 virtual WGC3Dboolean isQueryEXT(WebGLId query);
490 virtual void beginQueryEXT(WGC3Denum target, WebGLId query);
491 virtual void endQueryEXT(WGC3Denum target);
492 virtual void getQueryivEXT(
493 WGC3Denum target, WGC3Denum pname, WGC3Dint* params);
494 virtual void getQueryObjectuivEXT(
495 WebGLId query, WGC3Denum pname, WGC3Duint* params);
497 virtual void copyTextureCHROMIUM(WGC3Denum target, WGC3Duint source_id,
498 WGC3Duint dest_id, WGC3Dint level,
499 WGC3Denum internal_format,
500 WGC3Denum dest_type);
502 virtual void bindUniformLocationCHROMIUM(WebGLId program, WGC3Dint location,
503 const WGC3Dchar* uniform);
505 virtual void shallowFlushCHROMIUM();
506 virtual void shallowFinishCHROMIUM();
508 virtual void genMailboxCHROMIUM(WGC3Dbyte* mailbox);
509 virtual void produceTextureCHROMIUM(WGC3Denum target,
510 const WGC3Dbyte* mailbox);
511 virtual void consumeTextureCHROMIUM(WGC3Denum target,
512 const WGC3Dbyte* mailbox);
514 virtual void insertEventMarkerEXT(const WGC3Dchar* marker);
515 virtual void pushGroupMarkerEXT(const WGC3Dchar* marker);
516 virtual void popGroupMarkerEXT();
518 virtual void* mapBufferCHROMIUM(WGC3Denum target, WGC3Denum access);
519 virtual WGC3Dboolean unmapBufferCHROMIUM(WGC3Denum target);
521 virtual void framebufferTexture2DMultisampleEXT(WGC3Denum target,
522 WGC3Denum attachment,
527 virtual void renderbufferStorageMultisampleEXT(WGC3Denum target,
529 WGC3Denum internalformat,
534 // Async pixel transfer functions.
535 virtual void asyncTexImage2DCHROMIUM(
538 WGC3Denum internalformat,
545 virtual void asyncTexSubImage2DCHROMIUM(
555 virtual void waitAsyncTexImage2DCHROMIUM(WGC3Denum target);
557 virtual void drawBuffersEXT(WGC3Dsizei n, const WGC3Denum* bufs);
559 virtual unsigned insertSyncPoint();
561 virtual void loseContextCHROMIUM(WGC3Denum current, WGC3Denum other);
563 virtual GrGLInterface* createGrGLInterface();
565 ::gpu::gles2::GLES2Interface* GetGLInterface();
566 ::gpu::ContextSupport* GetContextSupport();
568 ::gpu::gles2::GLES2Implementation* GetImplementation() {
573 WebGraphicsContext3DInProcessCommandBufferImpl(
574 scoped_ptr< ::gpu::GLInProcessContext> context,
575 const blink::WebGraphicsContext3D::Attributes& attributes,
576 bool lose_context_when_out_of_memory,
578 gfx::AcceleratedWidget window);
580 void OnContextLost();
582 bool MaybeInitializeGL();
584 // Used to try to find bugs in code that calls gl directly through the gl api
585 // instead of going through WebGraphicsContext3D.
589 // Only used when not offscreen.
590 gfx::AcceleratedWidget window_;
593 bool initialize_failed_;
595 // The context we use for OpenGL rendering.
596 scoped_ptr< ::gpu::GLInProcessContext> context_;
597 // The GLES2Implementation we use for OpenGL rendering.
598 ::gpu::gles2::GLES2Implementation* gl_;
600 WebGraphicsContext3D::WebGraphicsContextLostCallback* context_lost_callback_;
601 WGC3Denum context_lost_reason_;
603 blink::WebGraphicsContext3D::Attributes attributes_;
604 bool lose_context_when_out_of_memory_;
606 // Errors raised by synthesizeGLError().
607 std::vector<WGC3Denum> synthetic_errors_;
613 } // namespace webkit
615 #endif // WEBKIT_COMMON_GPU_WEBGRAPHICSCONTEXT3D_IN_PROCESS_COMMAND_BUFFER_IMPL_H_