Chromium Code Reviews| Index: Source/core/html/canvas/WebGLSharedObject.h |
| diff --git a/Source/core/html/canvas/WebGLSharedObject.h b/Source/core/html/canvas/WebGLSharedObject.h |
| index 6c33471ba7fb52b7235e0e8da1211dc32a586337..eca028d8a14de8cb10dd21f694a9e287fa730007 100644 |
| --- a/Source/core/html/canvas/WebGLSharedObject.h |
| +++ b/Source/core/html/canvas/WebGLSharedObject.h |
| @@ -26,36 +26,59 @@ |
| #ifndef WebGLSharedObject_h |
| #define WebGLSharedObject_h |
| +#include "core/dom/ScriptExecutionContext.h" |
| #include "core/html/canvas/WebGLObject.h" |
| +#include "wtf/Deque.h" |
| +#include "wtf/HashMap.h" |
| namespace WebCore { |
| class GraphicsContext3D; |
| +class WebGLAcquireSharedResourceCallback; |
| class WebGLContextGroup; |
| class WebGLRenderingContext; |
| +class WebGLSharedObject; |
| +class WebGLAcquireSharedResourceRequest; |
| // WebGLSharedObject the base class for objects that can be shared by multiple |
| // WebGLRenderingContexts. |
| class WebGLSharedObject : public WebGLObject { |
| public: |
| + enum AcquireMode { |
| + Unacquired = 0, |
| + ReadOnly = 1, |
| + Exclusive = 4, |
| + }; |
| + |
| virtual ~WebGLSharedObject(); |
| + static bool IntToAcquireMode(unsigned, AcquireMode*); |
|
Ken Russell (switch to Gerrit)
2013/06/19 03:51:24
nit: I think Blink naming convention is intToAcqui
greggman
2013/06/21 19:54:21
Done.
|
| + |
| WebGLContextGroup* contextGroup() const { return m_contextGroup; } |
| virtual bool isBuffer() const { return false; } |
| - virtual bool isFramebuffer() const { return false; } |
| virtual bool isProgram() const { return false; } |
| virtual bool isRenderbuffer() const { return false; } |
| virtual bool isShader() const { return false; } |
| virtual bool isTexture() const { return false; } |
| - virtual bool validate(const WebGLContextGroup* contextGroup, const WebGLRenderingContext*) const |
| - { |
| - return contextGroup == m_contextGroup; |
| - } |
| + virtual const char* typeName() const = 0; |
| + |
| + bool validate(const char*, WebGLRenderingContext*, WebGLSharedObject::AcquireMode, bool, bool*) const; |
| void detachContextGroup(); |
| + bool isAcquiredForContext(const WebGLRenderingContext*, WebGLSharedObject::AcquireMode, bool, bool*, const char**) const; |
| + bool hasBeenBoundInContextSinceLastAcquire(const WebGLRenderingContext*); |
| + void markAsBoundSinceLastAcquireForContext(const WebGLRenderingContext*); |
| + bool addAcquireRequest(WebGLRenderingContext*, WebGLSharedObject::AcquireMode, PassRefPtr<WebGLAcquireSharedResourceCallback>, long&); |
| + // cancels an acquire request. Returns true if id was found. |
| + bool cancelAcquireRequest(const WebGLRenderingContext*, long); |
| + bool release(WebGLRenderingContext*); |
| + |
| + void processAcquireRequests(); |
| + void removePostedAcquireRequest(const WebGLRenderingContext*, long); |
| + |
| protected: |
| WebGLSharedObject(WebGLRenderingContext*); |
| @@ -67,9 +90,63 @@ protected: |
| virtual GraphicsContext3D* getAGraphicsContext3D() const; |
| private: |
| + class DispatchCallbackTask : public ScriptExecutionContext::Task { |
| + public: |
| + DispatchCallbackTask(PassRefPtr<WebGLAcquireSharedResourceRequest> request) |
| + : m_request(request) |
| + { |
| + } |
| + ~DispatchCallbackTask(); |
| + |
| + virtual void performTask(ScriptExecutionContext*); |
| + |
| + private: |
| + RefPtr<WebGLAcquireSharedResourceRequest> m_request; |
| + }; |
| + |
| + typedef HashMap<const WebGLRenderingContext*, bool> AcquireContextMap; |
| + typedef Deque<RefPtr<WebGLAcquireSharedResourceRequest> > AcquireRequestQueue; |
| + typedef Deque<RefPtr<WebGLAcquireSharedResourceRequest> > AcquireRequestList; |
| + |
| + bool acquire(WebGLSharedObject::AcquireMode, const WebGLRenderingContext*); |
| + bool isRequestPending(const WebGLRenderingContext*); |
| + |
| WebGLContextGroup* m_contextGroup; |
| + |
| + WebGLSharedObject::AcquireMode m_acquireMode; |
| + |
| + // A map of contexts that currently have this resource acquired. |
| + // and whether or not it's been bound since last acquired. |
| + AcquireContextMap m_acquireContextMap; |
| + |
| + AcquireRequestQueue m_acquireRequestQueue; // requests that are waiting for resources. |
| + AcquireRequestList m_acquireRequestPostedList; // requests what have had script tasks posted but the script has not executed. |
| +}; |
| + |
| +class WebGLAcquireSharedResourceRequest : public RefCounted<WebGLAcquireSharedResourceRequest> { |
| +public: |
| + static PassRefPtr<WebGLAcquireSharedResourceRequest> create(PassRefPtr<WebGLSharedObject>, PassRefPtr<WebGLAcquireSharedResourceCallback>, WebGLSharedObject::AcquireMode, WebGLRenderingContext*, long); |
| + ~WebGLAcquireSharedResourceRequest(); |
| + |
| + long id() const { return m_id; } |
| + WebGLRenderingContext* context() const { return m_context; } |
| + WebGLSharedObject::AcquireMode acquireMode() const { return m_acquireMode; } |
| + void cancel(); |
| + |
| + // Run the callback. |
| + void run(); |
| + |
| +private: |
| + WebGLAcquireSharedResourceRequest(PassRefPtr<WebGLSharedObject>, PassRefPtr<WebGLAcquireSharedResourceCallback>, WebGLSharedObject::AcquireMode, WebGLRenderingContext*, long); |
| + |
| + RefPtr<WebGLSharedObject> m_sharedObject; |
| + WebGLRenderingContext* m_context; |
|
Ken Russell (switch to Gerrit)
2013/06/19 03:51:24
How about a comment: // Weak, but context is kept
greggman
2013/06/21 19:54:21
Done.
|
| + long m_id; |
| + WebGLSharedObject::AcquireMode m_acquireMode; |
| + RefPtr<WebGLAcquireSharedResourceCallback> m_callback; |
| }; |
| + |
| } // namespace WebCore |
| #endif // WebGLSharedObject_h |