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 |