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 #include "gpu/blink/webgraphicscontext3d_impl.h"
7 #include "base/atomicops.h"
8 #include "base/lazy_instance.h"
9 #include "base/logging.h"
10 #include "gpu/GLES2/gl2extchromium.h"
11 #include "gpu/command_buffer/client/gles2_implementation.h"
12 #include "gpu/command_buffer/client/gles2_lib.h"
13 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
14 #include "gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h"
16 #include "third_party/khronos/GLES2/gl2.h"
17 #ifndef GL_GLEXT_PROTOTYPES
18 #define GL_GLEXT_PROTOTYPES 1
20 #include "third_party/khronos/GLES2/gl2ext.h"
22 using blink::WGC3Dbitfield
;
23 using blink::WGC3Dboolean
;
24 using blink::WGC3Dbyte
;
25 using blink::WGC3Dchar
;
26 using blink::WGC3Dclampf
;
27 using blink::WGC3Denum
;
28 using blink::WGC3Dfloat
;
29 using blink::WGC3Dint
;
30 using blink::WGC3Dintptr
;
31 using blink::WGC3Dsizei
;
32 using blink::WGC3Dsizeiptr
;
33 using blink::WGC3Duint64
;
34 using blink::WGC3Duint
;
36 using blink::WGC3Dsync
;
42 uint32_t GenFlushID() {
43 static base::subtle::Atomic32 flush_id
= 0;
45 base::subtle::Atomic32 my_id
= base::subtle::Barrier_AtomicIncrement(
47 return static_cast<uint32_t>(my_id
);
50 } // namespace anonymous
52 class WebGraphicsContext3DErrorMessageCallback
53 : public ::gpu::gles2::GLES2ImplementationErrorMessageCallback
{
55 WebGraphicsContext3DErrorMessageCallback(
56 WebGraphicsContext3DImpl
* context
)
57 : graphics_context_(context
) {
60 void OnErrorMessage(const char* msg
, int id
) override
;
63 WebGraphicsContext3DImpl
* graphics_context_
;
65 DISALLOW_COPY_AND_ASSIGN(WebGraphicsContext3DErrorMessageCallback
);
68 void WebGraphicsContext3DErrorMessageCallback::OnErrorMessage(
69 const char* msg
, int id
) {
70 graphics_context_
->OnErrorMessage(msg
, id
);
73 // Helper macros to reduce the amount of code.
75 #define DELEGATE_TO_GL(name, glname) \
76 void WebGraphicsContext3DImpl::name() { \
80 #define DELEGATE_TO_GL_R(name, glname, rt) \
81 rt WebGraphicsContext3DImpl::name() { \
82 return gl_->glname(); \
85 #define DELEGATE_TO_GL_1(name, glname, t1) \
86 void WebGraphicsContext3DImpl::name(t1 a1) { \
90 #define DELEGATE_TO_GL_1R(name, glname, t1, rt) \
91 rt WebGraphicsContext3DImpl::name(t1 a1) { \
92 return gl_->glname(a1); \
95 #define DELEGATE_TO_GL_1RB(name, glname, t1, rt) \
96 rt WebGraphicsContext3DImpl::name(t1 a1) { \
97 return gl_->glname(a1) ? true : false; \
100 #define DELEGATE_TO_GL_2(name, glname, t1, t2) \
101 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2) { \
102 gl_->glname(a1, a2); \
105 #define DELEGATE_TO_GL_2R(name, glname, t1, t2, rt) \
106 rt WebGraphicsContext3DImpl::name(t1 a1, t2 a2) { \
107 return gl_->glname(a1, a2); \
110 #define DELEGATE_TO_GL_3(name, glname, t1, t2, t3) \
111 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3) { \
112 gl_->glname(a1, a2, a3); \
115 #define DELEGATE_TO_GL_3R(name, glname, t1, t2, t3, rt) \
116 rt WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3) { \
117 return gl_->glname(a1, a2, a3); \
120 #define DELEGATE_TO_GL_4(name, glname, t1, t2, t3, t4) \
121 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4) { \
122 gl_->glname(a1, a2, a3, a4); \
125 #define DELEGATE_TO_GL_4R(name, glname, t1, t2, t3, t4, rt) \
126 rt WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4) { \
127 return gl_->glname(a1, a2, a3, a4); \
130 #define DELEGATE_TO_GL_5(name, glname, t1, t2, t3, t4, t5) \
131 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) {\
133 gl_->glname(a1, a2, a3, a4, a5); \
136 #define DELEGATE_TO_GL_6(name, glname, t1, t2, t3, t4, t5, t6) \
137 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, \
139 gl_->glname(a1, a2, a3, a4, a5, a6); \
142 #define DELEGATE_TO_GL_7(name, glname, t1, t2, t3, t4, t5, t6, t7) \
143 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, \
145 gl_->glname(a1, a2, a3, a4, a5, a6, a7); \
148 #define DELEGATE_TO_GL_8(name, glname, t1, t2, t3, t4, t5, t6, t7, t8) \
149 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, \
150 t6 a6, t7 a7, t8 a8) { \
151 gl_->glname(a1, a2, a3, a4, a5, a6, a7, a8); \
154 #define DELEGATE_TO_GL_9(name, glname, t1, t2, t3, t4, t5, t6, t7, t8, t9) \
155 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, \
156 t6 a6, t7 a7, t8 a8, t9 a9) { \
157 gl_->glname(a1, a2, a3, a4, a5, a6, a7, a8, a9); \
160 #define DELEGATE_TO_GL_9R(name, glname, t1, t2, t3, t4, t5, t6, t7, t8, \
162 rt WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, \
163 t6 a6, t7 a7, t8 a8, t9 a9) { \
164 return gl_->glname(a1, a2, a3, a4, a5, a6, a7, a8, a9); \
167 #define DELEGATE_TO_GL_10(name, glname, t1, t2, t3, t4, t5, t6, t7, t8, \
169 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, \
170 t6 a6, t7 a7, t8 a8, t9 a9, \
172 gl_->glname(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); \
175 #define DELEGATE_TO_GL_11(name, glname, t1, t2, t3, t4, t5, t6, t7, t8, \
177 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, \
178 t6 a6, t7 a7, t8 a8, t9 a9, t10 a10,\
180 gl_->glname(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); \
183 WebGraphicsContext3DImpl::WebGraphicsContext3DImpl()
184 : initialized_(false),
185 initialize_failed_(false),
186 context_lost_callback_(0),
187 context_lost_reason_(GL_NO_ERROR
),
188 error_message_callback_(0),
193 WebGraphicsContext3DImpl::~WebGraphicsContext3DImpl() {
197 void WebGraphicsContext3DImpl::synthesizeGLError(WGC3Denum error
) {
198 if (std::find(synthetic_errors_
.begin(), synthetic_errors_
.end(), error
) ==
199 synthetic_errors_
.end()) {
200 synthetic_errors_
.push_back(error
);
204 uint32_t WebGraphicsContext3DImpl::lastFlushID() {
208 DELEGATE_TO_GL_R(insertSyncPoint
, InsertSyncPointCHROMIUM
, unsigned int)
210 DELEGATE_TO_GL_3(reshapeWithScaleFactor
, ResizeCHROMIUM
, int, int, float)
212 DELEGATE_TO_GL_4R(mapBufferSubDataCHROMIUM
, MapBufferSubDataCHROMIUM
, WGC3Denum
,
213 WGC3Dintptr
, WGC3Dsizeiptr
, WGC3Denum
, void*)
215 DELEGATE_TO_GL_1(unmapBufferSubDataCHROMIUM
, UnmapBufferSubDataCHROMIUM
,
218 DELEGATE_TO_GL_9R(mapTexSubImage2DCHROMIUM
, MapTexSubImage2DCHROMIUM
, WGC3Denum
,
219 WGC3Dint
, WGC3Dint
, WGC3Dint
, WGC3Dsizei
, WGC3Dsizei
,
220 WGC3Denum
, WGC3Denum
, WGC3Denum
, void*)
222 DELEGATE_TO_GL_1(unmapTexSubImage2DCHROMIUM
, UnmapTexSubImage2DCHROMIUM
,
225 DELEGATE_TO_GL_3(discardFramebufferEXT
, DiscardFramebufferEXT
, WGC3Denum
,
226 WGC3Dsizei
, const WGC3Denum
*)
228 blink::WebString
WebGraphicsContext3DImpl::
229 getRequestableExtensionsCHROMIUM() {
230 return blink::WebString::fromUTF8(
231 gl_
->GetRequestableExtensionsCHROMIUM());
234 DELEGATE_TO_GL_1(requestExtensionCHROMIUM
, RequestExtensionCHROMIUM
,
237 void WebGraphicsContext3DImpl::blitFramebufferCHROMIUM(
238 WGC3Dint srcX0
, WGC3Dint srcY0
, WGC3Dint srcX1
, WGC3Dint srcY1
,
239 WGC3Dint dstX0
, WGC3Dint dstY0
, WGC3Dint dstX1
, WGC3Dint dstY1
,
240 WGC3Dbitfield mask
, WGC3Denum filter
) {
241 gl_
->BlitFramebufferCHROMIUM(
242 srcX0
, srcY0
, srcX1
, srcY1
,
243 dstX0
, dstY0
, dstX1
, dstY1
,
247 DELEGATE_TO_GL_5(renderbufferStorageMultisampleCHROMIUM
,
248 RenderbufferStorageMultisampleCHROMIUM
, WGC3Denum
, WGC3Dsizei
,
249 WGC3Denum
, WGC3Dsizei
, WGC3Dsizei
)
251 DELEGATE_TO_GL_1(activeTexture
, ActiveTexture
, WGC3Denum
)
253 DELEGATE_TO_GL_2(attachShader
, AttachShader
, WebGLId
, WebGLId
)
255 DELEGATE_TO_GL_3(bindAttribLocation
, BindAttribLocation
, WebGLId
,
256 WGC3Duint
, const WGC3Dchar
*)
258 DELEGATE_TO_GL_2(bindBuffer
, BindBuffer
, WGC3Denum
, WebGLId
)
260 DELEGATE_TO_GL_2(bindFramebuffer
, BindFramebuffer
, WGC3Denum
, WebGLId
)
262 DELEGATE_TO_GL_2(bindRenderbuffer
, BindRenderbuffer
, WGC3Denum
, WebGLId
)
264 DELEGATE_TO_GL_2(bindTexture
, BindTexture
, WGC3Denum
, WebGLId
)
266 DELEGATE_TO_GL_4(blendColor
, BlendColor
,
267 WGC3Dclampf
, WGC3Dclampf
, WGC3Dclampf
, WGC3Dclampf
)
269 DELEGATE_TO_GL_1(blendEquation
, BlendEquation
, WGC3Denum
)
271 DELEGATE_TO_GL_2(blendEquationSeparate
, BlendEquationSeparate
,
272 WGC3Denum
, WGC3Denum
)
274 DELEGATE_TO_GL_2(blendFunc
, BlendFunc
, WGC3Denum
, WGC3Denum
)
276 DELEGATE_TO_GL_4(blendFuncSeparate
, BlendFuncSeparate
,
277 WGC3Denum
, WGC3Denum
, WGC3Denum
, WGC3Denum
)
279 DELEGATE_TO_GL_4(bufferData
, BufferData
,
280 WGC3Denum
, WGC3Dsizeiptr
, const void*, WGC3Denum
)
282 DELEGATE_TO_GL_4(bufferSubData
, BufferSubData
,
283 WGC3Denum
, WGC3Dintptr
, WGC3Dsizeiptr
, const void*)
285 DELEGATE_TO_GL_1R(checkFramebufferStatus
, CheckFramebufferStatus
,
286 WGC3Denum
, WGC3Denum
)
288 DELEGATE_TO_GL_1(clear
, Clear
, WGC3Dbitfield
)
290 DELEGATE_TO_GL_4(clearColor
, ClearColor
,
291 WGC3Dclampf
, WGC3Dclampf
, WGC3Dclampf
, WGC3Dclampf
)
293 DELEGATE_TO_GL_1(clearDepth
, ClearDepthf
, WGC3Dclampf
)
295 DELEGATE_TO_GL_1(clearStencil
, ClearStencil
, WGC3Dint
)
297 DELEGATE_TO_GL_4(colorMask
, ColorMask
,
298 WGC3Dboolean
, WGC3Dboolean
, WGC3Dboolean
, WGC3Dboolean
)
300 DELEGATE_TO_GL_1(compileShader
, CompileShader
, WebGLId
)
302 DELEGATE_TO_GL_8(compressedTexImage2D
, CompressedTexImage2D
,
303 WGC3Denum
, WGC3Dint
, WGC3Denum
, WGC3Dint
, WGC3Dint
,
304 WGC3Dsizei
, WGC3Dsizei
, const void*)
306 DELEGATE_TO_GL_9(compressedTexSubImage2D
, CompressedTexSubImage2D
,
307 WGC3Denum
, WGC3Dint
, WGC3Dint
, WGC3Dint
, WGC3Dint
, WGC3Dint
,
308 WGC3Denum
, WGC3Dsizei
, const void*)
310 DELEGATE_TO_GL_8(copyTexImage2D
, CopyTexImage2D
,
311 WGC3Denum
, WGC3Dint
, WGC3Denum
, WGC3Dint
, WGC3Dint
,
312 WGC3Dsizei
, WGC3Dsizei
, WGC3Dint
)
314 DELEGATE_TO_GL_8(copyTexSubImage2D
, CopyTexSubImage2D
,
315 WGC3Denum
, WGC3Dint
, WGC3Dint
, WGC3Dint
, WGC3Dint
, WGC3Dint
,
316 WGC3Dsizei
, WGC3Dsizei
)
318 DELEGATE_TO_GL_1(cullFace
, CullFace
, WGC3Denum
)
320 DELEGATE_TO_GL_1(depthFunc
, DepthFunc
, WGC3Denum
)
322 DELEGATE_TO_GL_1(depthMask
, DepthMask
, WGC3Dboolean
)
324 DELEGATE_TO_GL_2(depthRange
, DepthRangef
, WGC3Dclampf
, WGC3Dclampf
)
326 DELEGATE_TO_GL_2(detachShader
, DetachShader
, WebGLId
, WebGLId
)
328 DELEGATE_TO_GL_1(disable
, Disable
, WGC3Denum
)
330 DELEGATE_TO_GL_1(disableVertexAttribArray
, DisableVertexAttribArray
,
333 DELEGATE_TO_GL_3(drawArrays
, DrawArrays
, WGC3Denum
, WGC3Dint
, WGC3Dsizei
)
335 void WebGraphicsContext3DImpl::drawElements(WGC3Denum mode
,
338 WGC3Dintptr offset
) {
341 reinterpret_cast<void*>(static_cast<intptr_t>(offset
)));
344 DELEGATE_TO_GL_1(enable
, Enable
, WGC3Denum
)
346 DELEGATE_TO_GL_1(enableVertexAttribArray
, EnableVertexAttribArray
,
349 void WebGraphicsContext3DImpl::finish() {
350 flush_id_
= GenFlushID();
354 void WebGraphicsContext3DImpl::flush() {
355 flush_id_
= GenFlushID();
359 DELEGATE_TO_GL_4(framebufferRenderbuffer
, FramebufferRenderbuffer
,
360 WGC3Denum
, WGC3Denum
, WGC3Denum
, WebGLId
)
362 DELEGATE_TO_GL_5(framebufferTexture2D
, FramebufferTexture2D
,
363 WGC3Denum
, WGC3Denum
, WGC3Denum
, WebGLId
, WGC3Dint
)
365 DELEGATE_TO_GL_1(frontFace
, FrontFace
, WGC3Denum
)
367 DELEGATE_TO_GL_1(generateMipmap
, GenerateMipmap
, WGC3Denum
)
369 bool WebGraphicsContext3DImpl::getActiveAttrib(
370 WebGLId program
, WGC3Duint index
, ActiveInfo
& info
) {
372 synthesizeGLError(GL_INVALID_VALUE
);
375 GLint max_name_length
= -1;
377 program
, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
, &max_name_length
);
378 if (max_name_length
< 0)
380 if (max_name_length
== 0) {
381 // No active attributes exist.
382 synthesizeGLError(GL_INVALID_VALUE
);
385 scoped_ptr
<GLchar
[]> name(new GLchar
[max_name_length
]);
389 gl_
->GetActiveAttrib(
390 program
, index
, max_name_length
, &length
, &size
, &type
, name
.get());
394 info
.name
= blink::WebString::fromUTF8(name
.get(), length
);
400 bool WebGraphicsContext3DImpl::getActiveUniform(
401 WebGLId program
, WGC3Duint index
, ActiveInfo
& info
) {
402 GLint max_name_length
= -1;
404 program
, GL_ACTIVE_UNIFORM_MAX_LENGTH
, &max_name_length
);
405 if (max_name_length
< 0)
407 if (max_name_length
== 0) {
408 // No active uniforms exist.
409 synthesizeGLError(GL_INVALID_VALUE
);
412 scoped_ptr
<GLchar
[]> name(new GLchar
[max_name_length
]);
416 gl_
->GetActiveUniform(
417 program
, index
, max_name_length
, &length
, &size
, &type
, name
.get());
421 info
.name
= blink::WebString::fromUTF8(name
.get(), length
);
427 DELEGATE_TO_GL_4(getAttachedShaders
, GetAttachedShaders
,
428 WebGLId
, WGC3Dsizei
, WGC3Dsizei
*, WebGLId
*)
430 DELEGATE_TO_GL_2R(getAttribLocation
, GetAttribLocation
,
431 WebGLId
, const WGC3Dchar
*, WGC3Dint
)
433 DELEGATE_TO_GL_2(getBooleanv
, GetBooleanv
, WGC3Denum
, WGC3Dboolean
*)
435 DELEGATE_TO_GL_3(getBufferParameteriv
, GetBufferParameteriv
,
436 WGC3Denum
, WGC3Denum
, WGC3Dint
*)
438 WGC3Denum
WebGraphicsContext3DImpl::getError() {
439 if (!synthetic_errors_
.empty()) {
440 std::vector
<WGC3Denum
>::iterator iter
= synthetic_errors_
.begin();
441 WGC3Denum err
= *iter
;
442 synthetic_errors_
.erase(iter
);
446 return gl_
->GetError();
449 DELEGATE_TO_GL_2(getFloatv
, GetFloatv
, WGC3Denum
, WGC3Dfloat
*)
451 DELEGATE_TO_GL_4(getFramebufferAttachmentParameteriv
,
452 GetFramebufferAttachmentParameteriv
,
453 WGC3Denum
, WGC3Denum
, WGC3Denum
, WGC3Dint
*)
455 DELEGATE_TO_GL_2(getIntegerv
, GetIntegerv
, WGC3Denum
, WGC3Dint
*)
457 DELEGATE_TO_GL_3(getProgramiv
, GetProgramiv
, WebGLId
, WGC3Denum
, WGC3Dint
*)
459 blink::WebString
WebGraphicsContext3DImpl::getProgramInfoLog(
462 gl_
->GetProgramiv(program
, GL_INFO_LOG_LENGTH
, &logLength
);
464 return blink::WebString();
465 scoped_ptr
<GLchar
[]> log(new GLchar
[logLength
]);
467 return blink::WebString();
468 GLsizei returnedLogLength
= 0;
469 gl_
->GetProgramInfoLog(
470 program
, logLength
, &returnedLogLength
, log
.get());
471 DCHECK_EQ(logLength
, returnedLogLength
+ 1);
472 blink::WebString res
=
473 blink::WebString::fromUTF8(log
.get(), returnedLogLength
);
477 DELEGATE_TO_GL_3(getRenderbufferParameteriv
, GetRenderbufferParameteriv
,
478 WGC3Denum
, WGC3Denum
, WGC3Dint
*)
480 DELEGATE_TO_GL_3(getShaderiv
, GetShaderiv
, WebGLId
, WGC3Denum
, WGC3Dint
*)
482 blink::WebString
WebGraphicsContext3DImpl::getShaderInfoLog(
485 gl_
->GetShaderiv(shader
, GL_INFO_LOG_LENGTH
, &logLength
);
487 return blink::WebString();
488 scoped_ptr
<GLchar
[]> log(new GLchar
[logLength
]);
490 return blink::WebString();
491 GLsizei returnedLogLength
= 0;
492 gl_
->GetShaderInfoLog(
493 shader
, logLength
, &returnedLogLength
, log
.get());
494 DCHECK_EQ(logLength
, returnedLogLength
+ 1);
495 blink::WebString res
=
496 blink::WebString::fromUTF8(log
.get(), returnedLogLength
);
500 DELEGATE_TO_GL_4(getShaderPrecisionFormat
, GetShaderPrecisionFormat
,
501 WGC3Denum
, WGC3Denum
, WGC3Dint
*, WGC3Dint
*)
503 blink::WebString
WebGraphicsContext3DImpl::getShaderSource(
506 gl_
->GetShaderiv(shader
, GL_SHADER_SOURCE_LENGTH
, &logLength
);
508 return blink::WebString();
509 scoped_ptr
<GLchar
[]> log(new GLchar
[logLength
]);
511 return blink::WebString();
512 GLsizei returnedLogLength
= 0;
513 gl_
->GetShaderSource(
514 shader
, logLength
, &returnedLogLength
, log
.get());
515 if (!returnedLogLength
)
516 return blink::WebString();
517 DCHECK_EQ(logLength
, returnedLogLength
+ 1);
518 blink::WebString res
=
519 blink::WebString::fromUTF8(log
.get(), returnedLogLength
);
523 blink::WebString
WebGraphicsContext3DImpl::
524 getTranslatedShaderSourceANGLE(WebGLId shader
) {
527 shader
, GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
, &logLength
);
529 return blink::WebString();
530 scoped_ptr
<GLchar
[]> log(new GLchar
[logLength
]);
532 return blink::WebString();
533 GLsizei returnedLogLength
= 0;
534 gl_
->GetTranslatedShaderSourceANGLE(
535 shader
, logLength
, &returnedLogLength
, log
.get());
536 if (!returnedLogLength
)
537 return blink::WebString();
538 DCHECK_EQ(logLength
, returnedLogLength
+ 1);
539 blink::WebString res
=
540 blink::WebString::fromUTF8(log
.get(), returnedLogLength
);
544 blink::WebString
WebGraphicsContext3DImpl::getString(
546 return blink::WebString::fromUTF8(
547 reinterpret_cast<const char*>(gl_
->GetString(name
)));
550 DELEGATE_TO_GL_3(getTexParameterfv
, GetTexParameterfv
,
551 WGC3Denum
, WGC3Denum
, WGC3Dfloat
*)
553 DELEGATE_TO_GL_3(getTexParameteriv
, GetTexParameteriv
,
554 WGC3Denum
, WGC3Denum
, WGC3Dint
*)
556 DELEGATE_TO_GL_3(getUniformfv
, GetUniformfv
, WebGLId
, WGC3Dint
, WGC3Dfloat
*)
558 DELEGATE_TO_GL_3(getUniformiv
, GetUniformiv
, WebGLId
, WGC3Dint
, WGC3Dint
*)
560 DELEGATE_TO_GL_2R(getUniformLocation
, GetUniformLocation
,
561 WebGLId
, const WGC3Dchar
*, WGC3Dint
)
563 DELEGATE_TO_GL_3(getVertexAttribfv
, GetVertexAttribfv
,
564 WGC3Duint
, WGC3Denum
, WGC3Dfloat
*)
566 DELEGATE_TO_GL_3(getVertexAttribiv
, GetVertexAttribiv
,
567 WGC3Duint
, WGC3Denum
, WGC3Dint
*)
569 WGC3Dsizeiptr
WebGraphicsContext3DImpl::getVertexAttribOffset(
570 WGC3Duint index
, WGC3Denum pname
) {
571 GLvoid
* value
= NULL
;
572 // NOTE: If pname is ever a value that returns more then 1 element
573 // this will corrupt memory.
574 gl_
->GetVertexAttribPointerv(index
, pname
, &value
);
575 return static_cast<WGC3Dsizeiptr
>(reinterpret_cast<intptr_t>(value
));
578 DELEGATE_TO_GL_2(hint
, Hint
, WGC3Denum
, WGC3Denum
)
580 DELEGATE_TO_GL_1RB(isBuffer
, IsBuffer
, WebGLId
, WGC3Dboolean
)
582 DELEGATE_TO_GL_1RB(isEnabled
, IsEnabled
, WGC3Denum
, WGC3Dboolean
)
584 DELEGATE_TO_GL_1RB(isFramebuffer
, IsFramebuffer
, WebGLId
, WGC3Dboolean
)
586 DELEGATE_TO_GL_1RB(isProgram
, IsProgram
, WebGLId
, WGC3Dboolean
)
588 DELEGATE_TO_GL_1RB(isRenderbuffer
, IsRenderbuffer
, WebGLId
, WGC3Dboolean
)
590 DELEGATE_TO_GL_1RB(isShader
, IsShader
, WebGLId
, WGC3Dboolean
)
592 DELEGATE_TO_GL_1RB(isTexture
, IsTexture
, WebGLId
, WGC3Dboolean
)
594 DELEGATE_TO_GL_1(lineWidth
, LineWidth
, WGC3Dfloat
)
596 DELEGATE_TO_GL_1(linkProgram
, LinkProgram
, WebGLId
)
598 DELEGATE_TO_GL_2(pixelStorei
, PixelStorei
, WGC3Denum
, WGC3Dint
)
600 DELEGATE_TO_GL_2(polygonOffset
, PolygonOffset
, WGC3Dfloat
, WGC3Dfloat
)
602 DELEGATE_TO_GL_7(readPixels
, ReadPixels
,
603 WGC3Dint
, WGC3Dint
, WGC3Dsizei
, WGC3Dsizei
, WGC3Denum
,
606 DELEGATE_TO_GL_4(renderbufferStorage
, RenderbufferStorage
,
607 WGC3Denum
, WGC3Denum
, WGC3Dsizei
, WGC3Dsizei
)
609 DELEGATE_TO_GL_2(sampleCoverage
, SampleCoverage
, WGC3Dfloat
, WGC3Dboolean
)
611 DELEGATE_TO_GL_4(scissor
, Scissor
, WGC3Dint
, WGC3Dint
, WGC3Dsizei
, WGC3Dsizei
)
613 void WebGraphicsContext3DImpl::shaderSource(
614 WebGLId shader
, const WGC3Dchar
* string
) {
615 GLint length
= strlen(string
);
616 gl_
->ShaderSource(shader
, 1, &string
, &length
);
619 DELEGATE_TO_GL_3(stencilFunc
, StencilFunc
, WGC3Denum
, WGC3Dint
, WGC3Duint
)
621 DELEGATE_TO_GL_4(stencilFuncSeparate
, StencilFuncSeparate
,
622 WGC3Denum
, WGC3Denum
, WGC3Dint
, WGC3Duint
)
624 DELEGATE_TO_GL_1(stencilMask
, StencilMask
, WGC3Duint
)
626 DELEGATE_TO_GL_2(stencilMaskSeparate
, StencilMaskSeparate
,
627 WGC3Denum
, WGC3Duint
)
629 DELEGATE_TO_GL_3(stencilOp
, StencilOp
,
630 WGC3Denum
, WGC3Denum
, WGC3Denum
)
632 DELEGATE_TO_GL_4(stencilOpSeparate
, StencilOpSeparate
,
633 WGC3Denum
, WGC3Denum
, WGC3Denum
, WGC3Denum
)
635 DELEGATE_TO_GL_9(texImage2D
, TexImage2D
,
636 WGC3Denum
, WGC3Dint
, WGC3Denum
, WGC3Dsizei
, WGC3Dsizei
,
637 WGC3Dint
, WGC3Denum
, WGC3Denum
, const void*)
639 DELEGATE_TO_GL_3(texParameterf
, TexParameterf
,
640 WGC3Denum
, WGC3Denum
, WGC3Dfloat
);
642 DELEGATE_TO_GL_3(texParameteri
, TexParameteri
,
643 WGC3Denum
, WGC3Denum
, WGC3Dint
);
645 DELEGATE_TO_GL_9(texSubImage2D
, TexSubImage2D
,
646 WGC3Denum
, WGC3Dint
, WGC3Dint
, WGC3Dint
, WGC3Dsizei
,
647 WGC3Dsizei
, WGC3Denum
, WGC3Denum
, const void*)
649 DELEGATE_TO_GL_2(uniform1f
, Uniform1f
, WGC3Dint
, WGC3Dfloat
)
651 DELEGATE_TO_GL_3(uniform1fv
, Uniform1fv
, WGC3Dint
, WGC3Dsizei
,
654 DELEGATE_TO_GL_2(uniform1i
, Uniform1i
, WGC3Dint
, WGC3Dint
)
656 DELEGATE_TO_GL_3(uniform1iv
, Uniform1iv
, WGC3Dint
, WGC3Dsizei
, const WGC3Dint
*)
658 DELEGATE_TO_GL_3(uniform2f
, Uniform2f
, WGC3Dint
, WGC3Dfloat
, WGC3Dfloat
)
660 DELEGATE_TO_GL_3(uniform2fv
, Uniform2fv
, WGC3Dint
, WGC3Dsizei
,
663 DELEGATE_TO_GL_3(uniform2i
, Uniform2i
, WGC3Dint
, WGC3Dint
, WGC3Dint
)
665 DELEGATE_TO_GL_3(uniform2iv
, Uniform2iv
, WGC3Dint
, WGC3Dsizei
, const WGC3Dint
*)
667 DELEGATE_TO_GL_4(uniform3f
, Uniform3f
, WGC3Dint
,
668 WGC3Dfloat
, WGC3Dfloat
, WGC3Dfloat
)
670 DELEGATE_TO_GL_3(uniform3fv
, Uniform3fv
, WGC3Dint
, WGC3Dsizei
,
673 DELEGATE_TO_GL_4(uniform3i
, Uniform3i
, WGC3Dint
, WGC3Dint
, WGC3Dint
, WGC3Dint
)
675 DELEGATE_TO_GL_3(uniform3iv
, Uniform3iv
, WGC3Dint
, WGC3Dsizei
, const WGC3Dint
*)
677 DELEGATE_TO_GL_5(uniform4f
, Uniform4f
, WGC3Dint
,
678 WGC3Dfloat
, WGC3Dfloat
, WGC3Dfloat
, WGC3Dfloat
)
680 DELEGATE_TO_GL_3(uniform4fv
, Uniform4fv
, WGC3Dint
, WGC3Dsizei
,
683 DELEGATE_TO_GL_5(uniform4i
, Uniform4i
, WGC3Dint
,
684 WGC3Dint
, WGC3Dint
, WGC3Dint
, WGC3Dint
)
686 DELEGATE_TO_GL_3(uniform4iv
, Uniform4iv
, WGC3Dint
, WGC3Dsizei
, const WGC3Dint
*)
688 DELEGATE_TO_GL_4(uniformMatrix2fv
, UniformMatrix2fv
,
689 WGC3Dint
, WGC3Dsizei
, WGC3Dboolean
, const WGC3Dfloat
*)
691 DELEGATE_TO_GL_4(uniformMatrix3fv
, UniformMatrix3fv
,
692 WGC3Dint
, WGC3Dsizei
, WGC3Dboolean
, const WGC3Dfloat
*)
694 DELEGATE_TO_GL_4(uniformMatrix4fv
, UniformMatrix4fv
,
695 WGC3Dint
, WGC3Dsizei
, WGC3Dboolean
, const WGC3Dfloat
*)
697 DELEGATE_TO_GL_1(useProgram
, UseProgram
, WebGLId
)
699 DELEGATE_TO_GL_1(validateProgram
, ValidateProgram
, WebGLId
)
701 DELEGATE_TO_GL_2(vertexAttrib1f
, VertexAttrib1f
, WGC3Duint
, WGC3Dfloat
)
703 DELEGATE_TO_GL_2(vertexAttrib1fv
, VertexAttrib1fv
, WGC3Duint
,
706 DELEGATE_TO_GL_3(vertexAttrib2f
, VertexAttrib2f
, WGC3Duint
,
707 WGC3Dfloat
, WGC3Dfloat
)
709 DELEGATE_TO_GL_2(vertexAttrib2fv
, VertexAttrib2fv
, WGC3Duint
,
712 DELEGATE_TO_GL_4(vertexAttrib3f
, VertexAttrib3f
, WGC3Duint
,
713 WGC3Dfloat
, WGC3Dfloat
, WGC3Dfloat
)
715 DELEGATE_TO_GL_2(vertexAttrib3fv
, VertexAttrib3fv
, WGC3Duint
,
718 DELEGATE_TO_GL_5(vertexAttrib4f
, VertexAttrib4f
, WGC3Duint
,
719 WGC3Dfloat
, WGC3Dfloat
, WGC3Dfloat
, WGC3Dfloat
)
721 DELEGATE_TO_GL_2(vertexAttrib4fv
, VertexAttrib4fv
, WGC3Duint
,
724 void WebGraphicsContext3DImpl::vertexAttribPointer(
725 WGC3Duint index
, WGC3Dint size
, WGC3Denum type
, WGC3Dboolean normalized
,
726 WGC3Dsizei stride
, WGC3Dintptr offset
) {
727 gl_
->VertexAttribPointer(
728 index
, size
, type
, normalized
, stride
,
729 reinterpret_cast<void*>(static_cast<intptr_t>(offset
)));
732 DELEGATE_TO_GL_4(viewport
, Viewport
,
733 WGC3Dint
, WGC3Dint
, WGC3Dsizei
, WGC3Dsizei
)
735 WebGLId
WebGraphicsContext3DImpl::createBuffer() {
737 gl_
->GenBuffers(1, &o
);
741 WebGLId
WebGraphicsContext3DImpl::createFramebuffer() {
743 gl_
->GenFramebuffers(1, &o
);
747 WebGLId
WebGraphicsContext3DImpl::createRenderbuffer() {
749 gl_
->GenRenderbuffers(1, &o
);
753 WebGLId
WebGraphicsContext3DImpl::createTexture() {
755 gl_
->GenTextures(1, &o
);
759 void WebGraphicsContext3DImpl::deleteBuffer(WebGLId buffer
) {
760 gl_
->DeleteBuffers(1, &buffer
);
763 void WebGraphicsContext3DImpl::deleteFramebuffer(
764 WebGLId framebuffer
) {
765 gl_
->DeleteFramebuffers(1, &framebuffer
);
768 void WebGraphicsContext3DImpl::deleteRenderbuffer(
769 WebGLId renderbuffer
) {
770 gl_
->DeleteRenderbuffers(1, &renderbuffer
);
773 void WebGraphicsContext3DImpl::deleteTexture(WebGLId texture
) {
774 gl_
->DeleteTextures(1, &texture
);
777 DELEGATE_TO_GL_R(createProgram
, CreateProgram
, WebGLId
)
779 DELEGATE_TO_GL_1R(createShader
, CreateShader
, WGC3Denum
, WebGLId
)
781 DELEGATE_TO_GL_1(deleteProgram
, DeleteProgram
, WebGLId
)
783 DELEGATE_TO_GL_1(deleteShader
, DeleteShader
, WebGLId
)
785 void WebGraphicsContext3DImpl::setErrorMessageCallback(
786 WebGraphicsContext3D::WebGraphicsErrorMessageCallback
* cb
) {
787 error_message_callback_
= cb
;
790 void WebGraphicsContext3DImpl::setContextLostCallback(
791 WebGraphicsContext3D::WebGraphicsContextLostCallback
* cb
) {
792 context_lost_callback_
= cb
;
795 DELEGATE_TO_GL_5(texImageIOSurface2DCHROMIUM
, TexImageIOSurface2DCHROMIUM
,
796 WGC3Denum
, WGC3Dint
, WGC3Dint
, WGC3Duint
, WGC3Duint
)
798 DELEGATE_TO_GL_5(texStorage2DEXT
, TexStorage2DEXT
,
799 WGC3Denum
, WGC3Dint
, WGC3Duint
, WGC3Dint
, WGC3Dint
)
801 WebGLId
WebGraphicsContext3DImpl::createQueryEXT() {
803 gl_
->GenQueriesEXT(1, &o
);
807 void WebGraphicsContext3DImpl::deleteQueryEXT(
809 gl_
->DeleteQueriesEXT(1, &query
);
812 DELEGATE_TO_GL_1R(isQueryEXT
, IsQueryEXT
, WebGLId
, WGC3Dboolean
)
813 DELEGATE_TO_GL_2(beginQueryEXT
, BeginQueryEXT
, WGC3Denum
, WebGLId
)
814 DELEGATE_TO_GL_1(endQueryEXT
, EndQueryEXT
, WGC3Denum
)
815 DELEGATE_TO_GL_3(getQueryivEXT
, GetQueryivEXT
, WGC3Denum
, WGC3Denum
, WGC3Dint
*)
816 DELEGATE_TO_GL_3(getQueryObjectuivEXT
, GetQueryObjectuivEXT
,
817 WebGLId
, WGC3Denum
, WGC3Duint
*)
819 DELEGATE_TO_GL_5(copyTextureCHROMIUM
,
827 DELEGATE_TO_GL_5(copySubTextureCHROMIUM
,
828 CopySubTextureCHROMIUM
,
835 DELEGATE_TO_GL_3(bindUniformLocationCHROMIUM
, BindUniformLocationCHROMIUM
,
836 WebGLId
, WGC3Dint
, const WGC3Dchar
*)
838 void WebGraphicsContext3DImpl::shallowFlushCHROMIUM() {
839 flush_id_
= GenFlushID();
840 gl_
->ShallowFlushCHROMIUM();
843 void WebGraphicsContext3DImpl::shallowFinishCHROMIUM() {
844 flush_id_
= GenFlushID();
845 gl_
->ShallowFinishCHROMIUM();
848 DELEGATE_TO_GL_1(waitSyncPoint
, WaitSyncPointCHROMIUM
, GLuint
)
850 void WebGraphicsContext3DImpl::loseContextCHROMIUM(
851 WGC3Denum current
, WGC3Denum other
) {
852 gl_
->LoseContextCHROMIUM(current
, other
);
856 DELEGATE_TO_GL_1(genMailboxCHROMIUM
, GenMailboxCHROMIUM
, WGC3Dbyte
*)
857 DELEGATE_TO_GL_2(produceTextureCHROMIUM
, ProduceTextureCHROMIUM
,
858 WGC3Denum
, const WGC3Dbyte
*)
859 DELEGATE_TO_GL_3(produceTextureDirectCHROMIUM
, ProduceTextureDirectCHROMIUM
,
860 WebGLId
, WGC3Denum
, const WGC3Dbyte
*)
861 DELEGATE_TO_GL_2(consumeTextureCHROMIUM
, ConsumeTextureCHROMIUM
,
862 WGC3Denum
, const WGC3Dbyte
*)
863 DELEGATE_TO_GL_2R(createAndConsumeTextureCHROMIUM
,
864 CreateAndConsumeTextureCHROMIUM
,
865 WGC3Denum
, const WGC3Dbyte
*, WebGLId
)
867 DELEGATE_TO_GL_2(genValuebuffersCHROMIUM
,
868 GenValuebuffersCHROMIUM
,
872 WebGLId
WebGraphicsContext3DImpl::createValuebufferCHROMIUM() {
874 gl_
->GenValuebuffersCHROMIUM(1, &o
);
878 DELEGATE_TO_GL_2(deleteValuebuffersCHROMIUM
,
879 DeleteValuebuffersCHROMIUM
,
883 void WebGraphicsContext3DImpl::deleteValuebufferCHROMIUM(WebGLId valuebuffer
) {
884 gl_
->DeleteValuebuffersCHROMIUM(1, &valuebuffer
);
887 DELEGATE_TO_GL_1RB(isValuebufferCHROMIUM
,
888 IsValuebufferCHROMIUM
,
891 DELEGATE_TO_GL_2(bindValuebufferCHROMIUM
,
892 BindValuebufferCHROMIUM
,
895 DELEGATE_TO_GL_2(subscribeValueCHROMIUM
,
896 SubscribeValueCHROMIUM
,
899 DELEGATE_TO_GL_1(populateSubscribedValuesCHROMIUM
,
900 PopulateSubscribedValuesCHROMIUM
,
902 DELEGATE_TO_GL_3(uniformValuebufferCHROMIUM
,
903 UniformValuebufferCHROMIUM
,
907 DELEGATE_TO_GL_2(traceBeginCHROMIUM
,
911 DELEGATE_TO_GL(traceEndCHROMIUM
, TraceEndCHROMIUM
);
913 void WebGraphicsContext3DImpl::insertEventMarkerEXT(
914 const WGC3Dchar
* marker
) {
915 gl_
->InsertEventMarkerEXT(0, marker
);
918 void WebGraphicsContext3DImpl::pushGroupMarkerEXT(
919 const WGC3Dchar
* marker
) {
920 gl_
->PushGroupMarkerEXT(0, marker
);
923 DELEGATE_TO_GL(popGroupMarkerEXT
, PopGroupMarkerEXT
);
925 WebGLId
WebGraphicsContext3DImpl::createVertexArrayOES() {
927 gl_
->GenVertexArraysOES(1, &array
);
931 void WebGraphicsContext3DImpl::deleteVertexArrayOES(
933 gl_
->DeleteVertexArraysOES(1, &array
);
936 DELEGATE_TO_GL_1R(isVertexArrayOES
, IsVertexArrayOES
, WebGLId
, WGC3Dboolean
)
937 DELEGATE_TO_GL_1(bindVertexArrayOES
, BindVertexArrayOES
, WebGLId
)
939 DELEGATE_TO_GL_2(bindTexImage2DCHROMIUM
, BindTexImage2DCHROMIUM
,
941 DELEGATE_TO_GL_2(releaseTexImage2DCHROMIUM
, ReleaseTexImage2DCHROMIUM
,
944 DELEGATE_TO_GL_2R(mapBufferCHROMIUM
, MapBufferCHROMIUM
, WGC3Denum
, WGC3Denum
,
946 DELEGATE_TO_GL_1R(unmapBufferCHROMIUM
, UnmapBufferCHROMIUM
, WGC3Denum
,
949 DELEGATE_TO_GL_9(asyncTexImage2DCHROMIUM
, AsyncTexImage2DCHROMIUM
, WGC3Denum
,
950 WGC3Dint
, WGC3Denum
, WGC3Dsizei
, WGC3Dsizei
, WGC3Dint
,
951 WGC3Denum
, WGC3Denum
, const void*)
952 DELEGATE_TO_GL_9(asyncTexSubImage2DCHROMIUM
, AsyncTexSubImage2DCHROMIUM
,
953 WGC3Denum
, WGC3Dint
, WGC3Dint
, WGC3Dint
, WGC3Dsizei
,
954 WGC3Dsizei
, WGC3Denum
, WGC3Denum
, const void*)
956 DELEGATE_TO_GL_1(waitAsyncTexImage2DCHROMIUM
, WaitAsyncTexImage2DCHROMIUM
,
959 DELEGATE_TO_GL_2(drawBuffersEXT
, DrawBuffersEXT
, WGC3Dsizei
, const WGC3Denum
*)
961 DELEGATE_TO_GL_4(drawArraysInstancedANGLE
, DrawArraysInstancedANGLE
, WGC3Denum
,
962 WGC3Dint
, WGC3Dsizei
, WGC3Dsizei
)
964 void WebGraphicsContext3DImpl::drawElementsInstancedANGLE(
969 WGC3Dsizei primcount
) {
970 gl_
->DrawElementsInstancedANGLE(
972 reinterpret_cast<void*>(static_cast<intptr_t>(offset
)), primcount
);
975 DELEGATE_TO_GL_2(vertexAttribDivisorANGLE
, VertexAttribDivisorANGLE
, WGC3Duint
,
978 DELEGATE_TO_GL_4R(createGpuMemoryBufferImageCHROMIUM
,
979 CreateGpuMemoryBufferImageCHROMIUM
,
986 DELEGATE_TO_GL_1(destroyImageCHROMIUM
, DestroyImageCHROMIUM
, WGC3Duint
);
988 DELEGATE_TO_GL_6(framebufferTexture2DMultisampleEXT
,
989 FramebufferTexture2DMultisampleEXT
,
990 WGC3Denum
, WGC3Denum
, WGC3Denum
, WebGLId
, WGC3Dint
, WGC3Dsizei
)
992 DELEGATE_TO_GL_5(renderbufferStorageMultisampleEXT
,
993 RenderbufferStorageMultisampleEXT
, WGC3Denum
, WGC3Dsizei
,
994 WGC3Denum
, WGC3Dsizei
, WGC3Dsizei
)
996 DELEGATE_TO_GL_1(beginTransformFeedback
, BeginTransformFeedback
, WGC3Denum
)
997 DELEGATE_TO_GL_3(bindBufferBase
, BindBufferBase
, WGC3Denum
, WGC3Duint
,
999 DELEGATE_TO_GL_5(bindBufferRange
, BindBufferRange
, WGC3Denum
, WGC3Duint
,
1000 WGC3Duint
, WGC3Dintptr
, WGC3Dsizeiptr
)
1001 DELEGATE_TO_GL_2(bindSampler
, BindSampler
, WGC3Duint
, WebGLId
)
1002 DELEGATE_TO_GL_2(bindTransformFeedback
, BindTransformFeedback
, WGC3Denum
,
1004 DELEGATE_TO_GL_4(clearBufferfi
, ClearBufferfi
, WGC3Denum
, WGC3Dint
, WGC3Dfloat
,
1006 DELEGATE_TO_GL_3(clearBufferfv
, ClearBufferfv
, WGC3Denum
, WGC3Dint
,
1008 DELEGATE_TO_GL_3(clearBufferiv
, ClearBufferiv
, WGC3Denum
, WGC3Dint
,
1010 DELEGATE_TO_GL_3(clearBufferuiv
, ClearBufferuiv
, WGC3Denum
, WGC3Dint
,
1012 WGC3Denum
WebGraphicsContext3DImpl::clientWaitSync(WGC3Dsync sync
,
1013 WGC3Dbitfield flags
,
1014 WGC3Duint64 timeout
) {
1015 return gl_
->ClientWaitSync(reinterpret_cast<GLsync
>(sync
), flags
, timeout
);
1017 DELEGATE_TO_GL_9(compressedTexImage3D
, CompressedTexImage3D
, WGC3Denum
,
1018 WGC3Dint
, WGC3Denum
, WGC3Dsizei
, WGC3Dsizei
, WGC3Dsizei
,
1019 WGC3Dint
, WGC3Dsizei
, const void *)
1020 DELEGATE_TO_GL_11(compressedTexSubImage3D
, CompressedTexSubImage3D
, WGC3Denum
,
1021 WGC3Dint
, WGC3Dint
, WGC3Dint
, WGC3Dint
, WGC3Dsizei
,
1022 WGC3Dsizei
, WGC3Dsizei
, WGC3Denum
, WGC3Dsizei
, const void *)
1023 DELEGATE_TO_GL_5(copyBufferSubData
, CopyBufferSubData
, WGC3Denum
, WGC3Denum
,
1024 WGC3Dintptr
, WGC3Dintptr
, WGC3Dsizeiptr
)
1025 DELEGATE_TO_GL_9(copyTexSubImage3D
, CopyTexSubImage3D
, WGC3Denum
, WGC3Dint
,
1026 WGC3Dint
, WGC3Dint
, WGC3Dint
, WGC3Dint
, WGC3Dint
, WGC3Dsizei
,
1028 WebGLId
WebGraphicsContext3DImpl::createSampler() {
1030 gl_
->GenSamplers(1, &sampler
);
1033 WebGLId
WebGraphicsContext3DImpl::createTransformFeedback() {
1035 gl_
->GenTransformFeedbacks(1, &tf
);
1038 void WebGraphicsContext3DImpl::deleteSampler(WebGLId sampler
) {
1039 gl_
->DeleteSamplers(1, &sampler
);
1041 void WebGraphicsContext3DImpl::deleteSync(WGC3Dsync sync
) {
1042 gl_
->DeleteSync(reinterpret_cast<GLsync
>(sync
));
1044 void WebGraphicsContext3DImpl::deleteTransformFeedback(WebGLId tf
) {
1045 gl_
->DeleteTransformFeedbacks(1, &tf
);
1047 void WebGraphicsContext3DImpl::drawRangeElements(
1048 WGC3Denum mode
, WGC3Duint start
, WGC3Duint end
, WGC3Dsizei count
,
1049 WGC3Denum type
, WGC3Dintptr offset
) {
1050 gl_
->DrawRangeElements(mode
, start
, end
, count
, type
,
1051 reinterpret_cast<void*>(static_cast<intptr_t>(offset
)));
1053 DELEGATE_TO_GL(endTransformFeedback
, EndTransformFeedback
)
1054 WGC3Dsync
WebGraphicsContext3DImpl::fenceSync(WGC3Denum condition
,
1055 WGC3Dbitfield flags
) {
1056 return reinterpret_cast<WGC3Dsync
>(gl_
->FenceSync(condition
, flags
));
1058 DELEGATE_TO_GL_5(framebufferTextureLayer
, FramebufferTextureLayer
, WGC3Denum
,
1059 WGC3Denum
, WGC3Duint
, WGC3Dint
, WGC3Dint
)
1060 DELEGATE_TO_GL_5(getActiveUniformBlockName
, GetActiveUniformBlockName
,
1061 WGC3Duint
, WGC3Duint
, WGC3Dsizei
, WGC3Dsizei
*, WGC3Dchar
*)
1062 DELEGATE_TO_GL_4(getActiveUniformBlockiv
, GetActiveUniformBlockiv
, WGC3Duint
,
1063 WGC3Duint
, WGC3Denum
, WGC3Dint
*)
1064 DELEGATE_TO_GL_5(getActiveUniformsiv
, GetActiveUniformsiv
, WGC3Duint
,
1065 WGC3Dsizei
, const WGC3Duint
*, WGC3Denum
, WGC3Dint
*)
1066 DELEGATE_TO_GL_2R(getFragDataLocation
, GetFragDataLocation
, WGC3Duint
,
1067 const WGC3Dchar
*, WGC3Dint
)
1068 DELEGATE_TO_GL_5(getInternalformativ
, GetInternalformativ
, WGC3Denum
, WGC3Denum
,
1069 WGC3Denum
, WGC3Dsizei
, WGC3Dint
*)
1070 DELEGATE_TO_GL_3(getSamplerParameterfv
, GetSamplerParameterfv
, WGC3Duint
,
1071 WGC3Denum
, WGC3Dfloat
*)
1072 DELEGATE_TO_GL_3(getSamplerParameteriv
, GetSamplerParameteriv
, WGC3Duint
,
1073 WGC3Denum
, WGC3Dint
*)
1074 DELEGATE_TO_GL_7(getTransformFeedbackVarying
, GetTransformFeedbackVarying
,
1075 WGC3Duint
, WGC3Duint
, WGC3Dsizei
, WGC3Dsizei
*, WGC3Dsizei
*,
1076 WGC3Denum
*, WGC3Dchar
*)
1077 DELEGATE_TO_GL_2R(getUniformBlockIndex
, GetUniformBlockIndex
, WGC3Duint
,
1078 const WGC3Dchar
*, WGC3Duint
)
1079 DELEGATE_TO_GL_4(getUniformIndices
, GetUniformIndices
, WGC3Duint
, WGC3Dsizei
,
1080 const WGC3Dchar
*const*, WGC3Duint
*)
1081 //DELEGATE_TO_GL_3(getUniformuiv, GetUniformuiv, WGC3Duint, WGC3Dint,
1083 //DELEGATE_TO_GL_3(getVertexAttribIiv, GetVertexAttribIiv, WGC3Duint,
1084 // WGC3Denum, WGC3Dint *)
1085 //DELEGATE_TO_GL_3(getVertexAttribIuiv, GetVertexAttribIuiv, WGC3Duint,
1086 // WGC3Denum, WGC3Duint *)
1087 DELEGATE_TO_GL_3(invalidateFramebuffer
, InvalidateFramebuffer
, WGC3Denum
,
1088 WGC3Dsizei
, const WGC3Denum
*)
1089 DELEGATE_TO_GL_7(invalidateSubFramebuffer
, InvalidateSubFramebuffer
, WGC3Denum
,
1090 WGC3Dsizei
, const WGC3Denum
*, WGC3Dint
, WGC3Dint
, WGC3Dsizei
,
1092 DELEGATE_TO_GL_1R(isSampler
, IsSampler
, WebGLId
, WGC3Dboolean
)
1093 WGC3Dboolean
WebGraphicsContext3DImpl::isSync(WGC3Dsync sync
) {
1094 return gl_
->IsSync(reinterpret_cast<GLsync
>(sync
));
1096 DELEGATE_TO_GL_1R(isTransformFeedback
, IsTransformFeedback
, WGC3Duint
,
1098 DELEGATE_TO_GL(pauseTransformFeedback
, PauseTransformFeedback
)
1099 //DELEGATE_TO_GL_3(programParameteri, ProgramParameteri, WGC3Duint, WGC3Denum,
1101 DELEGATE_TO_GL_1(readBuffer
, ReadBuffer
, WGC3Denum
)
1102 DELEGATE_TO_GL(resumeTransformFeedback
, ResumeTransformFeedback
)
1103 DELEGATE_TO_GL_3(samplerParameterf
, SamplerParameterf
, WGC3Duint
, WGC3Denum
,
1105 DELEGATE_TO_GL_3(samplerParameterfv
, SamplerParameterfv
, WGC3Duint
, WGC3Denum
,
1107 DELEGATE_TO_GL_3(samplerParameteri
, SamplerParameteri
, WGC3Duint
, WGC3Denum
,
1109 DELEGATE_TO_GL_3(samplerParameteriv
, SamplerParameteriv
, WGC3Duint
, WGC3Denum
,
1111 DELEGATE_TO_GL_10(texImage3D
, TexImage3D
, WGC3Denum
, WGC3Dint
, WGC3Dint
,
1112 WGC3Dsizei
, WGC3Dsizei
, WGC3Dsizei
, WGC3Dint
, WGC3Denum
,
1113 WGC3Denum
, const void *)
1114 DELEGATE_TO_GL_6(texStorage3D
, TexStorage3D
, WGC3Denum
, WGC3Dsizei
, WGC3Denum
,
1115 WGC3Dsizei
, WGC3Dsizei
, WGC3Dsizei
)
1116 DELEGATE_TO_GL_11(texSubImage3D
, TexSubImage3D
, WGC3Denum
, WGC3Dint
, WGC3Dint
,
1117 WGC3Dint
, WGC3Dint
, WGC3Dsizei
, WGC3Dsizei
, WGC3Dsizei
,
1118 WGC3Denum
, WGC3Denum
, const void *)
1119 DELEGATE_TO_GL_4(transformFeedbackVaryings
, TransformFeedbackVaryings
,
1120 WGC3Duint
, WGC3Dsizei
, const WGC3Dchar
*const*, WGC3Denum
)
1121 DELEGATE_TO_GL_2(uniform1ui
, Uniform1ui
, WGC3Dint
, WGC3Duint
)
1122 DELEGATE_TO_GL_3(uniform1uiv
, Uniform1uiv
, WGC3Dint
, WGC3Dsizei
,
1124 DELEGATE_TO_GL_3(uniform2ui
, Uniform2ui
, WGC3Dint
, WGC3Duint
, WGC3Duint
)
1125 DELEGATE_TO_GL_3(uniform2uiv
, Uniform2uiv
, WGC3Dint
, WGC3Dsizei
,
1127 DELEGATE_TO_GL_4(uniform3ui
, Uniform3ui
, WGC3Dint
, WGC3Duint
, WGC3Duint
,
1129 DELEGATE_TO_GL_3(uniform3uiv
, Uniform3uiv
, WGC3Dint
, WGC3Dsizei
,
1131 DELEGATE_TO_GL_5(uniform4ui
, Uniform4ui
, WGC3Dint
, WGC3Duint
, WGC3Duint
,
1132 WGC3Duint
, WGC3Duint
)
1133 DELEGATE_TO_GL_3(uniform4uiv
, Uniform4uiv
, WGC3Dint
, WGC3Dsizei
,
1135 DELEGATE_TO_GL_3(uniformBlockBinding
, UniformBlockBinding
, WGC3Duint
, WGC3Duint
,
1137 DELEGATE_TO_GL_4(uniformMatrix2x3fv
, UniformMatrix2x3fv
, WGC3Dint
, WGC3Dsizei
,
1138 WGC3Dboolean
, const WGC3Dfloat
*)
1139 DELEGATE_TO_GL_4(uniformMatrix2x4fv
, UniformMatrix2x4fv
, WGC3Dint
, WGC3Dsizei
,
1140 WGC3Dboolean
, const WGC3Dfloat
*)
1141 DELEGATE_TO_GL_4(uniformMatrix3x2fv
, UniformMatrix3x2fv
, WGC3Dint
, WGC3Dsizei
,
1142 WGC3Dboolean
, const WGC3Dfloat
*)
1143 DELEGATE_TO_GL_4(uniformMatrix3x4fv
, UniformMatrix3x4fv
, WGC3Dint
, WGC3Dsizei
,
1144 WGC3Dboolean
, const WGC3Dfloat
*)
1145 DELEGATE_TO_GL_4(uniformMatrix4x2fv
, UniformMatrix4x2fv
, WGC3Dint
, WGC3Dsizei
,
1146 WGC3Dboolean
, const WGC3Dfloat
*)
1147 DELEGATE_TO_GL_4(uniformMatrix4x3fv
, UniformMatrix4x3fv
, WGC3Dint
, WGC3Dsizei
,
1148 WGC3Dboolean
, const WGC3Dfloat
*)
1149 DELEGATE_TO_GL_5(vertexAttribI4i
, VertexAttribI4i
, WGC3Duint
, WGC3Dint
,
1150 WGC3Dint
, WGC3Dint
, WGC3Dint
)
1151 DELEGATE_TO_GL_2(vertexAttribI4iv
, VertexAttribI4iv
, WGC3Duint
,
1153 DELEGATE_TO_GL_5(vertexAttribI4ui
, VertexAttribI4ui
, WGC3Duint
, WGC3Duint
,
1154 WGC3Duint
, WGC3Duint
, WGC3Duint
)
1155 DELEGATE_TO_GL_2(vertexAttribI4uiv
, VertexAttribI4uiv
, WGC3Duint
,
1157 void WebGraphicsContext3DImpl::vertexAttribIPointer(
1158 WGC3Duint index
, WGC3Dint size
, WGC3Denum type
, WGC3Dsizei stride
,
1159 WGC3Dintptr offset
) {
1160 gl_
->VertexAttribIPointer(
1161 index
, size
, type
, stride
,
1162 reinterpret_cast<void*>(static_cast<intptr_t>(offset
)));
1164 void WebGraphicsContext3DImpl::waitSync(WGC3Dsync sync
,
1165 WGC3Dbitfield flags
,
1166 WGC3Duint64 timeout
) {
1167 gl_
->WaitSync(reinterpret_cast<GLsync
>(sync
), flags
, timeout
);
1170 GrGLInterface
* WebGraphicsContext3DImpl::createGrGLInterface() {
1171 return skia_bindings::CreateCommandBufferSkiaGLBinding();
1174 ::gpu::gles2::GLES2ImplementationErrorMessageCallback
*
1175 WebGraphicsContext3DImpl::getErrorMessageCallback() {
1176 if (!client_error_message_callback_
) {
1177 client_error_message_callback_
.reset(
1178 new WebGraphicsContext3DErrorMessageCallback(this));
1180 return client_error_message_callback_
.get();
1183 void WebGraphicsContext3DImpl::OnErrorMessage(
1184 const std::string
& message
, int id
) {
1185 if (error_message_callback_
) {
1186 blink::WebString str
= blink::WebString::fromUTF8(message
.c_str());
1187 error_message_callback_
->onErrorMessage(str
, id
);
1191 // TODO(bajones): Look into removing these functions from the blink interface
1192 void WebGraphicsContext3DImpl::prepareTexture() {
1196 void WebGraphicsContext3DImpl::postSubBufferCHROMIUM(
1197 int x
, int y
, int width
, int height
) {
1201 void WebGraphicsContext3DImpl::setVisibilityCHROMIUM(
1206 void WebGraphicsContext3DImpl::copyTextureToParentTextureCHROMIUM(
1207 WebGLId texture
, WebGLId parentTexture
) {
1211 void WebGraphicsContext3DImpl::releaseShaderCompiler() {
1215 void WebGraphicsContext3DImpl::ConvertAttributes(
1216 const blink::WebGraphicsContext3D::Attributes
& attributes
,
1217 ::gpu::gles2::ContextCreationAttribHelper
* output_attribs
) {
1218 output_attribs
->alpha_size
= attributes
.alpha
? 8 : 0;
1219 output_attribs
->depth_size
= attributes
.depth
? 24 : 0;
1220 output_attribs
->stencil_size
= attributes
.stencil
? 8 : 0;
1221 output_attribs
->samples
= attributes
.antialias
? 4 : 0;
1222 output_attribs
->sample_buffers
= attributes
.antialias
? 1 : 0;
1223 output_attribs
->fail_if_major_perf_caveat
=
1224 attributes
.failIfMajorPerformanceCaveat
;
1225 output_attribs
->bind_generates_resource
= false;
1226 output_attribs
->es3_context_required
=
1227 (attributes
.webGL
&& attributes
.webGLVersion
== 2);
1230 } // namespace gpu_blink