summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cc/DEPS3
-rw-r--r--cc/cc.gyp2
-rw-r--r--cc/resource_provider.cc51
-rw-r--r--cc/resource_provider.h24
-rw-r--r--cc/resource_provider_unittest.cc30
-rw-r--r--cc/transferable_resource.cc24
-rw-r--r--cc/transferable_resource.h44
7 files changed, 116 insertions, 62 deletions
diff --git a/cc/DEPS b/cc/DEPS
index e284d23..cf10e4c 100644
--- a/cc/DEPS
+++ b/cc/DEPS
@@ -29,4 +29,7 @@ include_rules = [
# http://crbug.com/154451
"+third_party/WebKit/Source/WTF/config.h",
"+Source/WTF/config.h",
+# TODO(piman): Remove as soon as ui/compositor uses cc directly.
+# http://crbug.com/159278
+ "+third_party/WebKit/Source/Platform/chromium/public/WebCompositorTransferableResourceList.h"
]
diff --git a/cc/cc.gyp b/cc/cc.gyp
index cca9c59..a8a768e 100644
--- a/cc/cc.gyp
+++ b/cc/cc.gyp
@@ -218,6 +218,8 @@
'time_source.h',
'timing_function.cc',
'timing_function.h',
+ 'transferable_resource.cc',
+ 'transferable_resource.h',
'tree_synchronizer.cc',
'tree_synchronizer.h',
'video_layer.cc',
diff --git a/cc/resource_provider.cc b/cc/resource_provider.cc
index eb17f18..b6b3695 100644
--- a/cc/resource_provider.cc
+++ b/cc/resource_provider.cc
@@ -16,6 +16,7 @@
#include "cc/gl_renderer.h" // For the GLC() macro.
#include "cc/proxy.h"
#include "cc/texture_uploader.h"
+#include "cc/transferable_resource.h"
#include "third_party/khronos/GLES2/gl2.h"
#include "third_party/khronos/GLES2/gl2ext.h"
#include "ui/gfx/rect.h"
@@ -58,14 +59,6 @@ static bool isTextureFormatSupportedForStorage(GLenum format)
return (format == GL_RGBA || format == GL_BGRA_EXT);
}
-ResourceProvider::TransferableResourceList::TransferableResourceList()
-{
-}
-
-ResourceProvider::TransferableResourceList::~TransferableResourceList()
-{
-}
-
ResourceProvider::Resource::Resource()
: glId(0)
, pixels(0)
@@ -548,37 +541,36 @@ const ResourceProvider::ResourceIdMap& ResourceProvider::getChildToParentMap(int
return it->second.childToParentMap;
}
-ResourceProvider::TransferableResourceList ResourceProvider::prepareSendToParent(const ResourceIdArray& resources)
+void ResourceProvider::prepareSendToParent(const ResourceIdArray& resources, TransferableResourceList* list)
{
DCHECK(Proxy::isImplThread());
- TransferableResourceList list;
- list.syncPoint = 0;
+ list->sync_point = 0;
+ list->resources.clear();
WebGraphicsContext3D* context3d = m_context->context3D();
if (!context3d || !context3d->makeContextCurrent()) {
// FIXME: Implement this path for software compositing.
- return list;
+ return;
}
for (ResourceIdArray::const_iterator it = resources.begin(); it != resources.end(); ++it) {
TransferableResource resource;
if (transferResource(context3d, *it, &resource)) {
m_resources.find(*it)->second.exported = true;
- list.resources.push_back(resource);
+ list->resources.push_back(resource);
}
}
- if (list.resources.size())
- list.syncPoint = context3d->insertSyncPoint();
- return list;
+ if (list->resources.size())
+ list->sync_point = context3d->insertSyncPoint();
}
-ResourceProvider::TransferableResourceList ResourceProvider::prepareSendToChild(int child, const ResourceIdArray& resources)
+void ResourceProvider::prepareSendToChild(int child, const ResourceIdArray& resources, TransferableResourceList* list)
{
DCHECK(Proxy::isImplThread());
- TransferableResourceList list;
- list.syncPoint = 0;
+ list->sync_point = 0;
+ list->resources.clear();
WebGraphicsContext3D* context3d = m_context->context3D();
if (!context3d || !context3d->makeContextCurrent()) {
// FIXME: Implement this path for software compositing.
- return list;
+ return;
}
Child& childInfo = m_children.find(child)->second;
for (ResourceIdArray::const_iterator it = resources.begin(); it != resources.end(); ++it) {
@@ -589,12 +581,11 @@ ResourceProvider::TransferableResourceList ResourceProvider::prepareSendToChild(
resource.id = childInfo.parentToChildMap[*it];
childInfo.parentToChildMap.erase(*it);
childInfo.childToParentMap.erase(resource.id);
- list.resources.push_back(resource);
+ list->resources.push_back(resource);
deleteResource(*it);
}
- if (list.resources.size())
- list.syncPoint = context3d->insertSyncPoint();
- return list;
+ if (list->resources.size())
+ list->sync_point = context3d->insertSyncPoint();
}
void ResourceProvider::receiveFromChild(int child, const TransferableResourceList& resources)
@@ -605,14 +596,14 @@ void ResourceProvider::receiveFromChild(int child, const TransferableResourceLis
// FIXME: Implement this path for software compositing.
return;
}
- if (resources.syncPoint) {
+ if (resources.sync_point) {
// NOTE: If the parent is a browser and the child a renderer, the parent
// is not supposed to have its context wait, because that could induce
// deadlocks and/or security issues. The caller is responsible for
- // waiting asynchronously, and resetting syncPoint before calling this.
+ // waiting asynchronously, and resetting sync_point before calling this.
// However if the parent is a renderer (e.g. browser tag), it may be ok
// (and is simpler) to wait.
- GLC(context3d, context3d->waitSyncPoint(resources.syncPoint));
+ GLC(context3d, context3d->waitSyncPoint(resources.sync_point));
}
Child& childInfo = m_children.find(child)->second;
for (TransferableResourceArray::const_iterator it = resources.resources.begin(); it != resources.resources.end(); ++it) {
@@ -637,8 +628,8 @@ void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc
// FIXME: Implement this path for software compositing.
return;
}
- if (resources.syncPoint)
- GLC(context3d, context3d->waitSyncPoint(resources.syncPoint));
+ if (resources.sync_point)
+ GLC(context3d, context3d->waitSyncPoint(resources.sync_point));
for (TransferableResourceArray::const_iterator it = resources.resources.begin(); it != resources.resources.end(); ++it) {
ResourceMap::iterator mapIterator = m_resources.find(it->id);
DCHECK(mapIterator != m_resources.end());
@@ -667,7 +658,7 @@ bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI
resource->id = id;
resource->format = source->format;
resource->size = source->size;
- if (m_mailboxes.size()) {
+ if (!m_mailboxes.empty()) {
resource->mailbox = m_mailboxes.front();
m_mailboxes.pop_front();
}
diff --git a/cc/resource_provider.h b/cc/resource_provider.h
index 6262d31..f7db99c 100644
--- a/cc/resource_provider.h
+++ b/cc/resource_provider.h
@@ -11,6 +11,7 @@
#include "cc/cc_export.h"
#include "cc/graphics_context.h"
#include "cc/texture_copier.h"
+#include "cc/transferable_resource.h"
#include "third_party/khronos/GLES2/gl2.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkCanvas.h"
@@ -43,23 +44,6 @@ public:
GLTexture = 1,
Bitmap,
};
- struct Mailbox {
- GLbyte name[64];
- };
- struct TransferableResource {
- unsigned id;
- GLenum format;
- gfx::Size size;
- Mailbox mailbox;
- };
- typedef std::vector<TransferableResource> TransferableResourceArray;
- struct CC_EXPORT TransferableResourceList {
- TransferableResourceList();
- ~TransferableResourceList();
-
- TransferableResourceArray resources;
- unsigned syncPoint;
- };
static scoped_ptr<ResourceProvider> create(GraphicsContext*);
@@ -122,16 +106,16 @@ public:
// Prepares resources to be transfered to the parent, moving them to
// mailboxes and serializing meta-data into TransferableResources.
- // Resources are not removed from the ResourceProvider, but are markes as
+ // Resources are not removed from the ResourceProvider, but are marked as
// "in use".
- TransferableResourceList prepareSendToParent(const ResourceIdArray&);
+ void prepareSendToParent(const ResourceIdArray&, TransferableResourceList*);
// Prepares resources to be transfered back to the child, moving them to
// mailboxes and serializing meta-data into TransferableResources.
// Resources are removed from the ResourceProvider. 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&);
+ void prepareSendToChild(int child, const ResourceIdArray&, TransferableResourceList*);
// Receives resources from a child, moving them from mailboxes. Resource IDs
// passed are in the child namespace, and will be translated to the parent
diff --git a/cc/resource_provider_unittest.cc b/cc/resource_provider_unittest.cc
index 0f0980a..2aca348 100644
--- a/cc/resource_provider_unittest.cc
+++ b/cc/resource_provider_unittest.cc
@@ -443,8 +443,9 @@ TEST_P(ResourceProviderTest, TransferResources)
ResourceProvider::ResourceIdArray resourceIdsToTransfer;
resourceIdsToTransfer.push_back(id1);
resourceIdsToTransfer.push_back(id2);
- ResourceProvider::TransferableResourceList list = childResourceProvider->prepareSendToParent(resourceIdsToTransfer);
- EXPECT_NE(0u, list.syncPoint);
+ TransferableResourceList list;
+ childResourceProvider->prepareSendToParent(resourceIdsToTransfer, &list);
+ EXPECT_NE(0u, list.sync_point);
EXPECT_EQ(2u, list.resources.size());
EXPECT_TRUE(childResourceProvider->inUseByConsumer(id1));
EXPECT_TRUE(childResourceProvider->inUseByConsumer(id2));
@@ -473,8 +474,9 @@ TEST_P(ResourceProviderTest, TransferResources)
// parent is a noop.
ResourceProvider::ResourceIdArray resourceIdsToTransfer;
resourceIdsToTransfer.push_back(id1);
- ResourceProvider::TransferableResourceList list = childResourceProvider->prepareSendToParent(resourceIdsToTransfer);
- EXPECT_EQ(0u, list.syncPoint);
+ TransferableResourceList list;
+ childResourceProvider->prepareSendToParent(resourceIdsToTransfer, &list);
+ EXPECT_EQ(0u, list.sync_point);
EXPECT_EQ(0u, list.resources.size());
}
@@ -483,8 +485,9 @@ TEST_P(ResourceProviderTest, TransferResources)
ResourceProvider::ResourceIdArray resourceIdsToTransfer;
resourceIdsToTransfer.push_back(mappedId1);
resourceIdsToTransfer.push_back(mappedId2);
- ResourceProvider::TransferableResourceList list = m_resourceProvider->prepareSendToChild(childId, resourceIdsToTransfer);
- EXPECT_NE(0u, list.syncPoint);
+ TransferableResourceList list;
+ m_resourceProvider->prepareSendToChild(childId, resourceIdsToTransfer, &list);
+ EXPECT_NE(0u, list.sync_point);
EXPECT_EQ(2u, list.resources.size());
childResourceProvider->receiveFromParent(list);
}
@@ -514,8 +517,9 @@ TEST_P(ResourceProviderTest, TransferResources)
ResourceProvider::ResourceIdArray resourceIdsToTransfer;
resourceIdsToTransfer.push_back(id1);
resourceIdsToTransfer.push_back(id2);
- ResourceProvider::TransferableResourceList list = childResourceProvider->prepareSendToParent(resourceIdsToTransfer);
- EXPECT_NE(0u, list.syncPoint);
+ TransferableResourceList list;
+ childResourceProvider->prepareSendToParent(resourceIdsToTransfer, &list);
+ EXPECT_NE(0u, list.sync_point);
EXPECT_EQ(2u, list.resources.size());
EXPECT_TRUE(childResourceProvider->inUseByConsumer(id1));
EXPECT_TRUE(childResourceProvider->inUseByConsumer(id2));
@@ -555,8 +559,9 @@ TEST_P(ResourceProviderTest, DeleteTransferredResources)
// Transfer some resource to the parent.
ResourceProvider::ResourceIdArray resourceIdsToTransfer;
resourceIdsToTransfer.push_back(id);
- ResourceProvider::TransferableResourceList list = childResourceProvider->prepareSendToParent(resourceIdsToTransfer);
- EXPECT_NE(0u, list.syncPoint);
+ TransferableResourceList list;
+ childResourceProvider->prepareSendToParent(resourceIdsToTransfer, &list);
+ EXPECT_NE(0u, list.sync_point);
EXPECT_EQ(1u, list.resources.size());
EXPECT_TRUE(childResourceProvider->inUseByConsumer(id));
m_resourceProvider->receiveFromChild(childId, list);
@@ -573,8 +578,9 @@ TEST_P(ResourceProviderTest, DeleteTransferredResources)
EXPECT_NE(0u, mappedId);
ResourceProvider::ResourceIdArray resourceIdsToTransfer;
resourceIdsToTransfer.push_back(mappedId);
- ResourceProvider::TransferableResourceList list = m_resourceProvider->prepareSendToChild(childId, resourceIdsToTransfer);
- EXPECT_NE(0u, list.syncPoint);
+ TransferableResourceList list;
+ m_resourceProvider->prepareSendToChild(childId, resourceIdsToTransfer, &list);
+ EXPECT_NE(0u, list.sync_point);
EXPECT_EQ(1u, list.resources.size());
childResourceProvider->receiveFromParent(list);
}
diff --git a/cc/transferable_resource.cc b/cc/transferable_resource.cc
new file mode 100644
index 0000000..904d0b6
--- /dev/null
+++ b/cc/transferable_resource.cc
@@ -0,0 +1,24 @@
+// 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.
+
+#include "cc/transferable_resource.h"
+
+namespace cc {
+
+TransferableResource::TransferableResource()
+ : id(0),
+ format(0) {
+}
+
+TransferableResource::~TransferableResource() {
+}
+
+TransferableResourceList::TransferableResourceList()
+ : sync_point(0) {
+}
+
+TransferableResourceList::~TransferableResourceList() {
+}
+
+} // namespace cc
diff --git a/cc/transferable_resource.h b/cc/transferable_resource.h
new file mode 100644
index 0000000..a390104
--- /dev/null
+++ b/cc/transferable_resource.h
@@ -0,0 +1,44 @@
+// 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 CC_TRANSERABLE_RESOURCE_H_
+#define CC_TRANSERABLE_RESOURCE_H_
+
+#include <vector>
+
+#include "cc/cc_export.h"
+#include "ui/gfx/size.h"
+#include "third_party/khronos/GLES2/gl2.h"
+#include "third_party/WebKit/Source/Platform/chromium/public/WebCompositorTransferableResourceList.h"
+
+namespace cc {
+
+struct Mailbox {
+ GLbyte name[64];
+};
+
+struct CC_EXPORT TransferableResource {
+ TransferableResource();
+ ~TransferableResource();
+
+ unsigned id;
+ GLenum format;
+ gfx::Size size;
+ Mailbox mailbox;
+};
+
+typedef std::vector<TransferableResource> TransferableResourceArray;
+
+struct CC_EXPORT TransferableResourceList :
+ public NON_EXPORTED_BASE(WebKit::WebCompositorTransferableResourceList) {
+ TransferableResourceList();
+ ~TransferableResourceList();
+
+ TransferableResourceArray resources;
+ unsigned sync_point;
+};
+
+} // namespace cc
+
+#endif // CC_TRANSERABLE_RESOURCE_H_