| Index: Source/modules/webgl/WebGLFramebuffer.cpp
|
| diff --git a/Source/modules/webgl/WebGLFramebuffer.cpp b/Source/modules/webgl/WebGLFramebuffer.cpp
|
| index d62069dc90d75d835a9f713f5b376f921b083666..e9dee4049417d46953014e526d414bf565c1c9bd 100644
|
| --- a/Source/modules/webgl/WebGLFramebuffer.cpp
|
| +++ b/Source/modules/webgl/WebGLFramebuffer.cpp
|
| @@ -38,7 +38,7 @@
|
|
|
| class WebGLRenderbufferAttachment final : public WebGLFramebuffer::WebGLAttachment {
|
| public:
|
| - static WebGLFramebuffer::WebGLAttachment* create(WebGLRenderbuffer*);
|
| + static PassRefPtrWillBeRawPtr<WebGLFramebuffer::WebGLAttachment> create(WebGLRenderbuffer*);
|
|
|
| DECLARE_VIRTUAL_TRACE();
|
|
|
| @@ -57,12 +57,12 @@
|
| void attach(WebGraphicsContext3D*, GLenum target, GLenum attachment) override;
|
| void unattach(WebGraphicsContext3D*, GLenum target, GLenum attachment) override;
|
|
|
| - Member<WebGLRenderbuffer> m_renderbuffer;
|
| + RefPtrWillBeMember<WebGLRenderbuffer> m_renderbuffer;
|
| };
|
|
|
| -WebGLFramebuffer::WebGLAttachment* WebGLRenderbufferAttachment::create(WebGLRenderbuffer* renderbuffer)
|
| -{
|
| - return new WebGLRenderbufferAttachment(renderbuffer);
|
| +PassRefPtrWillBeRawPtr<WebGLFramebuffer::WebGLAttachment> WebGLRenderbufferAttachment::create(WebGLRenderbuffer* renderbuffer)
|
| +{
|
| + return adoptRefWillBeNoop(new WebGLRenderbufferAttachment(renderbuffer));
|
| }
|
|
|
| DEFINE_TRACE(WebGLRenderbufferAttachment)
|
| @@ -140,13 +140,12 @@
|
|
|
| GLenum WebGLRenderbufferAttachment::type() const
|
| {
|
| - notImplemented();
|
| return 0;
|
| }
|
|
|
| class WebGLTextureAttachment final : public WebGLFramebuffer::WebGLAttachment {
|
| public:
|
| - static WebGLFramebuffer::WebGLAttachment* create(WebGLTexture*, GLenum target, GLint level);
|
| + static PassRefPtrWillBeRawPtr<WebGLFramebuffer::WebGLAttachment> create(WebGLTexture*, GLenum target, GLint level);
|
|
|
| DECLARE_VIRTUAL_TRACE();
|
|
|
| @@ -165,14 +164,14 @@
|
| void attach(WebGraphicsContext3D*, GLenum target, GLenum attachment) override;
|
| void unattach(WebGraphicsContext3D*, GLenum target, GLenum attachment) override;
|
|
|
| - Member<WebGLTexture> m_texture;
|
| + RefPtrWillBeMember<WebGLTexture> m_texture;
|
| GLenum m_target;
|
| GLint m_level;
|
| };
|
|
|
| -WebGLFramebuffer::WebGLAttachment* WebGLTextureAttachment::create(WebGLTexture* texture, GLenum target, GLint level)
|
| -{
|
| - return new WebGLTextureAttachment(texture, target, level);
|
| +PassRefPtrWillBeRawPtr<WebGLFramebuffer::WebGLAttachment> WebGLTextureAttachment::create(WebGLTexture* texture, GLenum target, GLint level)
|
| +{
|
| + return adoptRefWillBeNoop(new WebGLTextureAttachment(texture, target, level));
|
| }
|
|
|
| DEFINE_TRACE(WebGLTextureAttachment)
|
| @@ -325,9 +324,9 @@
|
| {
|
| }
|
|
|
| -WebGLFramebuffer* WebGLFramebuffer::create(WebGLRenderingContextBase* ctx)
|
| -{
|
| - return new WebGLFramebuffer(ctx);
|
| +PassRefPtrWillBeRawPtr<WebGLFramebuffer> WebGLFramebuffer::create(WebGLRenderingContextBase* ctx)
|
| +{
|
| + return adoptRefWillBeNoop(new WebGLFramebuffer(ctx));
|
| }
|
|
|
| WebGLFramebuffer::WebGLFramebuffer(WebGLRenderingContextBase* ctx)
|
| @@ -340,11 +339,14 @@
|
|
|
| WebGLFramebuffer::~WebGLFramebuffer()
|
| {
|
| - // Attachments in |m_attachments| will be deleted from other places, so we
|
| - // clear it to avoid deleting those attachments in detachAndDeleteObject().
|
| - m_attachments.clear();
|
| -
|
| - // See the comment in WebGLObject::detachAndDeleteObject().
|
| + // Delete the platform framebuffer resource. Explicit detachment
|
| + // is for the benefit of Oilpan, where the framebuffer object
|
| + // isn't detached when it and the WebGLRenderingContextBase object
|
| + // it is registered with are both finalized. Without Oilpan, the
|
| + // object will have been detached.
|
| + //
|
| + // To keep the code regular, the trivial detach()ment is always
|
| + // performed.
|
| detachAndDeleteObject();
|
| }
|
|
|
| @@ -579,11 +581,17 @@
|
|
|
| void WebGLFramebuffer::deleteObjectImpl(WebGraphicsContext3D* context3d)
|
| {
|
| - // Both the AttachmentMap and its WebGLAttachment objects are GCed
|
| - // objects and cannot be accessed, as they may have been finalized
|
| +#if !ENABLE(OILPAN)
|
| + // With Oilpan, both the AttachmentMap and its WebGLAttachment objects are
|
| + // GCed objects and cannot be accessed, as they may have been finalized
|
| // already during the same GC sweep.
|
| + //
|
| + // The WebGLAttachment-derived classes instead handle detachment
|
| + // on their own when finalizing, so the explicit notification is
|
| + // not needed.
|
| for (const auto& attachment : m_attachments)
|
| attachment.value->onDetached(context3d);
|
| +#endif
|
|
|
| context3d->deleteFramebuffer(m_object);
|
| m_object = 0;
|
| @@ -655,7 +663,9 @@
|
|
|
| DEFINE_TRACE(WebGLFramebuffer)
|
| {
|
| +#if ENABLE(OILPAN)
|
| visitor->trace(m_attachments);
|
| +#endif
|
| WebGLContextObject::trace(visitor);
|
| }
|
|
|
|
|