| 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..0afe5b85515989852d4f7fe6b2a90b0376ad48d6 100644
|
| --- a/Source/core/html/canvas/WebGLSharedObject.h
|
| +++ b/Source/core/html/canvas/WebGLSharedObject.h
|
| @@ -26,36 +26,57 @@
|
| #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*);
|
| +
|
| 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;
|
| - }
|
| + 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 +88,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;
|
| + long m_id;
|
| + WebGLSharedObject::AcquireMode m_acquireMode;
|
| + RefPtr<WebGLAcquireSharedResourceCallback> m_callback;
|
| +};
|
| +
|
| +
|
| } // namespace WebCore
|
|
|
| #endif // WebGLSharedObject_h
|
|
|