summaryrefslogtreecommitdiffstats
path: root/cc/resource_provider.h
diff options
context:
space:
mode:
Diffstat (limited to 'cc/resource_provider.h')
-rw-r--r--cc/resource_provider.h272
1 files changed, 272 insertions, 0 deletions
diff --git a/cc/resource_provider.h b/cc/resource_provider.h
index 638cbb2..f515c11 100644
--- a/cc/resource_provider.h
+++ b/cc/resource_provider.h
@@ -1,3 +1,275 @@
// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+
+#ifndef CCResourceProvider_h
+#define CCResourceProvider_h
+
+#include "base/basictypes.h"
+#include "CCGraphicsContext.h"
+#include "GraphicsContext3D.h"
+#include "IntSize.h"
+#include "SkBitmap.h"
+#include "SkCanvas.h"
+#include "TextureCopier.h"
+#include <wtf/Deque.h>
+#include <wtf/HashMap.h>
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+#include <wtf/Vector.h>
+
+namespace WebKit {
+class WebGraphicsContext3D;
+}
+
+namespace cc {
+
+class IntRect;
+class LayerTextureSubImage;
+class TextureCopier;
+class TextureUploader;
+
+// Thread-safety notes: this class is not thread-safe and can only be called
+// from the thread it was created on (in practice, the compositor thread).
+class CCResourceProvider {
+public:
+ typedef unsigned ResourceId;
+ typedef Vector<ResourceId> ResourceIdArray;
+ typedef HashMap<ResourceId, ResourceId> ResourceIdMap;
+ enum TextureUsageHint { TextureUsageAny, TextureUsageFramebuffer };
+ enum ResourceType {
+ GLTexture = 1,
+ Bitmap,
+ };
+ struct Mailbox {
+ GC3Dbyte name[64];
+ };
+ struct TransferableResource {
+ unsigned id;
+ GC3Denum format;
+ IntSize size;
+ Mailbox mailbox;
+ };
+ typedef Vector<TransferableResource> TransferableResourceArray;
+ struct TransferableResourceList {
+ TransferableResourceList();
+ ~TransferableResourceList();
+
+ TransferableResourceArray resources;
+ unsigned syncPoint;
+ };
+
+ static PassOwnPtr<CCResourceProvider> create(CCGraphicsContext*);
+
+ virtual ~CCResourceProvider();
+
+ WebKit::WebGraphicsContext3D* graphicsContext3D();
+ TextureUploader* textureUploader() const { return m_textureUploader.get(); }
+ TextureCopier* textureCopier() const { return m_textureCopier.get(); }
+ int maxTextureSize() const { return m_maxTextureSize; }
+ unsigned numResources() const { return m_resources.size(); }
+
+ // Checks whether a resource is in use by a consumer.
+ bool inUseByConsumer(ResourceId);
+
+
+ // Producer interface.
+
+ void setDefaultResourceType(ResourceType type) { m_defaultResourceType = type; }
+ ResourceType defaultResourceType() const { return m_defaultResourceType; }
+ ResourceType resourceType(ResourceId);
+
+ // Creates a resource of the default resource type.
+ ResourceId createResource(int pool, const IntSize&, GC3Denum format, TextureUsageHint);
+
+ // You can also explicitly create a specific resource type.
+ ResourceId createGLTexture(int pool, const IntSize&, GC3Denum format, TextureUsageHint);
+ ResourceId createBitmap(int pool, const IntSize&);
+ // Wraps an external texture into a GL resource.
+ ResourceId createResourceFromExternalTexture(unsigned textureId);
+
+ void deleteResource(ResourceId);
+
+ // Deletes all resources owned by a given pool.
+ void deleteOwnedResources(int pool);
+
+ // Upload data from image, copying sourceRect (in image) into destRect (in the resource).
+ void upload(ResourceId, const uint8_t* image, const IntRect& imageRect, const IntRect& sourceRect, const IntSize& destOffset);
+
+ // Flush all context operations, kicking uploads and ensuring ordering with
+ // respect to other contexts.
+ void flush();
+
+ // Only flush the command buffer if supported.
+ // Returns true if the shallow flush occurred, false otherwise.
+ bool shallowFlushIfSupported();
+
+ // Creates accounting for a child, and associate it with a pool. Resources
+ // transfered from that child will go to that pool. Returns a child ID.
+ int createChild(int pool);
+
+ // Destroys accounting for the child, deleting all resources from that pool.
+ void destroyChild(int child);
+
+ // Gets the child->parent resource ID map.
+ const ResourceIdMap& getChildToParentMap(int child) const;
+
+ // Prepares resources to be transfered to the parent, moving them to
+ // mailboxes and serializing meta-data into TransferableResources.
+ // Resources are not removed from the CCResourceProvider, but are markes as
+ // "in use".
+ TransferableResourceList prepareSendToParent(const ResourceIdArray&);
+
+ // Prepares resources to be transfered back to the child, moving them to
+ // mailboxes and serializing meta-data into TransferableResources.
+ // Resources are removed from the CCResourceProvider. Note: the resource IDs
+ // passed are in the parent namespace and will be translated to the child
+ // namespace when returned.
+ TransferableResourceList prepareSendToChild(int child, const ResourceIdArray&);
+
+ // Receives resources from a child, moving them from mailboxes. Resource IDs
+ // passed are in the child namespace, and will be translated to the parent
+ // namespace, added to the child->parent map.
+ // NOTE: if the syncPoint filed in TransferableResourceList is set, this
+ // will wait on it.
+ void receiveFromChild(int child, const TransferableResourceList&);
+
+ // Receives resources from the parent, moving them from mailboxes. Resource IDs
+ // passed are in the child namespace.
+ // NOTE: if the syncPoint filed in TransferableResourceList is set, this
+ // will wait on it.
+ void receiveFromParent(const TransferableResourceList&);
+
+ // Only for testing
+ size_t mailboxCount() const { return m_mailboxes.size(); }
+
+ // The following lock classes are part of the CCResourceProvider API and are
+ // needed to read and write the resource contents. The user must ensure
+ // that they only use GL locks on GL resources, etc, and this is enforced
+ // by assertions.
+ class ScopedReadLockGL {
+ public:
+ ScopedReadLockGL(CCResourceProvider*, CCResourceProvider::ResourceId);
+ ~ScopedReadLockGL();
+
+ unsigned textureId() const { return m_textureId; }
+
+ private:
+ CCResourceProvider* m_resourceProvider;
+ CCResourceProvider::ResourceId m_resourceId;
+ unsigned m_textureId;
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedReadLockGL);
+ };
+
+ class ScopedWriteLockGL {
+ public:
+ ScopedWriteLockGL(CCResourceProvider*, CCResourceProvider::ResourceId);
+ ~ScopedWriteLockGL();
+
+ unsigned textureId() const { return m_textureId; }
+
+ private:
+ CCResourceProvider* m_resourceProvider;
+ CCResourceProvider::ResourceId m_resourceId;
+ unsigned m_textureId;
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedWriteLockGL);
+ };
+
+ class ScopedReadLockSoftware {
+ public:
+ ScopedReadLockSoftware(CCResourceProvider*, CCResourceProvider::ResourceId);
+ ~ScopedReadLockSoftware();
+
+ const SkBitmap* skBitmap() const { return &m_skBitmap; }
+
+ private:
+ CCResourceProvider* m_resourceProvider;
+ CCResourceProvider::ResourceId m_resourceId;
+ SkBitmap m_skBitmap;
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedReadLockSoftware);
+ };
+
+ class ScopedWriteLockSoftware {
+ public:
+ ScopedWriteLockSoftware(CCResourceProvider*, CCResourceProvider::ResourceId);
+ ~ScopedWriteLockSoftware();
+
+ SkCanvas* skCanvas() { return m_skCanvas.get(); }
+
+ private:
+ CCResourceProvider* m_resourceProvider;
+ CCResourceProvider::ResourceId m_resourceId;
+ SkBitmap m_skBitmap;
+ OwnPtr<SkCanvas> m_skCanvas;
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedWriteLockSoftware);
+ };
+
+private:
+ struct Resource {
+ Resource();
+ Resource(unsigned textureId, int pool, const IntSize& size, GC3Denum format);
+ Resource(uint8_t* pixels, int pool, const IntSize& size, GC3Denum format);
+
+ unsigned glId;
+ uint8_t* pixels;
+ int pool;
+ int lockForReadCount;
+ bool lockedForWrite;
+ bool external;
+ bool exported;
+ IntSize size;
+ GC3Denum format;
+ ResourceType type;
+ };
+ typedef HashMap<ResourceId, Resource> ResourceMap;
+ struct Child {
+ Child();
+ ~Child();
+
+ int pool;
+ ResourceIdMap childToParentMap;
+ ResourceIdMap parentToChildMap;
+ };
+ typedef HashMap<int, Child> ChildMap;
+
+ explicit CCResourceProvider(CCGraphicsContext*);
+ bool initialize();
+
+ const Resource* lockForRead(ResourceId);
+ void unlockForRead(ResourceId);
+ const Resource* lockForWrite(ResourceId);
+ void unlockForWrite(ResourceId);
+ static void populateSkBitmapWithResource(SkBitmap*, const Resource*);
+
+ bool transferResource(WebKit::WebGraphicsContext3D*, ResourceId, TransferableResource*);
+ void trimMailboxDeque();
+
+ CCGraphicsContext* m_context;
+ ResourceId m_nextId;
+ ResourceMap m_resources;
+ int m_nextChild;
+ ChildMap m_children;
+
+ Deque<Mailbox> m_mailboxes;
+
+ ResourceType m_defaultResourceType;
+ bool m_useTextureStorageExt;
+ bool m_useTextureUsageHint;
+ bool m_useShallowFlush;
+ OwnPtr<LayerTextureSubImage> m_texSubImage;
+ OwnPtr<TextureUploader> m_textureUploader;
+ OwnPtr<AcceleratedTextureCopier> m_textureCopier;
+ int m_maxTextureSize;
+
+ DISALLOW_COPY_AND_ASSIGN(CCResourceProvider);
+};
+
+}
+
+#endif