#include "core/html/canvas/WebGLRenderingContextBase.h"
#include "platform/NotImplemented.h"
-namespace WebCore {
+namespace blink {
namespace {
class WebGLRenderbufferAttachment FINAL : public WebGLFramebuffer::WebGLAttachment {
public:
- static PassRefPtr<WebGLFramebuffer::WebGLAttachment> create(WebGLRenderbuffer*);
+ static PassRefPtrWillBeRawPtr<WebGLFramebuffer::WebGLAttachment> create(WebGLRenderbuffer*);
+
+ virtual void trace(Visitor*) OVERRIDE;
private:
- WebGLRenderbufferAttachment(WebGLRenderbuffer*);
+ explicit WebGLRenderbufferAttachment(WebGLRenderbuffer*);
+ WebGLRenderbufferAttachment() { }
+
virtual GLsizei width() const OVERRIDE;
virtual GLsizei height() const OVERRIDE;
virtual GLenum format() const OVERRIDE;
virtual void attach(blink::WebGraphicsContext3D*, GLenum attachment) OVERRIDE;
virtual void unattach(blink::WebGraphicsContext3D*, GLenum attachment) OVERRIDE;
- WebGLRenderbufferAttachment() { };
-
- RefPtr<WebGLRenderbuffer> m_renderbuffer;
+ RefPtrWillBeMember<WebGLRenderbuffer> m_renderbuffer;
};
- PassRefPtr<WebGLFramebuffer::WebGLAttachment> WebGLRenderbufferAttachment::create(WebGLRenderbuffer* renderbuffer)
+ PassRefPtrWillBeRawPtr<WebGLFramebuffer::WebGLAttachment> WebGLRenderbufferAttachment::create(WebGLRenderbuffer* renderbuffer)
+ {
+ return adoptRefWillBeNoop(new WebGLRenderbufferAttachment(renderbuffer));
+ }
+
+ void WebGLRenderbufferAttachment::trace(Visitor* visitor)
{
- return adoptRef(new WebGLRenderbufferAttachment(renderbuffer));
+ visitor->trace(m_renderbuffer);
+ WebGLFramebuffer::WebGLAttachment::trace(visitor);
}
WebGLRenderbufferAttachment::WebGLRenderbufferAttachment(WebGLRenderbuffer* renderbuffer)
class WebGLTextureAttachment FINAL : public WebGLFramebuffer::WebGLAttachment {
public:
- static PassRefPtr<WebGLFramebuffer::WebGLAttachment> create(WebGLTexture*, GLenum target, GLint level);
+ static PassRefPtrWillBeRawPtr<WebGLFramebuffer::WebGLAttachment> create(WebGLTexture*, GLenum target, GLint level);
+
+ virtual void trace(Visitor*) OVERRIDE;
private:
WebGLTextureAttachment(WebGLTexture*, GLenum target, GLint level);
+ WebGLTextureAttachment() { }
+
virtual GLsizei width() const OVERRIDE;
virtual GLsizei height() const OVERRIDE;
virtual GLenum format() const OVERRIDE;
virtual void attach(blink::WebGraphicsContext3D*, GLenum attachment) OVERRIDE;
virtual void unattach(blink::WebGraphicsContext3D*, GLenum attachment) OVERRIDE;
- WebGLTextureAttachment() { };
-
- RefPtr<WebGLTexture> m_texture;
+ RefPtrWillBeMember<WebGLTexture> m_texture;
GLenum m_target;
GLint m_level;
};
- PassRefPtr<WebGLFramebuffer::WebGLAttachment> WebGLTextureAttachment::create(WebGLTexture* texture, GLenum target, GLint level)
+ PassRefPtrWillBeRawPtr<WebGLFramebuffer::WebGLAttachment> WebGLTextureAttachment::create(WebGLTexture* texture, GLenum target, GLint level)
+ {
+ return adoptRefWillBeNoop(new WebGLTextureAttachment(texture, target, level));
+ }
+
+ void WebGLTextureAttachment::trace(Visitor* visitor)
{
- return adoptRef(new WebGLTextureAttachment(texture, target, level));
+ visitor->trace(m_texture);
+ WebGLFramebuffer::WebGLAttachment::trace(visitor);
}
WebGLTextureAttachment::WebGLTextureAttachment(WebGLTexture* texture, GLenum target, GLint level)
{
}
-PassRefPtr<WebGLFramebuffer> WebGLFramebuffer::create(WebGLRenderingContextBase* ctx)
+PassRefPtrWillBeRawPtr<WebGLFramebuffer> WebGLFramebuffer::create(WebGLRenderingContextBase* ctx)
{
- return adoptRef(new WebGLFramebuffer(ctx));
+ return adoptRefWillBeNoop(new WebGLFramebuffer(ctx));
}
WebGLFramebuffer::WebGLFramebuffer(WebGLRenderingContextBase* ctx)
WebGLFramebuffer::~WebGLFramebuffer()
{
- deleteObject(0);
+ // 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();
}
void WebGLFramebuffer::setAttachmentForBoundFramebuffer(GLenum attachment, GLenum texTarget, WebGLTexture* texture, GLint level)
void WebGLFramebuffer::deleteObjectImpl(blink::WebGraphicsContext3D* context3d, Platform3DObject object)
{
+#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 (AttachmentMap::iterator it = m_attachments.begin(); it != m_attachments.end(); ++it)
it->value->onDetached(context3d);
+#endif
context3d->deleteFramebuffer(object);
}
return GL_NONE;
}
+void WebGLFramebuffer::trace(Visitor* visitor)
+{
+#if ENABLE(OILPAN)
+ visitor->trace(m_attachments);
+#endif
+ WebGLContextObject::trace(visitor);
+}
+
}