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 GPU_BLINK_WEBGRAPHICSCONTEXT3D_IMPL_H_
6 #define GPU_BLINK_WEBGRAPHICSCONTEXT3D_IMPL_H_
11 #include "base/callback.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "gpu/blink/gpu_blink_export.h"
14 #include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
15 #include "third_party/WebKit/public/platform/WebString.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
;
43 class WebGraphicsContext3DErrorMessageCallback
;
45 class GPU_BLINK_EXPORT WebGraphicsContext3DImpl
46 : public NON_EXPORTED_BASE(blink::WebGraphicsContext3D
) {
48 virtual ~WebGraphicsContext3DImpl();
50 //----------------------------------------------------------------------
51 // WebGraphicsContext3D methods
53 virtual uint32_t lastFlushID();
55 virtual unsigned int insertSyncPoint();
56 virtual void waitSyncPoint(unsigned int sync_point
);
58 virtual void loseContextCHROMIUM(WGC3Denum current
, WGC3Denum other
);
60 virtual void reshapeWithScaleFactor(
61 int width
, int height
, float scale_factor
);
63 virtual void prepareTexture();
64 virtual void postSubBufferCHROMIUM(int x
, int y
, int width
, int height
);
66 virtual void activeTexture(WGC3Denum texture
);
67 virtual void attachShader(WebGLId program
, WebGLId shader
);
68 virtual void bindAttribLocation(WebGLId program
, WGC3Duint index
,
69 const WGC3Dchar
* name
);
70 virtual void bindBuffer(WGC3Denum target
, WebGLId buffer
);
71 virtual void bindFramebuffer(WGC3Denum target
, WebGLId framebuffer
);
72 virtual void bindRenderbuffer(WGC3Denum target
, WebGLId renderbuffer
);
73 virtual void bindTexture(WGC3Denum target
, WebGLId texture
);
74 virtual void blendColor(WGC3Dclampf red
, WGC3Dclampf green
,
75 WGC3Dclampf blue
, WGC3Dclampf alpha
);
76 virtual void blendEquation(WGC3Denum mode
);
77 virtual void blendEquationSeparate(WGC3Denum modeRGB
,
79 virtual void blendFunc(WGC3Denum sfactor
, WGC3Denum dfactor
);
80 virtual void blendFuncSeparate(WGC3Denum srcRGB
,
85 virtual void bufferData(WGC3Denum target
, WGC3Dsizeiptr size
,
86 const void* data
, WGC3Denum usage
);
87 virtual void bufferSubData(WGC3Denum target
, WGC3Dintptr offset
,
88 WGC3Dsizeiptr size
, const void* data
);
90 virtual WGC3Denum
checkFramebufferStatus(WGC3Denum target
);
91 virtual void clear(WGC3Dbitfield mask
);
92 virtual void clearColor(WGC3Dclampf red
, WGC3Dclampf green
,
93 WGC3Dclampf blue
, WGC3Dclampf alpha
);
94 virtual void clearDepth(WGC3Dclampf depth
);
95 virtual void clearStencil(WGC3Dint s
);
96 virtual void colorMask(WGC3Dboolean red
, WGC3Dboolean green
,
97 WGC3Dboolean blue
, WGC3Dboolean alpha
);
98 virtual void compileShader(WebGLId shader
);
100 virtual void compressedTexImage2D(WGC3Denum target
,
102 WGC3Denum internalformat
,
106 WGC3Dsizei imageSize
,
108 virtual void compressedTexSubImage2D(WGC3Denum target
,
115 WGC3Dsizei imageSize
,
117 virtual void copyTexImage2D(WGC3Denum target
,
119 WGC3Denum internalformat
,
125 virtual void copyTexSubImage2D(WGC3Denum target
,
133 virtual void cullFace(WGC3Denum mode
);
134 virtual void depthFunc(WGC3Denum func
);
135 virtual void depthMask(WGC3Dboolean flag
);
136 virtual void depthRange(WGC3Dclampf zNear
, WGC3Dclampf zFar
);
137 virtual void detachShader(WebGLId program
, WebGLId shader
);
138 virtual void disable(WGC3Denum cap
);
139 virtual void disableVertexAttribArray(WGC3Duint index
);
140 virtual void drawArrays(WGC3Denum mode
, WGC3Dint first
, WGC3Dsizei count
);
141 virtual void drawElements(WGC3Denum mode
,
146 virtual void enable(WGC3Denum cap
);
147 virtual void enableVertexAttribArray(WGC3Duint index
);
148 virtual void finish();
149 virtual void flush();
150 virtual void framebufferRenderbuffer(WGC3Denum target
,
151 WGC3Denum attachment
,
152 WGC3Denum renderbuffertarget
,
153 WebGLId renderbuffer
);
154 virtual void framebufferTexture2D(WGC3Denum target
,
155 WGC3Denum attachment
,
159 virtual void frontFace(WGC3Denum mode
);
160 virtual void generateMipmap(WGC3Denum target
);
162 virtual bool getActiveAttrib(WebGLId program
,
165 virtual bool getActiveUniform(WebGLId program
,
169 virtual void getAttachedShaders(WebGLId program
,
174 virtual WGC3Dint
getAttribLocation(WebGLId program
, const WGC3Dchar
* name
);
176 virtual void getBooleanv(WGC3Denum pname
, WGC3Dboolean
* value
);
178 virtual void getBufferParameteriv(WGC3Denum target
,
182 virtual WGC3Denum
getError();
184 virtual void getFloatv(WGC3Denum pname
, WGC3Dfloat
* value
);
186 virtual void getFramebufferAttachmentParameteriv(WGC3Denum target
,
187 WGC3Denum attachment
,
191 virtual void getIntegerv(WGC3Denum pname
, WGC3Dint
* value
);
193 virtual void getProgramiv(WebGLId program
, WGC3Denum pname
, WGC3Dint
* value
);
195 virtual blink::WebString
getProgramInfoLog(WebGLId program
);
197 virtual void getRenderbufferParameteriv(WGC3Denum target
,
201 virtual void getShaderiv(WebGLId shader
, WGC3Denum pname
, WGC3Dint
* value
);
203 virtual blink::WebString
getShaderInfoLog(WebGLId shader
);
205 virtual void getShaderPrecisionFormat(WGC3Denum shadertype
,
206 WGC3Denum precisiontype
,
208 WGC3Dint
* precision
);
210 virtual blink::WebString
getShaderSource(WebGLId shader
);
211 virtual blink::WebString
getString(WGC3Denum name
);
213 virtual void getTexParameterfv(WGC3Denum target
,
216 virtual void getTexParameteriv(WGC3Denum target
,
220 virtual void getUniformfv(WebGLId program
,
223 virtual void getUniformiv(WebGLId program
,
227 virtual WGC3Dint
getUniformLocation(WebGLId program
, const WGC3Dchar
* name
);
229 virtual void getVertexAttribfv(WGC3Duint index
, WGC3Denum pname
,
231 virtual void getVertexAttribiv(WGC3Duint index
, WGC3Denum pname
,
234 virtual WGC3Dsizeiptr
getVertexAttribOffset(WGC3Duint index
, WGC3Denum pname
);
236 virtual void hint(WGC3Denum target
, WGC3Denum mode
);
237 virtual WGC3Dboolean
isBuffer(WebGLId buffer
);
238 virtual WGC3Dboolean
isEnabled(WGC3Denum cap
);
239 virtual WGC3Dboolean
isFramebuffer(WebGLId framebuffer
);
240 virtual WGC3Dboolean
isProgram(WebGLId program
);
241 virtual WGC3Dboolean
isRenderbuffer(WebGLId renderbuffer
);
242 virtual WGC3Dboolean
isShader(WebGLId shader
);
243 virtual WGC3Dboolean
isTexture(WebGLId texture
);
244 virtual void lineWidth(WGC3Dfloat
);
245 virtual void linkProgram(WebGLId program
);
246 virtual void pixelStorei(WGC3Denum pname
, WGC3Dint param
);
247 virtual void polygonOffset(WGC3Dfloat factor
, WGC3Dfloat units
);
249 virtual void readPixels(WGC3Dint x
,
257 virtual void releaseShaderCompiler();
258 virtual void renderbufferStorage(WGC3Denum target
,
259 WGC3Denum internalformat
,
262 virtual void sampleCoverage(WGC3Dfloat value
, WGC3Dboolean invert
);
263 virtual void scissor(WGC3Dint x
, WGC3Dint y
,
264 WGC3Dsizei width
, WGC3Dsizei height
);
265 virtual void shaderSource(WebGLId shader
, const WGC3Dchar
* string
);
266 virtual void stencilFunc(WGC3Denum func
, WGC3Dint ref
, WGC3Duint mask
);
267 virtual void stencilFuncSeparate(WGC3Denum face
,
271 virtual void stencilMask(WGC3Duint mask
);
272 virtual void stencilMaskSeparate(WGC3Denum face
, WGC3Duint mask
);
273 virtual void stencilOp(WGC3Denum fail
,
276 virtual void stencilOpSeparate(WGC3Denum face
,
281 virtual void texImage2D(WGC3Denum target
,
283 WGC3Denum internalformat
,
291 virtual void texParameterf(WGC3Denum target
,
294 virtual void texParameteri(WGC3Denum target
,
298 virtual void texSubImage2D(WGC3Denum target
,
308 virtual void uniform1f(WGC3Dint location
, WGC3Dfloat x
);
309 virtual void uniform1fv(WGC3Dint location
,
310 WGC3Dsizei count
, const WGC3Dfloat
* v
);
311 virtual void uniform1i(WGC3Dint location
, WGC3Dint x
);
312 virtual void uniform1iv(WGC3Dint location
,
313 WGC3Dsizei count
, const WGC3Dint
* v
);
314 virtual void uniform2f(WGC3Dint location
, WGC3Dfloat x
, WGC3Dfloat y
);
315 virtual void uniform2fv(WGC3Dint location
,
316 WGC3Dsizei count
, const WGC3Dfloat
* v
);
317 virtual void uniform2i(WGC3Dint location
, WGC3Dint x
, WGC3Dint y
);
318 virtual void uniform2iv(WGC3Dint location
,
319 WGC3Dsizei count
, const WGC3Dint
* v
);
320 virtual void uniform3f(WGC3Dint location
,
321 WGC3Dfloat x
, WGC3Dfloat y
, WGC3Dfloat z
);
322 virtual void uniform3fv(WGC3Dint location
,
323 WGC3Dsizei count
, const WGC3Dfloat
* v
);
324 virtual void uniform3i(WGC3Dint location
,
325 WGC3Dint x
, WGC3Dint y
, WGC3Dint z
);
326 virtual void uniform3iv(WGC3Dint location
,
327 WGC3Dsizei count
, const WGC3Dint
* v
);
328 virtual void uniform4f(WGC3Dint location
,
329 WGC3Dfloat x
, WGC3Dfloat y
,
330 WGC3Dfloat z
, WGC3Dfloat w
);
331 virtual void uniform4fv(WGC3Dint location
,
332 WGC3Dsizei count
, const WGC3Dfloat
* v
);
333 virtual void uniform4i(WGC3Dint location
,
334 WGC3Dint x
, WGC3Dint y
, WGC3Dint z
, WGC3Dint w
);
335 virtual void uniform4iv(WGC3Dint location
,
336 WGC3Dsizei count
, const WGC3Dint
* v
);
337 virtual void uniformMatrix2fv(WGC3Dint location
,
339 WGC3Dboolean transpose
,
340 const WGC3Dfloat
* value
);
341 virtual void uniformMatrix3fv(WGC3Dint location
,
343 WGC3Dboolean transpose
,
344 const WGC3Dfloat
* value
);
345 virtual void uniformMatrix4fv(WGC3Dint location
,
347 WGC3Dboolean transpose
,
348 const WGC3Dfloat
* value
);
350 virtual void useProgram(WebGLId program
);
351 virtual void validateProgram(WebGLId program
);
353 virtual void vertexAttrib1f(WGC3Duint index
, WGC3Dfloat x
);
354 virtual void vertexAttrib1fv(WGC3Duint index
, const WGC3Dfloat
* values
);
355 virtual void vertexAttrib2f(WGC3Duint index
, WGC3Dfloat x
, WGC3Dfloat y
);
356 virtual void vertexAttrib2fv(WGC3Duint index
, const WGC3Dfloat
* values
);
357 virtual void vertexAttrib3f(WGC3Duint index
,
358 WGC3Dfloat x
, WGC3Dfloat y
, WGC3Dfloat z
);
359 virtual void vertexAttrib3fv(WGC3Duint index
, const WGC3Dfloat
* values
);
360 virtual void vertexAttrib4f(WGC3Duint index
,
361 WGC3Dfloat x
, WGC3Dfloat y
,
362 WGC3Dfloat z
, WGC3Dfloat w
);
363 virtual void vertexAttrib4fv(WGC3Duint index
, const WGC3Dfloat
* values
);
364 virtual void vertexAttribPointer(WGC3Duint index
,
367 WGC3Dboolean normalized
,
371 virtual void viewport(WGC3Dint x
, WGC3Dint y
,
372 WGC3Dsizei width
, WGC3Dsizei height
);
374 // Support for buffer creation and deletion
375 virtual void genBuffers(WGC3Dsizei count
, WebGLId
* ids
);
376 virtual void genFramebuffers(WGC3Dsizei count
, WebGLId
* ids
);
377 virtual void genRenderbuffers(WGC3Dsizei count
, WebGLId
* ids
);
378 virtual void genTextures(WGC3Dsizei count
, WebGLId
* ids
);
380 virtual void deleteBuffers(WGC3Dsizei count
, WebGLId
* ids
);
381 virtual void deleteFramebuffers(WGC3Dsizei count
, WebGLId
* ids
);
382 virtual void deleteRenderbuffers(WGC3Dsizei count
, WebGLId
* ids
);
383 virtual void deleteTextures(WGC3Dsizei count
, WebGLId
* ids
);
385 virtual WebGLId
createBuffer();
386 virtual WebGLId
createFramebuffer();
387 virtual WebGLId
createRenderbuffer();
388 virtual WebGLId
createTexture();
390 virtual void deleteBuffer(WebGLId
);
391 virtual void deleteFramebuffer(WebGLId
);
392 virtual void deleteRenderbuffer(WebGLId
);
393 virtual void deleteTexture(WebGLId
);
395 virtual WebGLId
createProgram();
396 virtual WebGLId
createShader(WGC3Denum
);
398 virtual void deleteProgram(WebGLId
);
399 virtual void deleteShader(WebGLId
);
401 virtual void synthesizeGLError(WGC3Denum
);
403 virtual void* mapBufferSubDataCHROMIUM(
404 WGC3Denum target
, WGC3Dintptr offset
,
405 WGC3Dsizeiptr size
, WGC3Denum access
);
406 virtual void unmapBufferSubDataCHROMIUM(const void*);
407 virtual void* mapTexSubImage2DCHROMIUM(
417 virtual void unmapTexSubImage2DCHROMIUM(const void*);
419 virtual void setVisibilityCHROMIUM(bool visible
);
421 virtual void discardFramebufferEXT(WGC3Denum target
,
422 WGC3Dsizei numAttachments
,
423 const WGC3Denum
* attachments
);
424 virtual void copyTextureToParentTextureCHROMIUM(
425 WebGLId texture
, WebGLId parentTexture
);
427 virtual blink::WebString
getRequestableExtensionsCHROMIUM();
428 virtual void requestExtensionCHROMIUM(const char*);
430 virtual void blitFramebufferCHROMIUM(
431 WGC3Dint srcX0
, WGC3Dint srcY0
, WGC3Dint srcX1
, WGC3Dint srcY1
,
432 WGC3Dint dstX0
, WGC3Dint dstY0
, WGC3Dint dstX1
, WGC3Dint dstY1
,
433 WGC3Dbitfield mask
, WGC3Denum filter
);
434 virtual void renderbufferStorageMultisampleCHROMIUM(
435 WGC3Denum target
, WGC3Dsizei samples
, WGC3Denum internalformat
,
436 WGC3Dsizei width
, WGC3Dsizei height
);
438 virtual blink::WebString
getTranslatedShaderSourceANGLE(WebGLId shader
);
440 virtual void setContextLostCallback(
441 WebGraphicsContext3D::WebGraphicsContextLostCallback
* callback
);
443 virtual void setErrorMessageCallback(
444 WebGraphicsContext3D::WebGraphicsErrorMessageCallback
* callback
);
446 virtual void texImageIOSurface2DCHROMIUM(
447 WGC3Denum target
, WGC3Dint width
, WGC3Dint height
,
448 WGC3Duint ioSurfaceId
, WGC3Duint plane
);
450 virtual void texStorage2DEXT(
451 WGC3Denum target
, WGC3Dint levels
, WGC3Duint internalformat
,
452 WGC3Dint width
, WGC3Dint height
);
454 virtual WebGLId
createQueryEXT();
455 virtual void deleteQueryEXT(WebGLId query
);
456 virtual WGC3Dboolean
isQueryEXT(WGC3Duint query
);
457 virtual void beginQueryEXT(WGC3Denum target
, WebGLId query
);
458 virtual void endQueryEXT(WGC3Denum target
);
459 virtual void getQueryivEXT(
460 WGC3Denum target
, WGC3Denum pname
, WGC3Dint
* params
);
461 virtual void getQueryObjectuivEXT(
462 WebGLId query
, WGC3Denum pname
, WGC3Duint
* params
);
464 virtual void copyTextureCHROMIUM(WGC3Denum target
, WebGLId source_id
,
465 WebGLId dest_id
, WGC3Dint level
,
466 WGC3Denum internal_format
,
467 WGC3Denum dest_type
);
469 virtual void bindUniformLocationCHROMIUM(WebGLId program
, WGC3Dint location
,
470 const WGC3Dchar
* uniform
);
472 virtual void shallowFlushCHROMIUM();
473 virtual void shallowFinishCHROMIUM();
475 virtual void genMailboxCHROMIUM(WGC3Dbyte
* mailbox
);
476 virtual void produceTextureCHROMIUM(WGC3Denum target
,
477 const WGC3Dbyte
* mailbox
);
478 virtual void produceTextureDirectCHROMIUM(WebGLId texture
, WGC3Denum target
,
479 const WGC3Dbyte
* mailbox
);
480 virtual void consumeTextureCHROMIUM(WGC3Denum target
,
481 const WGC3Dbyte
* mailbox
);
482 virtual WebGLId
createAndConsumeTextureCHROMIUM(WGC3Denum target
,
483 const WGC3Dbyte
* mailbox
);
485 virtual void genValuebuffersCHROMIUM(WGC3Dsizei count
, WebGLId
* ids
);
486 virtual WebGLId
createValuebufferCHROMIUM();
487 virtual void deleteValuebuffersCHROMIUM(WGC3Dsizei count
, WebGLId
* ids
);
488 virtual void deleteValuebufferCHROMIUM(WebGLId
);
489 virtual void bindValuebufferCHROMIUM(WGC3Denum target
, WebGLId valuebuffer
);
490 virtual WGC3Dboolean
isValuebufferCHROMIUM(WebGLId renderbuffer
);
491 virtual void subscribeValueCHROMIUM(WGC3Denum target
, WGC3Denum subscription
);
492 virtual void populateSubscribedValuesCHROMIUM(WGC3Denum target
);
493 virtual void uniformValuebufferCHROMIUM(WGC3Dint location
,
495 WGC3Denum subscription
);
496 virtual void traceBeginCHROMIUM(const WGC3Dchar
* category_name
,
497 const WGC3Dchar
* trace_name
);
498 virtual void traceEndCHROMIUM();
500 virtual void insertEventMarkerEXT(const WGC3Dchar
* marker
);
501 virtual void pushGroupMarkerEXT(const WGC3Dchar
* marker
);
502 virtual void popGroupMarkerEXT();
504 // GL_OES_vertex_array_object
505 virtual WebGLId
createVertexArrayOES();
506 virtual void deleteVertexArrayOES(WebGLId array
);
507 virtual WGC3Dboolean
isVertexArrayOES(WebGLId array
);
508 virtual void bindVertexArrayOES(WebGLId array
);
510 virtual void bindTexImage2DCHROMIUM(WGC3Denum target
, WGC3Dint image_id
);
511 virtual void releaseTexImage2DCHROMIUM(WGC3Denum target
, WGC3Dint image_id
);
513 virtual void* mapBufferCHROMIUM(WGC3Denum target
, WGC3Denum access
);
514 virtual WGC3Dboolean
unmapBufferCHROMIUM(WGC3Denum target
);
516 // Async pixel transfer functions.
517 virtual void asyncTexImage2DCHROMIUM(
520 WGC3Denum internalformat
,
527 virtual void asyncTexSubImage2DCHROMIUM(
537 virtual void waitAsyncTexImage2DCHROMIUM(WGC3Denum target
);
539 // GL_EXT_draw_buffers
540 virtual void drawBuffersEXT(
542 const WGC3Denum
* bufs
);
544 // GL_ANGLE_instanced_arrays
545 virtual void drawArraysInstancedANGLE(WGC3Denum mode
, WGC3Dint first
,
546 WGC3Dsizei count
, WGC3Dsizei primcount
);
547 virtual void drawElementsInstancedANGLE(WGC3Denum mode
, WGC3Dsizei count
,
548 WGC3Denum type
, WGC3Dintptr offset
, WGC3Dsizei primcount
);
549 virtual void vertexAttribDivisorANGLE(WGC3Duint index
, WGC3Duint divisor
);
551 // GL_CHROMIUM_gpu_memory_buffer_image
552 virtual WGC3Duint
createGpuMemoryBufferImageCHROMIUM(WGC3Dsizei width
,
554 WGC3Denum internalformat
,
556 virtual void destroyImageCHROMIUM(WGC3Duint image_id
);
558 // GL_EXT_multisampled_render_to_texture
559 virtual void framebufferTexture2DMultisampleEXT(WGC3Denum target
,
560 WGC3Denum attachment
,
565 virtual void renderbufferStorageMultisampleEXT(
566 WGC3Denum target
, WGC3Dsizei samples
, WGC3Denum internalformat
,
567 WGC3Dsizei width
, WGC3Dsizei height
);
569 virtual GrGLInterface
* createGrGLInterface();
571 ::gpu::gles2::GLES2Interface
* GetGLInterface() {
575 // Convert WebGL context creation attributes into command buffer / EGL size
577 static void ConvertAttributes(
578 const blink::WebGraphicsContext3D::Attributes
& attributes
,
579 ::gpu::gles2::ContextCreationAttribHelper
* output_attribs
);
582 friend class WebGraphicsContext3DErrorMessageCallback
;
584 WebGraphicsContext3DImpl();
586 ::gpu::gles2::GLES2ImplementationErrorMessageCallback
*
587 getErrorMessageCallback();
588 virtual void OnErrorMessage(const std::string
& message
, int id
);
590 void setGLInterface(::gpu::gles2::GLES2Interface
* gl
) {
595 bool initialize_failed_
;
597 WebGraphicsContext3D::WebGraphicsContextLostCallback
* context_lost_callback_
;
598 WGC3Denum context_lost_reason_
;
600 WebGraphicsContext3D::WebGraphicsErrorMessageCallback
*
601 error_message_callback_
;
602 scoped_ptr
<WebGraphicsContext3DErrorMessageCallback
>
603 client_error_message_callback_
;
605 // Errors raised by synthesizeGLError().
606 std::vector
<WGC3Denum
> synthetic_errors_
;
608 ::gpu::gles2::GLES2Interface
* gl_
;
609 bool lose_context_when_out_of_memory_
;
613 } // namespace gpu_blink
615 #endif // GPU_BLINK_WEBGRAPHICSCONTEXT3D_IMPL_H_