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

Unified Diff: Source/core/html/canvas/WebGLRenderingContextBase.cpp

Issue 365653002: Oilpan: move 2D Canvas and WebGL objects to the heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Complete VectorTraits<> specialization for VertexAttribState Created 6 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 side-by-side diff with in-line comments
Download patch
Index: Source/core/html/canvas/WebGLRenderingContextBase.cpp
diff --git a/Source/core/html/canvas/WebGLRenderingContextBase.cpp b/Source/core/html/canvas/WebGLRenderingContextBase.cpp
index a43902f1941d5dd462835923d0b253982bbc6f58..f83acd1abb04b6e2f6428e777398e1bf51ce3508 100644
--- a/Source/core/html/canvas/WebGLRenderingContextBase.cpp
+++ b/Source/core/html/canvas/WebGLRenderingContextBase.cpp
@@ -462,8 +462,9 @@ namespace {
} // namespace anonymous
class ScopedTexture2DRestorer {
+ STACK_ALLOCATED();
public:
- ScopedTexture2DRestorer(WebGLRenderingContextBase* context)
+ explicit ScopedTexture2DRestorer(WebGLRenderingContextBase* context)
: m_context(context)
{
}
@@ -474,7 +475,7 @@ public:
}
private:
- WebGLRenderingContextBase* m_context;
+ RawPtrWillBeMember<WebGLRenderingContextBase> m_context;
};
class WebGLRenderingContextLostCallback : public blink::WebGraphicsContext3D::WebGraphicsContextLostCallback {
@@ -484,6 +485,8 @@ public:
virtual void onContextLost() { m_context->forceLostContext(WebGLRenderingContextBase::RealLostContext); }
virtual ~WebGLRenderingContextLostCallback() {}
private:
+ // Oilpan: kept as a bare pointer, with WebGLRenderingContextBase ensuring
+ // that it will not be used past its lifetime.
WebGLRenderingContextBase* m_context;
haraken 2014/07/02 07:47:38 Would you add a comment about why we can't make it
sof 2014/07/02 11:43:53 That creates a leak of WebGLRenderingContextBase o
};
@@ -499,6 +502,8 @@ public:
}
virtual ~WebGLRenderingContextErrorMessageCallback() { }
private:
+ // Oilpan: kept as a bare pointer, with WebGLRenderingContextBase ensuring
+ // that it will not be used past its lifetime.
WebGLRenderingContextBase* m_context;
haraken 2014/07/02 07:47:38 Ditto.
};
@@ -672,6 +677,7 @@ unsigned WebGLRenderingContextBase::getWebGLVersion(const CanvasRenderingContext
WebGLRenderingContextBase::~WebGLRenderingContextBase()
{
+#if !ENABLE(OILPAN)
// Remove all references to WebGLObjects so if they are the last reference
// they will be freed before the last context is removed from the context group.
m_boundArrayBuffer = nullptr;
@@ -700,16 +706,13 @@ WebGLRenderingContextBase::~WebGLRenderingContextBase()
// WebGraphicsContext3D, otherwise shared objects may not be properly deleted.
m_contextGroup->removeContext(this);
- destroyContext();
-
-#if !ENABLE(OILPAN)
- if (m_multisamplingObserverRegistered) {
- Page* page = canvas()->document().page();
- if (page)
+ if (m_multisamplingObserverRegistered)
+ if (Page* page = canvas()->document().page())
page->removeMultisamplingChangedObserver(this);
- }
#endif
+ destroyContext();
haraken 2014/07/02 07:47:38 It looks safe to call destroyContext() in the dest
+
willDestroyContext(this);
haraken 2014/07/02 07:47:39 Not related to this CL, it looks strange we call w
sof 2014/07/02 11:43:53 Sort of agree, but it does a bit more.
}
@@ -760,7 +763,7 @@ bool WebGLRenderingContextBase::clearIfComposited(GLbitfield mask)
|| m_requestedAttributes->preserveDrawingBuffer() || (mask && m_framebufferBinding))
return false;
- RefPtr<WebGLContextAttributes> contextAttributes = getContextAttributes();
+ RefPtrWillBeRawPtr<WebGLContextAttributes> contextAttributes = getContextAttributes();
// Determine if it's possible to combine the clear the user asked for and this clear.
bool combinedClear = mask && !m_scissorEnabled;
@@ -1487,47 +1490,47 @@ void WebGLRenderingContextBase::copyTexSubImage2D(GLenum target, GLint level, GL
webContext()->copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
}
-PassRefPtr<WebGLBuffer> WebGLRenderingContextBase::createBuffer()
+PassRefPtrWillBeRawPtr<WebGLBuffer> WebGLRenderingContextBase::createBuffer()
{
if (isContextLost())
return nullptr;
- RefPtr<WebGLBuffer> o = WebGLBuffer::create(this);
+ RefPtrWillBeRawPtr<WebGLBuffer> o = WebGLBuffer::create(this);
addSharedObject(o.get());
return o;
haraken 2014/07/02 07:47:38 This should be o.release(). The same comment for o
sof 2014/07/02 11:43:53 Alright, added.
}
-PassRefPtr<WebGLFramebuffer> WebGLRenderingContextBase::createFramebuffer()
+PassRefPtrWillBeRawPtr<WebGLFramebuffer> WebGLRenderingContextBase::createFramebuffer()
{
if (isContextLost())
return nullptr;
- RefPtr<WebGLFramebuffer> o = WebGLFramebuffer::create(this);
+ RefPtrWillBeRawPtr<WebGLFramebuffer> o = WebGLFramebuffer::create(this);
addContextObject(o.get());
return o;
}
-PassRefPtr<WebGLTexture> WebGLRenderingContextBase::createTexture()
+PassRefPtrWillBeRawPtr<WebGLTexture> WebGLRenderingContextBase::createTexture()
{
if (isContextLost())
return nullptr;
- RefPtr<WebGLTexture> o = WebGLTexture::create(this);
+ RefPtrWillBeRawPtr<WebGLTexture> o = WebGLTexture::create(this);
addSharedObject(o.get());
return o;
}
-PassRefPtr<WebGLProgram> WebGLRenderingContextBase::createProgram()
+PassRefPtrWillBeRawPtr<WebGLProgram> WebGLRenderingContextBase::createProgram()
{
if (isContextLost())
return nullptr;
- RefPtr<WebGLProgram> o = WebGLProgram::create(this);
+ RefPtrWillBeRawPtr<WebGLProgram> o = WebGLProgram::create(this);
addSharedObject(o.get());
return o;
}
-PassRefPtr<WebGLRenderbuffer> WebGLRenderingContextBase::createRenderbuffer()
+PassRefPtrWillBeRawPtr<WebGLRenderbuffer> WebGLRenderingContextBase::createRenderbuffer()
{
if (isContextLost())
return nullptr;
- RefPtr<WebGLRenderbuffer> o = WebGLRenderbuffer::create(this);
+ RefPtrWillBeRawPtr<WebGLRenderbuffer> o = WebGLRenderbuffer::create(this);
addSharedObject(o.get());
return o;
}
@@ -1544,7 +1547,7 @@ WebGLRenderbuffer* WebGLRenderingContextBase::ensureEmulatedStencilBuffer(GLenum
return renderbuffer->emulatedStencilBuffer();
}
-PassRefPtr<WebGLShader> WebGLRenderingContextBase::createShader(GLenum type)
+PassRefPtrWillBeRawPtr<WebGLShader> WebGLRenderingContextBase::createShader(GLenum type)
{
if (isContextLost())
return nullptr;
@@ -1553,7 +1556,7 @@ PassRefPtr<WebGLShader> WebGLRenderingContextBase::createShader(GLenum type)
return nullptr;
}
- RefPtr<WebGLShader> o = WebGLShader::create(this, type);
+ RefPtrWillBeRawPtr<WebGLShader> o = WebGLShader::create(this, type);
addSharedObject(o.get());
return o;
}
@@ -2001,7 +2004,7 @@ void WebGLRenderingContextBase::generateMipmap(GLenum target)
tex->generateMipmapLevelInfo();
}
-PassRefPtr<WebGLActiveInfo> WebGLRenderingContextBase::getActiveAttrib(WebGLProgram* program, GLuint index)
+PassRefPtrWillBeRawPtr<WebGLActiveInfo> WebGLRenderingContextBase::getActiveAttrib(WebGLProgram* program, GLuint index)
{
if (isContextLost() || !validateWebGLObject("getActiveAttrib", program))
return nullptr;
@@ -2011,7 +2014,7 @@ PassRefPtr<WebGLActiveInfo> WebGLRenderingContextBase::getActiveAttrib(WebGLProg
return WebGLActiveInfo::create(info.name, info.type, info.size);
}
-PassRefPtr<WebGLActiveInfo> WebGLRenderingContextBase::getActiveUniform(WebGLProgram* program, GLuint index)
+PassRefPtrWillBeRawPtr<WebGLActiveInfo> WebGLRenderingContextBase::getActiveUniform(WebGLProgram* program, GLuint index)
{
if (isContextLost() || !validateWebGLObject("getActiveUniform", program))
return nullptr;
@@ -2021,7 +2024,7 @@ PassRefPtr<WebGLActiveInfo> WebGLRenderingContextBase::getActiveUniform(WebGLPro
return WebGLActiveInfo::create(info.name, info.type, info.size);
}
-bool WebGLRenderingContextBase::getAttachedShaders(WebGLProgram* program, Vector<RefPtr<WebGLShader> >& shaderObjects)
+bool WebGLRenderingContextBase::getAttachedShaders(WebGLProgram* program, WillBeHeapVector<RefPtrWillBeMember<WebGLShader> >& shaderObjects)
{
shaderObjects.clear();
if (isContextLost() || !validateWebGLObject("getAttachedShaders", program))
@@ -2077,14 +2080,14 @@ WebGLGetInfo WebGLRenderingContextBase::getBufferParameter(GLenum target, GLenum
return WebGLGetInfo(static_cast<unsigned>(value));
}
-PassRefPtr<WebGLContextAttributes> WebGLRenderingContextBase::getContextAttributes()
+PassRefPtrWillBeRawPtr<WebGLContextAttributes> WebGLRenderingContextBase::getContextAttributes()
{
if (isContextLost())
return nullptr;
// We always need to return a new WebGLContextAttributes object to
// prevent the user from mutating any cached version.
blink::WebGraphicsContext3D::Attributes attrs = m_drawingBuffer->getActualAttributes();
- RefPtr<WebGLContextAttributes> attributes = m_requestedAttributes->clone();
+ RefPtrWillBeMember<WebGLContextAttributes> attributes = m_requestedAttributes->clone();
haraken 2014/07/02 07:47:38 This should be RefPtrWillBeRawPtr.
sof 2014/07/02 11:43:53 Oops, thanks - well spotted.
// Some requested attributes may not be honored, so we need to query the underlying
// context/drawing buffer and adjust accordingly.
if (m_requestedAttributes->depth() && !attrs.depth)
@@ -2137,7 +2140,7 @@ bool WebGLRenderingContextBase::extensionSupportedAndAllowed(const ExtensionTrac
}
-PassRefPtr<WebGLExtension> WebGLRenderingContextBase::getExtension(const String& name)
+PassRefPtrWillBeRawPtr<WebGLExtension> WebGLRenderingContextBase::getExtension(const String& name)
{
if (isContextLost())
return nullptr;
@@ -2148,7 +2151,7 @@ PassRefPtr<WebGLExtension> WebGLRenderingContextBase::getExtension(const String&
if (!extensionSupportedAndAllowed(tracker))
return nullptr;
- RefPtr<WebGLExtension> extension = tracker->getExtension(this);
+ RefPtrWillBeRawPtr<WebGLExtension> extension = tracker->getExtension(this);
if (extension)
m_extensionEnabled[extension->name()] = true;
return extension.release();
@@ -2184,7 +2187,7 @@ WebGLGetInfo WebGLRenderingContextBase::getFramebufferAttachmentParameter(GLenum
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
return WebGLGetInfo(GL_TEXTURE);
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
- return WebGLGetInfo(PassRefPtr<WebGLTexture>(static_cast<WebGLTexture*>(object)));
+ return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLTexture>(static_cast<WebGLTexture*>(object)));
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
{
@@ -2201,7 +2204,7 @@ WebGLGetInfo WebGLRenderingContextBase::getFramebufferAttachmentParameter(GLenum
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
return WebGLGetInfo(GL_RENDERBUFFER);
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
- return WebGLGetInfo(PassRefPtr<WebGLRenderbuffer>(static_cast<WebGLRenderbuffer*>(object)));
+ return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLRenderbuffer>(static_cast<WebGLRenderbuffer*>(object)));
default:
synthesizeGLError(GL_INVALID_ENUM, "getFramebufferAttachmentParameter", "invalid parameter name for renderbuffer attachment");
return WebGLGetInfo();
@@ -2224,7 +2227,7 @@ WebGLGetInfo WebGLRenderingContextBase::getParameter(GLenum pname)
case GL_ALPHA_BITS:
return getIntParameter(pname);
case GL_ARRAY_BUFFER_BINDING:
- return WebGLGetInfo(PassRefPtr<WebGLBuffer>(m_boundArrayBuffer));
+ return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLBuffer>(m_boundArrayBuffer.get()));
case GL_BLEND:
return getBooleanParameter(pname);
case GL_BLEND_COLOR:
@@ -2254,7 +2257,7 @@ WebGLGetInfo WebGLRenderingContextBase::getParameter(GLenum pname)
case GL_CULL_FACE_MODE:
return getUnsignedIntParameter(pname);
case GL_CURRENT_PROGRAM:
- return WebGLGetInfo(PassRefPtr<WebGLProgram>(m_currentProgram));
+ return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLProgram>(m_currentProgram.get()));
case GL_DEPTH_BITS:
if (!m_framebufferBinding && !m_requestedAttributes->depth())
return WebGLGetInfo(intZero);
@@ -2272,9 +2275,9 @@ WebGLGetInfo WebGLRenderingContextBase::getParameter(GLenum pname)
case GL_DITHER:
return getBooleanParameter(pname);
case GL_ELEMENT_ARRAY_BUFFER_BINDING:
- return WebGLGetInfo(PassRefPtr<WebGLBuffer>(m_boundVertexArrayObject->boundElementArrayBuffer()));
+ return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLBuffer>(m_boundVertexArrayObject->boundElementArrayBuffer()));
case GL_FRAMEBUFFER_BINDING:
- return WebGLGetInfo(PassRefPtr<WebGLFramebuffer>(m_framebufferBinding));
+ return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLFramebuffer>(m_framebufferBinding.get()));
case GL_FRONT_FACE:
return getUnsignedIntParameter(pname);
case GL_GENERATE_MIPMAP_HINT:
@@ -2323,7 +2326,7 @@ WebGLGetInfo WebGLRenderingContextBase::getParameter(GLenum pname)
case GL_RED_BITS:
return getIntParameter(pname);
case GL_RENDERBUFFER_BINDING:
- return WebGLGetInfo(PassRefPtr<WebGLRenderbuffer>(m_renderbufferBinding));
+ return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLRenderbuffer>(m_renderbufferBinding.get()));
case GL_RENDERER:
return WebGLGetInfo(String("WebKit WebGL"));
case GL_SAMPLE_BUFFERS:
@@ -2379,9 +2382,9 @@ WebGLGetInfo WebGLRenderingContextBase::getParameter(GLenum pname)
case GL_SUBPIXEL_BITS:
return getIntParameter(pname);
case GL_TEXTURE_BINDING_2D:
- return WebGLGetInfo(PassRefPtr<WebGLTexture>(m_textureUnits[m_activeTextureUnit].m_texture2DBinding));
+ return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLTexture>(m_textureUnits[m_activeTextureUnit].m_texture2DBinding.get()));
case GL_TEXTURE_BINDING_CUBE_MAP:
- return WebGLGetInfo(PassRefPtr<WebGLTexture>(m_textureUnits[m_activeTextureUnit].m_textureCubeMapBinding));
+ return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLTexture>(m_textureUnits[m_activeTextureUnit].m_textureCubeMapBinding.get()));
case GL_UNPACK_ALIGNMENT:
return getIntParameter(pname);
case GC3D_UNPACK_FLIP_Y_WEBGL:
@@ -2414,7 +2417,7 @@ WebGLGetInfo WebGLRenderingContextBase::getParameter(GLenum pname)
case GL_VERTEX_ARRAY_BINDING_OES: // OES_vertex_array_object
if (extensionEnabled(OESVertexArrayObjectName)) {
if (!m_boundVertexArrayObject->isDefaultObject())
- return WebGLGetInfo(PassRefPtr<WebGLVertexArrayObjectOES>(m_boundVertexArrayObject));
+ return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLVertexArrayObjectOES>(m_boundVertexArrayObject.get()));
return WebGLGetInfo();
}
synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter name, OES_vertex_array_object not enabled");
@@ -2554,7 +2557,7 @@ String WebGLRenderingContextBase::getShaderInfoLog(WebGLShader* shader)
return ensureNotNull(webContext()->getShaderInfoLog(objectOrZero(shader)));
}
-PassRefPtr<WebGLShaderPrecisionFormat> WebGLRenderingContextBase::getShaderPrecisionFormat(GLenum shaderType, GLenum precisionType)
+PassRefPtrWillBeRawPtr<WebGLShaderPrecisionFormat> WebGLRenderingContextBase::getShaderPrecisionFormat(GLenum shaderType, GLenum precisionType)
{
if (isContextLost())
return nullptr;
@@ -2790,7 +2793,7 @@ WebGLGetInfo WebGLRenderingContextBase::getUniform(WebGLProgram* program, const
return WebGLGetInfo();
}
-PassRefPtr<WebGLUniformLocation> WebGLRenderingContextBase::getUniformLocation(WebGLProgram* program, const String& name)
+PassRefPtrWillBeRawPtr<WebGLUniformLocation> WebGLRenderingContextBase::getUniformLocation(WebGLProgram* program, const String& name)
{
if (isContextLost() || !validateWebGLObject("getUniformLocation", program))
return nullptr;
@@ -2827,7 +2830,7 @@ WebGLGetInfo WebGLRenderingContextBase::getVertexAttrib(GLuint index, GLenum pna
case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
if (!state.bufferBinding || !state.bufferBinding->object())
return WebGLGetInfo();
- return WebGLGetInfo(PassRefPtr<WebGLBuffer>(state.bufferBinding));
+ return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLBuffer>(state.bufferBinding.get()));
case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
return WebGLGetInfo(state.enabled);
case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
@@ -4299,7 +4302,7 @@ void WebGLRenderingContextBase::addContextObject(WebGLContextObject* object)
void WebGLRenderingContextBase::detachAndRemoveAllObjects()
{
while (m_contextObjects.size() > 0) {
haraken 2014/07/02 07:47:38 This loop will cause an issue in oilpan builds. In
sof 2014/07/02 11:43:53 It's fine as it is; WebGLContextObject::detachCont
- HashSet<WebGLContextObject*>::iterator it = m_contextObjects.begin();
+ WillBeHeapHashSet<RawPtrWillBeWeakMember<WebGLContextObject> >::iterator it = m_contextObjects.begin();
(*it)->detachContext();
}
}
@@ -5631,7 +5634,7 @@ void WebGLRenderingContextBase::applyStencilTest()
if (m_framebufferBinding)
haveStencilBuffer = m_framebufferBinding->hasStencilBuffer();
else {
- RefPtr<WebGLContextAttributes> attributes = getContextAttributes();
+ RefPtrWillBeRawPtr<WebGLContextAttributes> attributes = getContextAttributes();
haveStencilBuffer = attributes->stencil();
}
enableOrDisable(GL_STENCIL_TEST,
@@ -5725,4 +5728,31 @@ void WebGLRenderingContextBase::findNewMaxNonDefaultTextureUnit()
m_onePlusMaxNonDefaultTextureUnit = 0;
}
+void WebGLRenderingContextBase::TextureUnitState::trace(Visitor* visitor)
+{
+ visitor->trace(m_texture2DBinding);
+ visitor->trace(m_textureCubeMapBinding);
+}
+
+void WebGLRenderingContextBase::trace(Visitor* visitor)
+{
+ visitor->trace(m_contextGroup);
+ visitor->trace(m_contextObjects);
+ visitor->trace(m_boundArrayBuffer);
+ visitor->trace(m_defaultVertexArrayObject);
+ visitor->trace(m_boundVertexArrayObject);
+ visitor->trace(m_vertexAttrib0Buffer);
+ visitor->trace(m_currentProgram);
+ visitor->trace(m_framebufferBinding);
+ visitor->trace(m_renderbufferBinding);
+ visitor->trace(m_textureUnits);
+ visitor->trace(m_blackTexture2D);
+ visitor->trace(m_blackTextureCubeMap);
+ visitor->trace(m_requestedAttributes);
+#if ENABLE(OILPAN)
+ visitor->trace(m_extensions);
+#endif
+ CanvasRenderingContext::trace(visitor);
+}
+
} // namespace WebCore

Powered by Google App Engine
This is Rietveld 408576698