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

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
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

Powered by Google App Engine
This is Rietveld 408576698