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

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

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: Rebased + Nullable<traceable-value> workaround Created 6 years, 5 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.h
diff --git a/Source/core/html/canvas/WebGLRenderingContextBase.h b/Source/core/html/canvas/WebGLRenderingContextBase.h
index bbff14c5823c38ea403d4a986b5aa1526e49b7dd..35eee457bb75f578c9522c1cd0febdec0e85fa89 100644
--- a/Source/core/html/canvas/WebGLRenderingContextBase.h
+++ b/Source/core/html/canvas/WebGLRenderingContextBase.h
@@ -98,6 +98,33 @@ class WebGLVertexArrayObjectOES;
class WebGLRenderingContextLostCallback;
class WebGLRenderingContextErrorMessageCallback;
+
+#if ENABLE(OILPAN)
+// The finalization of the attached WebGLContextObjects is done with respect to the
+// blink::WebGraphicsContext3D object of this object's DrawingBuffer.
+// With Oilpan, we need to keep this DrawingBuffer (=> its blink::WebGraphicsContext3D)
+// alive until all such finalizers have run. Make the WebGLContextObjects keep
+// a RefPtr to an off-heap object that handles the eventual release of the
+// underlying DrawingBuffer when all the finalizers have run.
+//
+// FIXME: move this into header + implementation files of its own once settled.
+class WebGLSharedWebGraphicsContext3D FINAL : public RefCounted<WebGLSharedWebGraphicsContext3D> {
+public:
+ static PassRefPtr<WebGLSharedWebGraphicsContext3D> create(PassRefPtr<DrawingBuffer>);
+
+ ~WebGLSharedWebGraphicsContext3D();
+
+ void reset();
+ void update(PassRefPtr<DrawingBuffer>);
+
+ blink::WebGraphicsContext3D* webContext() { return m_buffer ? m_buffer->context() : 0; }
+private:
+ explicit WebGLSharedWebGraphicsContext3D(PassRefPtr<DrawingBuffer>);
+
+ RefPtr<DrawingBuffer> m_buffer;
+};
+#endif
+
class WebGLRenderingContextBase: public CanvasRenderingContext, public ActiveDOMObject, public Page::MultisamplingChangedObserver {
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(WebGLRenderingContextBase);
public:
@@ -147,12 +174,12 @@ public:
void copyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
void copyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- PassRefPtr<WebGLBuffer> createBuffer();
- PassRefPtr<WebGLFramebuffer> createFramebuffer();
- PassRefPtr<WebGLProgram> createProgram();
- PassRefPtr<WebGLRenderbuffer> createRenderbuffer();
- PassRefPtr<WebGLShader> createShader(GLenum type);
- PassRefPtr<WebGLTexture> createTexture();
+ PassRefPtrWillBeRawPtr<WebGLBuffer> createBuffer();
+ PassRefPtrWillBeRawPtr<WebGLFramebuffer> createFramebuffer();
+ PassRefPtrWillBeRawPtr<WebGLProgram> createProgram();
+ PassRefPtrWillBeRawPtr<WebGLRenderbuffer> createRenderbuffer();
+ PassRefPtrWillBeRawPtr<WebGLShader> createShader(GLenum type);
+ PassRefPtrWillBeRawPtr<WebGLTexture> createTexture();
void cullFace(GLenum mode);
@@ -184,14 +211,15 @@ public:
void frontFace(GLenum mode);
void generateMipmap(GLenum target);
- PassRefPtr<WebGLActiveInfo> getActiveAttrib(WebGLProgram*, GLuint index);
- PassRefPtr<WebGLActiveInfo> getActiveUniform(WebGLProgram*, GLuint index);
- Nullable<Vector<RefPtr<WebGLShader> > > getAttachedShaders(WebGLProgram*);
+ PassRefPtrWillBeRawPtr<WebGLActiveInfo> getActiveAttrib(WebGLProgram*, GLuint index);
+ PassRefPtrWillBeRawPtr<WebGLActiveInfo> getActiveUniform(WebGLProgram*, GLuint index);
+ bool getAttachedShaders(WebGLProgram*, WillBeHeapVector<RefPtrWillBeMember<WebGLShader> >&);
+ Nullable<WillBeHeapVector<RefPtrWillBeMember<WebGLShader> > > getAttachedShaders(WebGLProgram*);
GLint getAttribLocation(WebGLProgram*, const String& name);
WebGLGetInfo getBufferParameter(GLenum target, GLenum pname);
- PassRefPtr<WebGLContextAttributes> getContextAttributes();
+ PassRefPtrWillBeRawPtr<WebGLContextAttributes> getContextAttributes();
GLenum getError();
- PassRefPtr<WebGLExtension> getExtension(const String& name);
+ PassRefPtrWillBeRawPtr<WebGLExtension> getExtension(const String& name);
WebGLGetInfo getFramebufferAttachmentParameter(GLenum target, GLenum attachment, GLenum pname);
WebGLGetInfo getParameter(GLenum pname);
WebGLGetInfo getProgramParameter(WebGLProgram*, GLenum pname);
@@ -199,12 +227,12 @@ public:
WebGLGetInfo getRenderbufferParameter(GLenum target, GLenum pname);
WebGLGetInfo getShaderParameter(WebGLShader*, GLenum pname);
String getShaderInfoLog(WebGLShader*);
- PassRefPtr<WebGLShaderPrecisionFormat> getShaderPrecisionFormat(GLenum shaderType, GLenum precisionType);
+ PassRefPtrWillBeRawPtr<WebGLShaderPrecisionFormat> getShaderPrecisionFormat(GLenum shaderType, GLenum precisionType);
String getShaderSource(WebGLShader*);
Nullable<Vector<String> > getSupportedExtensions();
WebGLGetInfo getTexParameter(GLenum target, GLenum pname);
WebGLGetInfo getUniform(WebGLProgram*, const WebGLUniformLocation*);
- PassRefPtr<WebGLUniformLocation> getUniformLocation(WebGLProgram*, const String&);
+ PassRefPtrWillBeRawPtr<WebGLUniformLocation> getUniformLocation(WebGLProgram*, const String&);
WebGLGetInfo getVertexAttrib(GLuint index, GLenum pname);
long long getVertexAttribOffset(GLuint index, GLenum pname);
@@ -350,10 +378,23 @@ public:
virtual void stop() OVERRIDE;
void setSavingImage(bool isSaving) { m_savingImage = isSaving; }
+
+ virtual void trace(Visitor*) OVERRIDE;
+
+ class TextureUnitState {
+ ALLOW_ONLY_INLINE_ALLOCATION();
+ public:
+ RefPtrWillBeMember<WebGLTexture> m_texture2DBinding;
+ RefPtrWillBeMember<WebGLTexture> m_textureCubeMapBinding;
+
+ void trace(Visitor*);
+ };
+
protected:
friend class WebGLDrawBuffers;
friend class WebGLFramebuffer;
friend class WebGLObject;
+ friend class WebGLContextObject;
friend class OESVertexArrayObject;
friend class WebGLDebugShaders;
friend class WebGLCompressedTextureATC;
@@ -369,6 +410,10 @@ protected:
void initializeNewContext();
void setupFlags();
+#if ENABLE(OILPAN)
+ PassRefPtr<WebGLSharedWebGraphicsContext3D> sharedWebGraphicsContext3D() { return m_sharedWebGraphicsContext3D; }
+#endif
+
void addSharedObject(WebGLSharedObject*);
void addContextObject(WebGLContextObject*);
void detachAndRemoveAllObjects();
@@ -403,6 +448,10 @@ protected:
// Structure for rendering to a DrawingBuffer, instead of directly
// to the back-buffer of m_context.
RefPtr<DrawingBuffer> m_drawingBuffer;
+#if ENABLE(OILPAN)
+ RefPtr<WebGLSharedWebGraphicsContext3D> m_sharedWebGraphicsContext3D;
+#endif
+
RefPtr<WebGLContextGroup> m_contextGroup;
// Dispatches a context lost event once it is determined that one is needed.
@@ -416,17 +465,17 @@ protected:
bool m_needsUpdate;
bool m_markedCanvasDirty;
- HashSet<WebGLContextObject*> m_contextObjects;
+ WillBeHeapHashSet<RawPtrWillBeWeakMember<WebGLContextObject> > m_contextObjects;
- OwnPtr<WebGLRenderingContextLostCallback> m_contextLostCallbackAdapter;
- OwnPtr<WebGLRenderingContextErrorMessageCallback> m_errorMessageCallbackAdapter;
+ OwnPtrWillBeMember<WebGLRenderingContextLostCallback> m_contextLostCallbackAdapter;
+ OwnPtrWillBeMember<WebGLRenderingContextErrorMessageCallback> m_errorMessageCallbackAdapter;
// List of bound VBO's. Used to maintain info about sizes for ARRAY_BUFFER and stored values for ELEMENT_ARRAY_BUFFER
- RefPtr<WebGLBuffer> m_boundArrayBuffer;
+ RefPtrWillBeMember<WebGLBuffer> m_boundArrayBuffer;
- RefPtr<WebGLVertexArrayObjectOES> m_defaultVertexArrayObject;
- RefPtr<WebGLVertexArrayObjectOES> m_boundVertexArrayObject;
- void setBoundVertexArrayObject(PassRefPtr<WebGLVertexArrayObjectOES> arrayObject)
+ RefPtrWillBeMember<WebGLVertexArrayObjectOES> m_defaultVertexArrayObject;
+ RefPtrWillBeMember<WebGLVertexArrayObjectOES> m_boundVertexArrayObject;
+ void setBoundVertexArrayObject(PassRefPtrWillBeRawPtr<WebGLVertexArrayObjectOES> arrayObject)
{
if (arrayObject)
m_boundVertexArrayObject = arrayObject;
@@ -453,25 +502,21 @@ protected:
};
Vector<VertexAttribValue> m_vertexAttribValue;
unsigned m_maxVertexAttribs;
- RefPtr<WebGLBuffer> m_vertexAttrib0Buffer;
+ RefPtrWillBeMember<WebGLBuffer> m_vertexAttrib0Buffer;
long m_vertexAttrib0BufferSize;
GLfloat m_vertexAttrib0BufferValue[4];
bool m_forceAttrib0BufferRefill;
bool m_vertexAttrib0UsedBefore;
- RefPtr<WebGLProgram> m_currentProgram;
- RefPtr<WebGLFramebuffer> m_framebufferBinding;
- RefPtr<WebGLRenderbuffer> m_renderbufferBinding;
- class TextureUnitState {
- public:
- RefPtr<WebGLTexture> m_texture2DBinding;
- RefPtr<WebGLTexture> m_textureCubeMapBinding;
- };
- Vector<TextureUnitState> m_textureUnits;
+ RefPtrWillBeMember<WebGLProgram> m_currentProgram;
+ RefPtrWillBeMember<WebGLFramebuffer> m_framebufferBinding;
+ RefPtrWillBeMember<WebGLRenderbuffer> m_renderbufferBinding;
+
+ WillBeHeapVector<TextureUnitState> m_textureUnits;
unsigned long m_activeTextureUnit;
- RefPtr<WebGLTexture> m_blackTexture2D;
- RefPtr<WebGLTexture> m_blackTextureCubeMap;
+ RefPtrWillBeMember<WebGLTexture> m_blackTexture2D;
+ RefPtrWillBeMember<WebGLTexture> m_blackTextureCubeMap;
Vector<GLenum> m_compressedTextureFormats;
@@ -508,7 +553,7 @@ protected:
GLenum m_unpackColorspaceConversion;
bool m_contextLost;
LostContextMode m_contextLostMode;
- RefPtr<WebGLContextAttributes> m_requestedAttributes;
+ RefPtrWillBeMember<WebGLContextAttributes> m_requestedAttributes;
bool m_layerCleared;
GLfloat m_clearColor[4];
@@ -545,7 +590,7 @@ protected:
DraftExtension = 0x01,
};
- class ExtensionTracker {
+ class ExtensionTracker : public NoBaseWillBeGarbageCollected<ExtensionTracker> {
public:
ExtensionTracker(ExtensionFlags flags, const char* const* prefixes)
: m_draft(flags & DraftExtension)
@@ -553,9 +598,11 @@ protected:
{
}
+#if !ENABLE(OILPAN)
virtual ~ExtensionTracker()
{
}
+#endif
bool draft() const
{
@@ -565,11 +612,13 @@ protected:
const char* const* prefixes() const;
bool matchesNameWithPrefixes(const String&) const;
- virtual PassRefPtr<WebGLExtension> getExtension(WebGLRenderingContextBase*) = 0;
+ virtual PassRefPtrWillBeRawPtr<WebGLExtension> getExtension(WebGLRenderingContextBase*) = 0;
virtual bool supported(WebGLRenderingContextBase*) const = 0;
virtual const char* extensionName() const = 0;
virtual void loseExtension() = 0;
+ virtual void trace(Visitor*) { }
+
private:
bool m_draft;
const char* const* m_prefixes;
@@ -578,13 +627,12 @@ protected:
template <typename T>
class TypedExtensionTracker FINAL : public ExtensionTracker {
public:
- TypedExtensionTracker(RefPtr<T>& extensionField, ExtensionFlags flags, const char* const* prefixes)
- : ExtensionTracker(flags, prefixes)
- , m_extensionField(extensionField)
- , m_extension(nullptr)
+ static PassOwnPtrWillBeRawPtr<TypedExtensionTracker<T> > create(RefPtrWillBeMember<T>& extensionField, ExtensionFlags flags, const char* const* prefixes)
{
+ return adoptPtrWillBeNoop(new TypedExtensionTracker<T>(extensionField, flags, prefixes));
}
+#if !ENABLE(OILPAN)
virtual ~TypedExtensionTracker()
{
if (m_extension) {
@@ -592,8 +640,9 @@ protected:
m_extension = nullptr;
}
}
+#endif
- virtual PassRefPtr<WebGLExtension> getExtension(WebGLRenderingContextBase* context) OVERRIDE
+ virtual PassRefPtrWillBeRawPtr<WebGLExtension> getExtension(WebGLRenderingContextBase* context) OVERRIDE
{
if (!m_extension) {
m_extension = T::create(context);
@@ -622,20 +671,33 @@ protected:
}
}
+ virtual void trace(Visitor* visitor) OVERRIDE
+ {
+ visitor->trace(m_extension);
+ visitor->trace(m_extensionField);
+ ExtensionTracker::trace(visitor);
+ }
+
private:
- RefPtr<T>& m_extensionField;
+ TypedExtensionTracker(RefPtrWillBeMember<T>& extensionField, ExtensionFlags flags, const char* const* prefixes)
+ : ExtensionTracker(flags, prefixes)
+ , m_extensionField(extensionField)
+ {
+ }
+
+ RefPtrWillBeMember<T>& m_extensionField;
// ExtensionTracker holds it's own reference to the extension to ensure
// that it is not deleted before this object's destructor is called
- RefPtr<T> m_extension;
+ RefPtrWillBeMember<T> m_extension;
};
bool m_extensionEnabled[WebGLExtensionNameCount];
- Vector<ExtensionTracker*> m_extensions;
+ WillBeHeapVector<OwnPtrWillBeMember<ExtensionTracker> > m_extensions;
template <typename T>
- void registerExtension(RefPtr<T>& extensionPtr, ExtensionFlags flags = ApprovedExtension, const char* const* prefixes = 0)
+ void registerExtension(RefPtrWillBeMember<T>& extensionPtr, ExtensionFlags flags = ApprovedExtension, const char* const* prefixes = 0)
{
- m_extensions.append(new TypedExtensionTracker<T>(extensionPtr, flags, prefixes));
+ m_extensions.append(TypedExtensionTracker<T>::create(extensionPtr, flags, prefixes));
}
bool extensionSupportedAndAllowed(const ExtensionTracker*);
@@ -909,4 +971,6 @@ DEFINE_TYPE_CASTS(WebGLRenderingContextBase, CanvasRenderingContext, context, co
} // namespace WebCore
+WTF_ALLOW_MOVE_INIT_AND_COMPARE_WITH_MEM_FUNCTIONS(WebCore::WebGLRenderingContextBase::TextureUnitState);
+
#endif // WebGLRenderingContextBase_h

Powered by Google App Engine
This is Rietveld 408576698