OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #include "gpu/blink/webgraphicscontext3d_impl.h" | |
6 | |
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" | |
15 | |
16 #include "third_party/khronos/GLES2/gl2.h" | |
17 #ifndef GL_GLEXT_PROTOTYPES | |
18 #define GL_GLEXT_PROTOTYPES 1 | |
19 #endif | |
20 #include "third_party/khronos/GLES2/gl2ext.h" | |
21 | |
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; | |
35 using blink::WebGLId; | |
36 | |
37 namespace gpu_blink { | |
38 | |
39 namespace { | |
40 | |
41 uint32_t GenFlushID() { | |
42 static base::subtle::Atomic32 flush_id = 0; | |
43 | |
44 base::subtle::Atomic32 my_id = base::subtle::Barrier_AtomicIncrement( | |
45 &flush_id, 1); | |
46 return static_cast<uint32_t>(my_id); | |
47 } | |
48 | |
49 } // namespace anonymous | |
50 | |
51 class WebGraphicsContext3DErrorMessageCallback | |
52 : public ::gpu::gles2::GLES2ImplementationErrorMessageCallback { | |
53 public: | |
54 WebGraphicsContext3DErrorMessageCallback( | |
55 WebGraphicsContext3DImpl* context) | |
56 : graphics_context_(context) { | |
57 } | |
58 | |
59 void OnErrorMessage(const char* msg, int id) override; | |
60 | |
61 private: | |
62 WebGraphicsContext3DImpl* graphics_context_; | |
63 | |
64 DISALLOW_COPY_AND_ASSIGN(WebGraphicsContext3DErrorMessageCallback); | |
65 }; | |
66 | |
67 void WebGraphicsContext3DErrorMessageCallback::OnErrorMessage( | |
68 const char* msg, int id) { | |
69 graphics_context_->OnErrorMessage(msg, id); | |
70 } | |
71 | |
72 // Helper macros to reduce the amount of code. | |
73 | |
74 #define DELEGATE_TO_GL(name, glname) \ | |
75 void WebGraphicsContext3DImpl::name() { \ | |
76 gl_->glname(); \ | |
77 } | |
78 | |
79 #define DELEGATE_TO_GL_R(name, glname, rt) \ | |
80 rt WebGraphicsContext3DImpl::name() { \ | |
81 return gl_->glname(); \ | |
82 } | |
83 | |
84 #define DELEGATE_TO_GL_1(name, glname, t1) \ | |
85 void WebGraphicsContext3DImpl::name(t1 a1) { \ | |
86 gl_->glname(a1); \ | |
87 } | |
88 | |
89 #define DELEGATE_TO_GL_1R(name, glname, t1, rt) \ | |
90 rt WebGraphicsContext3DImpl::name(t1 a1) { \ | |
91 return gl_->glname(a1); \ | |
92 } | |
93 | |
94 #define DELEGATE_TO_GL_1RB(name, glname, t1, rt) \ | |
95 rt WebGraphicsContext3DImpl::name(t1 a1) { \ | |
96 return gl_->glname(a1) ? true : false; \ | |
97 } | |
98 | |
99 #define DELEGATE_TO_GL_2(name, glname, t1, t2) \ | |
100 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2) { \ | |
101 gl_->glname(a1, a2); \ | |
102 } | |
103 | |
104 #define DELEGATE_TO_GL_2R(name, glname, t1, t2, rt) \ | |
105 rt WebGraphicsContext3DImpl::name(t1 a1, t2 a2) { \ | |
106 return gl_->glname(a1, a2); \ | |
107 } | |
108 | |
109 #define DELEGATE_TO_GL_3(name, glname, t1, t2, t3) \ | |
110 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3) { \ | |
111 gl_->glname(a1, a2, a3); \ | |
112 } | |
113 | |
114 #define DELEGATE_TO_GL_3R(name, glname, t1, t2, t3, rt) \ | |
115 rt WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3) { \ | |
116 return gl_->glname(a1, a2, a3); \ | |
117 } | |
118 | |
119 #define DELEGATE_TO_GL_4(name, glname, t1, t2, t3, t4) \ | |
120 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4) { \ | |
121 gl_->glname(a1, a2, a3, a4); \ | |
122 } | |
123 | |
124 #define DELEGATE_TO_GL_4R(name, glname, t1, t2, t3, t4, rt) \ | |
125 rt WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4) { \ | |
126 return gl_->glname(a1, a2, a3, a4); \ | |
127 } | |
128 | |
129 #define DELEGATE_TO_GL_5(name, glname, t1, t2, t3, t4, t5) \ | |
130 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) {\ | |
131 \ | |
132 gl_->glname(a1, a2, a3, a4, a5); \ | |
133 } | |
134 | |
135 #define DELEGATE_TO_GL_6(name, glname, t1, t2, t3, t4, t5, t6) \ | |
136 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, \ | |
137 t6 a6) { \ | |
138 gl_->glname(a1, a2, a3, a4, a5, a6); \ | |
139 } | |
140 | |
141 #define DELEGATE_TO_GL_7(name, glname, t1, t2, t3, t4, t5, t6, t7) \ | |
142 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, \ | |
143 t6 a6, t7 a7) { \ | |
144 gl_->glname(a1, a2, a3, a4, a5, a6, a7); \ | |
145 } | |
146 | |
147 #define DELEGATE_TO_GL_8(name, glname, t1, t2, t3, t4, t5, t6, t7, t8) \ | |
148 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, \ | |
149 t6 a6, t7 a7, t8 a8) { \ | |
150 gl_->glname(a1, a2, a3, a4, a5, a6, a7, a8); \ | |
151 } | |
152 | |
153 #define DELEGATE_TO_GL_9(name, glname, t1, t2, t3, t4, t5, t6, t7, t8, t9) \ | |
154 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, \ | |
155 t6 a6, t7 a7, t8 a8, t9 a9) { \ | |
156 gl_->glname(a1, a2, a3, a4, a5, a6, a7, a8, a9); \ | |
157 } | |
158 | |
159 #define DELEGATE_TO_GL_9R(name, glname, t1, t2, t3, t4, t5, t6, t7, t8, \ | |
160 t9, rt) \ | |
161 rt WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, \ | |
162 t6 a6, t7 a7, t8 a8, t9 a9) { \ | |
163 return gl_->glname(a1, a2, a3, a4, a5, a6, a7, a8, a9); \ | |
164 } | |
165 | |
166 #define DELEGATE_TO_GL_10(name, glname, t1, t2, t3, t4, t5, t6, t7, t8, \ | |
167 t9, t10) \ | |
168 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, \ | |
169 t6 a6, t7 a7, t8 a8, t9 a9, \ | |
170 t10 a10) { \ | |
171 gl_->glname(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); \ | |
172 } | |
173 | |
174 #define DELEGATE_TO_GL_11(name, glname, t1, t2, t3, t4, t5, t6, t7, t8, \ | |
175 t9, t10, t11) \ | |
176 void WebGraphicsContext3DImpl::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, \ | |
177 t6 a6, t7 a7, t8 a8, t9 a9, t10 a10,\ | |
178 t11 a11) { \ | |
179 gl_->glname(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); \ | |
180 } | |
181 | |
182 WebGraphicsContext3DImpl::WebGraphicsContext3DImpl() | |
183 : initialized_(false), | |
184 initialize_failed_(false), | |
185 context_lost_callback_(0), | |
186 context_lost_reason_(GL_NO_ERROR), | |
187 error_message_callback_(0), | |
188 gl_(NULL), | |
189 flush_id_(0) { | |
190 } | |
191 | |
192 WebGraphicsContext3DImpl::~WebGraphicsContext3DImpl() { | |
193 | |
194 } | |
195 | |
196 void WebGraphicsContext3DImpl::synthesizeGLError(WGC3Denum error) { | |
197 if (std::find(synthetic_errors_.begin(), synthetic_errors_.end(), error) == | |
198 synthetic_errors_.end()) { | |
199 synthetic_errors_.push_back(error); | |
200 } | |
201 } | |
202 | |
203 uint32_t WebGraphicsContext3DImpl::lastFlushID() { | |
204 return flush_id_; | |
205 } | |
206 | |
207 DELEGATE_TO_GL_R(insertSyncPoint, InsertSyncPointCHROMIUM, unsigned int) | |
208 | |
209 DELEGATE_TO_GL_3(reshapeWithScaleFactor, ResizeCHROMIUM, int, int, float) | |
210 | |
211 DELEGATE_TO_GL_4R(mapBufferSubDataCHROMIUM, MapBufferSubDataCHROMIUM, WGC3Denum, | |
212 WGC3Dintptr, WGC3Dsizeiptr, WGC3Denum, void*) | |
213 | |
214 DELEGATE_TO_GL_1(unmapBufferSubDataCHROMIUM, UnmapBufferSubDataCHROMIUM, | |
215 const void*) | |
216 | |
217 DELEGATE_TO_GL_9R(mapTexSubImage2DCHROMIUM, MapTexSubImage2DCHROMIUM, WGC3Denum, | |
218 WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei, | |
219 WGC3Denum, WGC3Denum, WGC3Denum, void*) | |
220 | |
221 DELEGATE_TO_GL_1(unmapTexSubImage2DCHROMIUM, UnmapTexSubImage2DCHROMIUM, | |
222 const void*) | |
223 | |
224 DELEGATE_TO_GL_3(discardFramebufferEXT, DiscardFramebufferEXT, WGC3Denum, | |
225 WGC3Dsizei, const WGC3Denum*) | |
226 | |
227 blink::WebString WebGraphicsContext3DImpl:: | |
228 getRequestableExtensionsCHROMIUM() { | |
229 return blink::WebString::fromUTF8( | |
230 gl_->GetRequestableExtensionsCHROMIUM()); | |
231 } | |
232 | |
233 DELEGATE_TO_GL_1(requestExtensionCHROMIUM, RequestExtensionCHROMIUM, | |
234 const char*) | |
235 | |
236 void WebGraphicsContext3DImpl::blitFramebufferCHROMIUM( | |
237 WGC3Dint srcX0, WGC3Dint srcY0, WGC3Dint srcX1, WGC3Dint srcY1, | |
238 WGC3Dint dstX0, WGC3Dint dstY0, WGC3Dint dstX1, WGC3Dint dstY1, | |
239 WGC3Dbitfield mask, WGC3Denum filter) { | |
240 gl_->BlitFramebufferCHROMIUM( | |
241 srcX0, srcY0, srcX1, srcY1, | |
242 dstX0, dstY0, dstX1, dstY1, | |
243 mask, filter); | |
244 } | |
245 | |
246 DELEGATE_TO_GL_5(renderbufferStorageMultisampleCHROMIUM, | |
247 RenderbufferStorageMultisampleCHROMIUM, WGC3Denum, WGC3Dsizei, | |
248 WGC3Denum, WGC3Dsizei, WGC3Dsizei) | |
249 | |
250 DELEGATE_TO_GL_1(activeTexture, ActiveTexture, WGC3Denum) | |
251 | |
252 DELEGATE_TO_GL_2(attachShader, AttachShader, WebGLId, WebGLId) | |
253 | |
254 DELEGATE_TO_GL_3(bindAttribLocation, BindAttribLocation, WebGLId, | |
255 WGC3Duint, const WGC3Dchar*) | |
256 | |
257 DELEGATE_TO_GL_2(bindBuffer, BindBuffer, WGC3Denum, WebGLId) | |
258 | |
259 DELEGATE_TO_GL_2(bindFramebuffer, BindFramebuffer, WGC3Denum, WebGLId) | |
260 | |
261 DELEGATE_TO_GL_2(bindRenderbuffer, BindRenderbuffer, WGC3Denum, WebGLId) | |
262 | |
263 DELEGATE_TO_GL_2(bindTexture, BindTexture, WGC3Denum, WebGLId) | |
264 | |
265 DELEGATE_TO_GL_4(blendColor, BlendColor, | |
266 WGC3Dclampf, WGC3Dclampf, WGC3Dclampf, WGC3Dclampf) | |
267 | |
268 DELEGATE_TO_GL_1(blendEquation, BlendEquation, WGC3Denum) | |
269 | |
270 DELEGATE_TO_GL_2(blendEquationSeparate, BlendEquationSeparate, | |
271 WGC3Denum, WGC3Denum) | |
272 | |
273 DELEGATE_TO_GL_2(blendFunc, BlendFunc, WGC3Denum, WGC3Denum) | |
274 | |
275 DELEGATE_TO_GL_4(blendFuncSeparate, BlendFuncSeparate, | |
276 WGC3Denum, WGC3Denum, WGC3Denum, WGC3Denum) | |
277 | |
278 DELEGATE_TO_GL_4(bufferData, BufferData, | |
279 WGC3Denum, WGC3Dsizeiptr, const void*, WGC3Denum) | |
280 | |
281 DELEGATE_TO_GL_4(bufferSubData, BufferSubData, | |
282 WGC3Denum, WGC3Dintptr, WGC3Dsizeiptr, const void*) | |
283 | |
284 DELEGATE_TO_GL_1R(checkFramebufferStatus, CheckFramebufferStatus, | |
285 WGC3Denum, WGC3Denum) | |
286 | |
287 DELEGATE_TO_GL_1(clear, Clear, WGC3Dbitfield) | |
288 | |
289 DELEGATE_TO_GL_4(clearColor, ClearColor, | |
290 WGC3Dclampf, WGC3Dclampf, WGC3Dclampf, WGC3Dclampf) | |
291 | |
292 DELEGATE_TO_GL_1(clearDepth, ClearDepthf, WGC3Dclampf) | |
293 | |
294 DELEGATE_TO_GL_1(clearStencil, ClearStencil, WGC3Dint) | |
295 | |
296 DELEGATE_TO_GL_4(colorMask, ColorMask, | |
297 WGC3Dboolean, WGC3Dboolean, WGC3Dboolean, WGC3Dboolean) | |
298 | |
299 DELEGATE_TO_GL_1(compileShader, CompileShader, WebGLId) | |
300 | |
301 DELEGATE_TO_GL_8(compressedTexImage2D, CompressedTexImage2D, | |
302 WGC3Denum, WGC3Dint, WGC3Denum, WGC3Dint, WGC3Dint, | |
303 WGC3Dsizei, WGC3Dsizei, const void*) | |
304 | |
305 DELEGATE_TO_GL_9(compressedTexSubImage2D, CompressedTexSubImage2D, | |
306 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint, | |
307 WGC3Denum, WGC3Dsizei, const void*) | |
308 | |
309 DELEGATE_TO_GL_8(copyTexImage2D, CopyTexImage2D, | |
310 WGC3Denum, WGC3Dint, WGC3Denum, WGC3Dint, WGC3Dint, | |
311 WGC3Dsizei, WGC3Dsizei, WGC3Dint) | |
312 | |
313 DELEGATE_TO_GL_8(copyTexSubImage2D, CopyTexSubImage2D, | |
314 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint, | |
315 WGC3Dsizei, WGC3Dsizei) | |
316 | |
317 DELEGATE_TO_GL_1(cullFace, CullFace, WGC3Denum) | |
318 | |
319 DELEGATE_TO_GL_1(depthFunc, DepthFunc, WGC3Denum) | |
320 | |
321 DELEGATE_TO_GL_1(depthMask, DepthMask, WGC3Dboolean) | |
322 | |
323 DELEGATE_TO_GL_2(depthRange, DepthRangef, WGC3Dclampf, WGC3Dclampf) | |
324 | |
325 DELEGATE_TO_GL_2(detachShader, DetachShader, WebGLId, WebGLId) | |
326 | |
327 DELEGATE_TO_GL_1(disable, Disable, WGC3Denum) | |
328 | |
329 DELEGATE_TO_GL_1(disableVertexAttribArray, DisableVertexAttribArray, | |
330 WGC3Duint) | |
331 | |
332 DELEGATE_TO_GL_3(drawArrays, DrawArrays, WGC3Denum, WGC3Dint, WGC3Dsizei) | |
333 | |
334 void WebGraphicsContext3DImpl::drawElements(WGC3Denum mode, | |
335 WGC3Dsizei count, | |
336 WGC3Denum type, | |
337 WGC3Dintptr offset) { | |
338 gl_->DrawElements( | |
339 mode, count, type, | |
340 reinterpret_cast<void*>(static_cast<intptr_t>(offset))); | |
341 } | |
342 | |
343 DELEGATE_TO_GL_1(enable, Enable, WGC3Denum) | |
344 | |
345 DELEGATE_TO_GL_1(enableVertexAttribArray, EnableVertexAttribArray, | |
346 WGC3Duint) | |
347 | |
348 void WebGraphicsContext3DImpl::finish() { | |
349 flush_id_ = GenFlushID(); | |
350 gl_->Finish(); | |
351 } | |
352 | |
353 void WebGraphicsContext3DImpl::flush() { | |
354 flush_id_ = GenFlushID(); | |
355 gl_->Flush(); | |
356 } | |
357 | |
358 DELEGATE_TO_GL_4(framebufferRenderbuffer, FramebufferRenderbuffer, | |
359 WGC3Denum, WGC3Denum, WGC3Denum, WebGLId) | |
360 | |
361 DELEGATE_TO_GL_5(framebufferTexture2D, FramebufferTexture2D, | |
362 WGC3Denum, WGC3Denum, WGC3Denum, WebGLId, WGC3Dint) | |
363 | |
364 DELEGATE_TO_GL_1(frontFace, FrontFace, WGC3Denum) | |
365 | |
366 DELEGATE_TO_GL_1(generateMipmap, GenerateMipmap, WGC3Denum) | |
367 | |
368 bool WebGraphicsContext3DImpl::getActiveAttrib( | |
369 WebGLId program, WGC3Duint index, ActiveInfo& info) { | |
370 if (!program) { | |
371 synthesizeGLError(GL_INVALID_VALUE); | |
372 return false; | |
373 } | |
374 GLint max_name_length = -1; | |
375 gl_->GetProgramiv( | |
376 program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_name_length); | |
377 if (max_name_length < 0) | |
378 return false; | |
379 if (max_name_length == 0) { | |
380 // No active attributes exist. | |
381 synthesizeGLError(GL_INVALID_VALUE); | |
382 return false; | |
383 } | |
384 scoped_ptr<GLchar[]> name(new GLchar[max_name_length]); | |
385 GLsizei length = 0; | |
386 GLint size = -1; | |
387 GLenum type = 0; | |
388 gl_->GetActiveAttrib( | |
389 program, index, max_name_length, &length, &size, &type, name.get()); | |
390 if (size < 0) { | |
391 return false; | |
392 } | |
393 info.name = blink::WebString::fromUTF8(name.get(), length); | |
394 info.type = type; | |
395 info.size = size; | |
396 return true; | |
397 } | |
398 | |
399 bool WebGraphicsContext3DImpl::getActiveUniform( | |
400 WebGLId program, WGC3Duint index, ActiveInfo& info) { | |
401 GLint max_name_length = -1; | |
402 gl_->GetProgramiv( | |
403 program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &max_name_length); | |
404 if (max_name_length < 0) | |
405 return false; | |
406 if (max_name_length == 0) { | |
407 // No active uniforms exist. | |
408 synthesizeGLError(GL_INVALID_VALUE); | |
409 return false; | |
410 } | |
411 scoped_ptr<GLchar[]> name(new GLchar[max_name_length]); | |
412 GLsizei length = 0; | |
413 GLint size = -1; | |
414 GLenum type = 0; | |
415 gl_->GetActiveUniform( | |
416 program, index, max_name_length, &length, &size, &type, name.get()); | |
417 if (size < 0) { | |
418 return false; | |
419 } | |
420 info.name = blink::WebString::fromUTF8(name.get(), length); | |
421 info.type = type; | |
422 info.size = size; | |
423 return true; | |
424 } | |
425 | |
426 DELEGATE_TO_GL_4(getAttachedShaders, GetAttachedShaders, | |
427 WebGLId, WGC3Dsizei, WGC3Dsizei*, WebGLId*) | |
428 | |
429 DELEGATE_TO_GL_2R(getAttribLocation, GetAttribLocation, | |
430 WebGLId, const WGC3Dchar*, WGC3Dint) | |
431 | |
432 DELEGATE_TO_GL_2(getBooleanv, GetBooleanv, WGC3Denum, WGC3Dboolean*) | |
433 | |
434 DELEGATE_TO_GL_3(getBufferParameteriv, GetBufferParameteriv, | |
435 WGC3Denum, WGC3Denum, WGC3Dint*) | |
436 | |
437 WGC3Denum WebGraphicsContext3DImpl::getError() { | |
438 if (!synthetic_errors_.empty()) { | |
439 std::vector<WGC3Denum>::iterator iter = synthetic_errors_.begin(); | |
440 WGC3Denum err = *iter; | |
441 synthetic_errors_.erase(iter); | |
442 return err; | |
443 } | |
444 | |
445 return gl_->GetError(); | |
446 } | |
447 | |
448 DELEGATE_TO_GL_2(getFloatv, GetFloatv, WGC3Denum, WGC3Dfloat*) | |
449 | |
450 DELEGATE_TO_GL_4(getFramebufferAttachmentParameteriv, | |
451 GetFramebufferAttachmentParameteriv, | |
452 WGC3Denum, WGC3Denum, WGC3Denum, WGC3Dint*) | |
453 | |
454 DELEGATE_TO_GL_2(getIntegerv, GetIntegerv, WGC3Denum, WGC3Dint*) | |
455 | |
456 DELEGATE_TO_GL_3(getProgramiv, GetProgramiv, WebGLId, WGC3Denum, WGC3Dint*) | |
457 | |
458 blink::WebString WebGraphicsContext3DImpl::getProgramInfoLog( | |
459 WebGLId program) { | |
460 GLint logLength = 0; | |
461 gl_->GetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength); | |
462 if (!logLength) | |
463 return blink::WebString(); | |
464 scoped_ptr<GLchar[]> log(new GLchar[logLength]); | |
465 if (!log) | |
466 return blink::WebString(); | |
467 GLsizei returnedLogLength = 0; | |
468 gl_->GetProgramInfoLog( | |
469 program, logLength, &returnedLogLength, log.get()); | |
470 DCHECK_EQ(logLength, returnedLogLength + 1); | |
471 blink::WebString res = | |
472 blink::WebString::fromUTF8(log.get(), returnedLogLength); | |
473 return res; | |
474 } | |
475 | |
476 DELEGATE_TO_GL_3(getRenderbufferParameteriv, GetRenderbufferParameteriv, | |
477 WGC3Denum, WGC3Denum, WGC3Dint*) | |
478 | |
479 DELEGATE_TO_GL_3(getShaderiv, GetShaderiv, WebGLId, WGC3Denum, WGC3Dint*) | |
480 | |
481 blink::WebString WebGraphicsContext3DImpl::getShaderInfoLog( | |
482 WebGLId shader) { | |
483 GLint logLength = 0; | |
484 gl_->GetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength); | |
485 if (!logLength) | |
486 return blink::WebString(); | |
487 scoped_ptr<GLchar[]> log(new GLchar[logLength]); | |
488 if (!log) | |
489 return blink::WebString(); | |
490 GLsizei returnedLogLength = 0; | |
491 gl_->GetShaderInfoLog( | |
492 shader, logLength, &returnedLogLength, log.get()); | |
493 DCHECK_EQ(logLength, returnedLogLength + 1); | |
494 blink::WebString res = | |
495 blink::WebString::fromUTF8(log.get(), returnedLogLength); | |
496 return res; | |
497 } | |
498 | |
499 DELEGATE_TO_GL_4(getShaderPrecisionFormat, GetShaderPrecisionFormat, | |
500 WGC3Denum, WGC3Denum, WGC3Dint*, WGC3Dint*) | |
501 | |
502 blink::WebString WebGraphicsContext3DImpl::getShaderSource( | |
503 WebGLId shader) { | |
504 GLint logLength = 0; | |
505 gl_->GetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &logLength); | |
506 if (!logLength) | |
507 return blink::WebString(); | |
508 scoped_ptr<GLchar[]> log(new GLchar[logLength]); | |
509 if (!log) | |
510 return blink::WebString(); | |
511 GLsizei returnedLogLength = 0; | |
512 gl_->GetShaderSource( | |
513 shader, logLength, &returnedLogLength, log.get()); | |
514 if (!returnedLogLength) | |
515 return blink::WebString(); | |
516 DCHECK_EQ(logLength, returnedLogLength + 1); | |
517 blink::WebString res = | |
518 blink::WebString::fromUTF8(log.get(), returnedLogLength); | |
519 return res; | |
520 } | |
521 | |
522 blink::WebString WebGraphicsContext3DImpl:: | |
523 getTranslatedShaderSourceANGLE(WebGLId shader) { | |
524 GLint logLength = 0; | |
525 gl_->GetShaderiv( | |
526 shader, GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, &logLength); | |
527 if (!logLength) | |
528 return blink::WebString(); | |
529 scoped_ptr<GLchar[]> log(new GLchar[logLength]); | |
530 if (!log) | |
531 return blink::WebString(); | |
532 GLsizei returnedLogLength = 0; | |
533 gl_->GetTranslatedShaderSourceANGLE( | |
534 shader, logLength, &returnedLogLength, log.get()); | |
535 if (!returnedLogLength) | |
536 return blink::WebString(); | |
537 DCHECK_EQ(logLength, returnedLogLength + 1); | |
538 blink::WebString res = | |
539 blink::WebString::fromUTF8(log.get(), returnedLogLength); | |
540 return res; | |
541 } | |
542 | |
543 blink::WebString WebGraphicsContext3DImpl::getString( | |
544 WGC3Denum name) { | |
545 return blink::WebString::fromUTF8( | |
546 reinterpret_cast<const char*>(gl_->GetString(name))); | |
547 } | |
548 | |
549 DELEGATE_TO_GL_3(getTexParameterfv, GetTexParameterfv, | |
550 WGC3Denum, WGC3Denum, WGC3Dfloat*) | |
551 | |
552 DELEGATE_TO_GL_3(getTexParameteriv, GetTexParameteriv, | |
553 WGC3Denum, WGC3Denum, WGC3Dint*) | |
554 | |
555 DELEGATE_TO_GL_3(getUniformfv, GetUniformfv, WebGLId, WGC3Dint, WGC3Dfloat*) | |
556 | |
557 DELEGATE_TO_GL_3(getUniformiv, GetUniformiv, WebGLId, WGC3Dint, WGC3Dint*) | |
558 | |
559 DELEGATE_TO_GL_2R(getUniformLocation, GetUniformLocation, | |
560 WebGLId, const WGC3Dchar*, WGC3Dint) | |
561 | |
562 DELEGATE_TO_GL_3(getVertexAttribfv, GetVertexAttribfv, | |
563 WGC3Duint, WGC3Denum, WGC3Dfloat*) | |
564 | |
565 DELEGATE_TO_GL_3(getVertexAttribiv, GetVertexAttribiv, | |
566 WGC3Duint, WGC3Denum, WGC3Dint*) | |
567 | |
568 WGC3Dsizeiptr WebGraphicsContext3DImpl::getVertexAttribOffset( | |
569 WGC3Duint index, WGC3Denum pname) { | |
570 GLvoid* value = NULL; | |
571 // NOTE: If pname is ever a value that returns more then 1 element | |
572 // this will corrupt memory. | |
573 gl_->GetVertexAttribPointerv(index, pname, &value); | |
574 return static_cast<WGC3Dsizeiptr>(reinterpret_cast<intptr_t>(value)); | |
575 } | |
576 | |
577 DELEGATE_TO_GL_2(hint, Hint, WGC3Denum, WGC3Denum) | |
578 | |
579 DELEGATE_TO_GL_1RB(isBuffer, IsBuffer, WebGLId, WGC3Dboolean) | |
580 | |
581 DELEGATE_TO_GL_1RB(isEnabled, IsEnabled, WGC3Denum, WGC3Dboolean) | |
582 | |
583 DELEGATE_TO_GL_1RB(isFramebuffer, IsFramebuffer, WebGLId, WGC3Dboolean) | |
584 | |
585 DELEGATE_TO_GL_1RB(isProgram, IsProgram, WebGLId, WGC3Dboolean) | |
586 | |
587 DELEGATE_TO_GL_1RB(isRenderbuffer, IsRenderbuffer, WebGLId, WGC3Dboolean) | |
588 | |
589 DELEGATE_TO_GL_1RB(isShader, IsShader, WebGLId, WGC3Dboolean) | |
590 | |
591 DELEGATE_TO_GL_1RB(isTexture, IsTexture, WebGLId, WGC3Dboolean) | |
592 | |
593 DELEGATE_TO_GL_1(lineWidth, LineWidth, WGC3Dfloat) | |
594 | |
595 DELEGATE_TO_GL_1(linkProgram, LinkProgram, WebGLId) | |
596 | |
597 DELEGATE_TO_GL_2(pixelStorei, PixelStorei, WGC3Denum, WGC3Dint) | |
598 | |
599 DELEGATE_TO_GL_2(polygonOffset, PolygonOffset, WGC3Dfloat, WGC3Dfloat) | |
600 | |
601 DELEGATE_TO_GL_7(readPixels, ReadPixels, | |
602 WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei, WGC3Denum, | |
603 WGC3Denum, void*) | |
604 | |
605 DELEGATE_TO_GL_4(renderbufferStorage, RenderbufferStorage, | |
606 WGC3Denum, WGC3Denum, WGC3Dsizei, WGC3Dsizei) | |
607 | |
608 DELEGATE_TO_GL_2(sampleCoverage, SampleCoverage, WGC3Dfloat, WGC3Dboolean) | |
609 | |
610 DELEGATE_TO_GL_4(scissor, Scissor, WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei) | |
611 | |
612 void WebGraphicsContext3DImpl::shaderSource( | |
613 WebGLId shader, const WGC3Dchar* string) { | |
614 GLint length = strlen(string); | |
615 gl_->ShaderSource(shader, 1, &string, &length); | |
616 } | |
617 | |
618 DELEGATE_TO_GL_3(stencilFunc, StencilFunc, WGC3Denum, WGC3Dint, WGC3Duint) | |
619 | |
620 DELEGATE_TO_GL_4(stencilFuncSeparate, StencilFuncSeparate, | |
621 WGC3Denum, WGC3Denum, WGC3Dint, WGC3Duint) | |
622 | |
623 DELEGATE_TO_GL_1(stencilMask, StencilMask, WGC3Duint) | |
624 | |
625 DELEGATE_TO_GL_2(stencilMaskSeparate, StencilMaskSeparate, | |
626 WGC3Denum, WGC3Duint) | |
627 | |
628 DELEGATE_TO_GL_3(stencilOp, StencilOp, | |
629 WGC3Denum, WGC3Denum, WGC3Denum) | |
630 | |
631 DELEGATE_TO_GL_4(stencilOpSeparate, StencilOpSeparate, | |
632 WGC3Denum, WGC3Denum, WGC3Denum, WGC3Denum) | |
633 | |
634 DELEGATE_TO_GL_9(texImage2D, TexImage2D, | |
635 WGC3Denum, WGC3Dint, WGC3Denum, WGC3Dsizei, WGC3Dsizei, | |
636 WGC3Dint, WGC3Denum, WGC3Denum, const void*) | |
637 | |
638 DELEGATE_TO_GL_3(texParameterf, TexParameterf, | |
639 WGC3Denum, WGC3Denum, WGC3Dfloat); | |
640 | |
641 static const unsigned int kTextureWrapR = 0x8072; | |
642 | |
643 void WebGraphicsContext3DImpl::texParameteri( | |
644 WGC3Denum target, WGC3Denum pname, WGC3Dint param) { | |
645 // TODO(kbr): figure out whether the setting of TEXTURE_WRAP_R in | |
646 // GraphicsContext3D.cpp is strictly necessary to avoid seams at the | |
647 // edge of cube maps, and, if it is, push it into the GLES2 service | |
648 // side code. | |
649 if (pname == kTextureWrapR) { | |
650 return; | |
651 } | |
652 gl_->TexParameteri(target, pname, param); | |
653 } | |
654 | |
655 DELEGATE_TO_GL_9(texSubImage2D, TexSubImage2D, | |
656 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dsizei, | |
657 WGC3Dsizei, WGC3Denum, WGC3Denum, const void*) | |
658 | |
659 DELEGATE_TO_GL_2(uniform1f, Uniform1f, WGC3Dint, WGC3Dfloat) | |
660 | |
661 DELEGATE_TO_GL_3(uniform1fv, Uniform1fv, WGC3Dint, WGC3Dsizei, | |
662 const WGC3Dfloat*) | |
663 | |
664 DELEGATE_TO_GL_2(uniform1i, Uniform1i, WGC3Dint, WGC3Dint) | |
665 | |
666 DELEGATE_TO_GL_3(uniform1iv, Uniform1iv, WGC3Dint, WGC3Dsizei, const WGC3Dint*) | |
667 | |
668 DELEGATE_TO_GL_3(uniform2f, Uniform2f, WGC3Dint, WGC3Dfloat, WGC3Dfloat) | |
669 | |
670 DELEGATE_TO_GL_3(uniform2fv, Uniform2fv, WGC3Dint, WGC3Dsizei, | |
671 const WGC3Dfloat*) | |
672 | |
673 DELEGATE_TO_GL_3(uniform2i, Uniform2i, WGC3Dint, WGC3Dint, WGC3Dint) | |
674 | |
675 DELEGATE_TO_GL_3(uniform2iv, Uniform2iv, WGC3Dint, WGC3Dsizei, const WGC3Dint*) | |
676 | |
677 DELEGATE_TO_GL_4(uniform3f, Uniform3f, WGC3Dint, | |
678 WGC3Dfloat, WGC3Dfloat, WGC3Dfloat) | |
679 | |
680 DELEGATE_TO_GL_3(uniform3fv, Uniform3fv, WGC3Dint, WGC3Dsizei, | |
681 const WGC3Dfloat*) | |
682 | |
683 DELEGATE_TO_GL_4(uniform3i, Uniform3i, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint) | |
684 | |
685 DELEGATE_TO_GL_3(uniform3iv, Uniform3iv, WGC3Dint, WGC3Dsizei, const WGC3Dint*) | |
686 | |
687 DELEGATE_TO_GL_5(uniform4f, Uniform4f, WGC3Dint, | |
688 WGC3Dfloat, WGC3Dfloat, WGC3Dfloat, WGC3Dfloat) | |
689 | |
690 DELEGATE_TO_GL_3(uniform4fv, Uniform4fv, WGC3Dint, WGC3Dsizei, | |
691 const WGC3Dfloat*) | |
692 | |
693 DELEGATE_TO_GL_5(uniform4i, Uniform4i, WGC3Dint, | |
694 WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint) | |
695 | |
696 DELEGATE_TO_GL_3(uniform4iv, Uniform4iv, WGC3Dint, WGC3Dsizei, const WGC3Dint*) | |
697 | |
698 DELEGATE_TO_GL_4(uniformMatrix2fv, UniformMatrix2fv, | |
699 WGC3Dint, WGC3Dsizei, WGC3Dboolean, const WGC3Dfloat*) | |
700 | |
701 DELEGATE_TO_GL_4(uniformMatrix3fv, UniformMatrix3fv, | |
702 WGC3Dint, WGC3Dsizei, WGC3Dboolean, const WGC3Dfloat*) | |
703 | |
704 DELEGATE_TO_GL_4(uniformMatrix4fv, UniformMatrix4fv, | |
705 WGC3Dint, WGC3Dsizei, WGC3Dboolean, const WGC3Dfloat*) | |
706 | |
707 DELEGATE_TO_GL_1(useProgram, UseProgram, WebGLId) | |
708 | |
709 DELEGATE_TO_GL_1(validateProgram, ValidateProgram, WebGLId) | |
710 | |
711 DELEGATE_TO_GL_2(vertexAttrib1f, VertexAttrib1f, WGC3Duint, WGC3Dfloat) | |
712 | |
713 DELEGATE_TO_GL_2(vertexAttrib1fv, VertexAttrib1fv, WGC3Duint, | |
714 const WGC3Dfloat*) | |
715 | |
716 DELEGATE_TO_GL_3(vertexAttrib2f, VertexAttrib2f, WGC3Duint, | |
717 WGC3Dfloat, WGC3Dfloat) | |
718 | |
719 DELEGATE_TO_GL_2(vertexAttrib2fv, VertexAttrib2fv, WGC3Duint, | |
720 const WGC3Dfloat*) | |
721 | |
722 DELEGATE_TO_GL_4(vertexAttrib3f, VertexAttrib3f, WGC3Duint, | |
723 WGC3Dfloat, WGC3Dfloat, WGC3Dfloat) | |
724 | |
725 DELEGATE_TO_GL_2(vertexAttrib3fv, VertexAttrib3fv, WGC3Duint, | |
726 const WGC3Dfloat*) | |
727 | |
728 DELEGATE_TO_GL_5(vertexAttrib4f, VertexAttrib4f, WGC3Duint, | |
729 WGC3Dfloat, WGC3Dfloat, WGC3Dfloat, WGC3Dfloat) | |
730 | |
731 DELEGATE_TO_GL_2(vertexAttrib4fv, VertexAttrib4fv, WGC3Duint, | |
732 const WGC3Dfloat*) | |
733 | |
734 void WebGraphicsContext3DImpl::vertexAttribPointer( | |
735 WGC3Duint index, WGC3Dint size, WGC3Denum type, WGC3Dboolean normalized, | |
736 WGC3Dsizei stride, WGC3Dintptr offset) { | |
737 gl_->VertexAttribPointer( | |
738 index, size, type, normalized, stride, | |
739 reinterpret_cast<void*>(static_cast<intptr_t>(offset))); | |
740 } | |
741 | |
742 DELEGATE_TO_GL_4(viewport, Viewport, | |
743 WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei) | |
744 | |
745 WebGLId WebGraphicsContext3DImpl::createBuffer() { | |
746 GLuint o; | |
747 gl_->GenBuffers(1, &o); | |
748 return o; | |
749 } | |
750 | |
751 WebGLId WebGraphicsContext3DImpl::createFramebuffer() { | |
752 GLuint o = 0; | |
753 gl_->GenFramebuffers(1, &o); | |
754 return o; | |
755 } | |
756 | |
757 WebGLId WebGraphicsContext3DImpl::createRenderbuffer() { | |
758 GLuint o; | |
759 gl_->GenRenderbuffers(1, &o); | |
760 return o; | |
761 } | |
762 | |
763 WebGLId WebGraphicsContext3DImpl::createTexture() { | |
764 GLuint o; | |
765 gl_->GenTextures(1, &o); | |
766 return o; | |
767 } | |
768 | |
769 void WebGraphicsContext3DImpl::deleteBuffer(WebGLId buffer) { | |
770 gl_->DeleteBuffers(1, &buffer); | |
771 } | |
772 | |
773 void WebGraphicsContext3DImpl::deleteFramebuffer( | |
774 WebGLId framebuffer) { | |
775 gl_->DeleteFramebuffers(1, &framebuffer); | |
776 } | |
777 | |
778 void WebGraphicsContext3DImpl::deleteRenderbuffer( | |
779 WebGLId renderbuffer) { | |
780 gl_->DeleteRenderbuffers(1, &renderbuffer); | |
781 } | |
782 | |
783 void WebGraphicsContext3DImpl::deleteTexture(WebGLId texture) { | |
784 gl_->DeleteTextures(1, &texture); | |
785 } | |
786 | |
787 DELEGATE_TO_GL_R(createProgram, CreateProgram, WebGLId) | |
788 | |
789 DELEGATE_TO_GL_1R(createShader, CreateShader, WGC3Denum, WebGLId) | |
790 | |
791 DELEGATE_TO_GL_1(deleteProgram, DeleteProgram, WebGLId) | |
792 | |
793 DELEGATE_TO_GL_1(deleteShader, DeleteShader, WebGLId) | |
794 | |
795 void WebGraphicsContext3DImpl::setErrorMessageCallback( | |
796 WebGraphicsContext3D::WebGraphicsErrorMessageCallback* cb) { | |
797 error_message_callback_ = cb; | |
798 } | |
799 | |
800 void WebGraphicsContext3DImpl::setContextLostCallback( | |
801 WebGraphicsContext3D::WebGraphicsContextLostCallback* cb) { | |
802 context_lost_callback_ = cb; | |
803 } | |
804 | |
805 DELEGATE_TO_GL_5(texImageIOSurface2DCHROMIUM, TexImageIOSurface2DCHROMIUM, | |
806 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Duint, WGC3Duint) | |
807 | |
808 DELEGATE_TO_GL_5(texStorage2DEXT, TexStorage2DEXT, | |
809 WGC3Denum, WGC3Dint, WGC3Duint, WGC3Dint, WGC3Dint) | |
810 | |
811 WebGLId WebGraphicsContext3DImpl::createQueryEXT() { | |
812 GLuint o; | |
813 gl_->GenQueriesEXT(1, &o); | |
814 return o; | |
815 } | |
816 | |
817 void WebGraphicsContext3DImpl::deleteQueryEXT( | |
818 WebGLId query) { | |
819 gl_->DeleteQueriesEXT(1, &query); | |
820 } | |
821 | |
822 DELEGATE_TO_GL_1R(isQueryEXT, IsQueryEXT, WebGLId, WGC3Dboolean) | |
823 DELEGATE_TO_GL_2(beginQueryEXT, BeginQueryEXT, WGC3Denum, WebGLId) | |
824 DELEGATE_TO_GL_1(endQueryEXT, EndQueryEXT, WGC3Denum) | |
825 DELEGATE_TO_GL_3(getQueryivEXT, GetQueryivEXT, WGC3Denum, WGC3Denum, WGC3Dint*) | |
826 DELEGATE_TO_GL_3(getQueryObjectuivEXT, GetQueryObjectuivEXT, | |
827 WebGLId, WGC3Denum, WGC3Duint*) | |
828 | |
829 void WebGraphicsContext3DImpl::copyTextureCHROMIUM(WGC3Denum target, | |
830 WebGLId source_id, | |
831 WebGLId dest_id, | |
832 WGC3Dint level, | |
833 WGC3Denum internal_format, | |
834 WGC3Denum dest_type) { | |
835 copyTextureCHROMIUM(target, source_id, dest_id, internal_format, dest_type); | |
836 } | |
837 | |
838 void WebGraphicsContext3DImpl::copySubTextureCHROMIUM(WGC3Denum target, | |
839 WebGLId source_id, | |
840 WebGLId dest_id, | |
841 WGC3Dint level, | |
842 WGC3Dint xoffset, | |
843 WGC3Dint yoffset) { | |
844 copySubTextureCHROMIUM(target, source_id, dest_id, xoffset, yoffset); | |
845 } | |
846 | |
847 DELEGATE_TO_GL_5(copyTextureCHROMIUM, | |
848 CopyTextureCHROMIUM, | |
849 WGC3Denum, | |
850 WebGLId, | |
851 WebGLId, | |
852 WGC3Denum, | |
853 WGC3Denum); | |
854 | |
855 DELEGATE_TO_GL_5(copySubTextureCHROMIUM, | |
856 CopySubTextureCHROMIUM, | |
857 WGC3Denum, | |
858 WebGLId, | |
859 WebGLId, | |
860 WGC3Dint, | |
861 WGC3Dint); | |
862 | |
863 DELEGATE_TO_GL_3(bindUniformLocationCHROMIUM, BindUniformLocationCHROMIUM, | |
864 WebGLId, WGC3Dint, const WGC3Dchar*) | |
865 | |
866 void WebGraphicsContext3DImpl::shallowFlushCHROMIUM() { | |
867 flush_id_ = GenFlushID(); | |
868 gl_->ShallowFlushCHROMIUM(); | |
869 } | |
870 | |
871 void WebGraphicsContext3DImpl::shallowFinishCHROMIUM() { | |
872 flush_id_ = GenFlushID(); | |
873 gl_->ShallowFinishCHROMIUM(); | |
874 } | |
875 | |
876 DELEGATE_TO_GL_1(waitSyncPoint, WaitSyncPointCHROMIUM, GLuint) | |
877 | |
878 void WebGraphicsContext3DImpl::loseContextCHROMIUM( | |
879 WGC3Denum current, WGC3Denum other) { | |
880 gl_->LoseContextCHROMIUM(current, other); | |
881 gl_->Flush(); | |
882 } | |
883 | |
884 DELEGATE_TO_GL_1(genMailboxCHROMIUM, GenMailboxCHROMIUM, WGC3Dbyte*) | |
885 DELEGATE_TO_GL_2(produceTextureCHROMIUM, ProduceTextureCHROMIUM, | |
886 WGC3Denum, const WGC3Dbyte*) | |
887 DELEGATE_TO_GL_3(produceTextureDirectCHROMIUM, ProduceTextureDirectCHROMIUM, | |
888 WebGLId, WGC3Denum, const WGC3Dbyte*) | |
889 DELEGATE_TO_GL_2(consumeTextureCHROMIUM, ConsumeTextureCHROMIUM, | |
890 WGC3Denum, const WGC3Dbyte*) | |
891 DELEGATE_TO_GL_2R(createAndConsumeTextureCHROMIUM, | |
892 CreateAndConsumeTextureCHROMIUM, | |
893 WGC3Denum, const WGC3Dbyte*, WebGLId) | |
894 | |
895 DELEGATE_TO_GL_2(genValuebuffersCHROMIUM, | |
896 GenValuebuffersCHROMIUM, | |
897 WGC3Dsizei, | |
898 WebGLId*); | |
899 | |
900 WebGLId WebGraphicsContext3DImpl::createValuebufferCHROMIUM() { | |
901 GLuint o; | |
902 gl_->GenValuebuffersCHROMIUM(1, &o); | |
903 return o; | |
904 } | |
905 | |
906 DELEGATE_TO_GL_2(deleteValuebuffersCHROMIUM, | |
907 DeleteValuebuffersCHROMIUM, | |
908 WGC3Dsizei, | |
909 WebGLId*); | |
910 | |
911 void WebGraphicsContext3DImpl::deleteValuebufferCHROMIUM(WebGLId valuebuffer) { | |
912 gl_->DeleteValuebuffersCHROMIUM(1, &valuebuffer); | |
913 } | |
914 | |
915 DELEGATE_TO_GL_1RB(isValuebufferCHROMIUM, | |
916 IsValuebufferCHROMIUM, | |
917 WebGLId, | |
918 WGC3Dboolean) | |
919 DELEGATE_TO_GL_2(bindValuebufferCHROMIUM, | |
920 BindValuebufferCHROMIUM, | |
921 WGC3Denum, | |
922 WebGLId) | |
923 DELEGATE_TO_GL_2(subscribeValueCHROMIUM, | |
924 SubscribeValueCHROMIUM, | |
925 WGC3Denum, | |
926 WGC3Denum); | |
927 DELEGATE_TO_GL_1(populateSubscribedValuesCHROMIUM, | |
928 PopulateSubscribedValuesCHROMIUM, | |
929 WGC3Denum); | |
930 DELEGATE_TO_GL_3(uniformValuebufferCHROMIUM, | |
931 UniformValuebufferCHROMIUM, | |
932 WGC3Dint, | |
933 WGC3Denum, | |
934 WGC3Denum); | |
935 DELEGATE_TO_GL_2(traceBeginCHROMIUM, | |
936 TraceBeginCHROMIUM, | |
937 const WGC3Dchar*, | |
938 const WGC3Dchar*); | |
939 DELEGATE_TO_GL(traceEndCHROMIUM, TraceEndCHROMIUM); | |
940 | |
941 void WebGraphicsContext3DImpl::insertEventMarkerEXT( | |
942 const WGC3Dchar* marker) { | |
943 gl_->InsertEventMarkerEXT(0, marker); | |
944 } | |
945 | |
946 void WebGraphicsContext3DImpl::pushGroupMarkerEXT( | |
947 const WGC3Dchar* marker) { | |
948 gl_->PushGroupMarkerEXT(0, marker); | |
949 } | |
950 | |
951 DELEGATE_TO_GL(popGroupMarkerEXT, PopGroupMarkerEXT); | |
952 | |
953 WebGLId WebGraphicsContext3DImpl::createVertexArrayOES() { | |
954 GLuint array; | |
955 gl_->GenVertexArraysOES(1, &array); | |
956 return array; | |
957 } | |
958 | |
959 void WebGraphicsContext3DImpl::deleteVertexArrayOES( | |
960 WebGLId array) { | |
961 gl_->DeleteVertexArraysOES(1, &array); | |
962 } | |
963 | |
964 DELEGATE_TO_GL_1R(isVertexArrayOES, IsVertexArrayOES, WebGLId, WGC3Dboolean) | |
965 DELEGATE_TO_GL_1(bindVertexArrayOES, BindVertexArrayOES, WebGLId) | |
966 | |
967 DELEGATE_TO_GL_2(bindTexImage2DCHROMIUM, BindTexImage2DCHROMIUM, | |
968 WGC3Denum, WGC3Dint) | |
969 DELEGATE_TO_GL_2(releaseTexImage2DCHROMIUM, ReleaseTexImage2DCHROMIUM, | |
970 WGC3Denum, WGC3Dint) | |
971 | |
972 DELEGATE_TO_GL_2R(mapBufferCHROMIUM, MapBufferCHROMIUM, WGC3Denum, WGC3Denum, | |
973 void*) | |
974 DELEGATE_TO_GL_1R(unmapBufferCHROMIUM, UnmapBufferCHROMIUM, WGC3Denum, | |
975 WGC3Dboolean) | |
976 | |
977 DELEGATE_TO_GL_9(asyncTexImage2DCHROMIUM, AsyncTexImage2DCHROMIUM, WGC3Denum, | |
978 WGC3Dint, WGC3Denum, WGC3Dsizei, WGC3Dsizei, WGC3Dint, | |
979 WGC3Denum, WGC3Denum, const void*) | |
980 DELEGATE_TO_GL_9(asyncTexSubImage2DCHROMIUM, AsyncTexSubImage2DCHROMIUM, | |
981 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dsizei, | |
982 WGC3Dsizei, WGC3Denum, WGC3Denum, const void*) | |
983 | |
984 DELEGATE_TO_GL_1(waitAsyncTexImage2DCHROMIUM, WaitAsyncTexImage2DCHROMIUM, | |
985 WGC3Denum) | |
986 | |
987 DELEGATE_TO_GL_2(drawBuffersEXT, DrawBuffersEXT, WGC3Dsizei, const WGC3Denum*) | |
988 | |
989 DELEGATE_TO_GL_4(drawArraysInstancedANGLE, DrawArraysInstancedANGLE, WGC3Denum, | |
990 WGC3Dint, WGC3Dsizei, WGC3Dsizei) | |
991 | |
992 void WebGraphicsContext3DImpl::drawElementsInstancedANGLE( | |
993 WGC3Denum mode, | |
994 WGC3Dsizei count, | |
995 WGC3Denum type, | |
996 WGC3Dintptr offset, | |
997 WGC3Dsizei primcount) { | |
998 gl_->DrawElementsInstancedANGLE( | |
999 mode, count, type, | |
1000 reinterpret_cast<void*>(static_cast<intptr_t>(offset)), primcount); | |
1001 } | |
1002 | |
1003 DELEGATE_TO_GL_2(vertexAttribDivisorANGLE, VertexAttribDivisorANGLE, WGC3Duint, | |
1004 WGC3Duint) | |
1005 | |
1006 DELEGATE_TO_GL_4R(createGpuMemoryBufferImageCHROMIUM, | |
1007 CreateGpuMemoryBufferImageCHROMIUM, | |
1008 WGC3Dsizei, | |
1009 WGC3Dsizei, | |
1010 WGC3Denum, | |
1011 WGC3Denum, | |
1012 WGC3Duint); | |
1013 | |
1014 DELEGATE_TO_GL_1(destroyImageCHROMIUM, DestroyImageCHROMIUM, WGC3Duint); | |
1015 | |
1016 DELEGATE_TO_GL_6(framebufferTexture2DMultisampleEXT, | |
1017 FramebufferTexture2DMultisampleEXT, | |
1018 WGC3Denum, WGC3Denum, WGC3Denum, WebGLId, WGC3Dint, WGC3Dsizei) | |
1019 | |
1020 DELEGATE_TO_GL_5(renderbufferStorageMultisampleEXT, | |
1021 RenderbufferStorageMultisampleEXT, WGC3Denum, WGC3Dsizei, | |
1022 WGC3Denum, WGC3Dsizei, WGC3Dsizei) | |
1023 | |
1024 DELEGATE_TO_GL_1(beginTransformFeedback, BeginTransformFeedback, WGC3Denum) | |
1025 DELEGATE_TO_GL_3(bindBufferBase, BindBufferBase, WGC3Denum, WGC3Duint, | |
1026 WGC3Duint) | |
1027 DELEGATE_TO_GL_5(bindBufferRange, BindBufferRange, WGC3Denum, WGC3Duint, | |
1028 WGC3Duint, WGC3Dintptr, WGC3Dsizeiptr) | |
1029 DELEGATE_TO_GL_2(bindSampler, BindSampler, WGC3Duint, WebGLId) | |
1030 DELEGATE_TO_GL_2(bindTransformFeedback, BindTransformFeedback, WGC3Denum, | |
1031 WebGLId) | |
1032 DELEGATE_TO_GL_4(clearBufferfi, ClearBufferfi, WGC3Denum, WGC3Dint, WGC3Dfloat, | |
1033 WGC3Dint) | |
1034 DELEGATE_TO_GL_3(clearBufferfv, ClearBufferfv, WGC3Denum, WGC3Dint, | |
1035 const WGC3Dfloat *) | |
1036 DELEGATE_TO_GL_3(clearBufferiv, ClearBufferiv, WGC3Denum, WGC3Dint, | |
1037 const WGC3Dint *) | |
1038 DELEGATE_TO_GL_3(clearBufferuiv, ClearBufferuiv, WGC3Denum, WGC3Dint, | |
1039 const WGC3Duint *) | |
1040 //DELEGATE_TO_GL_3R(clientWaitSync, ClientWaitSync, WebGLId, WGC3Dbitfield, | |
1041 // WGC3Duint64, WGC3Denum) | |
1042 //DELEGATE_TO_GL_9(compressedTexImage3D, CompressedTexImage3D, WGC3Denum, | |
1043 // WGC3Dint, WGC3Denum, WGC3Dsizei, WGC3Dsizei, WGC3Dsizei, | |
1044 // WGC3Dint, WGC3Dsizei, const void *) | |
1045 //DELEGATE_TO_GL_11(compressedTexSubImage3D, CompressedTexSubImage3D, WGC3Denum, | |
1046 // WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dsizei, | |
1047 // WGC3Dsizei, WGC3Dsizei, WGC3Denum, WGC3Dsizei, const void *) | |
1048 DELEGATE_TO_GL_5(copyBufferSubData, CopyBufferSubData, WGC3Denum, WGC3Denum, | |
1049 WGC3Dintptr, WGC3Dintptr, WGC3Dsizeiptr) | |
1050 DELEGATE_TO_GL_9(copyTexSubImage3D, CopyTexSubImage3D, WGC3Denum, WGC3Dint, | |
1051 WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dsizei, | |
1052 WGC3Dsizei) | |
1053 WebGLId WebGraphicsContext3DImpl::createSampler() { | |
1054 GLuint sampler; | |
1055 gl_->GenSamplers(1, &sampler); | |
1056 return sampler; | |
1057 } | |
1058 WebGLId WebGraphicsContext3DImpl::createTransformFeedback() { | |
1059 GLuint tf; | |
1060 gl_->GenTransformFeedbacks(1, &tf); | |
1061 return tf; | |
1062 } | |
1063 void WebGraphicsContext3DImpl::deleteSampler(WebGLId sampler) { | |
1064 gl_->DeleteSamplers(1, &sampler); | |
1065 } | |
1066 //DELEGATE_TO_GL_1(deleteSync, DeleteSync, WebGLId) | |
1067 void WebGraphicsContext3DImpl::deleteTransformFeedback(WebGLId tf) { | |
1068 gl_->DeleteTransformFeedbacks(1, &tf); | |
1069 } | |
1070 DELEGATE_TO_GL(endTransformFeedback, EndTransformFeedback) | |
1071 //DELEGATE_TO_GL_2R(fenceSync, FenceSync, WGC3Denum, WGC3Dbitfield, WebGLId) | |
1072 DELEGATE_TO_GL_5(framebufferTextureLayer, FramebufferTextureLayer, WGC3Denum, | |
1073 WGC3Denum, WGC3Duint, WGC3Dint, WGC3Dint) | |
1074 DELEGATE_TO_GL_5(getActiveUniformBlockName, GetActiveUniformBlockName, | |
1075 WGC3Duint, WGC3Duint, WGC3Dsizei, WGC3Dsizei *, WGC3Dchar *) | |
1076 DELEGATE_TO_GL_4(getActiveUniformBlockiv, GetActiveUniformBlockiv, WGC3Duint, | |
1077 WGC3Duint, WGC3Denum, WGC3Dint *) | |
1078 //DELEGATE_TO_GL_5(getActiveUniformsiv, GetActiveUniformsiv, WGC3Duint, | |
1079 // WGC3Dsizei, const WGC3Duint *, WGC3Denum, WGC3Dint *) | |
1080 DELEGATE_TO_GL_2R(getFragDataLocation, GetFragDataLocation, WGC3Duint, | |
1081 const WGC3Dchar *, WGC3Dint) | |
1082 DELEGATE_TO_GL_5(getInternalformativ, GetInternalformativ, WGC3Denum, WGC3Denum, | |
1083 WGC3Denum, WGC3Dsizei, WGC3Dint *) | |
1084 DELEGATE_TO_GL_3(getSamplerParameterfv, GetSamplerParameterfv, WGC3Duint, | |
1085 WGC3Denum, WGC3Dfloat *) | |
1086 DELEGATE_TO_GL_3(getSamplerParameteriv, GetSamplerParameteriv, WGC3Duint, | |
1087 WGC3Denum, WGC3Dint *) | |
1088 //DELEGATE_TO_GL_7(getTransformFeedbackVarying, GetTransformFeedbackVarying, | |
1089 // WGC3Duint, WGC3Duint, WGC3Dsizei, WGC3Dsizei *, WGC3Dsizei *, | |
1090 // WGC3Denum *, WGC3Dchar *) | |
1091 DELEGATE_TO_GL_2R(getUniformBlockIndex, GetUniformBlockIndex, WGC3Duint, | |
1092 const WGC3Dchar *, WGC3Duint) | |
1093 //DELEGATE_TO_GL_4(getUniformIndices, GetUniformIndices, WGC3Duint, WGC3Dsizei, | |
1094 // const WGC3Dchar *const*, WGC3Duint *) | |
1095 //DELEGATE_TO_GL_3(getUniformuiv, GetUniformuiv, WGC3Duint, WGC3Dint, | |
1096 // WGC3Duint *) | |
1097 //DELEGATE_TO_GL_3(getVertexAttribIiv, GetVertexAttribIiv, WGC3Duint, | |
1098 // WGC3Denum, WGC3Dint *) | |
1099 //DELEGATE_TO_GL_3(getVertexAttribIuiv, GetVertexAttribIuiv, WGC3Duint, | |
1100 // WGC3Denum, WGC3Duint *) | |
1101 DELEGATE_TO_GL_3(invalidateFramebuffer, InvalidateFramebuffer, WGC3Denum, | |
1102 WGC3Dsizei, const WGC3Denum *) | |
1103 DELEGATE_TO_GL_7(invalidateSubFramebuffer, InvalidateSubFramebuffer, WGC3Denum, | |
1104 WGC3Dsizei, const WGC3Denum *, WGC3Dint, WGC3Dint, WGC3Dsizei, | |
1105 WGC3Dsizei) | |
1106 DELEGATE_TO_GL_1R(isSampler, IsSampler, WebGLId, WGC3Dboolean) | |
1107 //DELEGATE_TO_GL_1R(isSync, IsSync, WebGLId, WGC3Dboolean) | |
1108 DELEGATE_TO_GL_1R(isTransformFeedback, IsTransformFeedback, WGC3Duint, | |
1109 WGC3Dboolean) | |
1110 DELEGATE_TO_GL(pauseTransformFeedback, PauseTransformFeedback) | |
1111 //DELEGATE_TO_GL_3(programParameteri, ProgramParameteri, WGC3Duint, WGC3Denum, | |
1112 // WGC3Dint) | |
1113 DELEGATE_TO_GL_1(readBuffer, ReadBuffer, WGC3Denum) | |
1114 DELEGATE_TO_GL(resumeTransformFeedback, ResumeTransformFeedback) | |
1115 DELEGATE_TO_GL_3(samplerParameterf, SamplerParameterf, WGC3Duint, WGC3Denum, | |
1116 WGC3Dfloat) | |
1117 DELEGATE_TO_GL_3(samplerParameterfv, SamplerParameterfv, WGC3Duint, WGC3Denum, | |
1118 const WGC3Dfloat *) | |
1119 DELEGATE_TO_GL_3(samplerParameteri, SamplerParameteri, WGC3Duint, WGC3Denum, | |
1120 WGC3Dint) | |
1121 DELEGATE_TO_GL_3(samplerParameteriv, SamplerParameteriv, WGC3Duint, WGC3Denum, | |
1122 const WGC3Dint *) | |
1123 DELEGATE_TO_GL_10(texImage3D, TexImage3D, WGC3Denum, WGC3Dint, WGC3Dint, | |
1124 WGC3Dsizei, WGC3Dsizei, WGC3Dsizei, WGC3Dint, WGC3Denum, | |
1125 WGC3Denum, const void *) | |
1126 DELEGATE_TO_GL_6(texStorage3D, TexStorage3D, WGC3Denum, WGC3Dsizei, WGC3Denum, | |
1127 WGC3Dsizei, WGC3Dsizei, WGC3Dsizei) | |
1128 DELEGATE_TO_GL_11(texSubImage3D, TexSubImage3D, WGC3Denum, WGC3Dint, WGC3Dint, | |
1129 WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei, WGC3Dsizei, | |
1130 WGC3Denum, WGC3Denum, const void *) | |
1131 DELEGATE_TO_GL_4(transformFeedbackVaryings, TransformFeedbackVaryings, | |
1132 WGC3Duint, WGC3Dsizei, const WGC3Dchar *const*, WGC3Denum) | |
1133 DELEGATE_TO_GL_2(uniform1ui, Uniform1ui, WGC3Dint, WGC3Duint) | |
1134 DELEGATE_TO_GL_3(uniform1uiv, Uniform1uiv, WGC3Dint, WGC3Dsizei, | |
1135 const WGC3Duint *) | |
1136 DELEGATE_TO_GL_3(uniform2ui, Uniform2ui, WGC3Dint, WGC3Duint, WGC3Duint) | |
1137 DELEGATE_TO_GL_3(uniform2uiv, Uniform2uiv, WGC3Dint, WGC3Dsizei, | |
1138 const WGC3Duint *) | |
1139 DELEGATE_TO_GL_4(uniform3ui, Uniform3ui, WGC3Dint, WGC3Duint, WGC3Duint, | |
1140 WGC3Duint) | |
1141 DELEGATE_TO_GL_3(uniform3uiv, Uniform3uiv, WGC3Dint, WGC3Dsizei, | |
1142 const WGC3Duint *) | |
1143 DELEGATE_TO_GL_5(uniform4ui, Uniform4ui, WGC3Dint, WGC3Duint, WGC3Duint, | |
1144 WGC3Duint, WGC3Duint) | |
1145 DELEGATE_TO_GL_3(uniform4uiv, Uniform4uiv, WGC3Dint, WGC3Dsizei, | |
1146 const WGC3Duint *) | |
1147 DELEGATE_TO_GL_3(uniformBlockBinding, UniformBlockBinding, WGC3Duint, WGC3Duint, | |
1148 WGC3Duint) | |
1149 DELEGATE_TO_GL_4(uniformMatrix2x3fv, UniformMatrix2x3fv, WGC3Dint, WGC3Dsizei, | |
1150 WGC3Dboolean, const WGC3Dfloat*) | |
1151 DELEGATE_TO_GL_4(uniformMatrix2x4fv, UniformMatrix2x4fv, WGC3Dint, WGC3Dsizei, | |
1152 WGC3Dboolean, const WGC3Dfloat*) | |
1153 DELEGATE_TO_GL_4(uniformMatrix3x2fv, UniformMatrix3x2fv, WGC3Dint, WGC3Dsizei, | |
1154 WGC3Dboolean, const WGC3Dfloat*) | |
1155 DELEGATE_TO_GL_4(uniformMatrix3x4fv, UniformMatrix3x4fv, WGC3Dint, WGC3Dsizei, | |
1156 WGC3Dboolean, const WGC3Dfloat*) | |
1157 DELEGATE_TO_GL_4(uniformMatrix4x2fv, UniformMatrix4x2fv, WGC3Dint, WGC3Dsizei, | |
1158 WGC3Dboolean, const WGC3Dfloat*) | |
1159 DELEGATE_TO_GL_4(uniformMatrix4x3fv, UniformMatrix4x3fv, WGC3Dint, WGC3Dsizei, | |
1160 WGC3Dboolean, const WGC3Dfloat*) | |
1161 DELEGATE_TO_GL_5(vertexAttribI4i, VertexAttribI4i, WGC3Duint, WGC3Dint, | |
1162 WGC3Dint, WGC3Dint, WGC3Dint) | |
1163 DELEGATE_TO_GL_2(vertexAttribI4iv, VertexAttribI4iv, WGC3Duint, | |
1164 const WGC3Dint *) | |
1165 DELEGATE_TO_GL_5(vertexAttribI4ui, VertexAttribI4ui, WGC3Duint, WGC3Duint, | |
1166 WGC3Duint, WGC3Duint, WGC3Duint) | |
1167 DELEGATE_TO_GL_2(vertexAttribI4uiv, VertexAttribI4uiv, WGC3Duint, | |
1168 const WGC3Duint *) | |
1169 void WebGraphicsContext3DImpl::vertexAttribIPointer( | |
1170 WGC3Duint index, WGC3Dint size, WGC3Denum type, WGC3Dsizei stride, | |
1171 WGC3Dintptr offset) { | |
1172 gl_->VertexAttribIPointer( | |
1173 index, size, type, stride, | |
1174 reinterpret_cast<void*>(static_cast<intptr_t>(offset))); | |
1175 } | |
1176 //DELEGATE_TO_GL_3(waitSync, WaitSync, WebGLId, WGC3Dbitfield, WGC3Duint64) | |
1177 | |
1178 GrGLInterface* WebGraphicsContext3DImpl::createGrGLInterface() { | |
1179 return skia_bindings::CreateCommandBufferSkiaGLBinding(); | |
1180 } | |
1181 | |
1182 ::gpu::gles2::GLES2ImplementationErrorMessageCallback* | |
1183 WebGraphicsContext3DImpl::getErrorMessageCallback() { | |
1184 if (!client_error_message_callback_) { | |
1185 client_error_message_callback_.reset( | |
1186 new WebGraphicsContext3DErrorMessageCallback(this)); | |
1187 } | |
1188 return client_error_message_callback_.get(); | |
1189 } | |
1190 | |
1191 void WebGraphicsContext3DImpl::OnErrorMessage( | |
1192 const std::string& message, int id) { | |
1193 if (error_message_callback_) { | |
1194 blink::WebString str = blink::WebString::fromUTF8(message.c_str()); | |
1195 error_message_callback_->onErrorMessage(str, id); | |
1196 } | |
1197 } | |
1198 | |
1199 // TODO(bajones): Look into removing these functions from the blink interface | |
1200 void WebGraphicsContext3DImpl::prepareTexture() { | |
1201 NOTREACHED(); | |
1202 } | |
1203 | |
1204 void WebGraphicsContext3DImpl::postSubBufferCHROMIUM( | |
1205 int x, int y, int width, int height) { | |
1206 NOTREACHED(); | |
1207 } | |
1208 | |
1209 void WebGraphicsContext3DImpl::setVisibilityCHROMIUM( | |
1210 bool visible) { | |
1211 NOTREACHED(); | |
1212 } | |
1213 | |
1214 void WebGraphicsContext3DImpl::copyTextureToParentTextureCHROMIUM( | |
1215 WebGLId texture, WebGLId parentTexture) { | |
1216 NOTIMPLEMENTED(); | |
1217 } | |
1218 | |
1219 void WebGraphicsContext3DImpl::releaseShaderCompiler() { | |
1220 } | |
1221 | |
1222 // static | |
1223 void WebGraphicsContext3DImpl::ConvertAttributes( | |
1224 const blink::WebGraphicsContext3D::Attributes& attributes, | |
1225 ::gpu::gles2::ContextCreationAttribHelper* output_attribs) { | |
1226 output_attribs->alpha_size = attributes.alpha ? 8 : 0; | |
1227 output_attribs->depth_size = attributes.depth ? 24 : 0; | |
1228 output_attribs->stencil_size = attributes.stencil ? 8 : 0; | |
1229 output_attribs->samples = attributes.antialias ? 4 : 0; | |
1230 output_attribs->sample_buffers = attributes.antialias ? 1 : 0; | |
1231 output_attribs->fail_if_major_perf_caveat = | |
1232 attributes.failIfMajorPerformanceCaveat; | |
1233 output_attribs->bind_generates_resource = false; | |
1234 output_attribs->es3_context_required = | |
1235 (attributes.webGL && attributes.webGLVersion == 2); | |
1236 } | |
1237 | |
1238 } // namespace gpu_blink | |
OLD | NEW |