Index: cc/resource_provider_unittest.cc |
diff --git a/cc/resource_provider_unittest.cc b/cc/resource_provider_unittest.cc |
deleted file mode 100644 |
index 936b2c519055360d1a2757b7bbe8add3215be8bb..0000000000000000000000000000000000000000 |
--- a/cc/resource_provider_unittest.cc |
+++ /dev/null |
@@ -1,1020 +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 "cc/resource_provider.h" |
- |
-#include "base/bind.h" |
-#include "base/logging.h" |
-#include "cc/base/scoped_ptr_deque.h" |
-#include "cc/base/scoped_ptr_hash_map.h" |
-#include "cc/output/output_surface.h" |
-#include "cc/test/fake_output_surface.h" |
-#include "cc/test/test_web_graphics_context_3d.h" |
-#include "gpu/GLES2/gl2extchromium.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3D.h" |
-#include "third_party/khronos/GLES2/gl2.h" |
-#include "third_party/khronos/GLES2/gl2ext.h" |
-#include "ui/gfx/rect.h" |
- |
-using namespace WebKit; |
- |
-using testing::Mock; |
-using testing::NiceMock; |
-using testing::Return; |
-using testing::StrictMock; |
-using testing::_; |
- |
-namespace cc { |
-namespace { |
- |
-size_t textureSize(const gfx::Size& size, WGC3Denum format) |
-{ |
- unsigned int componentsPerPixel = 4; |
- unsigned int bytesPerComponent = 1; |
- return size.width() * size.height() * componentsPerPixel * bytesPerComponent; |
-} |
- |
-struct Texture { |
- Texture() |
- : format(0) |
- , filter(GL_NEAREST_MIPMAP_LINEAR) |
- { |
- } |
- |
- void reallocate(const gfx::Size& size, WGC3Denum format) |
- { |
- this->size = size; |
- this->format = format; |
- this->data.reset(new uint8_t[textureSize(size, format)]); |
- } |
- |
- gfx::Size size; |
- WGC3Denum format; |
- WGC3Denum filter; |
- scoped_array<uint8_t> data; |
-}; |
- |
-// Shared data between multiple ResourceProviderContext. This contains mailbox |
-// contents as well as information about sync points. |
-class ContextSharedData { |
-public: |
- static scoped_ptr<ContextSharedData> Create() { return make_scoped_ptr(new ContextSharedData()); } |
- |
- unsigned insertSyncPoint() { return m_nextSyncPoint++; } |
- |
- void genMailbox(WGC3Dbyte* mailbox) |
- { |
- memset(mailbox, 0, sizeof(WGC3Dbyte[64])); |
- memcpy(mailbox, &m_nextMailBox, sizeof(m_nextMailBox)); |
- ++m_nextMailBox; |
- } |
- |
- void produceTexture(const WGC3Dbyte* mailboxName, unsigned syncPoint, scoped_ptr<Texture> texture) |
- { |
- unsigned mailbox = 0; |
- memcpy(&mailbox, mailboxName, sizeof(mailbox)); |
- ASSERT_TRUE(mailbox && mailbox < m_nextMailBox); |
- m_textures.set(mailbox, texture.Pass()); |
- ASSERT_LT(m_syncPointForMailbox[mailbox], syncPoint); |
- m_syncPointForMailbox[mailbox] = syncPoint; |
- } |
- |
- scoped_ptr<Texture> consumeTexture(const WGC3Dbyte* mailboxName, unsigned syncPoint) |
- { |
- unsigned mailbox = 0; |
- memcpy(&mailbox, mailboxName, sizeof(mailbox)); |
- DCHECK(mailbox && mailbox < m_nextMailBox); |
- |
- // If the latest sync point the context has waited on is before the sync |
- // point for when the mailbox was set, pretend we never saw that |
- // produceTexture. |
- if (m_syncPointForMailbox[mailbox] > syncPoint) { |
- NOTREACHED(); |
- return scoped_ptr<Texture>(); |
- } |
- return m_textures.take(mailbox); |
- } |
- |
-private: |
- ContextSharedData() |
- : m_nextSyncPoint(1) |
- , m_nextMailBox(1) |
- { } |
- |
- unsigned m_nextSyncPoint; |
- unsigned m_nextMailBox; |
- typedef ScopedPtrHashMap<unsigned, Texture> TextureMap; |
- TextureMap m_textures; |
- base::hash_map<unsigned, unsigned> m_syncPointForMailbox; |
-}; |
- |
-class ResourceProviderContext : public TestWebGraphicsContext3D { |
-public: |
- static scoped_ptr<ResourceProviderContext> Create(ContextSharedData* sharedData) { return make_scoped_ptr(new ResourceProviderContext(Attributes(), sharedData)); } |
- |
- virtual unsigned insertSyncPoint() |
- { |
- unsigned syncPoint = m_sharedData->insertSyncPoint(); |
- // Commit the produceTextureCHROMIUM calls at this point, so that |
- // they're associated with the sync point. |
- for (PendingProduceTextureList::iterator it = m_pendingProduceTextures.begin(); it != m_pendingProduceTextures.end(); ++it) |
- m_sharedData->produceTexture((*it)->mailbox, syncPoint, (*it)->texture.Pass()); |
- m_pendingProduceTextures.clear(); |
- return syncPoint; |
- } |
- |
- virtual void waitSyncPoint(unsigned syncPoint) |
- { |
- m_lastWaitedSyncPoint = std::max(syncPoint, m_lastWaitedSyncPoint); |
- } |
- |
- virtual void bindTexture(WGC3Denum target, WebGLId texture) |
- { |
- ASSERT_EQ(target, GL_TEXTURE_2D); |
- ASSERT_TRUE(!texture || m_textures.find(texture) != m_textures.end()); |
- m_currentTexture = texture; |
- } |
- |
- virtual WebGLId createTexture() |
- { |
- WebGLId id = TestWebGraphicsContext3D::createTexture(); |
- m_textures.add(id, make_scoped_ptr(new Texture)); |
- return id; |
- } |
- |
- virtual void deleteTexture(WebGLId id) |
- { |
- TextureMap::iterator it = m_textures.find(id); |
- ASSERT_FALSE(it == m_textures.end()); |
- m_textures.erase(it); |
- if (m_currentTexture == id) |
- m_currentTexture = 0; |
- } |
- |
- virtual void texStorage2DEXT(WGC3Denum target, WGC3Dint levels, WGC3Duint internalformat, |
- WGC3Dint width, WGC3Dint height) |
- { |
- ASSERT_TRUE(m_currentTexture); |
- ASSERT_EQ(target, GL_TEXTURE_2D); |
- ASSERT_EQ(levels, 1); |
- WGC3Denum format = GL_RGBA; |
- switch (internalformat) { |
- case GL_RGBA8_OES: |
- break; |
- case GL_BGRA8_EXT: |
- format = GL_BGRA_EXT; |
- break; |
- default: |
- NOTREACHED(); |
- } |
- allocateTexture(gfx::Size(width, height), format); |
- } |
- |
- virtual void texImage2D(WGC3Denum target, WGC3Dint level, WGC3Denum internalformat, WGC3Dsizei width, WGC3Dsizei height, WGC3Dint border, WGC3Denum format, WGC3Denum type, const void* pixels) |
- { |
- ASSERT_TRUE(m_currentTexture); |
- ASSERT_EQ(target, GL_TEXTURE_2D); |
- ASSERT_FALSE(level); |
- ASSERT_EQ(internalformat, format); |
- ASSERT_FALSE(border); |
- ASSERT_EQ(type, GL_UNSIGNED_BYTE); |
- allocateTexture(gfx::Size(width, height), format); |
- if (pixels) |
- setPixels(0, 0, width, height, pixels); |
- } |
- |
- virtual void texSubImage2D(WGC3Denum target, WGC3Dint level, WGC3Dint xoffset, WGC3Dint yoffset, WGC3Dsizei width, WGC3Dsizei height, WGC3Denum format, WGC3Denum type, const void* pixels) |
- { |
- ASSERT_TRUE(m_currentTexture); |
- ASSERT_EQ(target, GL_TEXTURE_2D); |
- ASSERT_FALSE(level); |
- ASSERT_TRUE(m_textures.get(m_currentTexture)); |
- ASSERT_EQ(m_textures.get(m_currentTexture)->format, format); |
- ASSERT_EQ(type, GL_UNSIGNED_BYTE); |
- ASSERT_TRUE(pixels); |
- setPixels(xoffset, yoffset, width, height, pixels); |
- } |
- |
- virtual void texParameteri(WGC3Denum target, WGC3Denum param, WGC3Dint value) |
- { |
- ASSERT_TRUE(m_currentTexture); |
- ASSERT_EQ(target, GL_TEXTURE_2D); |
- Texture* texture = m_textures.get(m_currentTexture); |
- ASSERT_TRUE(texture); |
- if (param != GL_TEXTURE_MIN_FILTER) |
- return; |
- texture->filter = value; |
- } |
- |
- virtual void genMailboxCHROMIUM(WGC3Dbyte* mailbox) { return m_sharedData->genMailbox(mailbox); } |
- virtual void produceTextureCHROMIUM(WGC3Denum target, const WGC3Dbyte* mailbox) |
- { |
- ASSERT_TRUE(m_currentTexture); |
- ASSERT_EQ(target, GL_TEXTURE_2D); |
- |
- // Delay moving the texture into the mailbox until the next |
- // insertSyncPoint, so that it is not visible to other contexts that |
- // haven't waited on that sync point. |
- scoped_ptr<PendingProduceTexture> pending(new PendingProduceTexture); |
- memcpy(pending->mailbox, mailbox, sizeof(pending->mailbox)); |
- pending->texture = m_textures.take(m_currentTexture); |
- m_textures.set(m_currentTexture, scoped_ptr<Texture>()); |
- m_pendingProduceTextures.push_back(pending.Pass()); |
- } |
- |
- virtual void consumeTextureCHROMIUM(WGC3Denum target, const WGC3Dbyte* mailbox) |
- { |
- ASSERT_TRUE(m_currentTexture); |
- ASSERT_EQ(target, GL_TEXTURE_2D); |
- m_textures.set(m_currentTexture, m_sharedData->consumeTexture(mailbox, m_lastWaitedSyncPoint)); |
- } |
- |
- void getPixels(const gfx::Size& size, WGC3Denum format, uint8_t* pixels) |
- { |
- ASSERT_TRUE(m_currentTexture); |
- Texture* texture = m_textures.get(m_currentTexture); |
- ASSERT_TRUE(texture); |
- ASSERT_EQ(texture->size, size); |
- ASSERT_EQ(texture->format, format); |
- memcpy(pixels, texture->data.get(), textureSize(size, format)); |
- } |
- |
- WGC3Denum getTextureFilter() |
- { |
- DCHECK(m_currentTexture); |
- Texture* texture = m_textures.get(m_currentTexture); |
- DCHECK(texture); |
- return texture->filter; |
- } |
- |
- int textureCount() |
- { |
- return m_textures.size(); |
- } |
- |
-protected: |
- ResourceProviderContext(const Attributes& attrs, ContextSharedData* sharedData) |
- : TestWebGraphicsContext3D(attrs) |
- , m_sharedData(sharedData) |
- , m_currentTexture(0) |
- , m_lastWaitedSyncPoint(0) |
- { } |
- |
-private: |
- void allocateTexture(const gfx::Size& size, WGC3Denum format) |
- { |
- ASSERT_TRUE(m_currentTexture); |
- Texture* texture = m_textures.get(m_currentTexture); |
- ASSERT_TRUE(texture); |
- texture->reallocate(size, format); |
- } |
- |
- void setPixels(int xoffset, int yoffset, int width, int height, const void* pixels) |
- { |
- ASSERT_TRUE(m_currentTexture); |
- Texture* texture = m_textures.get(m_currentTexture); |
- ASSERT_TRUE(texture); |
- ASSERT_TRUE(texture->data.get()); |
- ASSERT_TRUE(xoffset >= 0 && xoffset+width <= texture->size.width()); |
- ASSERT_TRUE(yoffset >= 0 && yoffset+height <= texture->size.height()); |
- ASSERT_TRUE(pixels); |
- size_t inPitch = textureSize(gfx::Size(width, 1), texture->format); |
- size_t outPitch = textureSize(gfx::Size(texture->size.width(), 1), texture->format); |
- uint8_t* dest = texture->data.get() + yoffset * outPitch + textureSize(gfx::Size(xoffset, 1), texture->format); |
- const uint8_t* src = static_cast<const uint8_t*>(pixels); |
- for (int i = 0; i < height; ++i) { |
- memcpy(dest, src, inPitch); |
- dest += outPitch; |
- src += inPitch; |
- } |
- } |
- |
- typedef ScopedPtrHashMap<WebGLId, Texture> TextureMap; |
- struct PendingProduceTexture { |
- WGC3Dbyte mailbox[64]; |
- scoped_ptr<Texture> texture; |
- }; |
- typedef ScopedPtrDeque<PendingProduceTexture> PendingProduceTextureList; |
- ContextSharedData* m_sharedData; |
- WebGLId m_currentTexture; |
- TextureMap m_textures; |
- unsigned m_lastWaitedSyncPoint; |
- PendingProduceTextureList m_pendingProduceTextures; |
-}; |
- |
-class ResourceProviderTest : public testing::TestWithParam<ResourceProvider::ResourceType> { |
-public: |
- ResourceProviderTest() |
- : m_sharedData(ContextSharedData::Create()) |
- , m_outputSurface(FakeOutputSurface::Create3d(ResourceProviderContext::Create(m_sharedData.get()).PassAs<WebKit::WebGraphicsContext3D>().PassAs<WebKit::WebGraphicsContext3D>())) |
- , m_resourceProvider(ResourceProvider::Create(m_outputSurface.get())) |
- { |
- m_resourceProvider->set_default_resource_type(GetParam()); |
- } |
- |
- ResourceProviderContext* context() { return static_cast<ResourceProviderContext*>(m_outputSurface->context3d()); } |
- |
- void getResourcePixels(ResourceProvider::ResourceId id, const gfx::Size& size, WGC3Denum format, uint8_t* pixels) |
- { |
- if (GetParam() == ResourceProvider::GLTexture) { |
- ResourceProvider::ScopedReadLockGL lockGL(m_resourceProvider.get(), id); |
- ASSERT_NE(0U, lockGL.texture_id()); |
- context()->bindTexture(GL_TEXTURE_2D, lockGL.texture_id()); |
- context()->getPixels(size, format, pixels); |
- } else if (GetParam() == ResourceProvider::Bitmap) { |
- ResourceProvider::ScopedReadLockSoftware lockSoftware(m_resourceProvider.get(), id); |
- memcpy(pixels, lockSoftware.sk_bitmap()->getPixels(), lockSoftware.sk_bitmap()->getSize()); |
- } |
- } |
- |
- void setResourceFilter(ResourceProvider* resourceProvider, ResourceProvider::ResourceId id, WGC3Denum filter) |
- { |
- ResourceProvider::ScopedSamplerGL sampler(resourceProvider, id, GL_TEXTURE_2D, filter); |
- } |
- |
- WGC3Denum getResourceFilter(ResourceProvider* resourceProvider, ResourceProvider::ResourceId id) |
- { |
- DCHECK_EQ(GetParam(), ResourceProvider::GLTexture); |
- ResourceProvider::ScopedReadLockGL lockGL(resourceProvider, id); |
- EXPECT_NE(0u, lockGL.texture_id()); |
- ResourceProviderContext* context = static_cast<ResourceProviderContext*>(resourceProvider->GraphicsContext3D()); |
- context->bindTexture(GL_TEXTURE_2D, lockGL.texture_id()); |
- return context->getTextureFilter(); |
- } |
- |
- void expectNumResources(int count) |
- { |
- EXPECT_EQ(count, static_cast<int>(m_resourceProvider->num_resources())); |
- if (GetParam() == ResourceProvider::GLTexture) |
- EXPECT_EQ(count, context()->textureCount()); |
- } |
- |
-protected: |
- scoped_ptr<ContextSharedData> m_sharedData; |
- scoped_ptr<OutputSurface> m_outputSurface; |
- scoped_ptr<ResourceProvider> m_resourceProvider; |
-}; |
- |
-TEST_P(ResourceProviderTest, Basic) |
-{ |
- gfx::Size size(1, 1); |
- WGC3Denum format = GL_RGBA; |
- size_t pixelSize = textureSize(size, format); |
- ASSERT_EQ(4U, pixelSize); |
- |
- ResourceProvider::ResourceId id = m_resourceProvider->CreateResource(size, format, ResourceProvider::TextureUsageAny); |
- expectNumResources(1); |
- |
- uint8_t data[4] = {1, 2, 3, 4}; |
- gfx::Rect rect(gfx::Point(), size); |
- m_resourceProvider->SetPixels(id, data, rect, rect, gfx::Vector2d()); |
- |
- uint8_t result[4] = {0}; |
- getResourcePixels(id, size, format, result); |
- EXPECT_EQ(0, memcmp(data, result, pixelSize)); |
- |
- m_resourceProvider->DeleteResource(id); |
- expectNumResources(0); |
-} |
- |
-TEST_P(ResourceProviderTest, Upload) |
-{ |
- gfx::Size size(2, 2); |
- WGC3Denum format = GL_RGBA; |
- size_t pixelSize = textureSize(size, format); |
- ASSERT_EQ(16U, pixelSize); |
- |
- ResourceProvider::ResourceId id = m_resourceProvider->CreateResource(size, format, ResourceProvider::TextureUsageAny); |
- |
- uint8_t image[16] = {0}; |
- gfx::Rect imageRect(gfx::Point(), size); |
- m_resourceProvider->SetPixels(id, image, imageRect, imageRect, gfx::Vector2d()); |
- |
- for (uint8_t i = 0 ; i < pixelSize; ++i) |
- image[i] = i; |
- |
- uint8_t result[16] = {0}; |
- { |
- gfx::Rect sourceRect(0, 0, 1, 1); |
- gfx::Vector2d destOffset(0, 0); |
- m_resourceProvider->SetPixels(id, image, imageRect, sourceRect, destOffset); |
- |
- uint8_t expected[16] = {0, 1, 2, 3, 0, 0, 0, 0, |
- 0, 0, 0, 0, 0, 0, 0, 0}; |
- getResourcePixels(id, size, format, result); |
- EXPECT_EQ(0, memcmp(expected, result, pixelSize)); |
- } |
- { |
- gfx::Rect sourceRect(0, 0, 1, 1); |
- gfx::Vector2d destOffset(1, 1); |
- m_resourceProvider->SetPixels(id, image, imageRect, sourceRect, destOffset); |
- |
- uint8_t expected[16] = {0, 1, 2, 3, 0, 0, 0, 0, |
- 0, 0, 0, 0, 0, 1, 2, 3}; |
- getResourcePixels(id, size, format, result); |
- EXPECT_EQ(0, memcmp(expected, result, pixelSize)); |
- } |
- { |
- gfx::Rect sourceRect(1, 0, 1, 1); |
- gfx::Vector2d destOffset(0, 1); |
- m_resourceProvider->SetPixels(id, image, imageRect, sourceRect, destOffset); |
- |
- uint8_t expected[16] = {0, 1, 2, 3, 0, 0, 0, 0, |
- 4, 5, 6, 7, 0, 1, 2, 3}; |
- getResourcePixels(id, size, format, result); |
- EXPECT_EQ(0, memcmp(expected, result, pixelSize)); |
- } |
- { |
- gfx::Rect offsetImageRect(gfx::Point(100, 100), size); |
- gfx::Rect sourceRect(100, 100, 1, 1); |
- gfx::Vector2d destOffset(1, 0); |
- m_resourceProvider->SetPixels(id, image, offsetImageRect, sourceRect, destOffset); |
- |
- uint8_t expected[16] = {0, 1, 2, 3, 0, 1, 2, 3, |
- 4, 5, 6, 7, 0, 1, 2, 3}; |
- getResourcePixels(id, size, format, result); |
- EXPECT_EQ(0, memcmp(expected, result, pixelSize)); |
- } |
- |
- |
- m_resourceProvider->DeleteResource(id); |
-} |
- |
-TEST_P(ResourceProviderTest, TransferResources) |
-{ |
- // Resource transfer is only supported with GL textures for now. |
- if (GetParam() != ResourceProvider::GLTexture) |
- return; |
- |
- scoped_ptr<OutputSurface> childOutputSurface(FakeOutputSurface::Create3d(ResourceProviderContext::Create(m_sharedData.get()).PassAs<WebKit::WebGraphicsContext3D>())); |
- scoped_ptr<ResourceProvider> childResourceProvider(ResourceProvider::Create(childOutputSurface.get())); |
- |
- gfx::Size size(1, 1); |
- WGC3Denum format = GL_RGBA; |
- size_t pixelSize = textureSize(size, format); |
- ASSERT_EQ(4U, pixelSize); |
- |
- ResourceProvider::ResourceId id1 = childResourceProvider->CreateResource(size, format, ResourceProvider::TextureUsageAny); |
- uint8_t data1[4] = {1, 2, 3, 4}; |
- gfx::Rect rect(gfx::Point(), size); |
- childResourceProvider->SetPixels(id1, data1, rect, rect, gfx::Vector2d()); |
- |
- ResourceProvider::ResourceId id2 = childResourceProvider->CreateResource(size, format, ResourceProvider::TextureUsageAny); |
- uint8_t data2[4] = {5, 5, 5, 5}; |
- childResourceProvider->SetPixels(id2, data2, rect, rect, gfx::Vector2d()); |
- |
- int childId = m_resourceProvider->CreateChild(); |
- |
- { |
- // Transfer some resources to the parent. |
- ResourceProvider::ResourceIdArray resourceIdsToTransfer; |
- resourceIdsToTransfer.push_back(id1); |
- resourceIdsToTransfer.push_back(id2); |
- TransferableResourceArray list; |
- childResourceProvider->PrepareSendToParent(resourceIdsToTransfer, &list); |
- ASSERT_EQ(2u, list.size()); |
- EXPECT_NE(0u, list[0].sync_point); |
- EXPECT_NE(0u, list[1].sync_point); |
- EXPECT_TRUE(childResourceProvider->InUseByConsumer(id1)); |
- EXPECT_TRUE(childResourceProvider->InUseByConsumer(id2)); |
- m_resourceProvider->ReceiveFromChild(childId, list); |
- } |
- |
- EXPECT_EQ(2u, m_resourceProvider->num_resources()); |
- ResourceProvider::ResourceIdMap resourceMap = m_resourceProvider->GetChildToParentMap(childId); |
- ResourceProvider::ResourceId mappedId1 = resourceMap[id1]; |
- ResourceProvider::ResourceId mappedId2 = resourceMap[id2]; |
- EXPECT_NE(0u, mappedId1); |
- EXPECT_NE(0u, mappedId2); |
- EXPECT_FALSE(m_resourceProvider->InUseByConsumer(id1)); |
- EXPECT_FALSE(m_resourceProvider->InUseByConsumer(id2)); |
- |
- uint8_t result[4] = {0}; |
- getResourcePixels(mappedId1, size, format, result); |
- EXPECT_EQ(0, memcmp(data1, result, pixelSize)); |
- |
- getResourcePixels(mappedId2, size, format, result); |
- EXPECT_EQ(0, memcmp(data2, result, pixelSize)); |
- |
- { |
- // Check that transfering again the same resource from the child to the |
- // parent is a noop. |
- ResourceProvider::ResourceIdArray resourceIdsToTransfer; |
- resourceIdsToTransfer.push_back(id1); |
- TransferableResourceArray list; |
- childResourceProvider->PrepareSendToParent(resourceIdsToTransfer, &list); |
- EXPECT_EQ(0u, list.size()); |
- } |
- |
- { |
- // Transfer resources back from the parent to the child. |
- ResourceProvider::ResourceIdArray resourceIdsToTransfer; |
- resourceIdsToTransfer.push_back(mappedId1); |
- resourceIdsToTransfer.push_back(mappedId2); |
- TransferableResourceArray list; |
- m_resourceProvider->PrepareSendToChild(childId, resourceIdsToTransfer, &list); |
- ASSERT_EQ(2u, list.size()); |
- EXPECT_NE(0u, list[0].sync_point); |
- EXPECT_NE(0u, list[1].sync_point); |
- childResourceProvider->ReceiveFromParent(list); |
- } |
- EXPECT_FALSE(childResourceProvider->InUseByConsumer(id1)); |
- EXPECT_FALSE(childResourceProvider->InUseByConsumer(id2)); |
- |
- ResourceProviderContext* childContext3D = static_cast<ResourceProviderContext*>(childOutputSurface->context3d()); |
- { |
- ResourceProvider::ScopedReadLockGL lock(childResourceProvider.get(), id1); |
- ASSERT_NE(0U, lock.texture_id()); |
- childContext3D->bindTexture(GL_TEXTURE_2D, lock.texture_id()); |
- childContext3D->getPixels(size, format, result); |
- EXPECT_EQ(0, memcmp(data1, result, pixelSize)); |
- } |
- { |
- ResourceProvider::ScopedReadLockGL lock(childResourceProvider.get(), id2); |
- ASSERT_NE(0U, lock.texture_id()); |
- childContext3D->bindTexture(GL_TEXTURE_2D, lock.texture_id()); |
- childContext3D->getPixels(size, format, result); |
- EXPECT_EQ(0, memcmp(data2, result, pixelSize)); |
- } |
- |
- { |
- // Transfer resources to the parent again. |
- ResourceProvider::ResourceIdArray resourceIdsToTransfer; |
- resourceIdsToTransfer.push_back(id1); |
- resourceIdsToTransfer.push_back(id2); |
- TransferableResourceArray list; |
- childResourceProvider->PrepareSendToParent(resourceIdsToTransfer, &list); |
- ASSERT_EQ(2u, list.size()); |
- EXPECT_NE(0u, list[0].sync_point); |
- EXPECT_NE(0u, list[1].sync_point); |
- EXPECT_TRUE(childResourceProvider->InUseByConsumer(id1)); |
- EXPECT_TRUE(childResourceProvider->InUseByConsumer(id2)); |
- m_resourceProvider->ReceiveFromChild(childId, list); |
- } |
- |
- EXPECT_EQ(2u, m_resourceProvider->num_resources()); |
- m_resourceProvider->DestroyChild(childId); |
- EXPECT_EQ(0u, m_resourceProvider->num_resources()); |
-} |
- |
-TEST_P(ResourceProviderTest, DeleteTransferredResources) |
-{ |
- // Resource transfer is only supported with GL textures for now. |
- if (GetParam() != ResourceProvider::GLTexture) |
- return; |
- |
- scoped_ptr<OutputSurface> childOutputSurface(FakeOutputSurface::Create3d(ResourceProviderContext::Create(m_sharedData.get()).PassAs<WebKit::WebGraphicsContext3D>())); |
- scoped_ptr<ResourceProvider> childResourceProvider(ResourceProvider::Create(childOutputSurface.get())); |
- |
- gfx::Size size(1, 1); |
- WGC3Denum format = GL_RGBA; |
- size_t pixelSize = textureSize(size, format); |
- ASSERT_EQ(4U, pixelSize); |
- |
- ResourceProvider::ResourceId id = childResourceProvider->CreateResource(size, format, ResourceProvider::TextureUsageAny); |
- uint8_t data[4] = {1, 2, 3, 4}; |
- gfx::Rect rect(gfx::Point(), size); |
- childResourceProvider->SetPixels(id, data, rect, rect, gfx::Vector2d()); |
- |
- int childId = m_resourceProvider->CreateChild(); |
- |
- { |
- // Transfer some resource to the parent. |
- ResourceProvider::ResourceIdArray resourceIdsToTransfer; |
- resourceIdsToTransfer.push_back(id); |
- TransferableResourceArray list; |
- childResourceProvider->PrepareSendToParent(resourceIdsToTransfer, &list); |
- ASSERT_EQ(1u, list.size()); |
- EXPECT_NE(0u, list[0].sync_point); |
- EXPECT_TRUE(childResourceProvider->InUseByConsumer(id)); |
- m_resourceProvider->ReceiveFromChild(childId, list); |
- } |
- |
- // Delete textures in the child, while they are transfered. |
- childResourceProvider->DeleteResource(id); |
- EXPECT_EQ(1u, childResourceProvider->num_resources()); |
- |
- { |
- // Transfer resources back from the parent to the child. |
- ResourceProvider::ResourceIdMap resourceMap = m_resourceProvider->GetChildToParentMap(childId); |
- ResourceProvider::ResourceId mappedId = resourceMap[id]; |
- EXPECT_NE(0u, mappedId); |
- ResourceProvider::ResourceIdArray resourceIdsToTransfer; |
- resourceIdsToTransfer.push_back(mappedId); |
- TransferableResourceArray list; |
- m_resourceProvider->PrepareSendToChild(childId, resourceIdsToTransfer, &list); |
- ASSERT_EQ(1u, list.size()); |
- EXPECT_NE(0u, list[0].sync_point); |
- childResourceProvider->ReceiveFromParent(list); |
- } |
- EXPECT_EQ(0u, childResourceProvider->num_resources()); |
-} |
- |
-TEST_P(ResourceProviderTest, TextureFilters) |
-{ |
- // Resource transfer is only supported with GL textures for now. |
- if (GetParam() != ResourceProvider::GLTexture) |
- return; |
- |
- scoped_ptr<OutputSurface> childOutputSurface(FakeOutputSurface::Create3d(ResourceProviderContext::Create(m_sharedData.get()).PassAs<WebKit::WebGraphicsContext3D>())); |
- scoped_ptr<ResourceProvider> childResourceProvider(ResourceProvider::Create(childOutputSurface.get())); |
- |
- gfx::Size size(1, 1); |
- WGC3Denum format = GL_RGBA; |
- size_t pixelSize = textureSize(size, format); |
- ASSERT_EQ(4U, pixelSize); |
- |
- ResourceProvider::ResourceId id = childResourceProvider->CreateResource(size, format, ResourceProvider::TextureUsageAny); |
- uint8_t data[4] = {1, 2, 3, 4}; |
- gfx::Rect rect(gfx::Point(), size); |
- childResourceProvider->SetPixels(id, data, rect, rect, gfx::Vector2d()); |
- EXPECT_EQ(GL_LINEAR, getResourceFilter(childResourceProvider.get(), id)); |
- setResourceFilter(childResourceProvider.get(), id, GL_NEAREST); |
- EXPECT_EQ(GL_NEAREST, getResourceFilter(childResourceProvider.get(), id)); |
- |
- int childId = m_resourceProvider->CreateChild(); |
- |
- { |
- // Transfer some resource to the parent. |
- ResourceProvider::ResourceIdArray resourceIdsToTransfer; |
- resourceIdsToTransfer.push_back(id); |
- TransferableResourceArray list; |
- childResourceProvider->PrepareSendToParent(resourceIdsToTransfer, &list); |
- ASSERT_EQ(1u, list.size()); |
- EXPECT_EQ(GL_NEAREST, list[0].filter); |
- m_resourceProvider->ReceiveFromChild(childId, list); |
- } |
- ResourceProvider::ResourceIdMap resourceMap = m_resourceProvider->GetChildToParentMap(childId); |
- ResourceProvider::ResourceId mappedId = resourceMap[id]; |
- EXPECT_NE(0u, mappedId); |
- EXPECT_EQ(GL_NEAREST, getResourceFilter(m_resourceProvider.get(), mappedId)); |
- setResourceFilter(m_resourceProvider.get(), mappedId, GL_LINEAR); |
- EXPECT_EQ(GL_LINEAR, getResourceFilter(m_resourceProvider.get(), mappedId)); |
- { |
- // Transfer resources back from the parent to the child. |
- ResourceProvider::ResourceIdArray resourceIdsToTransfer; |
- resourceIdsToTransfer.push_back(mappedId); |
- TransferableResourceArray list; |
- m_resourceProvider->PrepareSendToChild(childId, resourceIdsToTransfer, &list); |
- ASSERT_EQ(1u, list.size()); |
- EXPECT_EQ(GL_LINEAR, list[0].filter); |
- childResourceProvider->ReceiveFromParent(list); |
- } |
- EXPECT_EQ(GL_LINEAR, getResourceFilter(childResourceProvider.get(), id)); |
- setResourceFilter(childResourceProvider.get(), id, GL_NEAREST); |
- EXPECT_EQ(GL_NEAREST, getResourceFilter(childResourceProvider.get(), id)); |
-} |
- |
-void ReleaseTextureMailbox(unsigned* releaseSyncPoint, unsigned syncPoint) { |
- *releaseSyncPoint = syncPoint; |
-} |
- |
-TEST_P(ResourceProviderTest, TransferMailboxResources) |
-{ |
- // Resource transfer is only supported with GL textures for now. |
- if (GetParam() != ResourceProvider::GLTexture) |
- return; |
- unsigned texture = context()->createTexture(); |
- context()->bindTexture(GL_TEXTURE_2D, texture); |
- uint8_t data[4] = {1, 2, 3, 4}; |
- context()->texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &data); |
- gpu::Mailbox mailbox; |
- context()->genMailboxCHROMIUM(mailbox.name); |
- context()->produceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); |
- unsigned syncPoint = context()->insertSyncPoint(); |
- |
- // All the logic below assumes that the sync points are all positive. |
- EXPECT_LT(0u, syncPoint); |
- |
- unsigned releaseSyncPoint = 0; |
- TextureMailbox::ReleaseCallback callback = base::Bind(ReleaseTextureMailbox, &releaseSyncPoint); |
- ResourceProvider::ResourceId resource = m_resourceProvider->CreateResourceFromTextureMailbox(TextureMailbox(mailbox, callback, syncPoint)); |
- EXPECT_EQ(1u, context()->textureCount()); |
- EXPECT_EQ(0u, releaseSyncPoint); |
- |
- { |
- // Transfer the resource, expect the sync points to be consistent. |
- ResourceProvider::ResourceIdArray resourceIdsToTransfer; |
- resourceIdsToTransfer.push_back(resource); |
- TransferableResourceArray list; |
- m_resourceProvider->PrepareSendToParent(resourceIdsToTransfer, &list); |
- ASSERT_EQ(1u, list.size()); |
- EXPECT_LE(syncPoint, list[0].sync_point); |
- EXPECT_EQ(0u, memcmp(mailbox.name, list[0].mailbox.name, sizeof(mailbox.name))); |
- EXPECT_EQ(0u, releaseSyncPoint); |
- |
- context()->waitSyncPoint(list[0].sync_point); |
- unsigned otherTexture = context()->createTexture(); |
- context()->bindTexture(GL_TEXTURE_2D, otherTexture); |
- context()->consumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); |
- uint8_t testData[4] = {0}; |
- context()->getPixels(gfx::Size(1, 1), GL_RGBA, testData); |
- EXPECT_EQ(0u, memcmp(data, testData, sizeof(data))); |
- context()->produceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); |
- context()->deleteTexture(otherTexture); |
- list[0].sync_point = context()->insertSyncPoint(); |
- EXPECT_LT(0u, list[0].sync_point); |
- |
- // Receive the resource, then delete it, expect the sync points to be consistent. |
- m_resourceProvider->ReceiveFromParent(list); |
- EXPECT_EQ(1u, context()->textureCount()); |
- EXPECT_EQ(0u, releaseSyncPoint); |
- |
- m_resourceProvider->DeleteResource(resource); |
- EXPECT_LE(list[0].sync_point, releaseSyncPoint); |
- } |
- |
- |
- // We're going to do the same thing as above, but testing the case where we |
- // delete the resource before we receive it back. |
- syncPoint = releaseSyncPoint; |
- EXPECT_LT(0u, syncPoint); |
- releaseSyncPoint = 0; |
- resource = m_resourceProvider->CreateResourceFromTextureMailbox(TextureMailbox(mailbox, callback, syncPoint)); |
- EXPECT_EQ(1u, context()->textureCount()); |
- EXPECT_EQ(0u, releaseSyncPoint); |
- |
- { |
- // Transfer the resource, expect the sync points to be consistent. |
- ResourceProvider::ResourceIdArray resourceIdsToTransfer; |
- resourceIdsToTransfer.push_back(resource); |
- TransferableResourceArray list; |
- m_resourceProvider->PrepareSendToParent(resourceIdsToTransfer, &list); |
- ASSERT_EQ(1u, list.size()); |
- EXPECT_LE(syncPoint, list[0].sync_point); |
- EXPECT_EQ(0u, memcmp(mailbox.name, list[0].mailbox.name, sizeof(mailbox.name))); |
- EXPECT_EQ(0u, releaseSyncPoint); |
- |
- context()->waitSyncPoint(list[0].sync_point); |
- unsigned otherTexture = context()->createTexture(); |
- context()->bindTexture(GL_TEXTURE_2D, otherTexture); |
- context()->consumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); |
- uint8_t testData[4] = {0}; |
- context()->getPixels(gfx::Size(1, 1), GL_RGBA, testData); |
- EXPECT_EQ(0u, memcmp(data, testData, sizeof(data))); |
- context()->produceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); |
- context()->deleteTexture(otherTexture); |
- list[0].sync_point = context()->insertSyncPoint(); |
- EXPECT_LT(0u, list[0].sync_point); |
- |
- // Delete the resource, which shouldn't do anything. |
- m_resourceProvider->DeleteResource(resource); |
- EXPECT_EQ(1u, context()->textureCount()); |
- EXPECT_EQ(0u, releaseSyncPoint); |
- |
- // Then receive the resource which should release the mailbox, expect the sync points to be consistent. |
- m_resourceProvider->ReceiveFromParent(list); |
- EXPECT_LE(list[0].sync_point, releaseSyncPoint); |
- } |
- |
- context()->waitSyncPoint(releaseSyncPoint); |
- context()->bindTexture(GL_TEXTURE_2D, texture); |
- context()->consumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); |
- context()->deleteTexture(texture); |
-} |
- |
-class TextureStateTrackingContext : public TestWebGraphicsContext3D { |
-public: |
- MOCK_METHOD2(bindTexture, void(WGC3Denum target, WebGLId texture)); |
- MOCK_METHOD3(texParameteri, void(WGC3Denum target, WGC3Denum pname, WGC3Dint param)); |
- |
- // Force all textures to be "1" so we can test for them. |
- virtual WebKit::WebGLId NextTextureId() { return 1; } |
-}; |
- |
-TEST_P(ResourceProviderTest, ScopedSampler) |
-{ |
- // Sampling is only supported for GL textures. |
- if (GetParam() != ResourceProvider::GLTexture) |
- return; |
- |
- scoped_ptr<OutputSurface> outputSurface(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new TextureStateTrackingContext))); |
- TextureStateTrackingContext* context = static_cast<TextureStateTrackingContext*>(outputSurface->context3d()); |
- scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::Create(outputSurface.get())); |
- |
- gfx::Size size(1, 1); |
- WGC3Denum format = GL_RGBA; |
- int textureId = 1; |
- |
- // Check that the texture gets created with the right sampler settings. |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)) |
- .Times(2); // Once to create and once to allocate. |
- EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); |
- EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); |
- EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); |
- EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); |
- EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROMIUM, GL_TEXTURE_POOL_UNMANAGED_CHROMIUM)); |
- ResourceProvider::ResourceId id = resourceProvider->CreateResource(size, format, ResourceProvider::TextureUsageAny); |
- resourceProvider->AllocateForTesting(id); |
- |
- // Creating a sampler with the default filter should not change any texture |
- // parameters. |
- { |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)); |
- ResourceProvider::ScopedSamplerGL sampler(resourceProvider.get(), id, GL_TEXTURE_2D, GL_LINEAR); |
- } |
- |
- // Using a different filter should be reflected in the texture parameters. |
- { |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)); |
- EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); |
- EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); |
- ResourceProvider::ScopedSamplerGL sampler(resourceProvider.get(), id, GL_TEXTURE_2D, GL_NEAREST); |
- } |
- |
- // Test resetting to the default filter. |
- { |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)); |
- EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); |
- EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); |
- ResourceProvider::ScopedSamplerGL sampler(resourceProvider.get(), id, GL_TEXTURE_2D, GL_LINEAR); |
- } |
- |
- Mock::VerifyAndClearExpectations(context); |
-} |
- |
-TEST_P(ResourceProviderTest, ManagedResource) |
-{ |
- // Sampling is only supported for GL textures. |
- if (GetParam() != ResourceProvider::GLTexture) |
- return; |
- |
- scoped_ptr<OutputSurface> outputSurface(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new TextureStateTrackingContext))); |
- TextureStateTrackingContext* context = static_cast<TextureStateTrackingContext*>(outputSurface->context3d()); |
- scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::Create(outputSurface.get())); |
- |
- gfx::Size size(1, 1); |
- WGC3Denum format = GL_RGBA; |
- int textureId = 1; |
- |
- // Check that the texture gets created with the right sampler settings. |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)); |
- EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); |
- EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); |
- EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); |
- EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); |
- EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROMIUM, GL_TEXTURE_POOL_MANAGED_CHROMIUM)); |
- ResourceProvider::ResourceId id = resourceProvider->CreateManagedResource(size, format, ResourceProvider::TextureUsageAny); |
- |
- Mock::VerifyAndClearExpectations(context); |
-} |
- |
-class AllocationTrackingContext3D : public TestWebGraphicsContext3D { |
-public: |
- MOCK_METHOD0(createTexture, WebGLId()); |
- MOCK_METHOD1(deleteTexture, void(WebGLId texture_id)); |
- MOCK_METHOD2(bindTexture, void(WGC3Denum target, WebGLId texture)); |
- MOCK_METHOD9(texImage2D, void(WGC3Denum target, WGC3Dint level, WGC3Denum internalformat, |
- WGC3Dsizei width, WGC3Dsizei height, WGC3Dint border, WGC3Denum format, |
- WGC3Denum type, const void* pixels)); |
- MOCK_METHOD9(texSubImage2D, void(WGC3Denum target, WGC3Dint level, WGC3Dint xoffset, WGC3Dint yoffset, |
- WGC3Dsizei width, WGC3Dsizei height, WGC3Denum format, |
- WGC3Denum type, const void* pixels)); |
- MOCK_METHOD9(asyncTexImage2DCHROMIUM, void(WGC3Denum target, WGC3Dint level, WGC3Denum internalformat, |
- WGC3Dsizei width, WGC3Dsizei height, WGC3Dint border, WGC3Denum format, |
- WGC3Denum type, const void* pixels)); |
- MOCK_METHOD9(asyncTexSubImage2DCHROMIUM, void(WGC3Denum target, WGC3Dint level, WGC3Dint xoffset, WGC3Dint yoffset, |
- WGC3Dsizei width, WGC3Dsizei height, WGC3Denum format, |
- WGC3Denum type, const void* pixels)); |
- MOCK_METHOD1(waitAsyncTexImage2DCHROMIUM, void(WGC3Denum target)); |
-}; |
- |
-TEST_P(ResourceProviderTest, TextureAllocation) |
-{ |
- // Only for GL textures. |
- if (GetParam() != ResourceProvider::GLTexture) |
- return; |
- scoped_ptr<WebKit::WebGraphicsContext3D> mock_context( |
- static_cast<WebKit::WebGraphicsContext3D*>(new NiceMock<AllocationTrackingContext3D>)); |
- scoped_ptr<OutputSurface> outputSurface(FakeOutputSurface::Create3d(mock_context.Pass())); |
- |
- gfx::Size size(2, 2); |
- gfx::Vector2d offset(0, 0); |
- gfx::Rect rect(0, 0, 2, 2); |
- WGC3Denum format = GL_RGBA; |
- ResourceProvider::ResourceId id = 0; |
- uint8_t pixels[16] = {0}; |
- int textureId = 123; |
- |
- AllocationTrackingContext3D* context = static_cast<AllocationTrackingContext3D*>(outputSurface->context3d()); |
- scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::Create(outputSurface.get())); |
- |
- // Lazy allocation. Don't allocate when creating the resource. |
- EXPECT_CALL(*context, createTexture()).WillOnce(Return(textureId)); |
- EXPECT_CALL(*context, deleteTexture(textureId)).Times(1); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)).Times(1); |
- EXPECT_CALL(*context, texImage2D(_,_,_,_,_,_,_,_,_)).Times(0); |
- EXPECT_CALL(*context, asyncTexImage2DCHROMIUM(_,_,_,_,_,_,_,_,_)).Times(0); |
- id = resourceProvider->CreateResource(size, format, ResourceProvider::TextureUsageAny); |
- resourceProvider->DeleteResource(id); |
- Mock::VerifyAndClearExpectations(context); |
- |
- // Do allocate when we set the pixels. |
- EXPECT_CALL(*context, createTexture()).WillOnce(Return(textureId)); |
- EXPECT_CALL(*context, deleteTexture(textureId)).Times(1); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)).Times(3); |
- EXPECT_CALL(*context, texImage2D(_,_,_,2,2,_,_,_,_)).Times(1); |
- EXPECT_CALL(*context, texSubImage2D(_,_,_,_,2,2,_,_,_)).Times(1); |
- id = resourceProvider->CreateResource(size, format, ResourceProvider::TextureUsageAny); |
- resourceProvider->SetPixels(id, pixels, rect, rect, offset); |
- resourceProvider->DeleteResource(id); |
- Mock::VerifyAndClearExpectations(context); |
- |
- // Same for setPixelsFromBuffer |
- EXPECT_CALL(*context, createTexture()).WillOnce(Return(textureId)); |
- EXPECT_CALL(*context, deleteTexture(textureId)).Times(1); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)).Times(3); |
- EXPECT_CALL(*context, texImage2D(_,_,_,2,2,_,_,_,_)).Times(1); |
- EXPECT_CALL(*context, texSubImage2D(_,_,_,_,2,2,_,_,_)).Times(1); |
- id = resourceProvider->CreateResource(size, format, ResourceProvider::TextureUsageAny); |
- resourceProvider->AcquirePixelBuffer(id); |
- resourceProvider->SetPixelsFromBuffer(id); |
- resourceProvider->ReleasePixelBuffer(id); |
- resourceProvider->DeleteResource(id); |
- Mock::VerifyAndClearExpectations(context); |
- |
- // Same for async version. |
- EXPECT_CALL(*context, createTexture()).WillOnce(Return(textureId)); |
- EXPECT_CALL(*context, deleteTexture(textureId)).Times(1); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)).Times(2); |
- EXPECT_CALL(*context, asyncTexImage2DCHROMIUM(_,_,_,2,2,_,_,_,_)).Times(1); |
- id = resourceProvider->CreateResource(size, format, ResourceProvider::TextureUsageAny); |
- resourceProvider->AcquirePixelBuffer(id); |
- resourceProvider->BeginSetPixels(id); |
- resourceProvider->ReleasePixelBuffer(id); |
- resourceProvider->DeleteResource(id); |
- Mock::VerifyAndClearExpectations(context); |
-} |
- |
-TEST_P(ResourceProviderTest, ForcingAsyncUploadToComplete) |
-{ |
- // Only for GL textures. |
- if (GetParam() != ResourceProvider::GLTexture) |
- return; |
- scoped_ptr<WebKit::WebGraphicsContext3D> mock_context( |
- static_cast<WebKit::WebGraphicsContext3D*>(new NiceMock<AllocationTrackingContext3D>)); |
- scoped_ptr<OutputSurface> outputSurface(FakeOutputSurface::Create3d(mock_context.Pass())); |
- |
- gfx::Size size(2, 2); |
- WGC3Denum format = GL_RGBA; |
- ResourceProvider::ResourceId id = 0; |
- int textureId = 123; |
- |
- AllocationTrackingContext3D* context = static_cast<AllocationTrackingContext3D*>(outputSurface->context3d()); |
- scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::Create(outputSurface.get())); |
- |
- EXPECT_CALL(*context, createTexture()).WillOnce(Return(textureId)); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)).Times(3); |
- EXPECT_CALL(*context, asyncTexImage2DCHROMIUM(_,_,_,2,2,_,_,_,_)).Times(1); |
- EXPECT_CALL(*context, waitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)).Times(1); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, 0)).Times(1); |
- id = resourceProvider->CreateResource(size, format, ResourceProvider::TextureUsageAny); |
- resourceProvider->AcquirePixelBuffer(id); |
- resourceProvider->BeginSetPixels(id); |
- resourceProvider->ForceSetPixelsToComplete(id); |
- resourceProvider->ReleasePixelBuffer(id); |
- Mock::VerifyAndClearExpectations(context); |
-} |
- |
-TEST_P(ResourceProviderTest, AbortForcedAsyncUpload) |
-{ |
- // Only for GL textures. |
- if (GetParam() != ResourceProvider::GLTexture) |
- return; |
- scoped_ptr<WebKit::WebGraphicsContext3D> mock_context( |
- static_cast<WebKit::WebGraphicsContext3D*>(new NiceMock<AllocationTrackingContext3D>)); |
- scoped_ptr<OutputSurface> outputSurface(FakeOutputSurface::Create3d(mock_context.Pass())); |
- |
- gfx::Size size(2, 2); |
- WGC3Denum format = GL_RGBA; |
- ResourceProvider::ResourceId id = 0; |
- int textureId = 123; |
- |
- AllocationTrackingContext3D* context = static_cast<AllocationTrackingContext3D*>(outputSurface->context3d()); |
- scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::Create(outputSurface.get())); |
- |
- EXPECT_CALL(*context, createTexture()).WillRepeatedly(Return(textureId)); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)).Times(4); |
- EXPECT_CALL(*context, asyncTexImage2DCHROMIUM(_,_,_,2,2,_,_,_,_)).Times(1); |
- EXPECT_CALL(*context, waitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)).Times(1); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, 0)).Times(1); |
- EXPECT_CALL(*context, deleteTexture(_)).Times(1); |
- id = resourceProvider->CreateResource(size, format, ResourceProvider::TextureUsageAny); |
- resourceProvider->AcquirePixelBuffer(id); |
- resourceProvider->BeginSetPixels(id); |
- resourceProvider->ForceSetPixelsToComplete(id); |
- resourceProvider->AbortSetPixels(id); |
- resourceProvider->ReleasePixelBuffer(id); |
- Mock::VerifyAndClearExpectations(context); |
-} |
- |
-INSTANTIATE_TEST_CASE_P(ResourceProviderTests, |
- ResourceProviderTest, |
- ::testing::Values(ResourceProvider::GLTexture, |
- ResourceProvider::Bitmap)); |
- |
-} // namespace |
-} // namespace cc |