Index: cc/CCResourceProvider.cpp |
diff --git a/cc/CCResourceProvider.cpp b/cc/CCResourceProvider.cpp |
deleted file mode 100644 |
index 29ca7d4373d9579af4f36ab5aa3d1681703c54d7..0000000000000000000000000000000000000000 |
--- a/cc/CCResourceProvider.cpp |
+++ /dev/null |
@@ -1,708 +0,0 @@ |
-// 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 "config.h" |
- |
-#include "CCResourceProvider.h" |
-#ifdef LOG |
-#undef LOG |
-#endif |
- |
-#include <limits.h> |
- |
-#include "base/debug/alias.h" |
-#include "base/hash_tables.h" |
-#include "base/stl_util.h" |
-#include "base/string_split.h" |
-#include "base/string_util.h" |
-#include "CCProxy.h" |
-#include "CCRendererGL.h" // For the GLC() macro. |
-#include "Extensions3DChromium.h" |
-#include "IntRect.h" |
-#include "LayerTextureSubImage.h" |
-#include "ThrottledTextureUploader.h" |
-#include "UnthrottledTextureUploader.h" |
-#include <public/WebGraphicsContext3D.h> |
- |
-using WebKit::WebGraphicsContext3D; |
- |
-namespace cc { |
- |
-static GC3Denum textureToStorageFormat(GC3Denum textureFormat) |
-{ |
- GC3Denum storageFormat = Extensions3D::RGBA8_OES; |
- switch (textureFormat) { |
- case GraphicsContext3D::RGBA: |
- break; |
- case Extensions3D::BGRA_EXT: |
- storageFormat = Extensions3DChromium::BGRA8_EXT; |
- break; |
- default: |
- ASSERT_NOT_REACHED(); |
- break; |
- } |
- |
- return storageFormat; |
-} |
- |
-static bool isTextureFormatSupportedForStorage(GC3Denum format) |
-{ |
- return (format == GraphicsContext3D::RGBA || format == Extensions3D::BGRA_EXT); |
-} |
- |
-CCResourceProvider::TransferableResourceList::TransferableResourceList() |
-{ |
-} |
- |
-CCResourceProvider::TransferableResourceList::~TransferableResourceList() |
-{ |
-} |
- |
-CCResourceProvider::Resource::Resource() |
- : glId(0) |
- , pixels(0) |
- , pool(0) |
- , lockForReadCount(0) |
- , lockedForWrite(false) |
- , external(false) |
- , exported(false) |
- , size() |
- , format(0) |
- , type(static_cast<ResourceType>(0)) |
-{ |
-} |
- |
-CCResourceProvider::Resource::Resource(unsigned textureId, int pool, const IntSize& size, GC3Denum format) |
- : glId(textureId) |
- , pixels(0) |
- , pool(pool) |
- , lockForReadCount(0) |
- , lockedForWrite(false) |
- , external(false) |
- , exported(false) |
- , size(size) |
- , format(format) |
- , type(GLTexture) |
-{ |
-} |
- |
-CCResourceProvider::Resource::Resource(uint8_t* pixels, int pool, const IntSize& size, GC3Denum format) |
- : glId(0) |
- , pixels(pixels) |
- , pool(pool) |
- , lockForReadCount(0) |
- , lockedForWrite(false) |
- , external(false) |
- , exported(false) |
- , size(size) |
- , format(format) |
- , type(Bitmap) |
-{ |
-} |
- |
-CCResourceProvider::Child::Child() |
-{ |
-} |
- |
-CCResourceProvider::Child::~Child() |
-{ |
-} |
- |
-PassOwnPtr<CCResourceProvider> CCResourceProvider::create(CCGraphicsContext* context) |
-{ |
- OwnPtr<CCResourceProvider> resourceProvider(adoptPtr(new CCResourceProvider(context))); |
- if (!resourceProvider->initialize()) |
- return nullptr; |
- return resourceProvider.release(); |
-} |
- |
-CCResourceProvider::~CCResourceProvider() |
-{ |
- WebGraphicsContext3D* context3d = m_context->context3D(); |
- if (!context3d || !context3d->makeContextCurrent()) |
- return; |
- m_textureUploader.clear(); |
- m_textureCopier.clear(); |
-} |
- |
-WebGraphicsContext3D* CCResourceProvider::graphicsContext3D() |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- return m_context->context3D(); |
-} |
- |
-bool CCResourceProvider::inUseByConsumer(ResourceId id) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- ResourceMap::iterator it = m_resources.find(id); |
- CHECK(it != m_resources.end()); |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- Resource* resource = &it->value; |
-#else |
- Resource* resource = &it->second; |
-#endif |
- return !!resource->lockForReadCount || resource->exported; |
-} |
- |
-CCResourceProvider::ResourceId CCResourceProvider::createResource(int pool, const IntSize& size, GC3Denum format, TextureUsageHint hint) |
-{ |
- switch (m_defaultResourceType) { |
- case GLTexture: |
- return createGLTexture(pool, size, format, hint); |
- case Bitmap: |
- ASSERT(format == GraphicsContext3D::RGBA); |
- return createBitmap(pool, size); |
- } |
- |
- CRASH(); |
- return 0; |
-} |
- |
-CCResourceProvider::ResourceId CCResourceProvider::createGLTexture(int pool, const IntSize& size, GC3Denum format, TextureUsageHint hint) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- unsigned textureId = 0; |
- WebGraphicsContext3D* context3d = m_context->context3D(); |
- ASSERT(context3d); |
- GLC(context3d, textureId = context3d->createTexture()); |
- GLC(context3d, context3d->bindTexture(GraphicsContext3D::TEXTURE_2D, textureId)); |
- GLC(context3d, context3d->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR)); |
- GLC(context3d, context3d->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR)); |
- GLC(context3d, context3d->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE)); |
- GLC(context3d, context3d->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE)); |
- |
- if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) |
- GLC(context3d, context3d->texParameteri(GraphicsContext3D::TEXTURE_2D, Extensions3DChromium::GL_TEXTURE_USAGE_ANGLE, Extensions3DChromium::GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); |
- if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { |
- GC3Denum storageFormat = textureToStorageFormat(format); |
- GLC(context3d, context3d->texStorage2DEXT(GraphicsContext3D::TEXTURE_2D, 1, storageFormat, size.width(), size.height())); |
- } else |
- GLC(context3d, context3d->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, format, size.width(), size.height(), 0, format, GraphicsContext3D::UNSIGNED_BYTE, 0)); |
- ResourceId id = m_nextId++; |
- Resource resource(textureId, pool, size, format); |
- m_resources.add(id, resource); |
- return id; |
-} |
- |
-CCResourceProvider::ResourceId CCResourceProvider::createBitmap(int pool, const IntSize& size) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- |
- uint8_t* pixels = new uint8_t[size.width() * size.height() * 4]; |
- |
- ResourceId id = m_nextId++; |
- Resource resource(pixels, pool, size, GraphicsContext3D::RGBA); |
- m_resources.add(id, resource); |
- return id; |
-} |
- |
-CCResourceProvider::ResourceId CCResourceProvider::createResourceFromExternalTexture(unsigned textureId) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- ASSERT(m_context->context3D()); |
- ResourceId id = m_nextId++; |
- Resource resource(textureId, 0, IntSize(), 0); |
- resource.external = true; |
- m_resources.add(id, resource); |
- return id; |
-} |
- |
-void CCResourceProvider::deleteResource(ResourceId id) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- ResourceMap::iterator it = m_resources.find(id); |
- CHECK(it != m_resources.end()); |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- Resource* resource = &it->value; |
-#else |
- Resource* resource = &it->second; |
-#endif |
- ASSERT(!resource->lockedForWrite); |
- ASSERT(!resource->lockForReadCount); |
- |
- if (resource->glId && !resource->external) { |
- WebGraphicsContext3D* context3d = m_context->context3D(); |
- ASSERT(context3d); |
- GLC(context3d, context3d->deleteTexture(resource->glId)); |
- } |
- if (resource->pixels) |
- delete resource->pixels; |
- |
- m_resources.remove(it); |
-} |
- |
-void CCResourceProvider::deleteOwnedResources(int pool) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- ResourceIdArray toDelete; |
- for (ResourceMap::iterator it = m_resources.begin(); it != m_resources.end(); ++it) { |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- if (it->value.pool == pool && !it->value.external) |
- toDelete.append(it->key); |
-#else |
- if (it->second.pool == pool && !it->second.external) |
- toDelete.append(it->first); |
-#endif |
- } |
- for (ResourceIdArray::iterator it = toDelete.begin(); it != toDelete.end(); ++it) |
- deleteResource(*it); |
-} |
- |
-CCResourceProvider::ResourceType CCResourceProvider::resourceType(ResourceId id) |
-{ |
- ResourceMap::iterator it = m_resources.find(id); |
- CHECK(it != m_resources.end()); |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- Resource* resource = &it->value; |
-#else |
- Resource* resource = &it->second; |
-#endif |
- return resource->type; |
-} |
- |
-void CCResourceProvider::upload(ResourceId id, const uint8_t* image, const IntRect& imageRect, const IntRect& sourceRect, const IntSize& destOffset) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- ResourceMap::iterator it = m_resources.find(id); |
- CHECK(it != m_resources.end()); |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- Resource* resource = &it->value; |
-#else |
- Resource* resource = &it->second; |
-#endif |
- ASSERT(!resource->lockedForWrite); |
- ASSERT(!resource->lockForReadCount); |
- ASSERT(!resource->external); |
- |
- if (resource->glId) { |
- WebGraphicsContext3D* context3d = m_context->context3D(); |
- ASSERT(context3d); |
- ASSERT(m_texSubImage.get()); |
- context3d->bindTexture(GraphicsContext3D::TEXTURE_2D, resource->glId); |
- m_texSubImage->upload(image, imageRect, sourceRect, destOffset, resource->format, context3d); |
- } |
- |
- if (resource->pixels) { |
- SkBitmap srcFull; |
- srcFull.setConfig(SkBitmap::kARGB_8888_Config, imageRect.width(), imageRect.height()); |
- srcFull.setPixels(const_cast<uint8_t*>(image)); |
- SkBitmap srcSubset; |
- SkIRect skSourceRect = SkIRect::MakeXYWH(sourceRect.x(), sourceRect.y(), sourceRect.width(), sourceRect.height()); |
- skSourceRect.offset(-imageRect.x(), -imageRect.y()); |
- srcFull.extractSubset(&srcSubset, skSourceRect); |
- |
- ScopedWriteLockSoftware lock(this, id); |
- SkCanvas* dest = lock.skCanvas(); |
- dest->writePixels(srcSubset, destOffset.width(), destOffset.height()); |
- } |
-} |
- |
-void CCResourceProvider::flush() |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- WebGraphicsContext3D* context3d = m_context->context3D(); |
- if (context3d) |
- context3d->flush(); |
-} |
- |
-bool CCResourceProvider::shallowFlushIfSupported() |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- WebGraphicsContext3D* context3d = m_context->context3D(); |
- if (!context3d || !m_useShallowFlush) |
- return false; |
- |
- context3d->shallowFlushCHROMIUM(); |
- return true; |
-} |
- |
-const CCResourceProvider::Resource* CCResourceProvider::lockForRead(ResourceId id) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- ResourceMap::iterator it = m_resources.find(id); |
- CHECK(it != m_resources.end()); |
- |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- Resource* resource = &it->value; |
-#else |
- Resource* resource = &it->second; |
-#endif |
- ASSERT(!resource->lockedForWrite); |
- resource->lockForReadCount++; |
- return resource; |
-} |
- |
-void CCResourceProvider::unlockForRead(ResourceId id) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- ResourceMap::iterator it = m_resources.find(id); |
- CHECK(it != m_resources.end()); |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- Resource* resource = &it->value; |
-#else |
- Resource* resource = &it->second; |
-#endif |
- ASSERT(resource->lockForReadCount > 0); |
- resource->lockForReadCount--; |
-} |
- |
-const CCResourceProvider::Resource* CCResourceProvider::lockForWrite(ResourceId id) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- ResourceMap::iterator it = m_resources.find(id); |
- CHECK(it != m_resources.end()); |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- Resource* resource = &it->value; |
-#else |
- Resource* resource = &it->second; |
-#endif |
- ASSERT(!resource->lockedForWrite); |
- ASSERT(!resource->lockForReadCount); |
- ASSERT(!resource->external); |
- resource->lockedForWrite = true; |
- return resource; |
-} |
- |
-void CCResourceProvider::unlockForWrite(ResourceId id) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- ResourceMap::iterator it = m_resources.find(id); |
- CHECK(it != m_resources.end()); |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- Resource* resource = &it->value; |
-#else |
- Resource* resource = &it->second; |
-#endif |
- ASSERT(resource->lockedForWrite); |
- ASSERT(!resource->external); |
- resource->lockedForWrite = false; |
-} |
- |
-CCResourceProvider::ScopedReadLockGL::ScopedReadLockGL(CCResourceProvider* resourceProvider, CCResourceProvider::ResourceId resourceId) |
- : m_resourceProvider(resourceProvider) |
- , m_resourceId(resourceId) |
- , m_textureId(resourceProvider->lockForRead(resourceId)->glId) |
-{ |
- ASSERT(m_textureId); |
-} |
- |
-CCResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() |
-{ |
- m_resourceProvider->unlockForRead(m_resourceId); |
-} |
- |
-CCResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL(CCResourceProvider* resourceProvider, CCResourceProvider::ResourceId resourceId) |
- : m_resourceProvider(resourceProvider) |
- , m_resourceId(resourceId) |
- , m_textureId(resourceProvider->lockForWrite(resourceId)->glId) |
-{ |
- ASSERT(m_textureId); |
-} |
- |
-CCResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() |
-{ |
- m_resourceProvider->unlockForWrite(m_resourceId); |
-} |
- |
-void CCResourceProvider::populateSkBitmapWithResource(SkBitmap* skBitmap, const Resource* resource) |
-{ |
- ASSERT(resource->pixels); |
- ASSERT(resource->format == GraphicsContext3D::RGBA); |
- skBitmap->setConfig(SkBitmap::kARGB_8888_Config, resource->size.width(), resource->size.height()); |
- skBitmap->setPixels(resource->pixels); |
-} |
- |
-CCResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware(CCResourceProvider* resourceProvider, CCResourceProvider::ResourceId resourceId) |
- : m_resourceProvider(resourceProvider) |
- , m_resourceId(resourceId) |
-{ |
- CCResourceProvider::populateSkBitmapWithResource(&m_skBitmap, resourceProvider->lockForRead(resourceId)); |
-} |
- |
-CCResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware() |
-{ |
- m_resourceProvider->unlockForRead(m_resourceId); |
-} |
- |
-CCResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware(CCResourceProvider* resourceProvider, CCResourceProvider::ResourceId resourceId) |
- : m_resourceProvider(resourceProvider) |
- , m_resourceId(resourceId) |
-{ |
- CCResourceProvider::populateSkBitmapWithResource(&m_skBitmap, resourceProvider->lockForWrite(resourceId)); |
- m_skCanvas = adoptPtr(new SkCanvas(m_skBitmap)); |
-} |
- |
-CCResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() |
-{ |
- m_resourceProvider->unlockForWrite(m_resourceId); |
-} |
- |
-CCResourceProvider::CCResourceProvider(CCGraphicsContext* context) |
- : m_context(context) |
- , m_nextId(1) |
- , m_nextChild(1) |
- , m_defaultResourceType(GLTexture) |
- , m_useTextureStorageExt(false) |
- , m_useTextureUsageHint(false) |
- , m_useShallowFlush(false) |
- , m_maxTextureSize(0) |
-{ |
-} |
- |
-bool CCResourceProvider::initialize() |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- WebGraphicsContext3D* context3d = m_context->context3D(); |
- if (!context3d) { |
- m_maxTextureSize = INT_MAX / 2; |
- m_textureUploader = UnthrottledTextureUploader::create(); |
- return true; |
- } |
- if (!context3d->makeContextCurrent()) |
- return false; |
- |
- std::string extensionsString = UTF16ToASCII(context3d->getString(GraphicsContext3D::EXTENSIONS)); |
- std::vector<std::string> extensions; |
- base::SplitString(extensionsString, ' ', &extensions); |
- bool useMapSub = false; |
- bool useBindUniform = false; |
- for (size_t i = 0; i < extensions.size(); ++i) { |
- if (extensions[i] == "GL_EXT_texture_storage") |
- m_useTextureStorageExt = true; |
- else if (extensions[i] == "GL_ANGLE_texture_usage") |
- m_useTextureUsageHint = true; |
- else if (extensions[i] == "GL_CHROMIUM_map_sub") |
- useMapSub = true; |
- else if (extensions[i] == "GL_CHROMIUM_shallow_flush") |
- m_useShallowFlush = true; |
- else if (extensions[i] == "GL_CHROMIUM_bind_uniform_location") |
- useBindUniform = true; |
- } |
- |
- m_texSubImage = adoptPtr(new LayerTextureSubImage(useMapSub)); |
- m_textureCopier = AcceleratedTextureCopier::create(context3d, useBindUniform); |
- |
- m_textureUploader = ThrottledTextureUploader::create(context3d); |
- GLC(context3d, context3d->getIntegerv(GraphicsContext3D::MAX_TEXTURE_SIZE, &m_maxTextureSize)); |
- return true; |
-} |
- |
-int CCResourceProvider::createChild(int pool) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- Child childInfo; |
- childInfo.pool = pool; |
- int child = m_nextChild++; |
- m_children.add(child, childInfo); |
- return child; |
-} |
- |
-void CCResourceProvider::destroyChild(int child) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- ChildMap::iterator it = m_children.find(child); |
- ASSERT(it != m_children.end()); |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- deleteOwnedResources(it->value.pool); |
-#else |
- deleteOwnedResources(it->second.pool); |
-#endif |
- m_children.remove(it); |
- trimMailboxDeque(); |
-} |
- |
-const CCResourceProvider::ResourceIdMap& CCResourceProvider::getChildToParentMap(int child) const |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- ChildMap::const_iterator it = m_children.find(child); |
- ASSERT(it != m_children.end()); |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- return it->value.childToParentMap; |
-#else |
- return it->second.childToParentMap; |
-#endif |
-} |
- |
-CCResourceProvider::TransferableResourceList CCResourceProvider::prepareSendToParent(const ResourceIdArray& resources) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- TransferableResourceList list; |
- list.syncPoint = 0; |
- WebGraphicsContext3D* context3d = m_context->context3D(); |
- if (!context3d || !context3d->makeContextCurrent()) { |
- // FIXME: Implement this path for software compositing. |
- return list; |
- } |
- for (ResourceIdArray::const_iterator it = resources.begin(); it != resources.end(); ++it) { |
- TransferableResource resource; |
- if (transferResource(context3d, *it, &resource)) { |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- m_resources.find(*it)->value.exported = true; |
-#else |
- m_resources.find(*it)->second.exported = true; |
-#endif |
- list.resources.append(resource); |
- } |
- } |
- if (list.resources.size()) |
- list.syncPoint = context3d->insertSyncPoint(); |
- return list; |
-} |
- |
-CCResourceProvider::TransferableResourceList CCResourceProvider::prepareSendToChild(int child, const ResourceIdArray& resources) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- TransferableResourceList list; |
- list.syncPoint = 0; |
- WebGraphicsContext3D* context3d = m_context->context3D(); |
- if (!context3d || !context3d->makeContextCurrent()) { |
- // FIXME: Implement this path for software compositing. |
- return list; |
- } |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- Child& childInfo = m_children.find(child)->value; |
-#else |
- Child& childInfo = m_children.find(child)->second; |
-#endif |
- for (ResourceIdArray::const_iterator it = resources.begin(); it != resources.end(); ++it) { |
- TransferableResource resource; |
- if (!transferResource(context3d, *it, &resource)) |
- ASSERT_NOT_REACHED(); |
- resource.id = childInfo.parentToChildMap.get(*it); |
- childInfo.parentToChildMap.remove(*it); |
- childInfo.childToParentMap.remove(resource.id); |
- list.resources.append(resource); |
- deleteResource(*it); |
- } |
- if (list.resources.size()) |
- list.syncPoint = context3d->insertSyncPoint(); |
- return list; |
-} |
- |
-void CCResourceProvider::receiveFromChild(int child, const TransferableResourceList& resources) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- WebGraphicsContext3D* context3d = m_context->context3D(); |
- if (!context3d || !context3d->makeContextCurrent()) { |
- // FIXME: Implement this path for software compositing. |
- return; |
- } |
- if (resources.syncPoint) { |
- // 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. |
- // 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)); |
- } |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- Child& childInfo = m_children.find(child)->value; |
-#else |
- Child& childInfo = m_children.find(child)->second; |
-#endif |
- for (Vector<TransferableResource>::const_iterator it = resources.resources.begin(); it != resources.resources.end(); ++it) { |
- unsigned textureId; |
- GLC(context3d, textureId = context3d->createTexture()); |
- GLC(context3d, context3d->bindTexture(GraphicsContext3D::TEXTURE_2D, textureId)); |
- GLC(context3d, context3d->consumeTextureCHROMIUM(GraphicsContext3D::TEXTURE_2D, it->mailbox.name)); |
- ResourceId id = m_nextId++; |
- Resource resource(textureId, childInfo.pool, it->size, it->format); |
- m_resources.add(id, resource); |
- m_mailboxes.append(it->mailbox); |
- childInfo.parentToChildMap.add(id, it->id); |
- childInfo.childToParentMap.add(it->id, id); |
- } |
-} |
- |
-void CCResourceProvider::receiveFromParent(const TransferableResourceList& resources) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- WebGraphicsContext3D* context3d = m_context->context3D(); |
- if (!context3d || !context3d->makeContextCurrent()) { |
- // FIXME: Implement this path for software compositing. |
- return; |
- } |
- if (resources.syncPoint) |
- GLC(context3d, context3d->waitSyncPoint(resources.syncPoint)); |
- for (Vector<TransferableResource>::const_iterator it = resources.resources.begin(); it != resources.resources.end(); ++it) { |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- Resource* resource = &m_resources.find(it->id)->value; |
-#else |
- Resource* resource = &m_resources.find(it->id)->second; |
-#endif |
- ASSERT(resource->exported); |
- resource->exported = false; |
- GLC(context3d, context3d->bindTexture(GraphicsContext3D::TEXTURE_2D, resource->glId)); |
- GLC(context3d, context3d->consumeTextureCHROMIUM(GraphicsContext3D::TEXTURE_2D, it->mailbox.name)); |
- m_mailboxes.append(it->mailbox); |
- } |
-} |
- |
-bool CCResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceId id, TransferableResource* resource) |
-{ |
- ASSERT(CCProxy::isImplThread()); |
- ResourceMap::const_iterator it = m_resources.find(id); |
- CHECK(it != m_resources.end()); |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- const Resource* source = &it->value; |
-#else |
- const Resource* source = &it->second; |
-#endif |
- ASSERT(!source->lockedForWrite); |
- ASSERT(!source->lockForReadCount); |
- ASSERT(!source->external); |
- if (source->exported) |
- return false; |
- resource->id = id; |
- resource->format = source->format; |
- resource->size = source->size; |
- if (!m_mailboxes.isEmpty()) |
- resource->mailbox = m_mailboxes.takeFirst(); |
- else |
- GLC(context, context->genMailboxCHROMIUM(resource->mailbox.name)); |
- GLC(context, context->bindTexture(GraphicsContext3D::TEXTURE_2D, source->glId)); |
- GLC(context, context->produceTextureCHROMIUM(GraphicsContext3D::TEXTURE_2D, resource->mailbox.name)); |
- return true; |
-} |
- |
-void CCResourceProvider::trimMailboxDeque() |
-{ |
- // Trim the mailbox deque to the maximum number of resources we may need to |
- // send. |
- // If we have a parent, any non-external resource not already transfered is |
- // eligible to be sent to the parent. Otherwise, all resources belonging to |
- // a child might need to be sent back to the child. |
- size_t maxMailboxCount = 0; |
- if (m_context->capabilities().hasParentCompositor) { |
- for (ResourceMap::iterator it = m_resources.begin(); it != m_resources.end(); ++it) { |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- if (!it->value.exported && !it->value.external) |
-#else |
- if (!it->second.exported && !it->second.external) |
-#endif |
- ++maxMailboxCount; |
- } |
- } else { |
- base::hash_set<int> childPoolSet; |
- for (ChildMap::iterator it = m_children.begin(); it != m_children.end(); ++it) |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- childPoolSet.insert(it->value.pool); |
-#else |
- childPoolSet.insert(it->second.pool); |
-#endif |
- for (ResourceMap::iterator it = m_resources.begin(); it != m_resources.end(); ++it) { |
-#if WTF_NEW_HASHMAP_ITERATORS_INTERFACE |
- if (ContainsKey(childPoolSet, it->value.pool)) |
-#else |
- if (ContainsKey(childPoolSet, it->second.pool)) |
-#endif |
- ++maxMailboxCount; |
- } |
- } |
- while (m_mailboxes.size() > maxMailboxCount) |
- m_mailboxes.removeFirst(); |
-} |
- |
-} |