Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(339)

Side by Side Diff: Source/core/html/canvas/WebGLFramebuffer.cpp

Issue 1120953002: WebGL 2: add read/write framebuffer binding points to related APIs (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: addressed zmo@'s and kbr@'s feedback Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2009 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 WebGLRenderbufferAttachment() { } 47 WebGLRenderbufferAttachment() { }
48 48
49 virtual GLsizei width() const override; 49 virtual GLsizei width() const override;
50 virtual GLsizei height() const override; 50 virtual GLsizei height() const override;
51 virtual GLenum format() const override; 51 virtual GLenum format() const override;
52 virtual GLenum type() const override; 52 virtual GLenum type() const override;
53 virtual WebGLSharedObject* object() const override; 53 virtual WebGLSharedObject* object() const override;
54 virtual bool isSharedObject(WebGLSharedObject*) const override; 54 virtual bool isSharedObject(WebGLSharedObject*) const override;
55 virtual bool valid() const override; 55 virtual bool valid() const override;
56 virtual void onDetached(WebGraphicsContext3D*) override; 56 virtual void onDetached(WebGraphicsContext3D*) override;
57 virtual void attach(WebGraphicsContext3D*, GLenum attachment) override; 57 virtual void attach(WebGraphicsContext3D*, GLenum target, GLenum attachm ent) override;
58 virtual void unattach(WebGraphicsContext3D*, GLenum attachment) override ; 58 virtual void unattach(WebGraphicsContext3D*, GLenum target, GLenum attac hment) override;
59 59
60 RefPtrWillBeMember<WebGLRenderbuffer> m_renderbuffer; 60 RefPtrWillBeMember<WebGLRenderbuffer> m_renderbuffer;
61 }; 61 };
62 62
63 PassRefPtrWillBeRawPtr<WebGLFramebuffer::WebGLAttachment> WebGLRenderbufferA ttachment::create(WebGLRenderbuffer* renderbuffer) 63 PassRefPtrWillBeRawPtr<WebGLFramebuffer::WebGLAttachment> WebGLRenderbufferA ttachment::create(WebGLRenderbuffer* renderbuffer)
64 { 64 {
65 return adoptRefWillBeNoop(new WebGLRenderbufferAttachment(renderbuffer)) ; 65 return adoptRefWillBeNoop(new WebGLRenderbufferAttachment(renderbuffer)) ;
66 } 66 }
67 67
68 DEFINE_TRACE(WebGLRenderbufferAttachment) 68 DEFINE_TRACE(WebGLRenderbufferAttachment)
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 bool WebGLRenderbufferAttachment::valid() const 110 bool WebGLRenderbufferAttachment::valid() const
111 { 111 {
112 return m_renderbuffer->object(); 112 return m_renderbuffer->object();
113 } 113 }
114 114
115 void WebGLRenderbufferAttachment::onDetached(WebGraphicsContext3D* context) 115 void WebGLRenderbufferAttachment::onDetached(WebGraphicsContext3D* context)
116 { 116 {
117 m_renderbuffer->onDetached(context); 117 m_renderbuffer->onDetached(context);
118 } 118 }
119 119
120 void WebGLRenderbufferAttachment::attach(WebGraphicsContext3D* context, GLen um attachment) 120 void WebGLRenderbufferAttachment::attach(WebGraphicsContext3D* context, GLen um target, GLenum attachment)
121 { 121 {
122 Platform3DObject object = objectOrZero(m_renderbuffer.get()); 122 Platform3DObject object = objectOrZero(m_renderbuffer.get());
123 if (attachment == GL_DEPTH_STENCIL_ATTACHMENT && m_renderbuffer->emulate dStencilBuffer()) { 123 if (attachment == GL_DEPTH_STENCIL_ATTACHMENT && m_renderbuffer->emulate dStencilBuffer()) {
124 context->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT , GL_RENDERBUFFER, object); 124 context->framebufferRenderbuffer(target, GL_DEPTH_ATTACHMENT, GL_REN DERBUFFER, object);
125 context->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHME NT, GL_RENDERBUFFER, objectOrZero(m_renderbuffer->emulatedStencilBuffer())); 125 context->framebufferRenderbuffer(target, GL_STENCIL_ATTACHMENT, GL_R ENDERBUFFER, objectOrZero(m_renderbuffer->emulatedStencilBuffer()));
126 } else { 126 } else {
127 context->framebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_REND ERBUFFER, object); 127 context->framebufferRenderbuffer(target, attachment, GL_RENDERBUFFER , object);
128 } 128 }
129 } 129 }
130 130
131 void WebGLRenderbufferAttachment::unattach(WebGraphicsContext3D* context, GL enum attachment) 131 void WebGLRenderbufferAttachment::unattach(WebGraphicsContext3D* context, GL enum target, GLenum attachment)
132 { 132 {
133 if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) { 133 if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
134 context->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT , GL_RENDERBUFFER, 0); 134 context->framebufferRenderbuffer(target, GL_DEPTH_ATTACHMENT, GL_REN DERBUFFER, 0);
135 context->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHME NT, GL_RENDERBUFFER, 0); 135 context->framebufferRenderbuffer(target, GL_STENCIL_ATTACHMENT, GL_R ENDERBUFFER, 0);
136 } else { 136 } else {
137 context->framebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_REND ERBUFFER, 0); 137 context->framebufferRenderbuffer(target, attachment, GL_RENDERBUFFER , 0);
138 } 138 }
139 } 139 }
140 140
141 GLenum WebGLRenderbufferAttachment::type() const 141 GLenum WebGLRenderbufferAttachment::type() const
142 { 142 {
143 notImplemented(); 143 notImplemented();
144 return 0; 144 return 0;
145 } 145 }
146 146
147 class WebGLTextureAttachment final : public WebGLFramebuffer::WebGLAttachmen t { 147 class WebGLTextureAttachment final : public WebGLFramebuffer::WebGLAttachmen t {
148 public: 148 public:
149 static PassRefPtrWillBeRawPtr<WebGLFramebuffer::WebGLAttachment> create( WebGLTexture*, GLenum target, GLint level); 149 static PassRefPtrWillBeRawPtr<WebGLFramebuffer::WebGLAttachment> create( WebGLTexture*, GLenum target, GLint level);
150 150
151 DECLARE_VIRTUAL_TRACE(); 151 DECLARE_VIRTUAL_TRACE();
152 152
153 private: 153 private:
154 WebGLTextureAttachment(WebGLTexture*, GLenum target, GLint level); 154 WebGLTextureAttachment(WebGLTexture*, GLenum target, GLint level);
155 WebGLTextureAttachment() { } 155 WebGLTextureAttachment() { }
156 156
157 virtual GLsizei width() const override; 157 virtual GLsizei width() const override;
158 virtual GLsizei height() const override; 158 virtual GLsizei height() const override;
159 virtual GLenum format() const override; 159 virtual GLenum format() const override;
160 virtual GLenum type() const override; 160 virtual GLenum type() const override;
161 virtual WebGLSharedObject* object() const override; 161 virtual WebGLSharedObject* object() const override;
162 virtual bool isSharedObject(WebGLSharedObject*) const override; 162 virtual bool isSharedObject(WebGLSharedObject*) const override;
163 virtual bool valid() const override; 163 virtual bool valid() const override;
164 virtual void onDetached(WebGraphicsContext3D*) override; 164 virtual void onDetached(WebGraphicsContext3D*) override;
165 virtual void attach(WebGraphicsContext3D*, GLenum attachment) override; 165 virtual void attach(WebGraphicsContext3D*, GLenum target, GLenum attachm ent) override;
166 virtual void unattach(WebGraphicsContext3D*, GLenum attachment) override ; 166 virtual void unattach(WebGraphicsContext3D*, GLenum target, GLenum attac hment) override;
167 167
168 RefPtrWillBeMember<WebGLTexture> m_texture; 168 RefPtrWillBeMember<WebGLTexture> m_texture;
169 GLenum m_target; 169 GLenum m_target;
170 GLint m_level; 170 GLint m_level;
171 }; 171 };
172 172
173 PassRefPtrWillBeRawPtr<WebGLFramebuffer::WebGLAttachment> WebGLTextureAttach ment::create(WebGLTexture* texture, GLenum target, GLint level) 173 PassRefPtrWillBeRawPtr<WebGLFramebuffer::WebGLAttachment> WebGLTextureAttach ment::create(WebGLTexture* texture, GLenum target, GLint level)
174 { 174 {
175 return adoptRefWillBeNoop(new WebGLTextureAttachment(texture, target, le vel)); 175 return adoptRefWillBeNoop(new WebGLTextureAttachment(texture, target, le vel));
176 } 176 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 bool WebGLTextureAttachment::valid() const 216 bool WebGLTextureAttachment::valid() const
217 { 217 {
218 return m_texture->object(); 218 return m_texture->object();
219 } 219 }
220 220
221 void WebGLTextureAttachment::onDetached(WebGraphicsContext3D* context) 221 void WebGLTextureAttachment::onDetached(WebGraphicsContext3D* context)
222 { 222 {
223 m_texture->onDetached(context); 223 m_texture->onDetached(context);
224 } 224 }
225 225
226 void WebGLTextureAttachment::attach(WebGraphicsContext3D* context, GLenum at tachment) 226 void WebGLTextureAttachment::attach(WebGraphicsContext3D* context, GLenum ta rget, GLenum attachment)
227 { 227 {
228 Platform3DObject object = objectOrZero(m_texture.get()); 228 Platform3DObject object = objectOrZero(m_texture.get());
229 context->framebufferTexture2D(GL_FRAMEBUFFER, attachment, m_target, obje ct, m_level); 229 context->framebufferTexture2D(target, attachment, m_target, object, m_le vel);
230 } 230 }
231 231
232 void WebGLTextureAttachment::unattach(WebGraphicsContext3D* context, GLenum attachment) 232 void WebGLTextureAttachment::unattach(WebGraphicsContext3D* context, GLenum target, GLenum attachment)
233 { 233 {
234 if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) { 234 if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
235 context->framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m _target, 0, m_level); 235 context->framebufferTexture2D(target, GL_DEPTH_ATTACHMENT, m_target, 0, m_level);
236 context->framebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, m_target, 0, m_level); 236 context->framebufferTexture2D(target, GL_STENCIL_ATTACHMENT, m_targe t, 0, m_level);
237 } else { 237 } else {
238 context->framebufferTexture2D(GL_FRAMEBUFFER, attachment, m_target, 0, m_level); 238 context->framebufferTexture2D(target, attachment, m_target, 0, m_lev el);
239 } 239 }
240 } 240 }
241 241
242 GLenum WebGLTextureAttachment::type() const 242 GLenum WebGLTextureAttachment::type() const
243 { 243 {
244 return m_texture->getType(m_target, m_level); 244 return m_texture->getType(m_target, m_level);
245 } 245 }
246 246
247 bool isColorRenderable(GLenum internalformat) 247 bool isColorRenderable(GLenum internalformat)
248 { 248 {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 // is for the benefit of Oilpan, where the framebuffer object 288 // is for the benefit of Oilpan, where the framebuffer object
289 // isn't detached when it and the WebGLRenderingContextBase object 289 // isn't detached when it and the WebGLRenderingContextBase object
290 // it is registered with are both finalized. Without Oilpan, the 290 // it is registered with are both finalized. Without Oilpan, the
291 // object will have been detached. 291 // object will have been detached.
292 // 292 //
293 // To keep the code regular, the trivial detach()ment is always 293 // To keep the code regular, the trivial detach()ment is always
294 // performed. 294 // performed.
295 detachAndDeleteObject(); 295 detachAndDeleteObject();
296 } 296 }
297 297
298 void WebGLFramebuffer::setAttachmentForBoundFramebuffer(GLenum attachment, GLenu m texTarget, WebGLTexture* texture, GLint level) 298 void WebGLFramebuffer::setAttachmentForBoundFramebuffer(GLenum target, GLenum at tachment, GLenum texTarget, WebGLTexture* texture, GLint level)
299 { 299 {
300 ASSERT(isBound()); 300 ASSERT(isBound());
301 removeAttachmentFromBoundFramebuffer(attachment); 301 removeAttachmentFromBoundFramebuffer(target, attachment);
302 if (!m_object) 302 if (!m_object)
303 return; 303 return;
304 if (texture && texture->object()) { 304 if (texture && texture->object()) {
305 m_attachments.add(attachment, WebGLTextureAttachment::create(texture, te xTarget, level)); 305 m_attachments.add(attachment, WebGLTextureAttachment::create(texture, te xTarget, level));
306 drawBuffersIfNecessary(false); 306 drawBuffersIfNecessary(false);
307 texture->onAttached(); 307 texture->onAttached();
308 } 308 }
309 } 309 }
310 310
311 void WebGLFramebuffer::setAttachmentForBoundFramebuffer(GLenum attachment, WebGL Renderbuffer* renderbuffer) 311 void WebGLFramebuffer::setAttachmentForBoundFramebuffer(GLenum target, GLenum at tachment, WebGLRenderbuffer* renderbuffer)
312 { 312 {
313 ASSERT(isBound()); 313 ASSERT(isBound());
314 removeAttachmentFromBoundFramebuffer(attachment); 314 removeAttachmentFromBoundFramebuffer(target, attachment);
315 if (!m_object) 315 if (!m_object)
316 return; 316 return;
317 if (renderbuffer && renderbuffer->object()) { 317 if (renderbuffer && renderbuffer->object()) {
318 m_attachments.add(attachment, WebGLRenderbufferAttachment::create(render buffer)); 318 m_attachments.add(attachment, WebGLRenderbufferAttachment::create(render buffer));
319 drawBuffersIfNecessary(false); 319 drawBuffersIfNecessary(false);
320 renderbuffer->onAttached(); 320 renderbuffer->onAttached();
321 } 321 }
322 } 322 }
323 323
324 void WebGLFramebuffer::attach(GLenum attachment, GLenum attachmentPoint) 324 void WebGLFramebuffer::attach(GLenum target, GLenum attachment, GLenum attachmen tPoint)
325 { 325 {
326 ASSERT(isBound()); 326 ASSERT(isBound());
327 WebGLAttachment* attachmentObject = getAttachment(attachment); 327 WebGLAttachment* attachmentObject = getAttachment(attachment);
328 if (attachmentObject) 328 if (attachmentObject)
329 attachmentObject->attach(context()->webContext(), attachmentPoint); 329 attachmentObject->attach(context()->webContext(), target, attachmentPoin t);
330 } 330 }
331 331
332 WebGLSharedObject* WebGLFramebuffer::getAttachmentObject(GLenum attachment) cons t 332 WebGLSharedObject* WebGLFramebuffer::getAttachmentObject(GLenum attachment) cons t
333 { 333 {
334 if (!m_object) 334 if (!m_object)
335 return nullptr; 335 return nullptr;
336 WebGLAttachment* attachmentObject = getAttachment(attachment); 336 WebGLAttachment* attachmentObject = getAttachment(attachment);
337 return attachmentObject ? attachmentObject->object() : nullptr; 337 return attachmentObject ? attachmentObject->object() : nullptr;
338 } 338 }
339 339
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 } 423 }
424 return true; 424 return true;
425 } 425 }
426 426
427 WebGLFramebuffer::WebGLAttachment* WebGLFramebuffer::getAttachment(GLenum attach ment) const 427 WebGLFramebuffer::WebGLAttachment* WebGLFramebuffer::getAttachment(GLenum attach ment) const
428 { 428 {
429 const AttachmentMap::const_iterator it = m_attachments.find(attachment); 429 const AttachmentMap::const_iterator it = m_attachments.find(attachment);
430 return (it != m_attachments.end()) ? it->value.get() : 0; 430 return (it != m_attachments.end()) ? it->value.get() : 0;
431 } 431 }
432 432
433 void WebGLFramebuffer::removeAttachmentFromBoundFramebuffer(GLenum attachment) 433 void WebGLFramebuffer::removeAttachmentFromBoundFramebuffer(GLenum target, GLenu m attachment)
434 { 434 {
435 ASSERT(isBound()); 435 ASSERT(isBound());
436 if (!m_object) 436 if (!m_object)
437 return; 437 return;
438 438
439 WebGLAttachment* attachmentObject = getAttachment(attachment); 439 WebGLAttachment* attachmentObject = getAttachment(attachment);
440 if (attachmentObject) { 440 if (attachmentObject) {
441 attachmentObject->onDetached(context()->webContext()); 441 attachmentObject->onDetached(context()->webContext());
442 m_attachments.remove(attachment); 442 m_attachments.remove(attachment);
443 drawBuffersIfNecessary(false); 443 drawBuffersIfNecessary(false);
444 switch (attachment) { 444 switch (attachment) {
445 case GL_DEPTH_STENCIL_ATTACHMENT: 445 case GL_DEPTH_STENCIL_ATTACHMENT:
446 attach(GL_DEPTH_ATTACHMENT, GL_DEPTH_ATTACHMENT); 446 attach(target, GL_DEPTH_ATTACHMENT, GL_DEPTH_ATTACHMENT);
447 attach(GL_STENCIL_ATTACHMENT, GL_STENCIL_ATTACHMENT); 447 attach(target, GL_STENCIL_ATTACHMENT, GL_STENCIL_ATTACHMENT);
448 break; 448 break;
449 case GL_DEPTH_ATTACHMENT: 449 case GL_DEPTH_ATTACHMENT:
450 attach(GL_DEPTH_STENCIL_ATTACHMENT, GL_DEPTH_ATTACHMENT); 450 attach(target, GL_DEPTH_STENCIL_ATTACHMENT, GL_DEPTH_ATTACHMENT);
451 break; 451 break;
452 case GL_STENCIL_ATTACHMENT: 452 case GL_STENCIL_ATTACHMENT:
453 attach(GL_DEPTH_STENCIL_ATTACHMENT, GL_STENCIL_ATTACHMENT); 453 attach(target, GL_DEPTH_STENCIL_ATTACHMENT, GL_STENCIL_ATTACHMENT);
454 break; 454 break;
455 } 455 }
456 } 456 }
457 } 457 }
458 458
459 void WebGLFramebuffer::removeAttachmentFromBoundFramebuffer(WebGLSharedObject* a ttachment) 459 void WebGLFramebuffer::removeAttachmentFromBoundFramebuffer(GLenum target, WebGL SharedObject* attachment)
460 { 460 {
461 ASSERT(isBound()); 461 ASSERT(isBound());
462 if (!m_object) 462 if (!m_object)
463 return; 463 return;
464 if (!attachment) 464 if (!attachment)
465 return; 465 return;
466 466
467 bool checkMore = true; 467 bool checkMore = true;
468 while (checkMore) { 468 while (checkMore) {
469 checkMore = false; 469 checkMore = false;
470 for (const auto& it : m_attachments) { 470 for (const auto& it : m_attachments) {
471 WebGLAttachment* attachmentObject = it.value.get(); 471 WebGLAttachment* attachmentObject = it.value.get();
472 if (attachmentObject->isSharedObject(attachment)) { 472 if (attachmentObject->isSharedObject(attachment)) {
473 GLenum attachmentType = it.key; 473 GLenum attachmentType = it.key;
474 attachmentObject->unattach(context()->webContext(), attachmentTy pe); 474 attachmentObject->unattach(context()->webContext(), target, atta chmentType);
475 removeAttachmentFromBoundFramebuffer(attachmentType); 475 removeAttachmentFromBoundFramebuffer(target, attachmentType);
476 checkMore = true; 476 checkMore = true;
477 break; 477 break;
478 } 478 }
479 } 479 }
480 } 480 }
481 } 481 }
482 482
483 GLenum WebGLFramebuffer::colorBufferFormat() const 483 GLenum WebGLFramebuffer::colorBufferFormat() const
484 { 484 {
485 if (!m_object) 485 if (!m_object)
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
540 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; 540 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
541 } 541 }
542 // WebGL specific: no conflicting DEPTH/STENCIL/DEPTH_STENCIL attachments. 542 // WebGL specific: no conflicting DEPTH/STENCIL/DEPTH_STENCIL attachments.
543 if ((haveDepthStencil && (haveDepth || haveStencil)) || (haveDepth && haveSt encil)) { 543 if ((haveDepthStencil && (haveDepth || haveStencil)) || (haveDepth && haveSt encil)) {
544 *reason = "conflicting DEPTH/STENCIL/DEPTH_STENCIL attachments"; 544 *reason = "conflicting DEPTH/STENCIL/DEPTH_STENCIL attachments";
545 return GL_FRAMEBUFFER_UNSUPPORTED; 545 return GL_FRAMEBUFFER_UNSUPPORTED;
546 } 546 }
547 return GL_FRAMEBUFFER_COMPLETE; 547 return GL_FRAMEBUFFER_COMPLETE;
548 } 548 }
549 549
550 bool WebGLFramebuffer::onAccess(WebGraphicsContext3D* context3d, const char** re ason) 550 bool WebGLFramebuffer::onAccess(WebGraphicsContext3D* context3d, GLenum target, const char** reason)
551 { 551 {
552 if (checkStatus(reason) != GL_FRAMEBUFFER_COMPLETE) 552 if (checkStatus(reason) != GL_FRAMEBUFFER_COMPLETE)
553 return false; 553 return false;
554 return true; 554 return true;
555 } 555 }
556 556
557 bool WebGLFramebuffer::hasStencilBuffer() const 557 bool WebGLFramebuffer::hasStencilBuffer() const
558 { 558 {
559 WebGLAttachment* attachment = getAttachment(GL_STENCIL_ATTACHMENT); 559 WebGLAttachment* attachment = getAttachment(GL_STENCIL_ATTACHMENT);
560 if (!attachment) 560 if (!attachment)
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 632
633 DEFINE_TRACE(WebGLFramebuffer) 633 DEFINE_TRACE(WebGLFramebuffer)
634 { 634 {
635 #if ENABLE(OILPAN) 635 #if ENABLE(OILPAN)
636 visitor->trace(m_attachments); 636 visitor->trace(m_attachments);
637 #endif 637 #endif
638 WebGLContextObject::trace(visitor); 638 WebGLContextObject::trace(visitor);
639 } 639 }
640 640
641 } 641 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698