blob: 5c0264c32e3c636fff909f5579bebec06ca4577f [file] [log] [blame]
[email protected]3b63f8f42011-03-28 01:54:151// Copyright (c) 2011 The Chromium Authors. All rights reserved.
[email protected]49861ff2011-01-11 19:50:402// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef WEBKIT_GPU_WEBGRAPHICSCONTEXT3D_IN_PROCESS_IMPL_H_
6#define WEBKIT_GPU_WEBGRAPHICSCONTEXT3D_IN_PROCESS_IMPL_H_
7
8#include <list>
9#include <set>
10
11#include "base/hash_tables.h"
[email protected]3b63f8f42011-03-28 01:54:1512#include "base/memory/scoped_ptr.h"
[email protected]49861ff2011-01-11 19:50:4013#include "third_party/angle/include/GLSLANG/ShaderLang.h"
[email protected]c1d9cdc2011-01-17 06:50:0114#include "third_party/WebKit/Source/WebKit/chromium/public/WebGraphicsContext3D.h"
15#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
[email protected]49861ff2011-01-11 19:50:4016
17#if !defined(OS_MACOSX)
18#define FLIP_FRAMEBUFFER_VERTICALLY
19#endif
20namespace gfx {
21class GLContext;
22}
23
[email protected]9cae4ee12011-01-27 18:06:5624using WebKit::WGC3Dchar;
25using WebKit::WGC3Denum;
26using WebKit::WGC3Dboolean;
27using WebKit::WGC3Dbitfield;
28using WebKit::WGC3Dint;
29using WebKit::WGC3Dsizei;
30using WebKit::WGC3Duint;
31using WebKit::WGC3Dfloat;
32using WebKit::WGC3Dclampf;
33using WebKit::WGC3Dintptr;
34using WebKit::WGC3Dsizeiptr;
[email protected]9cae4ee12011-01-27 18:06:5635
36using WebKit::WebGLId;
37
38using WebKit::WebString;
39using WebKit::WebView;
40
41using WebKit::WebGraphicsContext3D;
42
[email protected]de06f682011-01-12 21:10:1643namespace webkit {
44namespace gpu {
[email protected]49861ff2011-01-11 19:50:4045
46// The default implementation of WebGL. In Chromium, using this class
47// requires the sandbox to be disabled, which is strongly discouraged.
48// It is provided for support of test_shell and any Chromium ports
49// where an in-renderer WebGL implementation would be helpful.
50
[email protected]9cae4ee12011-01-27 18:06:5651class WebGraphicsContext3DInProcessImpl : public WebGraphicsContext3D {
52 public:
53 WebGraphicsContext3DInProcessImpl();
54 virtual ~WebGraphicsContext3DInProcessImpl();
55
56 //----------------------------------------------------------------------
57 // WebGraphicsContext3D methods
58 virtual bool initialize(
59 WebGraphicsContext3D::Attributes attributes, WebView*, bool);
60 virtual bool makeContextCurrent();
61
62 virtual int width();
63 virtual int height();
64
65 virtual bool isGLES2Compliant();
66
67 virtual void reshape(int width, int height);
68
69 virtual bool readBackFramebuffer(unsigned char* pixels, size_t bufferSize);
70
71 virtual WebGLId getPlatformTextureId();
72 virtual void prepareTexture();
73
74 virtual void synthesizeGLError(WGC3Denum error);
75 virtual void* mapBufferSubDataCHROMIUM(WGC3Denum target, WGC3Dintptr offset,
76 WGC3Dsizeiptr size, WGC3Denum access);
77 virtual void unmapBufferSubDataCHROMIUM(const void*);
78 virtual void* mapTexSubImage2DCHROMIUM(
79 WGC3Denum target,
80 WGC3Dint level,
81 WGC3Dint xoffset,
82 WGC3Dint yoffset,
83 WGC3Dsizei width,
84 WGC3Dsizei height,
85 WGC3Denum format,
86 WGC3Denum type,
87 WGC3Denum access);
88 virtual void unmapTexSubImage2DCHROMIUM(const void*);
89 virtual void copyTextureToParentTextureCHROMIUM(
90 WebGLId texture, WebGLId parentTexture);
91
[email protected]91b10402011-04-13 00:19:4292 virtual void getParentToChildLatchCHROMIUM(WGC3Duint* latch_id);
93 virtual void getChildToParentLatchCHROMIUM(WGC3Duint* latch_id);
[email protected]ce9eea602011-04-12 20:09:5794 virtual void waitLatchCHROMIUM(WGC3Duint latch_id);
95 virtual void setLatchCHROMIUM(WGC3Duint latch_id);
96
[email protected]31fe0b62011-05-13 01:07:3297 virtual void rateLimitOffscreenContextCHROMIUM() { }
98
[email protected]9cae4ee12011-01-27 18:06:5699 virtual WebString getRequestableExtensionsCHROMIUM();
100 virtual void requestExtensionCHROMIUM(const char*);
101
102 virtual void blitFramebufferCHROMIUM(
103 WGC3Dint srcX0, WGC3Dint srcY0, WGC3Dint srcX1, WGC3Dint srcY1,
104 WGC3Dint dstX0, WGC3Dint dstY0, WGC3Dint dstX1, WGC3Dint dstY1,
105 WGC3Dbitfield mask, WGC3Denum filter);
106 virtual void renderbufferStorageMultisampleCHROMIUM(
107 WGC3Denum target, WGC3Dsizei samples, WGC3Denum internalformat,
108 WGC3Dsizei width, WGC3Dsizei height);
109
110 virtual void activeTexture(WGC3Denum texture);
111 virtual void attachShader(WebGLId program, WebGLId shader);
112 virtual void bindAttribLocation(
113 WebGLId program, WGC3Duint index, const WGC3Dchar* name);
114 virtual void bindBuffer(WGC3Denum target, WebGLId buffer);
115 virtual void bindFramebuffer(WGC3Denum target, WebGLId framebuffer);
116 virtual void bindRenderbuffer(
117 WGC3Denum target, WebGLId renderbuffer);
118 virtual void bindTexture(WGC3Denum target, WebGLId texture);
119 virtual void blendColor(
120 WGC3Dclampf red, WGC3Dclampf green, WGC3Dclampf blue, WGC3Dclampf alpha);
121 virtual void blendEquation(WGC3Denum mode);
122 virtual void blendEquationSeparate(WGC3Denum modeRGB, WGC3Denum modeAlpha);
123 virtual void blendFunc(WGC3Denum sfactor, WGC3Denum dfactor);
124 virtual void blendFuncSeparate(WGC3Denum srcRGB, WGC3Denum dstRGB,
125 WGC3Denum srcAlpha, WGC3Denum dstAlpha);
126
127 virtual void bufferData(
128 WGC3Denum target, WGC3Dsizeiptr size, const void* data, WGC3Denum usage);
129 virtual void bufferSubData(WGC3Denum target, WGC3Dintptr offset,
130 WGC3Dsizeiptr size, const void* data);
131
132 virtual WGC3Denum checkFramebufferStatus(WGC3Denum target);
133 virtual void clear(WGC3Dbitfield mask);
134 virtual void clearColor(
135 WGC3Dclampf red, WGC3Dclampf green, WGC3Dclampf blue, WGC3Dclampf alpha);
136 virtual void clearDepth(WGC3Dclampf depth);
137 virtual void clearStencil(WGC3Dint s);
138 virtual void colorMask(WGC3Dboolean red, WGC3Dboolean green,
139 WGC3Dboolean blue, WGC3Dboolean alpha);
140 virtual void compileShader(WebGLId shader);
141
142 virtual void copyTexImage2D(
143 WGC3Denum target,
144 WGC3Dint level,
145 WGC3Denum internalformat,
146 WGC3Dint x,
147 WGC3Dint y,
148 WGC3Dsizei width,
149 WGC3Dsizei height,
150 WGC3Dint border);
151 virtual void copyTexSubImage2D(
152 WGC3Denum target,
153 WGC3Dint level,
154 WGC3Dint xoffset,
155 WGC3Dint yoffset,
156 WGC3Dint x,
157 WGC3Dint y,
158 WGC3Dsizei width,
159 WGC3Dsizei height);
160 virtual void cullFace(WGC3Denum mode);
161 virtual void depthFunc(WGC3Denum func);
162 virtual void depthMask(WGC3Dboolean flag);
163 virtual void depthRange(WGC3Dclampf zNear, WGC3Dclampf zFar);
164 virtual void detachShader(WebGLId program, WebGLId shader);
165 virtual void disable(WGC3Denum cap);
166 virtual void disableVertexAttribArray(WGC3Duint index);
167 virtual void drawArrays(WGC3Denum mode, WGC3Dint first, WGC3Dsizei count);
168 virtual void drawElements(
169 WGC3Denum mode,
170 WGC3Dsizei count,
171 WGC3Denum type,
172 WGC3Dintptr offset);
173
174 virtual void enable(WGC3Denum cap);
175 virtual void enableVertexAttribArray(WGC3Duint index);
176 virtual void finish();
177 virtual void flush();
178 virtual void framebufferRenderbuffer(
179 WGC3Denum target,
180 WGC3Denum attachment,
181 WGC3Denum renderbuffertarget,
182 WebGLId renderbuffer);
183 virtual void framebufferTexture2D(
184 WGC3Denum target,
185 WGC3Denum attachment,
186 WGC3Denum textarget,
187 WebGLId texture,
188 WGC3Dint level);
189 virtual void frontFace(WGC3Denum mode);
190 virtual void generateMipmap(WGC3Denum target);
191
192 virtual bool getActiveAttrib(WebGLId program, WGC3Duint index, ActiveInfo&);
193 virtual bool getActiveUniform(WebGLId program, WGC3Duint index, ActiveInfo&);
194
195 virtual void getAttachedShaders(WebGLId program, WGC3Dsizei maxCount,
196 WGC3Dsizei* count, WebGLId* shaders);
197
198 virtual WGC3Dint getAttribLocation(WebGLId program, const WGC3Dchar* name);
199
200 virtual void getBooleanv(WGC3Denum pname, WGC3Dboolean* value);
201
202 virtual void getBufferParameteriv(
203 WGC3Denum target, WGC3Denum pname, WGC3Dint* value);
204
205 virtual Attributes getContextAttributes();
206
207 virtual WGC3Denum getError();
208
209 virtual bool isContextLost();
210
211 virtual void getFloatv(WGC3Denum pname, WGC3Dfloat* value);
212
213 virtual void getFramebufferAttachmentParameteriv(
214 WGC3Denum target,
215 WGC3Denum attachment,
216 WGC3Denum pname,
217 WGC3Dint* value);
218
219 virtual void getIntegerv(WGC3Denum pname, WGC3Dint* value);
220
221 virtual void getProgramiv(
222 WebGLId program, WGC3Denum pname, WGC3Dint* value);
223
224 virtual WebString getProgramInfoLog(WebGLId program);
225
226 virtual void getRenderbufferParameteriv(
227 WGC3Denum target, WGC3Denum pname, WGC3Dint* value);
228
229 virtual void getShaderiv(
230 WebGLId shader, WGC3Denum pname, WGC3Dint* value);
231
232 virtual WebString getShaderInfoLog(WebGLId shader);
233
234 // TBD
235 // void glGetShaderPrecisionFormat(
236 // GLenum shadertype, GLenum precisiontype,
237 // GLint* range, GLint* precision);
238
239 virtual WebString getShaderSource(WebGLId shader);
240 virtual WebString getString(WGC3Denum name);
241
242 virtual void getTexParameterfv(
243 WGC3Denum target, WGC3Denum pname, WGC3Dfloat* value);
244 virtual void getTexParameteriv(
245 WGC3Denum target, WGC3Denum pname, WGC3Dint* value);
246
247 virtual void getUniformfv(
248 WebGLId program, WGC3Dint location, WGC3Dfloat* value);
249 virtual void getUniformiv(
250 WebGLId program, WGC3Dint location, WGC3Dint* value);
251
252 virtual WGC3Dint getUniformLocation(WebGLId program, const WGC3Dchar* name);
253
254 virtual void getVertexAttribfv(
255 WGC3Duint index, WGC3Denum pname, WGC3Dfloat* value);
256 virtual void getVertexAttribiv(
257 WGC3Duint index, WGC3Denum pname, WGC3Dint* value);
258
259 virtual WGC3Dsizeiptr getVertexAttribOffset(
260 WGC3Duint index, WGC3Denum pname);
261
262 virtual void hint(WGC3Denum target, WGC3Denum mode);
263 virtual WGC3Dboolean isBuffer(WebGLId buffer);
264 virtual WGC3Dboolean isEnabled(WGC3Denum cap);
265 virtual WGC3Dboolean isFramebuffer(WebGLId framebuffer);
266 virtual WGC3Dboolean isProgram(WebGLId program);
267 virtual WGC3Dboolean isRenderbuffer(WebGLId renderbuffer);
268 virtual WGC3Dboolean isShader(WebGLId shader);
269 virtual WGC3Dboolean isTexture(WebGLId texture);
270 virtual void lineWidth(WGC3Dfloat width);
271 virtual void linkProgram(WebGLId program);
272 virtual void pixelStorei(WGC3Denum pname, WGC3Dint param);
273 virtual void polygonOffset(WGC3Dfloat factor, WGC3Dfloat units);
274
275 virtual void readPixels(
276 WGC3Dint x, WGC3Dint y,
277 WGC3Dsizei width, WGC3Dsizei height,
278 WGC3Denum format,
279 WGC3Denum type,
280 void* pixels);
281
282 virtual void releaseShaderCompiler();
283 virtual void renderbufferStorage(
284 WGC3Denum target,
285 WGC3Denum internalformat,
286 WGC3Dsizei width,
287 WGC3Dsizei height);
288 virtual void sampleCoverage(WGC3Dclampf value, WGC3Dboolean invert);
289 virtual void scissor(
290 WGC3Dint x, WGC3Dint y, WGC3Dsizei width, WGC3Dsizei height);
291 virtual void shaderSource(WebGLId shader, const WGC3Dchar* source);
292 virtual void stencilFunc(WGC3Denum func, WGC3Dint ref, WGC3Duint mask);
293 virtual void stencilFuncSeparate(
294 WGC3Denum face, WGC3Denum func, WGC3Dint ref, WGC3Duint mask);
295 virtual void stencilMask(WGC3Duint mask);
296 virtual void stencilMaskSeparate(WGC3Denum face, WGC3Duint mask);
297 virtual void stencilOp(WGC3Denum fail, WGC3Denum zfail, WGC3Denum zpass);
298 virtual void stencilOpSeparate(
299 WGC3Denum face,
300 WGC3Denum fail,
301 WGC3Denum zfail,
302 WGC3Denum zpass);
303
304 virtual void texImage2D(
305 WGC3Denum target,
306 WGC3Dint level,
307 WGC3Denum internalformat,
308 WGC3Dsizei width,
309 WGC3Dsizei height,
310 WGC3Dint border,
311 WGC3Denum format,
312 WGC3Denum type,
313 const void* pixels);
314
315 virtual void texParameterf(
316 WGC3Denum target, WGC3Denum pname, WGC3Dfloat param);
317 virtual void texParameteri(
318 WGC3Denum target, WGC3Denum pname, WGC3Dint param);
319
320 virtual void texSubImage2D(
321 WGC3Denum target,
322 WGC3Dint level,
323 WGC3Dint xoffset,
324 WGC3Dint yoffset,
325 WGC3Dsizei width,
326 WGC3Dsizei height,
327 WGC3Denum format,
328 WGC3Denum type,
329 const void* pixels);
330
331 virtual void uniform1f(WGC3Dint location, WGC3Dfloat x);
332 virtual void uniform1fv(WGC3Dint location, WGC3Dsizei count,
333 const WGC3Dfloat* v);
334 virtual void uniform1i(WGC3Dint location, WGC3Dint x);
335 virtual void uniform1iv(WGC3Dint location, WGC3Dsizei count,
336 const WGC3Dint* v);
337 virtual void uniform2f(WGC3Dint location, WGC3Dfloat x, WGC3Dfloat y);
338 virtual void uniform2fv(WGC3Dint location, WGC3Dsizei count,
339 const WGC3Dfloat* v);
340 virtual void uniform2i(WGC3Dint location, WGC3Dint x, WGC3Dint y);
341 virtual void uniform2iv(WGC3Dint location, WGC3Dsizei count,
342 const WGC3Dint* v);
343 virtual void uniform3f(WGC3Dint location,
344 WGC3Dfloat x, WGC3Dfloat y, WGC3Dfloat z);
345 virtual void uniform3fv(WGC3Dint location, WGC3Dsizei count,
346 const WGC3Dfloat* v);
347 virtual void uniform3i(WGC3Dint location, WGC3Dint x, WGC3Dint y, WGC3Dint z);
348 virtual void uniform3iv(WGC3Dint location, WGC3Dsizei count,
349 const WGC3Dint* v);
350 virtual void uniform4f(WGC3Dint location, WGC3Dfloat x, WGC3Dfloat y,
351 WGC3Dfloat z, WGC3Dfloat w);
352 virtual void uniform4fv(WGC3Dint location, WGC3Dsizei count,
353 const WGC3Dfloat* v);
354 virtual void uniform4i(WGC3Dint location, WGC3Dint x, WGC3Dint y,
355 WGC3Dint z, WGC3Dint w);
356 virtual void uniform4iv(WGC3Dint location, WGC3Dsizei count,
357 const WGC3Dint* v);
358 virtual void uniformMatrix2fv(
359 WGC3Dint location, WGC3Dsizei count,
360 WGC3Dboolean transpose, const WGC3Dfloat* value);
361 virtual void uniformMatrix3fv(
362 WGC3Dint location, WGC3Dsizei count,
363 WGC3Dboolean transpose, const WGC3Dfloat* value);
364 virtual void uniformMatrix4fv(
365 WGC3Dint location, WGC3Dsizei count,
366 WGC3Dboolean transpose, const WGC3Dfloat* value);
367
368 virtual void useProgram(WebGLId program);
369 virtual void validateProgram(WebGLId program);
370
371 virtual void vertexAttrib1f(WGC3Duint index, WGC3Dfloat x);
372 virtual void vertexAttrib1fv(WGC3Duint index, const WGC3Dfloat* values);
373 virtual void vertexAttrib2f(WGC3Duint index, WGC3Dfloat x, WGC3Dfloat y);
374 virtual void vertexAttrib2fv(WGC3Duint index, const WGC3Dfloat* values);
375 virtual void vertexAttrib3f(
376 WGC3Duint index, WGC3Dfloat x, WGC3Dfloat y, WGC3Dfloat z);
377 virtual void vertexAttrib3fv(WGC3Duint index, const WGC3Dfloat* values);
378 virtual void vertexAttrib4f(
379 WGC3Duint index, WGC3Dfloat x, WGC3Dfloat y, WGC3Dfloat z, WGC3Dfloat w);
380 virtual void vertexAttrib4fv(WGC3Duint index, const WGC3Dfloat* values);
381 virtual void vertexAttribPointer(
382 WGC3Duint index,
383 WGC3Dint size,
384 WGC3Denum type,
385 WGC3Dboolean normalized,
386 WGC3Dsizei stride,
387 WGC3Dintptr offset);
388
389 virtual void viewport(
390 WGC3Dint x, WGC3Dint y, WGC3Dsizei width, WGC3Dsizei height);
391
392 // Support for buffer creation and deletion
393 virtual WebGLId createBuffer();
394 virtual WebGLId createFramebuffer();
395 virtual WebGLId createProgram();
396 virtual WebGLId createRenderbuffer();
397 virtual WebGLId createShader(WGC3Denum);
398 virtual WebGLId createTexture();
399
400 virtual void deleteBuffer(WebGLId);
401 virtual void deleteFramebuffer(WebGLId);
402 virtual void deleteProgram(WebGLId);
403 virtual void deleteRenderbuffer(WebGLId);
404 virtual void deleteShader(WebGLId);
405 virtual void deleteTexture(WebGLId);
406
[email protected]36681ea2011-02-02 20:17:18407 virtual void setContextLostCallback(
408 WebGraphicsContext3D::WebGraphicsContextLostCallback* callback) {}
409
[email protected]9cae4ee12011-01-27 18:06:56410 private:
411 // ANGLE related.
[email protected]09fb3872011-02-02 01:16:46412 struct ShaderSourceEntry;
[email protected]9cae4ee12011-01-27 18:06:56413
414 typedef base::hash_map<WebGLId, ShaderSourceEntry*> ShaderSourceMap;
415
416#ifdef FLIP_FRAMEBUFFER_VERTICALLY
417 void FlipVertically(unsigned char* framebuffer,
418 unsigned int width,
419 unsigned int height);
420#endif
421
422 // Take into account the user's requested context creation attributes, in
423 // particular stencil and antialias, and determine which could or could
424 // not be honored based on the capabilities of the OpenGL implementation.
425 void ValidateAttributes();
426
427 // Resolve the given rectangle of the multisampled framebuffer if necessary.
428 void ResolveMultisampledFramebuffer(
429 WGC3Dint x, WGC3Dint y, WGC3Dsizei width, WGC3Dsizei height);
430
431 bool AngleCreateCompilers();
432 void AngleDestroyCompilers();
433 bool AngleValidateShaderSource(ShaderSourceEntry* entry);
434
435 WebGraphicsContext3D::Attributes attributes_;
436 bool initialized_;
437 bool render_directly_to_web_view_;
438 bool is_gles2_;
439 bool have_ext_framebuffer_object_;
440 bool have_ext_framebuffer_multisample_;
441 bool have_angle_framebuffer_multisample_;
442
443 WebGLId texture_;
444 WebGLId fbo_;
445 WebGLId depth_stencil_buffer_;
446 int cached_width_, cached_height_;
447
448 // For multisampling
449 WebGLId multisample_fbo_;
450 WebGLId multisample_depth_stencil_buffer_;
451 WebGLId multisample_color_buffer_;
452
453 // For tracking which FBO is bound
454 WebGLId bound_fbo_;
455
456 // For tracking which texture is bound
457 WebGLId bound_texture_;
458
459 // FBO used for copying child texture to parent texture.
460 WebGLId copy_texture_to_parent_texture_fbo_;
461
462#ifdef FLIP_FRAMEBUFFER_VERTICALLY
463 unsigned char* scanline_;
464#endif
465
466 // Errors raised by synthesizeGLError().
467 std::list<WGC3Denum> synthetic_errors_list_;
468 std::set<WGC3Denum> synthetic_errors_set_;
469
470 scoped_ptr<gfx::GLContext> gl_context_;
471
472 ShaderSourceMap shader_source_map_;
473
474 ShHandle fragment_compiler_;
475 ShHandle vertex_compiler_;
476};
477
[email protected]de06f682011-01-12 21:10:16478} // namespace gpu
479} // namespace webkit
[email protected]49861ff2011-01-11 19:50:40480
481#endif // WEBKIT_GPU_WEBGRAPHICSCONTEXT3D_IN_PROCESS_IMPL_H_