OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 2009 Google Inc. All rights reserved. | |
3 * | |
4 * Redistribution and use in source and binary forms, with or without | |
5 * modification, are permitted provided that the following conditions are | |
6 * met: | |
7 * | |
8 * * Redistributions of source code must retain the above copyright | |
9 * notice, this list of conditions and the following disclaimer. | |
10 * * Redistributions in binary form must reproduce the above | |
11 * copyright notice, this list of conditions and the following disclaimer | |
12 * in the documentation and/or other materials provided with the | |
13 * distribution. | |
14 * * Neither the name of Google Inc. nor the names of its | |
15 * contributors may be used to endorse or promote products derived from | |
16 * this software without specific prior written permission. | |
17 * | |
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
29 */ | |
30 | |
31 #include "config.h" | |
32 | |
33 #include "GraphicsContext3D.h" | |
34 | |
35 #include "DrawingBuffer.h" | |
36 #include "GraphicsContext3DPrivate.h" | |
37 #include "ImageBuffer.h" | |
38 #include "ImageData.h" | |
39 #include "SkTypes.h" | |
40 #include <public/Platform.h> | |
41 #include <public/WebGraphicsContext3D.h> | |
42 #include <wtf/text/CString.h> | |
43 #include <wtf/text/WTFString.h> | |
44 | |
45 namespace WebCore { | |
46 | |
47 GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes, HostWindow*,
GraphicsContext3D::RenderStyle) | |
48 { | |
49 } | |
50 | |
51 GraphicsContext3D::~GraphicsContext3D() | |
52 { | |
53 m_private->setContextLostCallback(nullptr); | |
54 m_private->setErrorMessageCallback(nullptr); | |
55 } | |
56 | |
57 void GraphicsContext3D::setContextLostCallback(PassOwnPtr<GraphicsContext3D::Con
textLostCallback> callback) | |
58 { | |
59 m_private->setContextLostCallback(callback); | |
60 } | |
61 | |
62 void GraphicsContext3D::setErrorMessageCallback(PassOwnPtr<GraphicsContext3D::Er
rorMessageCallback> callback) | |
63 { | |
64 m_private->setErrorMessageCallback(callback); | |
65 } | |
66 | |
67 PassRefPtr<GraphicsContext3D> GraphicsContext3D::create(GraphicsContext3D::Attri
butes attrs, HostWindow*, GraphicsContext3D::RenderStyle renderStyle) | |
68 { | |
69 ASSERT(renderStyle != GraphicsContext3D::RenderDirectlyToHostWindow); | |
70 | |
71 WebKit::WebGraphicsContext3D::Attributes webAttributes; | |
72 webAttributes.alpha = attrs.alpha; | |
73 webAttributes.depth = attrs.depth; | |
74 webAttributes.stencil = attrs.stencil; | |
75 webAttributes.antialias = attrs.antialias; | |
76 webAttributes.premultipliedAlpha = attrs.premultipliedAlpha; | |
77 webAttributes.noExtensions = attrs.noExtensions; | |
78 webAttributes.shareResources = attrs.shareResources; | |
79 webAttributes.preferDiscreteGPU = attrs.preferDiscreteGPU; | |
80 webAttributes.topDocumentURL = attrs.topDocumentURL.string(); | |
81 | |
82 OwnPtr<WebKit::WebGraphicsContext3D> webContext = adoptPtr(WebKit::Platform:
:current()->createOffscreenGraphicsContext3D(webAttributes)); | |
83 if (!webContext) | |
84 return 0; | |
85 | |
86 return GraphicsContext3DPrivate::createGraphicsContextFromWebContext(webCont
ext.release(), attrs.preserveDrawingBuffer); | |
87 } | |
88 | |
89 PlatformGraphicsContext3D GraphicsContext3D::platformGraphicsContext3D() const | |
90 { | |
91 return m_private->webContext(); | |
92 } | |
93 | |
94 Platform3DObject GraphicsContext3D::platformTexture() const | |
95 { | |
96 return m_private->webContext()->getPlatformTextureId(); | |
97 } | |
98 | |
99 GrContext* GraphicsContext3D::grContext() | |
100 { | |
101 return m_private->grContext(); | |
102 } | |
103 | |
104 PlatformLayer* GraphicsContext3D::platformLayer() const | |
105 { | |
106 return 0; | |
107 } | |
108 | |
109 // Macros to assist in delegating from GraphicsContext3D to | |
110 // WebGraphicsContext3D. | |
111 | |
112 #define DELEGATE_TO_WEBCONTEXT(name) \ | |
113 void GraphicsContext3D::name() \ | |
114 { \ | |
115 m_private->webContext()->name(); \ | |
116 } | |
117 | |
118 #define DELEGATE_TO_WEBCONTEXT_R(name, rt) \ | |
119 rt GraphicsContext3D::name() \ | |
120 { \ | |
121 return m_private->webContext()->name(); \ | |
122 } | |
123 | |
124 #define DELEGATE_TO_WEBCONTEXT_1(name, t1) \ | |
125 void GraphicsContext3D::name(t1 a1) \ | |
126 { \ | |
127 m_private->webContext()->name(a1); \ | |
128 } | |
129 | |
130 #define DELEGATE_TO_WEBCONTEXT_1R(name, t1, rt) \ | |
131 rt GraphicsContext3D::name(t1 a1) \ | |
132 { \ | |
133 return m_private->webContext()->name(a1); \ | |
134 } | |
135 | |
136 #define DELEGATE_TO_WEBCONTEXT_2(name, t1, t2) \ | |
137 void GraphicsContext3D::name(t1 a1, t2 a2) \ | |
138 { \ | |
139 m_private->webContext()->name(a1, a2); \ | |
140 } | |
141 | |
142 #define DELEGATE_TO_WEBCONTEXT_2R(name, t1, t2, rt) \ | |
143 rt GraphicsContext3D::name(t1 a1, t2 a2) \ | |
144 { \ | |
145 return m_private->webContext()->name(a1, a2); \ | |
146 } | |
147 | |
148 #define DELEGATE_TO_WEBCONTEXT_3(name, t1, t2, t3) \ | |
149 void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3) \ | |
150 { \ | |
151 m_private->webContext()->name(a1, a2, a3); \ | |
152 } | |
153 | |
154 #define DELEGATE_TO_WEBCONTEXT_3R(name, t1, t2, t3, rt) \ | |
155 rt GraphicsContext3D::name(t1 a1, t2 a2, t3 a3) \ | |
156 { \ | |
157 return m_private->webContext()->name(a1, a2, a3); \ | |
158 } | |
159 | |
160 #define DELEGATE_TO_WEBCONTEXT_4(name, t1, t2, t3, t4) \ | |
161 void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4) \ | |
162 { \ | |
163 m_private->webContext()->name(a1, a2, a3, a4); \ | |
164 } | |
165 | |
166 #define DELEGATE_TO_WEBCONTEXT_4R(name, t1, t2, t3, t4, rt) \ | |
167 rt GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4) \ | |
168 { \ | |
169 return m_private->webContext()->name(a1, a2, a3, a4); \ | |
170 } | |
171 | |
172 #define DELEGATE_TO_WEBCONTEXT_5(name, t1, t2, t3, t4, t5) \ | |
173 void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) \ | |
174 { \ | |
175 m_private->webContext()->name(a1, a2, a3, a4, a5); \ | |
176 } | |
177 | |
178 #define DELEGATE_TO_WEBCONTEXT_6(name, t1, t2, t3, t4, t5, t6) \ | |
179 void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \ | |
180 { \ | |
181 m_private->webContext()->name(a1, a2, a3, a4, a5, a6); \ | |
182 } | |
183 | |
184 #define DELEGATE_TO_WEBCONTEXT_6R(name, t1, t2, t3, t4, t5, t6, rt) \ | |
185 rt GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \ | |
186 { \ | |
187 return m_private->webContext()->name(a1, a2, a3, a4, a5, a6); \ | |
188 } | |
189 | |
190 #define DELEGATE_TO_WEBCONTEXT_7(name, t1, t2, t3, t4, t5, t6, t7) \ | |
191 void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) \ | |
192 { \ | |
193 m_private->webContext()->name(a1, a2, a3, a4, a5, a6, a7); \ | |
194 } | |
195 | |
196 #define DELEGATE_TO_WEBCONTEXT_7R(name, t1, t2, t3, t4, t5, t6, t7, rt) \ | |
197 rt GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) \ | |
198 { \ | |
199 return m_private->webContext()->name(a1, a2, a3, a4, a5, a6, a7); \ | |
200 } | |
201 | |
202 #define DELEGATE_TO_WEBCONTEXT_8(name, t1, t2, t3, t4, t5, t6, t7, t8) \ | |
203 void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8
a8) \ | |
204 { \ | |
205 m_private->webContext()->name(a1, a2, a3, a4, a5, a6, a7, a8); \ | |
206 } | |
207 | |
208 #define DELEGATE_TO_WEBCONTEXT_9(name, t1, t2, t3, t4, t5, t6, t7, t8, t9) \ | |
209 void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8
a8, t9 a9) \ | |
210 { \ | |
211 m_private->webContext()->name(a1, a2, a3, a4, a5, a6, a7, a8, a9); \ | |
212 } | |
213 | |
214 #define DELEGATE_TO_WEBCONTEXT_9R(name, t1, t2, t3, t4, t5, t6, t7, t8, t9, rt)
\ | |
215 rt GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a
8, t9 a9) \ | |
216 { \ | |
217 return m_private->webContext()->name(a1, a2, a3, a4, a5, a6, a7, a8, a9);
\ | |
218 } | |
219 | |
220 DELEGATE_TO_WEBCONTEXT_R(makeContextCurrent, bool) | |
221 DELEGATE_TO_WEBCONTEXT(prepareTexture) | |
222 | |
223 bool GraphicsContext3D::isGLES2Compliant() const | |
224 { | |
225 return m_private->webContext()->isGLES2Compliant(); | |
226 } | |
227 | |
228 | |
229 | |
230 bool GraphicsContext3D::isResourceSafe() | |
231 { | |
232 return m_private->isResourceSafe(); | |
233 } | |
234 | |
235 DELEGATE_TO_WEBCONTEXT_1(activeTexture, GC3Denum) | |
236 DELEGATE_TO_WEBCONTEXT_2(attachShader, Platform3DObject, Platform3DObject) | |
237 | |
238 void GraphicsContext3D::bindAttribLocation(Platform3DObject program, GC3Duint in
dex, const String& name) | |
239 { | |
240 m_private->webContext()->bindAttribLocation(program, index, name.utf8().data
()); | |
241 } | |
242 | |
243 DELEGATE_TO_WEBCONTEXT_2(bindBuffer, GC3Denum, Platform3DObject) | |
244 DELEGATE_TO_WEBCONTEXT_2(bindFramebuffer, GC3Denum, Platform3DObject) | |
245 DELEGATE_TO_WEBCONTEXT_2(bindRenderbuffer, GC3Denum, Platform3DObject) | |
246 DELEGATE_TO_WEBCONTEXT_2(bindTexture, GC3Denum, Platform3DObject) | |
247 DELEGATE_TO_WEBCONTEXT_4(blendColor, GC3Dclampf, GC3Dclampf, GC3Dclampf, GC3Dcla
mpf) | |
248 DELEGATE_TO_WEBCONTEXT_1(blendEquation, GC3Denum) | |
249 DELEGATE_TO_WEBCONTEXT_2(blendEquationSeparate, GC3Denum, GC3Denum) | |
250 DELEGATE_TO_WEBCONTEXT_2(blendFunc, GC3Denum, GC3Denum) | |
251 DELEGATE_TO_WEBCONTEXT_4(blendFuncSeparate, GC3Denum, GC3Denum, GC3Denum, GC3Den
um) | |
252 | |
253 void GraphicsContext3D::bufferData(GC3Denum target, GC3Dsizeiptr size, GC3Denum
usage) | |
254 { | |
255 bufferData(target, size, 0, usage); | |
256 } | |
257 | |
258 DELEGATE_TO_WEBCONTEXT_4(bufferData, GC3Denum, GC3Dsizeiptr, const void*, GC3Den
um) | |
259 DELEGATE_TO_WEBCONTEXT_4(bufferSubData, GC3Denum, GC3Dintptr, GC3Dsizeiptr, cons
t void*) | |
260 | |
261 DELEGATE_TO_WEBCONTEXT_1R(checkFramebufferStatus, GC3Denum, GC3Denum) | |
262 DELEGATE_TO_WEBCONTEXT_1(clear, GC3Dbitfield) | |
263 DELEGATE_TO_WEBCONTEXT_4(clearColor, GC3Dclampf, GC3Dclampf, GC3Dclampf, GC3Dcla
mpf) | |
264 DELEGATE_TO_WEBCONTEXT_1(clearDepth, GC3Dclampf) | |
265 DELEGATE_TO_WEBCONTEXT_1(clearStencil, GC3Dint) | |
266 DELEGATE_TO_WEBCONTEXT_4(colorMask, GC3Dboolean, GC3Dboolean, GC3Dboolean, GC3Db
oolean) | |
267 DELEGATE_TO_WEBCONTEXT_1(compileShader, Platform3DObject) | |
268 | |
269 DELEGATE_TO_WEBCONTEXT_8(compressedTexImage2D, GC3Denum, GC3Dint, GC3Denum, GC3D
int, GC3Dint, GC3Dsizei, GC3Dsizei, const void*) | |
270 DELEGATE_TO_WEBCONTEXT_9(compressedTexSubImage2D, GC3Denum, GC3Dint, GC3Dint, GC
3Dint, GC3Dint, GC3Dint, GC3Denum, GC3Dsizei, const void*) | |
271 DELEGATE_TO_WEBCONTEXT_8(copyTexImage2D, GC3Denum, GC3Dint, GC3Denum, GC3Dint, G
C3Dint, GC3Dsizei, GC3Dsizei, GC3Dint) | |
272 DELEGATE_TO_WEBCONTEXT_8(copyTexSubImage2D, GC3Denum, GC3Dint, GC3Dint, GC3Dint,
GC3Dint, GC3Dint, GC3Dsizei, GC3Dsizei) | |
273 DELEGATE_TO_WEBCONTEXT_1(cullFace, GC3Denum) | |
274 DELEGATE_TO_WEBCONTEXT_1(depthFunc, GC3Denum) | |
275 DELEGATE_TO_WEBCONTEXT_1(depthMask, GC3Dboolean) | |
276 DELEGATE_TO_WEBCONTEXT_2(depthRange, GC3Dclampf, GC3Dclampf) | |
277 DELEGATE_TO_WEBCONTEXT_2(detachShader, Platform3DObject, Platform3DObject) | |
278 DELEGATE_TO_WEBCONTEXT_1(disable, GC3Denum) | |
279 DELEGATE_TO_WEBCONTEXT_1(disableVertexAttribArray, GC3Duint) | |
280 DELEGATE_TO_WEBCONTEXT_3(drawArrays, GC3Denum, GC3Dint, GC3Dsizei) | |
281 DELEGATE_TO_WEBCONTEXT_4(drawElements, GC3Denum, GC3Dsizei, GC3Denum, GC3Dintptr
) | |
282 | |
283 DELEGATE_TO_WEBCONTEXT_1(enable, GC3Denum) | |
284 DELEGATE_TO_WEBCONTEXT_1(enableVertexAttribArray, GC3Duint) | |
285 DELEGATE_TO_WEBCONTEXT(finish) | |
286 DELEGATE_TO_WEBCONTEXT(flush) | |
287 DELEGATE_TO_WEBCONTEXT_4(framebufferRenderbuffer, GC3Denum, GC3Denum, GC3Denum,
Platform3DObject) | |
288 DELEGATE_TO_WEBCONTEXT_5(framebufferTexture2D, GC3Denum, GC3Denum, GC3Denum, Pla
tform3DObject, GC3Dint) | |
289 DELEGATE_TO_WEBCONTEXT_1(frontFace, GC3Denum) | |
290 DELEGATE_TO_WEBCONTEXT_1(generateMipmap, GC3Denum) | |
291 | |
292 bool GraphicsContext3D::getActiveAttrib(Platform3DObject program, GC3Duint index
, ActiveInfo& info) | |
293 { | |
294 WebKit::WebGraphicsContext3D::ActiveInfo webInfo; | |
295 if (!m_private->webContext()->getActiveAttrib(program, index, webInfo)) | |
296 return false; | |
297 info.name = webInfo.name; | |
298 info.type = webInfo.type; | |
299 info.size = webInfo.size; | |
300 return true; | |
301 } | |
302 | |
303 bool GraphicsContext3D::getActiveUniform(Platform3DObject program, GC3Duint inde
x, ActiveInfo& info) | |
304 { | |
305 WebKit::WebGraphicsContext3D::ActiveInfo webInfo; | |
306 if (!m_private->webContext()->getActiveUniform(program, index, webInfo)) | |
307 return false; | |
308 info.name = webInfo.name; | |
309 info.type = webInfo.type; | |
310 info.size = webInfo.size; | |
311 return true; | |
312 } | |
313 | |
314 | |
315 DELEGATE_TO_WEBCONTEXT_4(getAttachedShaders, Platform3DObject, GC3Dsizei, GC3Dsi
zei*, Platform3DObject*) | |
316 | |
317 GC3Dint GraphicsContext3D::getAttribLocation(Platform3DObject program, const Str
ing& name) | |
318 { | |
319 return m_private->webContext()->getAttribLocation(program, name.utf8().data(
)); | |
320 } | |
321 | |
322 DELEGATE_TO_WEBCONTEXT_2(getBooleanv, GC3Denum, GC3Dboolean*) | |
323 DELEGATE_TO_WEBCONTEXT_3(getBufferParameteriv, GC3Denum, GC3Denum, GC3Dint*) | |
324 | |
325 GraphicsContext3D::Attributes GraphicsContext3D::getContextAttributes() | |
326 { | |
327 WebKit::WebGraphicsContext3D::Attributes webAttributes = m_private->webConte
xt()->getContextAttributes(); | |
328 GraphicsContext3D::Attributes attributes; | |
329 attributes.alpha = webAttributes.alpha; | |
330 attributes.depth = webAttributes.depth; | |
331 attributes.stencil = webAttributes.stencil; | |
332 attributes.antialias = webAttributes.antialias; | |
333 attributes.premultipliedAlpha = webAttributes.premultipliedAlpha; | |
334 attributes.preserveDrawingBuffer = m_private->preserveDrawingBuffer(); | |
335 attributes.preferDiscreteGPU = webAttributes.preferDiscreteGPU; | |
336 return attributes; | |
337 } | |
338 | |
339 DELEGATE_TO_WEBCONTEXT_R(getError, GC3Denum) | |
340 DELEGATE_TO_WEBCONTEXT_2(getFloatv, GC3Denum, GC3Dfloat*) | |
341 DELEGATE_TO_WEBCONTEXT_4(getFramebufferAttachmentParameteriv, GC3Denum, GC3Denum
, GC3Denum, GC3Dint*) | |
342 DELEGATE_TO_WEBCONTEXT_2(getIntegerv, GC3Denum, GC3Dint*) | |
343 DELEGATE_TO_WEBCONTEXT_3(getProgramiv, Platform3DObject, GC3Denum, GC3Dint*) | |
344 | |
345 String GraphicsContext3D::getProgramInfoLog(Platform3DObject program) | |
346 { | |
347 return m_private->webContext()->getProgramInfoLog(program); | |
348 } | |
349 | |
350 | |
351 DELEGATE_TO_WEBCONTEXT_3(getRenderbufferParameteriv, GC3Denum, GC3Denum, GC3Dint
*) | |
352 DELEGATE_TO_WEBCONTEXT_3(getShaderiv, Platform3DObject, GC3Denum, GC3Dint*) | |
353 | |
354 String GraphicsContext3D::getShaderInfoLog(Platform3DObject shader) | |
355 { | |
356 return m_private->webContext()->getShaderInfoLog(shader); | |
357 } | |
358 | |
359 | |
360 DELEGATE_TO_WEBCONTEXT_4(getShaderPrecisionFormat, GC3Denum, GC3Denum, GC3Dint*,
GC3Dint*) | |
361 | |
362 String GraphicsContext3D::getShaderSource(Platform3DObject shader) | |
363 { | |
364 return m_private->webContext()->getShaderSource(shader); | |
365 } | |
366 | |
367 String GraphicsContext3D::getString(GC3Denum name) | |
368 { | |
369 return m_private->webContext()->getString(name); | |
370 } | |
371 | |
372 | |
373 DELEGATE_TO_WEBCONTEXT_3(getTexParameterfv, GC3Denum, GC3Denum, GC3Dfloat*) | |
374 DELEGATE_TO_WEBCONTEXT_3(getTexParameteriv, GC3Denum, GC3Denum, GC3Dint*) | |
375 DELEGATE_TO_WEBCONTEXT_3(getUniformfv, Platform3DObject, GC3Dint, GC3Dfloat*) | |
376 DELEGATE_TO_WEBCONTEXT_3(getUniformiv, Platform3DObject, GC3Dint, GC3Dint*) | |
377 | |
378 GC3Dint GraphicsContext3D::getUniformLocation(Platform3DObject program, const St
ring& name) | |
379 { | |
380 return m_private->webContext()->getUniformLocation(program, name.utf8().data
()); | |
381 } | |
382 | |
383 | |
384 DELEGATE_TO_WEBCONTEXT_3(getVertexAttribfv, GC3Duint, GC3Denum, GC3Dfloat*) | |
385 DELEGATE_TO_WEBCONTEXT_3(getVertexAttribiv, GC3Duint, GC3Denum, GC3Dint*) | |
386 DELEGATE_TO_WEBCONTEXT_2R(getVertexAttribOffset, GC3Duint, GC3Denum, GC3Dsizeipt
r) | |
387 | |
388 DELEGATE_TO_WEBCONTEXT_2(hint, GC3Denum, GC3Denum) | |
389 DELEGATE_TO_WEBCONTEXT_1R(isBuffer, Platform3DObject, GC3Dboolean) | |
390 DELEGATE_TO_WEBCONTEXT_1R(isEnabled, GC3Denum, GC3Dboolean) | |
391 DELEGATE_TO_WEBCONTEXT_1R(isFramebuffer, Platform3DObject, GC3Dboolean) | |
392 DELEGATE_TO_WEBCONTEXT_1R(isProgram, Platform3DObject, GC3Dboolean) | |
393 DELEGATE_TO_WEBCONTEXT_1R(isRenderbuffer, Platform3DObject, GC3Dboolean) | |
394 DELEGATE_TO_WEBCONTEXT_1R(isShader, Platform3DObject, GC3Dboolean) | |
395 DELEGATE_TO_WEBCONTEXT_1R(isTexture, Platform3DObject, GC3Dboolean) | |
396 DELEGATE_TO_WEBCONTEXT_1(lineWidth, GC3Dfloat) | |
397 DELEGATE_TO_WEBCONTEXT_1(linkProgram, Platform3DObject) | |
398 DELEGATE_TO_WEBCONTEXT_2(pixelStorei, GC3Denum, GC3Dint) | |
399 DELEGATE_TO_WEBCONTEXT_2(polygonOffset, GC3Dfloat, GC3Dfloat) | |
400 | |
401 DELEGATE_TO_WEBCONTEXT_7(readPixels, GC3Dint, GC3Dint, GC3Dsizei, GC3Dsizei, GC3
Denum, GC3Denum, void*) | |
402 | |
403 DELEGATE_TO_WEBCONTEXT(releaseShaderCompiler) | |
404 DELEGATE_TO_WEBCONTEXT_4(renderbufferStorage, GC3Denum, GC3Denum, GC3Dsizei, GC3
Dsizei) | |
405 DELEGATE_TO_WEBCONTEXT_2(sampleCoverage, GC3Dclampf, GC3Dboolean) | |
406 DELEGATE_TO_WEBCONTEXT_4(scissor, GC3Dint, GC3Dint, GC3Dsizei, GC3Dsizei) | |
407 | |
408 void GraphicsContext3D::shaderSource(Platform3DObject shader, const String& stri
ng) | |
409 { | |
410 m_private->webContext()->shaderSource(shader, string.utf8().data()); | |
411 } | |
412 | |
413 DELEGATE_TO_WEBCONTEXT_3(stencilFunc, GC3Denum, GC3Dint, GC3Duint) | |
414 DELEGATE_TO_WEBCONTEXT_4(stencilFuncSeparate, GC3Denum, GC3Denum, GC3Dint, GC3Du
int) | |
415 DELEGATE_TO_WEBCONTEXT_1(stencilMask, GC3Duint) | |
416 DELEGATE_TO_WEBCONTEXT_2(stencilMaskSeparate, GC3Denum, GC3Duint) | |
417 DELEGATE_TO_WEBCONTEXT_3(stencilOp, GC3Denum, GC3Denum, GC3Denum) | |
418 DELEGATE_TO_WEBCONTEXT_4(stencilOpSeparate, GC3Denum, GC3Denum, GC3Denum, GC3Den
um) | |
419 | |
420 bool GraphicsContext3D::texImage2D(GC3Denum target, GC3Dint level, GC3Denum inte
rnalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format,
GC3Denum type, const void* pixels) | |
421 { | |
422 m_private->webContext()->texImage2D(target, level, internalformat, width, he
ight, border, format, type, pixels); | |
423 return true; | |
424 } | |
425 | |
426 DELEGATE_TO_WEBCONTEXT_3(texParameterf, GC3Denum, GC3Denum, GC3Dfloat) | |
427 DELEGATE_TO_WEBCONTEXT_3(texParameteri, GC3Denum, GC3Denum, GC3Dint) | |
428 | |
429 void GraphicsContext3D::texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xo
ffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3D
enum type, const void* pixels) | |
430 { | |
431 m_private->webContext()->texSubImage2D(target, level, xoffset, yoffset, widt
h, height, format, type, pixels); | |
432 } | |
433 | |
434 DELEGATE_TO_WEBCONTEXT_2(uniform1f, GC3Dint, GC3Dfloat) | |
435 DELEGATE_TO_WEBCONTEXT_3(uniform1fv, GC3Dint, GC3Dsizei, GC3Dfloat*) | |
436 DELEGATE_TO_WEBCONTEXT_2(uniform1i, GC3Dint, GC3Dint) | |
437 DELEGATE_TO_WEBCONTEXT_3(uniform1iv, GC3Dint, GC3Dsizei, GC3Dint*) | |
438 DELEGATE_TO_WEBCONTEXT_3(uniform2f, GC3Dint, GC3Dfloat, GC3Dfloat) | |
439 DELEGATE_TO_WEBCONTEXT_3(uniform2fv, GC3Dint, GC3Dsizei, GC3Dfloat*) | |
440 DELEGATE_TO_WEBCONTEXT_3(uniform2i, GC3Dint, GC3Dint, GC3Dint) | |
441 DELEGATE_TO_WEBCONTEXT_3(uniform2iv, GC3Dint, GC3Dsizei, GC3Dint*) | |
442 DELEGATE_TO_WEBCONTEXT_4(uniform3f, GC3Dint, GC3Dfloat, GC3Dfloat, GC3Dfloat) | |
443 DELEGATE_TO_WEBCONTEXT_3(uniform3fv, GC3Dint, GC3Dsizei, GC3Dfloat*) | |
444 DELEGATE_TO_WEBCONTEXT_4(uniform3i, GC3Dint, GC3Dint, GC3Dint, GC3Dint) | |
445 DELEGATE_TO_WEBCONTEXT_3(uniform3iv, GC3Dint, GC3Dsizei, GC3Dint*) | |
446 DELEGATE_TO_WEBCONTEXT_5(uniform4f, GC3Dint, GC3Dfloat, GC3Dfloat, GC3Dfloat, GC
3Dfloat) | |
447 DELEGATE_TO_WEBCONTEXT_3(uniform4fv, GC3Dint, GC3Dsizei, GC3Dfloat*) | |
448 DELEGATE_TO_WEBCONTEXT_5(uniform4i, GC3Dint, GC3Dint, GC3Dint, GC3Dint, GC3Dint) | |
449 DELEGATE_TO_WEBCONTEXT_3(uniform4iv, GC3Dint, GC3Dsizei, GC3Dint*) | |
450 DELEGATE_TO_WEBCONTEXT_4(uniformMatrix2fv, GC3Dint, GC3Dsizei, GC3Dboolean, GC3D
float*) | |
451 DELEGATE_TO_WEBCONTEXT_4(uniformMatrix3fv, GC3Dint, GC3Dsizei, GC3Dboolean, GC3D
float*) | |
452 DELEGATE_TO_WEBCONTEXT_4(uniformMatrix4fv, GC3Dint, GC3Dsizei, GC3Dboolean, GC3D
float*) | |
453 | |
454 DELEGATE_TO_WEBCONTEXT_1(useProgram, Platform3DObject) | |
455 DELEGATE_TO_WEBCONTEXT_1(validateProgram, Platform3DObject) | |
456 | |
457 DELEGATE_TO_WEBCONTEXT_2(vertexAttrib1f, GC3Duint, GC3Dfloat) | |
458 DELEGATE_TO_WEBCONTEXT_2(vertexAttrib1fv, GC3Duint, GC3Dfloat*) | |
459 DELEGATE_TO_WEBCONTEXT_3(vertexAttrib2f, GC3Duint, GC3Dfloat, GC3Dfloat) | |
460 DELEGATE_TO_WEBCONTEXT_2(vertexAttrib2fv, GC3Duint, GC3Dfloat*) | |
461 DELEGATE_TO_WEBCONTEXT_4(vertexAttrib3f, GC3Duint, GC3Dfloat, GC3Dfloat, GC3Dflo
at) | |
462 DELEGATE_TO_WEBCONTEXT_2(vertexAttrib3fv, GC3Duint, GC3Dfloat*) | |
463 DELEGATE_TO_WEBCONTEXT_5(vertexAttrib4f, GC3Duint, GC3Dfloat, GC3Dfloat, GC3Dflo
at, GC3Dfloat) | |
464 DELEGATE_TO_WEBCONTEXT_2(vertexAttrib4fv, GC3Duint, GC3Dfloat*) | |
465 DELEGATE_TO_WEBCONTEXT_6(vertexAttribPointer, GC3Duint, GC3Dint, GC3Denum, GC3Db
oolean, GC3Dsizei, GC3Dintptr) | |
466 | |
467 DELEGATE_TO_WEBCONTEXT_4(viewport, GC3Dint, GC3Dint, GC3Dsizei, GC3Dsizei) | |
468 | |
469 void GraphicsContext3D::reshape(int width, int height) | |
470 { | |
471 if (width == m_private->webContext()->width() && height == m_private->webCon
text()->height()) | |
472 return; | |
473 | |
474 m_private->webContext()->reshape(width, height); | |
475 } | |
476 | |
477 void GraphicsContext3D::markContextChanged() | |
478 { | |
479 m_private->markContextChanged(); | |
480 } | |
481 | |
482 bool GraphicsContext3D::layerComposited() const | |
483 { | |
484 return m_private->layerComposited(); | |
485 } | |
486 | |
487 void GraphicsContext3D::markLayerComposited() | |
488 { | |
489 m_private->markLayerComposited(); | |
490 } | |
491 | |
492 namespace { | |
493 | |
494 void getDrawingParameters(DrawingBuffer* drawingBuffer, WebKit::WebGraphicsConte
xt3D* graphicsContext3D, | |
495 Platform3DObject* frameBufferId, int* width, int* heig
ht) | |
496 { | |
497 if (drawingBuffer) { | |
498 *frameBufferId = drawingBuffer->framebuffer(); | |
499 *width = drawingBuffer->size().width(); | |
500 *height = drawingBuffer->size().height(); | |
501 } else { | |
502 *frameBufferId = 0; | |
503 *width = graphicsContext3D->width(); | |
504 *height = graphicsContext3D->height(); | |
505 } | |
506 } | |
507 | |
508 } // anonymous namespace | |
509 | |
510 void GraphicsContext3D::paintRenderingResultsToCanvas(ImageBuffer* imageBuffer,
DrawingBuffer* drawingBuffer) | |
511 { | |
512 Platform3DObject framebufferId; | |
513 int width, height; | |
514 getDrawingParameters(drawingBuffer, m_private->webContext(), &framebufferId,
&width, &height); | |
515 m_private->paintFramebufferToCanvas(framebufferId, width, height, !getContex
tAttributes().premultipliedAlpha, imageBuffer); | |
516 } | |
517 | |
518 PassRefPtr<ImageData> GraphicsContext3D::paintRenderingResultsToImageData(Drawin
gBuffer* drawingBuffer) | |
519 { | |
520 if (getContextAttributes().premultipliedAlpha) | |
521 return 0; | |
522 | |
523 Platform3DObject framebufferId; | |
524 int width, height; | |
525 getDrawingParameters(drawingBuffer, m_private->webContext(), &framebufferId,
&width, &height); | |
526 | |
527 RefPtr<ImageData> imageData = ImageData::create(IntSize(width, height)); | |
528 unsigned char* pixels = imageData->data()->data(); | |
529 size_t bufferSize = 4 * width * height; | |
530 | |
531 m_private->webContext()->readBackFramebuffer(pixels, bufferSize, framebuffer
Id, width, height); | |
532 | |
533 #if (SK_R32_SHIFT == 16) && !SK_B32_SHIFT | |
534 // If the implementation swapped the red and blue channels, un-swap them. | |
535 for (size_t i = 0; i < bufferSize; i += 4) | |
536 std::swap(pixels[i], pixels[i + 2]); | |
537 #endif | |
538 | |
539 return imageData.release(); | |
540 } | |
541 | |
542 bool GraphicsContext3D::paintCompositedResultsToCanvas(ImageBuffer*) | |
543 { | |
544 return false; | |
545 } | |
546 | |
547 DELEGATE_TO_WEBCONTEXT_R(createBuffer, Platform3DObject) | |
548 DELEGATE_TO_WEBCONTEXT_R(createFramebuffer, Platform3DObject) | |
549 DELEGATE_TO_WEBCONTEXT_R(createProgram, Platform3DObject) | |
550 DELEGATE_TO_WEBCONTEXT_R(createRenderbuffer, Platform3DObject) | |
551 DELEGATE_TO_WEBCONTEXT_1R(createShader, GC3Denum, Platform3DObject) | |
552 DELEGATE_TO_WEBCONTEXT_R(createTexture, Platform3DObject) | |
553 | |
554 DELEGATE_TO_WEBCONTEXT_1(deleteBuffer, Platform3DObject) | |
555 DELEGATE_TO_WEBCONTEXT_1(deleteFramebuffer, Platform3DObject) | |
556 DELEGATE_TO_WEBCONTEXT_1(deleteProgram, Platform3DObject) | |
557 DELEGATE_TO_WEBCONTEXT_1(deleteRenderbuffer, Platform3DObject) | |
558 DELEGATE_TO_WEBCONTEXT_1(deleteShader, Platform3DObject) | |
559 DELEGATE_TO_WEBCONTEXT_1(deleteTexture, Platform3DObject) | |
560 | |
561 DELEGATE_TO_WEBCONTEXT_1(synthesizeGLError, GC3Denum) | |
562 | |
563 Extensions3D* GraphicsContext3D::getExtensions() | |
564 { | |
565 return m_private->getExtensions(); | |
566 } | |
567 | |
568 | |
569 IntSize GraphicsContext3D::getInternalFramebufferSize() const | |
570 { | |
571 return IntSize(m_private->webContext()->width(), m_private->webContext()->he
ight()); | |
572 } | |
573 | |
574 } // namespace WebCore | |
OLD | NEW |