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

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

Issue 17230006: Implement WEBGL_shared_resources Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 6 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
« no previous file with comments | « Source/core/html/canvas/WebGLShareGroup.idl ('k') | Source/core/html/canvas/WebGLSharedObject.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « Source/core/html/canvas/WebGLShareGroup.idl ('k') | Source/core/html/canvas/WebGLSharedObject.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698