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..054316a4ef8b411dd2773370b969e3c932910969 100644 |
--- a/Source/core/html/canvas/WebGLSharedObject.h |
+++ b/Source/core/html/canvas/WebGLSharedObject.h |
@@ -26,35 +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(); |
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 |
+ virtual const char* typeName() const = 0; |
+ |
+ bool validate(const char*, WebGLRenderingContext*, WebGLSharedObject::AcquireMode, bool, bool*) const; |
+ |
+ void detachContextGroup(); |
+ |
+ bool isLost() const |
{ |
- return contextGroup == m_contextGroup; |
+ return !m_contextGroup; |
} |
+ 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 detachContextGroup(); |
+ void cancelAllPendingRequestsForContext(const WebGLRenderingContext*); |
protected: |
WebGLSharedObject(WebGLRenderingContext*); |
@@ -67,9 +91,68 @@ protected: |
virtual GraphicsContext3D* getAGraphicsContext3D() const; |
private: |
+ friend class WebGLAcquireSharedResourceRequest; |
+ 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*); |
+ void processAcquireRequests(); |
+ void removePostedAcquireRequest(const WebGLRenderingContext*, long); |
+ static int generateAcquireRequestId(); |
+ |
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; |
+ // This weak pointer is okay because on context destruction we remove all outstanding requests. |
+ WebGLRenderingContext* m_context; |
+ long m_id; |
+ WebGLSharedObject::AcquireMode m_acquireMode; |
+ RefPtr<WebGLAcquireSharedResourceCallback> m_callback; |
+}; |
+ |
+ |
} // namespace WebCore |
#endif // WebGLSharedObject_h |