Index: cc/resources/resource_provider_unittest.cc |
diff --git a/cc/resources/resource_provider_unittest.cc b/cc/resources/resource_provider_unittest.cc |
deleted file mode 100644 |
index b33b4c32a26e69215b74db23dfd042d76249088e..0000000000000000000000000000000000000000 |
--- a/cc/resources/resource_provider_unittest.cc |
+++ /dev/null |
@@ -1,3734 +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/resources/resource_provider.h" |
- |
-#include <algorithm> |
-#include <map> |
-#include <set> |
- |
-#include "base/bind.h" |
-#include "base/containers/hash_tables.h" |
-#include "base/logging.h" |
-#include "base/memory/ref_counted.h" |
-#include "cc/base/blocking_task_runner.h" |
-#include "cc/base/scoped_ptr_deque.h" |
-#include "cc/output/output_surface.h" |
-#include "cc/resources/returned_resource.h" |
-#include "cc/resources/shared_bitmap_manager.h" |
-#include "cc/resources/single_release_callback.h" |
-#include "cc/test/fake_output_surface.h" |
-#include "cc/test/fake_output_surface_client.h" |
-#include "cc/test/test_gpu_memory_buffer_manager.h" |
-#include "cc/test/test_shared_bitmap_manager.h" |
-#include "cc/test/test_texture.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/khronos/GLES2/gl2.h" |
-#include "third_party/khronos/GLES2/gl2ext.h" |
-#include "ui/gfx/geometry/rect.h" |
-#include "ui/gfx/gpu_memory_buffer.h" |
- |
-using testing::Mock; |
-using testing::NiceMock; |
-using testing::Return; |
-using testing::SetArgPointee; |
-using testing::StrictMock; |
-using testing::_; |
- |
-namespace cc { |
-namespace { |
- |
-static void EmptyReleaseCallback(uint32 sync_point, |
- bool lost_resource, |
- BlockingTaskRunner* main_thread_task_runner) { |
-} |
- |
-static void ReleaseCallback( |
- uint32* release_sync_point, |
- bool* release_lost_resource, |
- BlockingTaskRunner** release_main_thread_task_runner, |
- uint32 sync_point, |
- bool lost_resource, |
- BlockingTaskRunner* main_thread_task_runner) { |
- *release_sync_point = sync_point; |
- *release_lost_resource = lost_resource; |
- *release_main_thread_task_runner = main_thread_task_runner; |
-} |
- |
-static void SharedBitmapReleaseCallback( |
- scoped_ptr<SharedBitmap> bitmap, |
- uint32 sync_point, |
- bool lost_resource, |
- BlockingTaskRunner* main_thread_task_runner) { |
-} |
- |
-static void ReleaseSharedBitmapCallback( |
- scoped_ptr<SharedBitmap> shared_bitmap, |
- bool* release_called, |
- uint32* release_sync_point, |
- bool* lost_resource_result, |
- uint32 sync_point, |
- bool lost_resource, |
- BlockingTaskRunner* main_thread_task_runner) { |
- *release_called = true; |
- *release_sync_point = sync_point; |
- *lost_resource_result = lost_resource; |
-} |
- |
-static scoped_ptr<SharedBitmap> CreateAndFillSharedBitmap( |
- SharedBitmapManager* manager, |
- const gfx::Size& size, |
- uint32_t value) { |
- scoped_ptr<SharedBitmap> shared_bitmap = manager->AllocateSharedBitmap(size); |
- CHECK(shared_bitmap); |
- uint32_t* pixels = reinterpret_cast<uint32_t*>(shared_bitmap->pixels()); |
- CHECK(pixels); |
- std::fill_n(pixels, size.GetArea(), value); |
- return shared_bitmap.Pass(); |
-} |
- |
-class TextureStateTrackingContext : public TestWebGraphicsContext3D { |
- public: |
- MOCK_METHOD2(bindTexture, void(GLenum target, GLuint texture)); |
- MOCK_METHOD3(texParameteri, void(GLenum target, GLenum pname, GLint param)); |
- MOCK_METHOD1(waitSyncPoint, void(GLuint sync_point)); |
- MOCK_METHOD0(insertSyncPoint, GLuint(void)); |
- MOCK_METHOD3(produceTextureDirectCHROMIUM, |
- void(GLuint texture, GLenum target, const GLbyte* mailbox)); |
- MOCK_METHOD2(createAndConsumeTextureCHROMIUM, |
- unsigned(GLenum target, const GLbyte* mailbox)); |
- |
- // Force all textures to be consecutive numbers starting at "1", |
- // so we easily can test for them. |
- GLuint NextTextureId() override { |
- base::AutoLock lock(namespace_->lock); |
- return namespace_->next_texture_id++; |
- } |
- void RetireTextureId(GLuint) override {} |
-}; |
- |
-// 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()); |
- } |
- |
- uint32 InsertSyncPoint() { return next_sync_point_++; } |
- |
- void GenMailbox(GLbyte* mailbox) { |
- memset(mailbox, 0, GL_MAILBOX_SIZE_CHROMIUM); |
- memcpy(mailbox, &next_mailbox_, sizeof(next_mailbox_)); |
- ++next_mailbox_; |
- } |
- |
- void ProduceTexture(const GLbyte* mailbox_name, |
- uint32 sync_point, |
- scoped_refptr<TestTexture> texture) { |
- unsigned mailbox = 0; |
- memcpy(&mailbox, mailbox_name, sizeof(mailbox)); |
- ASSERT_TRUE(mailbox && mailbox < next_mailbox_); |
- textures_[mailbox] = texture; |
- ASSERT_LT(sync_point_for_mailbox_[mailbox], sync_point); |
- sync_point_for_mailbox_[mailbox] = sync_point; |
- } |
- |
- scoped_refptr<TestTexture> ConsumeTexture(const GLbyte* mailbox_name, |
- uint32 sync_point) { |
- unsigned mailbox = 0; |
- memcpy(&mailbox, mailbox_name, sizeof(mailbox)); |
- DCHECK(mailbox && mailbox < next_mailbox_); |
- |
- // 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 (sync_point_for_mailbox_[mailbox] > sync_point) { |
- NOTREACHED(); |
- return scoped_refptr<TestTexture>(); |
- } |
- return textures_[mailbox]; |
- } |
- |
- private: |
- ContextSharedData() : next_sync_point_(1), next_mailbox_(1) {} |
- |
- uint32 next_sync_point_; |
- unsigned next_mailbox_; |
- typedef base::hash_map<unsigned, scoped_refptr<TestTexture>> TextureMap; |
- TextureMap textures_; |
- base::hash_map<unsigned, uint32> sync_point_for_mailbox_; |
-}; |
- |
-class ResourceProviderContext : public TestWebGraphicsContext3D { |
- public: |
- static scoped_ptr<ResourceProviderContext> Create( |
- ContextSharedData* shared_data) { |
- return make_scoped_ptr(new ResourceProviderContext(shared_data)); |
- } |
- |
- GLuint insertSyncPoint() override { |
- uint32 sync_point = shared_data_->InsertSyncPoint(); |
- // Commit the produceTextureCHROMIUM calls at this point, so that |
- // they're associated with the sync point. |
- for (PendingProduceTextureList::iterator it = |
- pending_produce_textures_.begin(); |
- it != pending_produce_textures_.end(); |
- ++it) { |
- shared_data_->ProduceTexture( |
- (*it)->mailbox, sync_point, (*it)->texture); |
- } |
- pending_produce_textures_.clear(); |
- return sync_point; |
- } |
- |
- void waitSyncPoint(GLuint sync_point) override { |
- last_waited_sync_point_ = std::max(sync_point, last_waited_sync_point_); |
- } |
- |
- unsigned last_waited_sync_point() const { return last_waited_sync_point_; } |
- |
- void texStorage2DEXT(GLenum target, |
- GLint levels, |
- GLuint internalformat, |
- GLint width, |
- GLint height) override { |
- CheckTextureIsBound(target); |
- ASSERT_EQ(static_cast<unsigned>(GL_TEXTURE_2D), target); |
- ASSERT_EQ(1, levels); |
- GLenum 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); |
- } |
- |
- void texImage2D(GLenum target, |
- GLint level, |
- GLenum internalformat, |
- GLsizei width, |
- GLsizei height, |
- GLint border, |
- GLenum format, |
- GLenum type, |
- const void* pixels) override { |
- CheckTextureIsBound(target); |
- ASSERT_EQ(static_cast<unsigned>(GL_TEXTURE_2D), target); |
- ASSERT_FALSE(level); |
- ASSERT_EQ(internalformat, format); |
- ASSERT_FALSE(border); |
- ASSERT_EQ(static_cast<unsigned>(GL_UNSIGNED_BYTE), type); |
- AllocateTexture(gfx::Size(width, height), format); |
- if (pixels) |
- SetPixels(0, 0, width, height, pixels); |
- } |
- |
- void texSubImage2D(GLenum target, |
- GLint level, |
- GLint xoffset, |
- GLint yoffset, |
- GLsizei width, |
- GLsizei height, |
- GLenum format, |
- GLenum type, |
- const void* pixels) override { |
- CheckTextureIsBound(target); |
- ASSERT_EQ(static_cast<unsigned>(GL_TEXTURE_2D), target); |
- ASSERT_FALSE(level); |
- ASSERT_EQ(static_cast<unsigned>(GL_UNSIGNED_BYTE), type); |
- { |
- base::AutoLock lock_for_texture_access(namespace_->lock); |
- ASSERT_EQ(GLDataFormat(BoundTexture(target)->format), format); |
- } |
- ASSERT_TRUE(pixels); |
- SetPixels(xoffset, yoffset, width, height, pixels); |
- } |
- |
- void genMailboxCHROMIUM(GLbyte* mailbox) override { |
- return shared_data_->GenMailbox(mailbox); |
- } |
- |
- void produceTextureDirectCHROMIUM(GLuint texture, |
- GLenum target, |
- const GLbyte* mailbox) override { |
- // 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)); |
- base::AutoLock lock_for_texture_access(namespace_->lock); |
- pending->texture = UnboundTexture(texture); |
- pending_produce_textures_.push_back(pending.Pass()); |
- } |
- |
- GLuint createAndConsumeTextureCHROMIUM(GLenum target, |
- const GLbyte* mailbox) override { |
- GLuint texture_id = createTexture(); |
- base::AutoLock lock_for_texture_access(namespace_->lock); |
- scoped_refptr<TestTexture> texture = |
- shared_data_->ConsumeTexture(mailbox, last_waited_sync_point_); |
- namespace_->textures.Replace(texture_id, texture); |
- return texture_id; |
- } |
- |
- void GetPixels(const gfx::Size& size, |
- ResourceFormat format, |
- uint8_t* pixels) { |
- CheckTextureIsBound(GL_TEXTURE_2D); |
- base::AutoLock lock_for_texture_access(namespace_->lock); |
- scoped_refptr<TestTexture> texture = BoundTexture(GL_TEXTURE_2D); |
- ASSERT_EQ(texture->size, size); |
- ASSERT_EQ(texture->format, format); |
- memcpy(pixels, texture->data.get(), TextureSizeBytes(size, format)); |
- } |
- |
- protected: |
- explicit ResourceProviderContext(ContextSharedData* shared_data) |
- : shared_data_(shared_data), |
- last_waited_sync_point_(0) {} |
- |
- private: |
- void AllocateTexture(const gfx::Size& size, GLenum format) { |
- CheckTextureIsBound(GL_TEXTURE_2D); |
- ResourceFormat texture_format = RGBA_8888; |
- switch (format) { |
- case GL_RGBA: |
- texture_format = RGBA_8888; |
- break; |
- case GL_BGRA_EXT: |
- texture_format = BGRA_8888; |
- break; |
- } |
- base::AutoLock lock_for_texture_access(namespace_->lock); |
- BoundTexture(GL_TEXTURE_2D)->Reallocate(size, texture_format); |
- } |
- |
- void SetPixels(int xoffset, |
- int yoffset, |
- int width, |
- int height, |
- const void* pixels) { |
- CheckTextureIsBound(GL_TEXTURE_2D); |
- base::AutoLock lock_for_texture_access(namespace_->lock); |
- scoped_refptr<TestTexture> texture = BoundTexture(GL_TEXTURE_2D); |
- 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 in_pitch = TextureSizeBytes(gfx::Size(width, 1), texture->format); |
- size_t out_pitch = |
- TextureSizeBytes(gfx::Size(texture->size.width(), 1), texture->format); |
- uint8_t* dest = texture->data.get() + yoffset * out_pitch + |
- TextureSizeBytes(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, in_pitch); |
- dest += out_pitch; |
- src += in_pitch; |
- } |
- } |
- |
- struct PendingProduceTexture { |
- GLbyte mailbox[GL_MAILBOX_SIZE_CHROMIUM]; |
- scoped_refptr<TestTexture> texture; |
- }; |
- typedef ScopedPtrDeque<PendingProduceTexture> PendingProduceTextureList; |
- ContextSharedData* shared_data_; |
- GLuint last_waited_sync_point_; |
- PendingProduceTextureList pending_produce_textures_; |
-}; |
- |
-void GetResourcePixels(ResourceProvider* resource_provider, |
- ResourceProviderContext* context, |
- ResourceProvider::ResourceId id, |
- const gfx::Size& size, |
- ResourceFormat format, |
- uint8_t* pixels) { |
- resource_provider->WaitSyncPointIfNeeded(id); |
- switch (resource_provider->default_resource_type()) { |
- case ResourceProvider::RESOURCE_TYPE_GL_TEXTURE: { |
- ResourceProvider::ScopedReadLockGL lock_gl(resource_provider, id); |
- ASSERT_NE(0U, lock_gl.texture_id()); |
- context->bindTexture(GL_TEXTURE_2D, lock_gl.texture_id()); |
- context->GetPixels(size, format, pixels); |
- break; |
- } |
- case ResourceProvider::RESOURCE_TYPE_BITMAP: { |
- ResourceProvider::ScopedReadLockSoftware lock_software(resource_provider, |
- id); |
- memcpy(pixels, |
- lock_software.sk_bitmap()->getPixels(), |
- lock_software.sk_bitmap()->getSize()); |
- break; |
- } |
- case ResourceProvider::RESOURCE_TYPE_INVALID: |
- NOTREACHED(); |
- break; |
- } |
-} |
- |
-class ResourceProviderTest |
- : public testing::TestWithParam<ResourceProvider::ResourceType> { |
- public: |
- ResourceProviderTest() |
- : shared_data_(ContextSharedData::Create()), |
- context3d_(NULL), |
- child_context_(NULL), |
- main_thread_task_runner_(BlockingTaskRunner::Create(NULL)) { |
- switch (GetParam()) { |
- case ResourceProvider::RESOURCE_TYPE_GL_TEXTURE: { |
- scoped_ptr<ResourceProviderContext> context3d( |
- ResourceProviderContext::Create(shared_data_.get())); |
- context3d_ = context3d.get(); |
- |
- scoped_refptr<TestContextProvider> context_provider = |
- TestContextProvider::Create(context3d.Pass()); |
- |
- output_surface_ = FakeOutputSurface::Create3d(context_provider); |
- |
- scoped_ptr<ResourceProviderContext> child_context_owned = |
- ResourceProviderContext::Create(shared_data_.get()); |
- child_context_ = child_context_owned.get(); |
- child_output_surface_ = |
- FakeOutputSurface::Create3d(child_context_owned.Pass()); |
- break; |
- } |
- case ResourceProvider::RESOURCE_TYPE_BITMAP: |
- output_surface_ = FakeOutputSurface::CreateSoftware( |
- make_scoped_ptr(new SoftwareOutputDevice)); |
- child_output_surface_ = FakeOutputSurface::CreateSoftware( |
- make_scoped_ptr(new SoftwareOutputDevice)); |
- break; |
- case ResourceProvider::RESOURCE_TYPE_INVALID: |
- NOTREACHED(); |
- break; |
- } |
- CHECK(output_surface_->BindToClient(&output_surface_client_)); |
- CHECK(child_output_surface_->BindToClient(&child_output_surface_client_)); |
- |
- shared_bitmap_manager_.reset(new TestSharedBitmapManager); |
- gpu_memory_buffer_manager_.reset(new TestGpuMemoryBufferManager); |
- |
- resource_provider_ = |
- ResourceProvider::Create(output_surface_.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- main_thread_task_runner_.get(), |
- 0, |
- false, |
- 1); |
- child_resource_provider_ = |
- ResourceProvider::Create(child_output_surface_.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- main_thread_task_runner_.get(), |
- 0, |
- false, |
- 1); |
- } |
- |
- static void CollectResources(ReturnedResourceArray* array, |
- const ReturnedResourceArray& returned, |
- BlockingTaskRunner* main_thread_task_runner) { |
- array->insert(array->end(), returned.begin(), returned.end()); |
- } |
- |
- static ReturnCallback GetReturnCallback(ReturnedResourceArray* array) { |
- return base::Bind(&ResourceProviderTest::CollectResources, array); |
- } |
- |
- static void SetResourceFilter(ResourceProvider* resource_provider, |
- ResourceProvider::ResourceId id, |
- GLenum filter) { |
- ResourceProvider::ScopedSamplerGL sampler( |
- resource_provider, id, GL_TEXTURE_2D, filter); |
- } |
- |
- ResourceProviderContext* context() { return context3d_; } |
- |
- ResourceProvider::ResourceId CreateChildMailbox(uint32* release_sync_point, |
- bool* lost_resource, |
- bool* release_called, |
- uint32* sync_point) { |
- if (GetParam() == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) { |
- unsigned texture = child_context_->createTexture(); |
- gpu::Mailbox gpu_mailbox; |
- child_context_->genMailboxCHROMIUM(gpu_mailbox.name); |
- child_context_->produceTextureDirectCHROMIUM(texture, GL_TEXTURE_2D, |
- gpu_mailbox.name); |
- *sync_point = child_context_->insertSyncPoint(); |
- EXPECT_LT(0u, *sync_point); |
- |
- scoped_ptr<SharedBitmap> shared_bitmap; |
- scoped_ptr<SingleReleaseCallbackImpl> callback = |
- SingleReleaseCallbackImpl::Create(base::Bind( |
- ReleaseSharedBitmapCallback, base::Passed(&shared_bitmap), |
- release_called, release_sync_point, lost_resource)); |
- return child_resource_provider_->CreateResourceFromTextureMailbox( |
- TextureMailbox(gpu_mailbox, GL_TEXTURE_2D, *sync_point), |
- callback.Pass()); |
- } else { |
- gfx::Size size(64, 64); |
- scoped_ptr<SharedBitmap> shared_bitmap( |
- CreateAndFillSharedBitmap(shared_bitmap_manager_.get(), size, 0)); |
- |
- SharedBitmap* shared_bitmap_ptr = shared_bitmap.get(); |
- scoped_ptr<SingleReleaseCallbackImpl> callback = |
- SingleReleaseCallbackImpl::Create(base::Bind( |
- ReleaseSharedBitmapCallback, base::Passed(&shared_bitmap), |
- release_called, release_sync_point, lost_resource)); |
- return child_resource_provider_->CreateResourceFromTextureMailbox( |
- TextureMailbox(shared_bitmap_ptr, size), callback.Pass()); |
- } |
- } |
- |
- protected: |
- scoped_ptr<ContextSharedData> shared_data_; |
- ResourceProviderContext* context3d_; |
- ResourceProviderContext* child_context_; |
- FakeOutputSurfaceClient output_surface_client_; |
- FakeOutputSurfaceClient child_output_surface_client_; |
- scoped_ptr<OutputSurface> output_surface_; |
- scoped_ptr<OutputSurface> child_output_surface_; |
- scoped_ptr<BlockingTaskRunner> main_thread_task_runner_; |
- scoped_ptr<ResourceProvider> resource_provider_; |
- scoped_ptr<ResourceProvider> child_resource_provider_; |
- scoped_ptr<TestSharedBitmapManager> shared_bitmap_manager_; |
- scoped_ptr<TestGpuMemoryBufferManager> gpu_memory_buffer_manager_; |
-}; |
- |
-void CheckCreateResource(ResourceProvider::ResourceType expected_default_type, |
- ResourceProvider* resource_provider, |
- ResourceProviderContext* context) { |
- DCHECK_EQ(expected_default_type, resource_provider->default_resource_type()); |
- |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- size_t pixel_size = TextureSizeBytes(size, format); |
- ASSERT_EQ(4U, pixel_size); |
- |
- ResourceProvider::ResourceId id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- EXPECT_EQ(1, static_cast<int>(resource_provider->num_resources())); |
- if (expected_default_type == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- EXPECT_EQ(0u, context->NumTextures()); |
- |
- uint8_t data[4] = { 1, 2, 3, 4 }; |
- resource_provider->CopyToResource(id, data, size); |
- if (expected_default_type == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- EXPECT_EQ(1u, context->NumTextures()); |
- |
- uint8_t result[4] = { 0 }; |
- GetResourcePixels(resource_provider, context, id, size, format, result); |
- EXPECT_EQ(0, memcmp(data, result, pixel_size)); |
- |
- resource_provider->DeleteResource(id); |
- EXPECT_EQ(0, static_cast<int>(resource_provider->num_resources())); |
- if (expected_default_type == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- EXPECT_EQ(0u, context->NumTextures()); |
-} |
- |
-TEST_P(ResourceProviderTest, Basic) { |
- CheckCreateResource(GetParam(), resource_provider_.get(), context()); |
-} |
- |
-TEST_P(ResourceProviderTest, Upload) { |
- gfx::Size size(2, 2); |
- ResourceFormat format = RGBA_8888; |
- size_t pixel_size = TextureSizeBytes(size, format); |
- ASSERT_EQ(16U, pixel_size); |
- |
- ResourceProvider::ResourceId id = resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- |
- uint8_t image[16] = { 0 }; |
- gfx::Rect image_rect(size); |
- resource_provider_->SetPixels( |
- id, image, image_rect, image_rect, gfx::Vector2d()); |
- |
- for (uint8_t i = 0; i < pixel_size; ++i) |
- image[i] = i; |
- |
- uint8_t result[16] = { 0 }; |
- { |
- gfx::Rect source_rect(0, 0, 1, 1); |
- gfx::Vector2d dest_offset(0, 0); |
- resource_provider_->SetPixels( |
- id, image, image_rect, source_rect, dest_offset); |
- |
- uint8_t expected[16] = { 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; |
- GetResourcePixels( |
- resource_provider_.get(), context(), id, size, format, result); |
- EXPECT_EQ(0, memcmp(expected, result, pixel_size)); |
- } |
- { |
- gfx::Rect source_rect(0, 0, 1, 1); |
- gfx::Vector2d dest_offset(1, 1); |
- resource_provider_->SetPixels( |
- id, image, image_rect, source_rect, dest_offset); |
- |
- uint8_t expected[16] = { 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 }; |
- GetResourcePixels( |
- resource_provider_.get(), context(), id, size, format, result); |
- EXPECT_EQ(0, memcmp(expected, result, pixel_size)); |
- } |
- { |
- gfx::Rect source_rect(1, 0, 1, 1); |
- gfx::Vector2d dest_offset(0, 1); |
- resource_provider_->SetPixels( |
- id, image, image_rect, source_rect, dest_offset); |
- |
- uint8_t expected[16] = { 0, 1, 2, 3, 0, 0, 0, 0, 4, 5, 6, 7, 0, 1, 2, 3 }; |
- GetResourcePixels( |
- resource_provider_.get(), context(), id, size, format, result); |
- EXPECT_EQ(0, memcmp(expected, result, pixel_size)); |
- } |
- { |
- gfx::Rect offset_image_rect(gfx::Point(100, 100), size); |
- gfx::Rect source_rect(100, 100, 1, 1); |
- gfx::Vector2d dest_offset(1, 0); |
- resource_provider_->SetPixels( |
- id, image, offset_image_rect, source_rect, dest_offset); |
- |
- uint8_t expected[16] = { 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3 }; |
- GetResourcePixels( |
- resource_provider_.get(), context(), id, size, format, result); |
- EXPECT_EQ(0, memcmp(expected, result, pixel_size)); |
- } |
- |
- resource_provider_->DeleteResource(id); |
-} |
- |
-TEST_P(ResourceProviderTest, SimpleUpload) { |
- gfx::Size size(2, 2); |
- ResourceFormat format = RGBA_8888; |
- size_t pixel_size = TextureSizeBytes(size, format); |
- ASSERT_EQ(16U, pixel_size); |
- |
- ResourceProvider::ResourceId id = resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- |
- uint8_t image[16] = {0}; |
- resource_provider_->CopyToResource(id, image, size); |
- { |
- uint8_t result[16] = {0}; |
- uint8_t expected[16] = {0}; |
- GetResourcePixels(resource_provider_.get(), context(), id, size, format, |
- result); |
- EXPECT_EQ(0, memcmp(expected, result, pixel_size)); |
- } |
- |
- for (uint8_t i = 0; i < pixel_size; ++i) |
- image[i] = i; |
- resource_provider_->CopyToResource(id, image, size); |
- { |
- uint8_t result[16] = {0}; |
- uint8_t expected[16] = { |
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; |
- GetResourcePixels(resource_provider_.get(), context(), id, size, format, |
- result); |
- EXPECT_EQ(0, memcmp(expected, result, pixel_size)); |
- } |
-} |
- |
-TEST_P(ResourceProviderTest, TransferGLResources) { |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- size_t pixel_size = TextureSizeBytes(size, format); |
- ASSERT_EQ(4U, pixel_size); |
- |
- ResourceProvider::ResourceId id1 = child_resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- uint8_t data1[4] = { 1, 2, 3, 4 }; |
- child_resource_provider_->CopyToResource(id1, data1, size); |
- |
- ResourceProvider::ResourceId id2 = child_resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- uint8_t data2[4] = { 5, 5, 5, 5 }; |
- child_resource_provider_->CopyToResource(id2, data2, size); |
- |
- ResourceProvider::ResourceId id3 = child_resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- { |
- ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock( |
- child_resource_provider_.get(), id3); |
- EXPECT_TRUE(!!lock.GetGpuMemoryBuffer()); |
- } |
- |
- GLuint external_texture_id = child_context_->createExternalTexture(); |
- |
- gpu::Mailbox external_mailbox; |
- child_context_->genMailboxCHROMIUM(external_mailbox.name); |
- child_context_->produceTextureDirectCHROMIUM( |
- external_texture_id, GL_TEXTURE_EXTERNAL_OES, external_mailbox.name); |
- const GLuint external_sync_point = child_context_->insertSyncPoint(); |
- ResourceProvider::ResourceId id4 = |
- child_resource_provider_->CreateResourceFromTextureMailbox( |
- TextureMailbox( |
- external_mailbox, GL_TEXTURE_EXTERNAL_OES, external_sync_point), |
- SingleReleaseCallbackImpl::Create(base::Bind(&EmptyReleaseCallback))); |
- |
- ReturnedResourceArray returned_to_child; |
- int child_id = |
- resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
- { |
- // Transfer some resources to the parent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(id1); |
- resource_ids_to_transfer.push_back(id2); |
- resource_ids_to_transfer.push_back(id3); |
- resource_ids_to_transfer.push_back(id4); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- ASSERT_EQ(4u, list.size()); |
- EXPECT_NE(0u, list[0].mailbox_holder.sync_point); |
- EXPECT_NE(0u, list[1].mailbox_holder.sync_point); |
- EXPECT_EQ(list[0].mailbox_holder.sync_point, |
- list[1].mailbox_holder.sync_point); |
- EXPECT_NE(0u, list[2].mailbox_holder.sync_point); |
- EXPECT_EQ(list[0].mailbox_holder.sync_point, |
- list[2].mailbox_holder.sync_point); |
- EXPECT_EQ(external_sync_point, list[3].mailbox_holder.sync_point); |
- EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), |
- list[0].mailbox_holder.texture_target); |
- EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), |
- list[1].mailbox_holder.texture_target); |
- EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), |
- list[2].mailbox_holder.texture_target); |
- EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), |
- list[3].mailbox_holder.texture_target); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id4)); |
- resource_provider_->ReceiveFromChild(child_id, list); |
- EXPECT_NE(list[0].mailbox_holder.sync_point, |
- context3d_->last_waited_sync_point()); |
- { |
- resource_provider_->WaitSyncPointIfNeeded(list[0].id); |
- ResourceProvider::ScopedReadLockGL lock(resource_provider_.get(), |
- list[0].id); |
- } |
- EXPECT_EQ(list[0].mailbox_holder.sync_point, |
- context3d_->last_waited_sync_point()); |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, |
- resource_ids_to_transfer); |
- } |
- |
- EXPECT_EQ(4u, resource_provider_->num_resources()); |
- ResourceProvider::ResourceIdMap resource_map = |
- resource_provider_->GetChildToParentMap(child_id); |
- ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; |
- ResourceProvider::ResourceId mapped_id2 = resource_map[id2]; |
- ResourceProvider::ResourceId mapped_id3 = resource_map[id3]; |
- ResourceProvider::ResourceId mapped_id4 = resource_map[id4]; |
- EXPECT_NE(0u, mapped_id1); |
- EXPECT_NE(0u, mapped_id2); |
- EXPECT_NE(0u, mapped_id3); |
- EXPECT_NE(0u, mapped_id4); |
- EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); |
- EXPECT_FALSE(resource_provider_->InUseByConsumer(id2)); |
- EXPECT_FALSE(resource_provider_->InUseByConsumer(id3)); |
- EXPECT_FALSE(resource_provider_->InUseByConsumer(id4)); |
- |
- uint8_t result[4] = { 0 }; |
- GetResourcePixels( |
- resource_provider_.get(), context(), mapped_id1, size, format, result); |
- EXPECT_EQ(0, memcmp(data1, result, pixel_size)); |
- |
- GetResourcePixels( |
- resource_provider_.get(), context(), mapped_id2, size, format, result); |
- EXPECT_EQ(0, memcmp(data2, result, pixel_size)); |
- |
- { |
- // Check that transfering again the same resource from the child to the |
- // parent works. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(id1); |
- resource_ids_to_transfer.push_back(id2); |
- resource_ids_to_transfer.push_back(id3); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- EXPECT_EQ(3u, list.size()); |
- EXPECT_EQ(id1, list[0].id); |
- EXPECT_EQ(id2, list[1].id); |
- EXPECT_EQ(id3, list[2].id); |
- EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), |
- list[0].mailbox_holder.texture_target); |
- EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), |
- list[1].mailbox_holder.texture_target); |
- EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), |
- list[2].mailbox_holder.texture_target); |
- ReturnedResourceArray returned; |
- TransferableResource::ReturnResources(list, &returned); |
- child_resource_provider_->ReceiveReturnsFromParent(returned); |
- // ids were exported twice, we returned them only once, they should still |
- // be in-use. |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
- } |
- { |
- EXPECT_EQ(0u, returned_to_child.size()); |
- |
- // Transfer resources back from the parent to the child. Set no resources as |
- // being in use. |
- ResourceProvider::ResourceIdArray no_resources; |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
- |
- ASSERT_EQ(4u, returned_to_child.size()); |
- EXPECT_NE(0u, returned_to_child[0].sync_point); |
- EXPECT_NE(0u, returned_to_child[1].sync_point); |
- EXPECT_NE(0u, returned_to_child[2].sync_point); |
- EXPECT_NE(0u, returned_to_child[3].sync_point); |
- EXPECT_FALSE(returned_to_child[0].lost); |
- EXPECT_FALSE(returned_to_child[1].lost); |
- EXPECT_FALSE(returned_to_child[2].lost); |
- EXPECT_FALSE(returned_to_child[3].lost); |
- child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); |
- returned_to_child.clear(); |
- } |
- EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id1)); |
- EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id2)); |
- EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id3)); |
- EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id4)); |
- |
- { |
- child_resource_provider_->WaitSyncPointIfNeeded(id1); |
- ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(), |
- id1); |
- ASSERT_NE(0U, lock.texture_id()); |
- child_context_->bindTexture(GL_TEXTURE_2D, lock.texture_id()); |
- child_context_->GetPixels(size, format, result); |
- EXPECT_EQ(0, memcmp(data1, result, pixel_size)); |
- } |
- { |
- child_resource_provider_->WaitSyncPointIfNeeded(id2); |
- ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(), |
- id2); |
- ASSERT_NE(0U, lock.texture_id()); |
- child_context_->bindTexture(GL_TEXTURE_2D, lock.texture_id()); |
- child_context_->GetPixels(size, format, result); |
- EXPECT_EQ(0, memcmp(data2, result, pixel_size)); |
- } |
- { |
- child_resource_provider_->WaitSyncPointIfNeeded(id3); |
- ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(), |
- id3); |
- ASSERT_NE(0U, lock.texture_id()); |
- child_context_->bindTexture(GL_TEXTURE_2D, lock.texture_id()); |
- } |
- { |
- // Transfer resources to the parent again. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(id1); |
- resource_ids_to_transfer.push_back(id2); |
- resource_ids_to_transfer.push_back(id3); |
- resource_ids_to_transfer.push_back(id4); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- ASSERT_EQ(4u, list.size()); |
- EXPECT_EQ(id1, list[0].id); |
- EXPECT_EQ(id2, list[1].id); |
- EXPECT_EQ(id3, list[2].id); |
- EXPECT_EQ(id4, list[3].id); |
- EXPECT_NE(0u, list[0].mailbox_holder.sync_point); |
- EXPECT_NE(0u, list[1].mailbox_holder.sync_point); |
- EXPECT_NE(0u, list[2].mailbox_holder.sync_point); |
- EXPECT_NE(0u, list[3].mailbox_holder.sync_point); |
- EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), |
- list[0].mailbox_holder.texture_target); |
- EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), |
- list[1].mailbox_holder.texture_target); |
- EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), |
- list[2].mailbox_holder.texture_target); |
- EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), |
- list[3].mailbox_holder.texture_target); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id4)); |
- resource_provider_->ReceiveFromChild(child_id, list); |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, |
- resource_ids_to_transfer); |
- } |
- |
- EXPECT_EQ(0u, returned_to_child.size()); |
- |
- EXPECT_EQ(4u, resource_provider_->num_resources()); |
- resource_provider_->DestroyChild(child_id); |
- EXPECT_EQ(0u, resource_provider_->num_resources()); |
- |
- ASSERT_EQ(4u, returned_to_child.size()); |
- EXPECT_NE(0u, returned_to_child[0].sync_point); |
- EXPECT_NE(0u, returned_to_child[1].sync_point); |
- EXPECT_NE(0u, returned_to_child[2].sync_point); |
- EXPECT_NE(0u, returned_to_child[3].sync_point); |
- EXPECT_FALSE(returned_to_child[0].lost); |
- EXPECT_FALSE(returned_to_child[1].lost); |
- EXPECT_FALSE(returned_to_child[2].lost); |
- EXPECT_FALSE(returned_to_child[3].lost); |
-} |
- |
-TEST_P(ResourceProviderTest, ReadLockCountStopsReturnToChildOrDelete) { |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- |
- ResourceProvider::ResourceId id1 = child_resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- uint8_t data1[4] = {1, 2, 3, 4}; |
- child_resource_provider_->CopyToResource(id1, data1, size); |
- |
- ReturnedResourceArray returned_to_child; |
- int child_id = |
- resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
- { |
- // Transfer some resources to the parent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(id1); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- ASSERT_EQ(1u, list.size()); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
- |
- resource_provider_->ReceiveFromChild(child_id, list); |
- |
- resource_provider_->WaitSyncPointIfNeeded(list[0].id); |
- ResourceProvider::ScopedReadLockGL lock(resource_provider_.get(), |
- list[0].id); |
- |
- resource_provider_->DeclareUsedResourcesFromChild( |
- child_id, ResourceProvider::ResourceIdArray()); |
- EXPECT_EQ(0u, returned_to_child.size()); |
- } |
- |
- EXPECT_EQ(1u, returned_to_child.size()); |
- child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); |
- |
- { |
- child_resource_provider_->WaitSyncPointIfNeeded(id1); |
- ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(), |
- id1); |
- child_resource_provider_->DeleteResource(id1); |
- EXPECT_EQ(1u, child_resource_provider_->num_resources()); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
- } |
- |
- EXPECT_EQ(0u, child_resource_provider_->num_resources()); |
- resource_provider_->DestroyChild(child_id); |
-} |
- |
-TEST_P(ResourceProviderTest, AllowOverlayTransfersToParent) { |
- // Overlays only supported on the GL path. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- |
- uint32 sync_point = 0; |
- TextureMailbox mailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point); |
- mailbox.set_allow_overlay(true); |
- scoped_ptr<SingleReleaseCallbackImpl> release_callback = |
- SingleReleaseCallbackImpl::Create(base::Bind(&EmptyReleaseCallback)); |
- ResourceProvider::ResourceId id1 = |
- child_resource_provider_->CreateResourceFromTextureMailbox( |
- mailbox, release_callback.Pass()); |
- |
- TextureMailbox mailbox2(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point); |
- mailbox2.set_allow_overlay(false); |
- scoped_ptr<SingleReleaseCallbackImpl> release_callback2 = |
- SingleReleaseCallbackImpl::Create(base::Bind(&EmptyReleaseCallback)); |
- ResourceProvider::ResourceId id2 = |
- child_resource_provider_->CreateResourceFromTextureMailbox( |
- mailbox2, release_callback2.Pass()); |
- |
- ReturnedResourceArray returned_to_child; |
- int child_id = |
- resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
- |
- // Transfer some resources to the parent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(id1); |
- resource_ids_to_transfer.push_back(id2); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- ASSERT_EQ(2u, list.size()); |
- resource_provider_->ReceiveFromChild(child_id, list); |
- EXPECT_TRUE(resource_provider_->AllowOverlay(list[0].id)); |
- EXPECT_FALSE(resource_provider_->AllowOverlay(list[1].id)); |
- |
- resource_provider_->DeclareUsedResourcesFromChild( |
- child_id, ResourceProvider::ResourceIdArray()); |
- |
- EXPECT_EQ(2u, returned_to_child.size()); |
- child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); |
- |
- child_resource_provider_->DeleteResource(id1); |
- child_resource_provider_->DeleteResource(id2); |
- EXPECT_EQ(0u, child_resource_provider_->num_resources()); |
- |
- resource_provider_->DestroyChild(child_id); |
-} |
- |
-TEST_P(ResourceProviderTest, TransferSoftwareResources) { |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_BITMAP) |
- return; |
- |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- size_t pixel_size = TextureSizeBytes(size, format); |
- ASSERT_EQ(4U, pixel_size); |
- |
- ResourceProvider::ResourceId id1 = child_resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- uint8_t data1[4] = { 1, 2, 3, 4 }; |
- child_resource_provider_->CopyToResource(id1, data1, size); |
- |
- ResourceProvider::ResourceId id2 = child_resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- uint8_t data2[4] = { 5, 5, 5, 5 }; |
- child_resource_provider_->CopyToResource(id2, data2, size); |
- |
- scoped_ptr<SharedBitmap> shared_bitmap(CreateAndFillSharedBitmap( |
- shared_bitmap_manager_.get(), gfx::Size(1, 1), 0)); |
- SharedBitmap* shared_bitmap_ptr = shared_bitmap.get(); |
- ResourceProvider::ResourceId id3 = |
- child_resource_provider_->CreateResourceFromTextureMailbox( |
- TextureMailbox(shared_bitmap_ptr, gfx::Size(1, 1)), |
- SingleReleaseCallbackImpl::Create(base::Bind( |
- &SharedBitmapReleaseCallback, base::Passed(&shared_bitmap)))); |
- |
- ReturnedResourceArray returned_to_child; |
- int child_id = |
- resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
- { |
- // Transfer some resources to the parent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(id1); |
- resource_ids_to_transfer.push_back(id2); |
- resource_ids_to_transfer.push_back(id3); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- ASSERT_EQ(3u, list.size()); |
- EXPECT_EQ(0u, list[0].mailbox_holder.sync_point); |
- EXPECT_EQ(0u, list[1].mailbox_holder.sync_point); |
- EXPECT_EQ(0u, list[2].mailbox_holder.sync_point); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
- resource_provider_->ReceiveFromChild(child_id, list); |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, |
- resource_ids_to_transfer); |
- } |
- |
- EXPECT_EQ(3u, resource_provider_->num_resources()); |
- ResourceProvider::ResourceIdMap resource_map = |
- resource_provider_->GetChildToParentMap(child_id); |
- ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; |
- ResourceProvider::ResourceId mapped_id2 = resource_map[id2]; |
- ResourceProvider::ResourceId mapped_id3 = resource_map[id3]; |
- EXPECT_NE(0u, mapped_id1); |
- EXPECT_NE(0u, mapped_id2); |
- EXPECT_NE(0u, mapped_id3); |
- EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); |
- EXPECT_FALSE(resource_provider_->InUseByConsumer(id2)); |
- EXPECT_FALSE(resource_provider_->InUseByConsumer(id3)); |
- |
- uint8_t result[4] = { 0 }; |
- GetResourcePixels( |
- resource_provider_.get(), context(), mapped_id1, size, format, result); |
- EXPECT_EQ(0, memcmp(data1, result, pixel_size)); |
- |
- GetResourcePixels( |
- resource_provider_.get(), context(), mapped_id2, size, format, result); |
- EXPECT_EQ(0, memcmp(data2, result, pixel_size)); |
- |
- { |
- // Check that transfering again the same resource from the child to the |
- // parent works. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(id1); |
- resource_ids_to_transfer.push_back(id2); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- EXPECT_EQ(2u, list.size()); |
- EXPECT_EQ(id1, list[0].id); |
- EXPECT_EQ(id2, list[1].id); |
- ReturnedResourceArray returned; |
- TransferableResource::ReturnResources(list, &returned); |
- child_resource_provider_->ReceiveReturnsFromParent(returned); |
- // ids were exported twice, we returned them only once, they should still |
- // be in-use. |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
- } |
- { |
- EXPECT_EQ(0u, returned_to_child.size()); |
- |
- // Transfer resources back from the parent to the child. Set no resources as |
- // being in use. |
- ResourceProvider::ResourceIdArray no_resources; |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
- |
- ASSERT_EQ(3u, returned_to_child.size()); |
- EXPECT_EQ(0u, returned_to_child[0].sync_point); |
- EXPECT_EQ(0u, returned_to_child[1].sync_point); |
- EXPECT_EQ(0u, returned_to_child[2].sync_point); |
- std::set<ResourceProvider::ResourceId> expected_ids; |
- expected_ids.insert(id1); |
- expected_ids.insert(id2); |
- expected_ids.insert(id3); |
- std::set<ResourceProvider::ResourceId> returned_ids; |
- for (unsigned i = 0; i < 3; i++) |
- returned_ids.insert(returned_to_child[i].id); |
- EXPECT_EQ(expected_ids, returned_ids); |
- EXPECT_FALSE(returned_to_child[0].lost); |
- EXPECT_FALSE(returned_to_child[1].lost); |
- EXPECT_FALSE(returned_to_child[2].lost); |
- child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); |
- returned_to_child.clear(); |
- } |
- EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id1)); |
- EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id2)); |
- EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id3)); |
- |
- { |
- ResourceProvider::ScopedReadLockSoftware lock( |
- child_resource_provider_.get(), id1); |
- const SkBitmap* sk_bitmap = lock.sk_bitmap(); |
- EXPECT_EQ(sk_bitmap->width(), size.width()); |
- EXPECT_EQ(sk_bitmap->height(), size.height()); |
- EXPECT_EQ(0, memcmp(data1, sk_bitmap->getPixels(), pixel_size)); |
- } |
- { |
- ResourceProvider::ScopedReadLockSoftware lock( |
- child_resource_provider_.get(), id2); |
- const SkBitmap* sk_bitmap = lock.sk_bitmap(); |
- EXPECT_EQ(sk_bitmap->width(), size.width()); |
- EXPECT_EQ(sk_bitmap->height(), size.height()); |
- EXPECT_EQ(0, memcmp(data2, sk_bitmap->getPixels(), pixel_size)); |
- } |
- { |
- // Transfer resources to the parent again. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(id1); |
- resource_ids_to_transfer.push_back(id2); |
- resource_ids_to_transfer.push_back(id3); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- ASSERT_EQ(3u, list.size()); |
- EXPECT_EQ(id1, list[0].id); |
- EXPECT_EQ(id2, list[1].id); |
- EXPECT_EQ(id3, list[2].id); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
- resource_provider_->ReceiveFromChild(child_id, list); |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, |
- resource_ids_to_transfer); |
- } |
- |
- EXPECT_EQ(0u, returned_to_child.size()); |
- |
- EXPECT_EQ(3u, resource_provider_->num_resources()); |
- resource_provider_->DestroyChild(child_id); |
- EXPECT_EQ(0u, resource_provider_->num_resources()); |
- |
- ASSERT_EQ(3u, returned_to_child.size()); |
- EXPECT_EQ(0u, returned_to_child[0].sync_point); |
- EXPECT_EQ(0u, returned_to_child[1].sync_point); |
- EXPECT_EQ(0u, returned_to_child[2].sync_point); |
- std::set<ResourceProvider::ResourceId> expected_ids; |
- expected_ids.insert(id1); |
- expected_ids.insert(id2); |
- expected_ids.insert(id3); |
- std::set<ResourceProvider::ResourceId> returned_ids; |
- for (unsigned i = 0; i < 3; i++) |
- returned_ids.insert(returned_to_child[i].id); |
- EXPECT_EQ(expected_ids, returned_ids); |
- EXPECT_FALSE(returned_to_child[0].lost); |
- EXPECT_FALSE(returned_to_child[1].lost); |
- EXPECT_FALSE(returned_to_child[2].lost); |
-} |
- |
-TEST_P(ResourceProviderTest, TransferGLToSoftware) { |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_BITMAP) |
- return; |
- |
- scoped_ptr<ResourceProviderContext> child_context_owned( |
- ResourceProviderContext::Create(shared_data_.get())); |
- |
- FakeOutputSurfaceClient child_output_surface_client; |
- scoped_ptr<OutputSurface> child_output_surface( |
- FakeOutputSurface::Create3d(child_context_owned.Pass())); |
- CHECK(child_output_surface->BindToClient(&child_output_surface_client)); |
- |
- scoped_ptr<ResourceProvider> child_resource_provider( |
- ResourceProvider::Create(child_output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- size_t pixel_size = TextureSizeBytes(size, format); |
- ASSERT_EQ(4U, pixel_size); |
- |
- ResourceProvider::ResourceId id1 = child_resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- uint8_t data1[4] = { 1, 2, 3, 4 }; |
- child_resource_provider->CopyToResource(id1, data1, size); |
- |
- ReturnedResourceArray returned_to_child; |
- int child_id = |
- resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
- { |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(id1); |
- TransferableResourceArray list; |
- child_resource_provider->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- ASSERT_EQ(1u, list.size()); |
- EXPECT_NE(0u, list[0].mailbox_holder.sync_point); |
- EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), |
- list[0].mailbox_holder.texture_target); |
- EXPECT_TRUE(child_resource_provider->InUseByConsumer(id1)); |
- resource_provider_->ReceiveFromChild(child_id, list); |
- } |
- |
- EXPECT_EQ(0u, resource_provider_->num_resources()); |
- ASSERT_EQ(1u, returned_to_child.size()); |
- EXPECT_EQ(returned_to_child[0].id, id1); |
- ResourceProvider::ResourceIdMap resource_map = |
- resource_provider_->GetChildToParentMap(child_id); |
- ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; |
- EXPECT_EQ(0u, mapped_id1); |
- |
- resource_provider_->DestroyChild(child_id); |
- EXPECT_EQ(0u, resource_provider_->num_resources()); |
- |
- ASSERT_EQ(1u, returned_to_child.size()); |
- EXPECT_FALSE(returned_to_child[0].lost); |
-} |
- |
-TEST_P(ResourceProviderTest, TransferInvalidSoftware) { |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_BITMAP) |
- return; |
- |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- size_t pixel_size = TextureSizeBytes(size, format); |
- ASSERT_EQ(4U, pixel_size); |
- |
- ResourceProvider::ResourceId id1 = child_resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- uint8_t data1[4] = { 1, 2, 3, 4 }; |
- child_resource_provider_->CopyToResource(id1, data1, size); |
- |
- ReturnedResourceArray returned_to_child; |
- int child_id = |
- resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
- { |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(id1); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- ASSERT_EQ(1u, list.size()); |
- // Make invalid. |
- list[0].mailbox_holder.mailbox.name[1] = 5; |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
- resource_provider_->ReceiveFromChild(child_id, list); |
- } |
- |
- EXPECT_EQ(1u, resource_provider_->num_resources()); |
- EXPECT_EQ(0u, returned_to_child.size()); |
- |
- ResourceProvider::ResourceIdMap resource_map = |
- resource_provider_->GetChildToParentMap(child_id); |
- ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; |
- EXPECT_NE(0u, mapped_id1); |
- { |
- ResourceProvider::ScopedReadLockSoftware lock(resource_provider_.get(), |
- mapped_id1); |
- EXPECT_FALSE(lock.valid()); |
- } |
- |
- resource_provider_->DestroyChild(child_id); |
- EXPECT_EQ(0u, resource_provider_->num_resources()); |
- |
- ASSERT_EQ(1u, returned_to_child.size()); |
- EXPECT_FALSE(returned_to_child[0].lost); |
-} |
- |
-TEST_P(ResourceProviderTest, DeleteExportedResources) { |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- size_t pixel_size = TextureSizeBytes(size, format); |
- ASSERT_EQ(4U, pixel_size); |
- |
- ResourceProvider::ResourceId id1 = child_resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- uint8_t data1[4] = { 1, 2, 3, 4 }; |
- child_resource_provider_->CopyToResource(id1, data1, size); |
- |
- ResourceProvider::ResourceId id2 = child_resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- uint8_t data2[4] = {5, 5, 5, 5}; |
- child_resource_provider_->CopyToResource(id2, data2, size); |
- |
- ReturnedResourceArray returned_to_child; |
- int child_id = |
- resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
- { |
- // Transfer some resources to the parent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(id1); |
- resource_ids_to_transfer.push_back(id2); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- ASSERT_EQ(2u, list.size()); |
- if (GetParam() == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) { |
- EXPECT_NE(0u, list[0].mailbox_holder.sync_point); |
- EXPECT_NE(0u, list[1].mailbox_holder.sync_point); |
- } |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
- resource_provider_->ReceiveFromChild(child_id, list); |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, |
- resource_ids_to_transfer); |
- } |
- |
- EXPECT_EQ(2u, resource_provider_->num_resources()); |
- ResourceProvider::ResourceIdMap resource_map = |
- resource_provider_->GetChildToParentMap(child_id); |
- ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; |
- ResourceProvider::ResourceId mapped_id2 = resource_map[id2]; |
- EXPECT_NE(0u, mapped_id1); |
- EXPECT_NE(0u, mapped_id2); |
- EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); |
- EXPECT_FALSE(resource_provider_->InUseByConsumer(id2)); |
- |
- { |
- // The parent transfers the resources to the grandparent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(mapped_id1); |
- resource_ids_to_transfer.push_back(mapped_id2); |
- TransferableResourceArray list; |
- resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); |
- |
- ASSERT_EQ(2u, list.size()); |
- if (GetParam() == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) { |
- EXPECT_NE(0u, list[0].mailbox_holder.sync_point); |
- EXPECT_NE(0u, list[1].mailbox_holder.sync_point); |
- } |
- EXPECT_TRUE(resource_provider_->InUseByConsumer(id1)); |
- EXPECT_TRUE(resource_provider_->InUseByConsumer(id2)); |
- |
- // Release the resource in the parent. Set no resources as being in use. The |
- // resources are exported so that can't be transferred back yet. |
- ResourceProvider::ResourceIdArray no_resources; |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
- |
- EXPECT_EQ(0u, returned_to_child.size()); |
- EXPECT_EQ(2u, resource_provider_->num_resources()); |
- |
- // Return the resources from the grandparent to the parent. They should be |
- // returned to the child then. |
- EXPECT_EQ(2u, list.size()); |
- EXPECT_EQ(mapped_id1, list[0].id); |
- EXPECT_EQ(mapped_id2, list[1].id); |
- ReturnedResourceArray returned; |
- TransferableResource::ReturnResources(list, &returned); |
- resource_provider_->ReceiveReturnsFromParent(returned); |
- |
- EXPECT_EQ(0u, resource_provider_->num_resources()); |
- ASSERT_EQ(2u, returned_to_child.size()); |
- if (GetParam() == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) { |
- EXPECT_NE(0u, returned_to_child[0].sync_point); |
- EXPECT_NE(0u, returned_to_child[1].sync_point); |
- } |
- EXPECT_FALSE(returned_to_child[0].lost); |
- EXPECT_FALSE(returned_to_child[1].lost); |
- } |
-} |
- |
-TEST_P(ResourceProviderTest, DestroyChildWithExportedResources) { |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- size_t pixel_size = TextureSizeBytes(size, format); |
- ASSERT_EQ(4U, pixel_size); |
- |
- ResourceProvider::ResourceId id1 = child_resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- uint8_t data1[4] = {1, 2, 3, 4}; |
- child_resource_provider_->CopyToResource(id1, data1, size); |
- |
- ResourceProvider::ResourceId id2 = child_resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- uint8_t data2[4] = {5, 5, 5, 5}; |
- child_resource_provider_->CopyToResource(id2, data2, size); |
- |
- ReturnedResourceArray returned_to_child; |
- int child_id = |
- resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
- { |
- // Transfer some resources to the parent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(id1); |
- resource_ids_to_transfer.push_back(id2); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- ASSERT_EQ(2u, list.size()); |
- if (GetParam() == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) { |
- EXPECT_NE(0u, list[0].mailbox_holder.sync_point); |
- EXPECT_NE(0u, list[1].mailbox_holder.sync_point); |
- } |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
- resource_provider_->ReceiveFromChild(child_id, list); |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, |
- resource_ids_to_transfer); |
- } |
- |
- EXPECT_EQ(2u, resource_provider_->num_resources()); |
- ResourceProvider::ResourceIdMap resource_map = |
- resource_provider_->GetChildToParentMap(child_id); |
- ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; |
- ResourceProvider::ResourceId mapped_id2 = resource_map[id2]; |
- EXPECT_NE(0u, mapped_id1); |
- EXPECT_NE(0u, mapped_id2); |
- EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); |
- EXPECT_FALSE(resource_provider_->InUseByConsumer(id2)); |
- |
- { |
- // The parent transfers the resources to the grandparent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(mapped_id1); |
- resource_ids_to_transfer.push_back(mapped_id2); |
- TransferableResourceArray list; |
- resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); |
- |
- ASSERT_EQ(2u, list.size()); |
- if (GetParam() == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) { |
- EXPECT_NE(0u, list[0].mailbox_holder.sync_point); |
- EXPECT_NE(0u, list[1].mailbox_holder.sync_point); |
- } |
- EXPECT_TRUE(resource_provider_->InUseByConsumer(id1)); |
- EXPECT_TRUE(resource_provider_->InUseByConsumer(id2)); |
- |
- // Release the resource in the parent. Set no resources as being in use. The |
- // resources are exported so that can't be transferred back yet. |
- ResourceProvider::ResourceIdArray no_resources; |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
- |
- // Destroy the child, the resources should not be returned yet. |
- EXPECT_EQ(0u, returned_to_child.size()); |
- EXPECT_EQ(2u, resource_provider_->num_resources()); |
- |
- resource_provider_->DestroyChild(child_id); |
- |
- EXPECT_EQ(2u, resource_provider_->num_resources()); |
- ASSERT_EQ(0u, returned_to_child.size()); |
- |
- // Return a resource from the grandparent, it should be returned at this |
- // point. |
- EXPECT_EQ(2u, list.size()); |
- EXPECT_EQ(mapped_id1, list[0].id); |
- EXPECT_EQ(mapped_id2, list[1].id); |
- TransferableResourceArray return_list; |
- return_list.push_back(list[1]); |
- list.pop_back(); |
- ReturnedResourceArray returned; |
- TransferableResource::ReturnResources(return_list, &returned); |
- resource_provider_->ReceiveReturnsFromParent(returned); |
- |
- EXPECT_EQ(1u, resource_provider_->num_resources()); |
- ASSERT_EQ(1u, returned_to_child.size()); |
- if (GetParam() == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) { |
- EXPECT_NE(0u, returned_to_child[0].sync_point); |
- } |
- EXPECT_FALSE(returned_to_child[0].lost); |
- returned_to_child.clear(); |
- |
- // Destroy the parent resource provider. The resource that's left should be |
- // lost at this point, and returned. |
- resource_provider_ = nullptr; |
- ASSERT_EQ(1u, returned_to_child.size()); |
- if (GetParam() == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) { |
- EXPECT_NE(0u, returned_to_child[0].sync_point); |
- } |
- EXPECT_TRUE(returned_to_child[0].lost); |
- } |
-} |
- |
-TEST_P(ResourceProviderTest, DeleteTransferredResources) { |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- size_t pixel_size = TextureSizeBytes(size, format); |
- ASSERT_EQ(4U, pixel_size); |
- |
- ResourceProvider::ResourceId id = child_resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- uint8_t data[4] = { 1, 2, 3, 4 }; |
- child_resource_provider_->CopyToResource(id, data, size); |
- |
- ReturnedResourceArray returned_to_child; |
- int child_id = |
- resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
- { |
- // Transfer some resource to the parent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(id); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- ASSERT_EQ(1u, list.size()); |
- if (GetParam() == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- EXPECT_NE(0u, list[0].mailbox_holder.sync_point); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id)); |
- resource_provider_->ReceiveFromChild(child_id, list); |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, |
- resource_ids_to_transfer); |
- } |
- |
- // Delete textures in the child, while they are transfered. |
- child_resource_provider_->DeleteResource(id); |
- EXPECT_EQ(1u, child_resource_provider_->num_resources()); |
- { |
- EXPECT_EQ(0u, returned_to_child.size()); |
- |
- // Transfer resources back from the parent to the child. Set no resources as |
- // being in use. |
- ResourceProvider::ResourceIdArray no_resources; |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
- |
- ASSERT_EQ(1u, returned_to_child.size()); |
- if (GetParam() == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- EXPECT_NE(0u, returned_to_child[0].sync_point); |
- child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); |
- } |
- EXPECT_EQ(0u, child_resource_provider_->num_resources()); |
-} |
- |
-TEST_P(ResourceProviderTest, UnuseTransferredResources) { |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- size_t pixel_size = TextureSizeBytes(size, format); |
- ASSERT_EQ(4U, pixel_size); |
- |
- ResourceProvider::ResourceId id = child_resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- uint8_t data[4] = {1, 2, 3, 4}; |
- child_resource_provider_->CopyToResource(id, data, size); |
- |
- ReturnedResourceArray returned_to_child; |
- int child_id = |
- resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
- const ResourceProvider::ResourceIdMap& map = |
- resource_provider_->GetChildToParentMap(child_id); |
- { |
- // Transfer some resource to the parent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(id); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id)); |
- resource_provider_->ReceiveFromChild(child_id, list); |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, |
- resource_ids_to_transfer); |
- } |
- TransferableResourceArray sent_to_top_level; |
- { |
- // Parent transfers to top-level. |
- ASSERT_TRUE(map.find(id) != map.end()); |
- ResourceProvider::ResourceId parent_id = map.find(id)->second; |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(parent_id); |
- resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &sent_to_top_level); |
- EXPECT_TRUE(resource_provider_->InUseByConsumer(parent_id)); |
- } |
- { |
- // Stop using resource. |
- ResourceProvider::ResourceIdArray empty; |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, empty); |
- // Resource is not yet returned to the child, since it's in use by the |
- // top-level. |
- EXPECT_TRUE(returned_to_child.empty()); |
- } |
- { |
- // Send the resource to the parent again. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(id); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id)); |
- resource_provider_->ReceiveFromChild(child_id, list); |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, |
- resource_ids_to_transfer); |
- } |
- { |
- // Receive returns back from top-level. |
- ReturnedResourceArray returned; |
- TransferableResource::ReturnResources(sent_to_top_level, &returned); |
- resource_provider_->ReceiveReturnsFromParent(returned); |
- // Resource is still not yet returned to the child, since it's declared used |
- // in the parent. |
- EXPECT_TRUE(returned_to_child.empty()); |
- ASSERT_TRUE(map.find(id) != map.end()); |
- ResourceProvider::ResourceId parent_id = map.find(id)->second; |
- EXPECT_FALSE(resource_provider_->InUseByConsumer(parent_id)); |
- } |
- { |
- sent_to_top_level.clear(); |
- // Parent transfers again to top-level. |
- ASSERT_TRUE(map.find(id) != map.end()); |
- ResourceProvider::ResourceId parent_id = map.find(id)->second; |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(parent_id); |
- resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &sent_to_top_level); |
- EXPECT_TRUE(resource_provider_->InUseByConsumer(parent_id)); |
- } |
- { |
- // Receive returns back from top-level. |
- ReturnedResourceArray returned; |
- TransferableResource::ReturnResources(sent_to_top_level, &returned); |
- resource_provider_->ReceiveReturnsFromParent(returned); |
- // Resource is still not yet returned to the child, since it's still |
- // declared used in the parent. |
- EXPECT_TRUE(returned_to_child.empty()); |
- ASSERT_TRUE(map.find(id) != map.end()); |
- ResourceProvider::ResourceId parent_id = map.find(id)->second; |
- EXPECT_FALSE(resource_provider_->InUseByConsumer(parent_id)); |
- } |
- { |
- // Stop using resource. |
- ResourceProvider::ResourceIdArray empty; |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, empty); |
- // Resource should have been returned to the child, since it's no longer in |
- // use by the top-level. |
- ASSERT_EQ(1u, returned_to_child.size()); |
- EXPECT_EQ(id, returned_to_child[0].id); |
- EXPECT_EQ(2, returned_to_child[0].count); |
- child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); |
- returned_to_child.clear(); |
- EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id)); |
- } |
-} |
- |
-class ResourceProviderTestTextureFilters : public ResourceProviderTest { |
- public: |
- static void RunTest(GLenum child_filter, GLenum parent_filter) { |
- scoped_ptr<TextureStateTrackingContext> child_context_owned( |
- new TextureStateTrackingContext); |
- TextureStateTrackingContext* child_context = child_context_owned.get(); |
- |
- FakeOutputSurfaceClient child_output_surface_client; |
- scoped_ptr<OutputSurface> child_output_surface( |
- FakeOutputSurface::Create3d(child_context_owned.Pass())); |
- CHECK(child_output_surface->BindToClient(&child_output_surface_client)); |
- scoped_ptr<SharedBitmapManager> shared_bitmap_manager( |
- new TestSharedBitmapManager()); |
- |
- scoped_ptr<ResourceProvider> child_resource_provider( |
- ResourceProvider::Create(child_output_surface.get(), |
- shared_bitmap_manager.get(), |
- NULL, |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- scoped_ptr<TextureStateTrackingContext> parent_context_owned( |
- new TextureStateTrackingContext); |
- TextureStateTrackingContext* parent_context = parent_context_owned.get(); |
- |
- FakeOutputSurfaceClient parent_output_surface_client; |
- scoped_ptr<OutputSurface> parent_output_surface( |
- FakeOutputSurface::Create3d(parent_context_owned.Pass())); |
- CHECK(parent_output_surface->BindToClient(&parent_output_surface_client)); |
- |
- scoped_ptr<ResourceProvider> parent_resource_provider( |
- ResourceProvider::Create(parent_output_surface.get(), |
- shared_bitmap_manager.get(), |
- NULL, |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- int child_texture_id = 1; |
- int parent_texture_id = 2; |
- |
- size_t pixel_size = TextureSizeBytes(size, format); |
- ASSERT_EQ(4U, pixel_size); |
- |
- ResourceProvider::ResourceId id = child_resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
- format); |
- |
- // The new texture is created with GL_LINEAR. |
- EXPECT_CALL(*child_context, bindTexture(GL_TEXTURE_2D, child_texture_id)) |
- .Times(2); // Once to create and once to allocate. |
- EXPECT_CALL(*child_context, |
- texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); |
- EXPECT_CALL(*child_context, |
- texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); |
- EXPECT_CALL( |
- *child_context, |
- texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); |
- EXPECT_CALL( |
- *child_context, |
- texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); |
- EXPECT_CALL(*child_context, |
- texParameteri(GL_TEXTURE_2D, |
- GL_TEXTURE_POOL_CHROMIUM, |
- GL_TEXTURE_POOL_UNMANAGED_CHROMIUM)); |
- child_resource_provider->AllocateForTesting(id); |
- Mock::VerifyAndClearExpectations(child_context); |
- |
- uint8_t data[4] = { 1, 2, 3, 4 }; |
- |
- EXPECT_CALL(*child_context, bindTexture(GL_TEXTURE_2D, child_texture_id)); |
- child_resource_provider->CopyToResource(id, data, size); |
- Mock::VerifyAndClearExpectations(child_context); |
- |
- // The texture is set to |child_filter| in the child. |
- EXPECT_CALL(*child_context, bindTexture(GL_TEXTURE_2D, child_texture_id)); |
- if (child_filter != GL_LINEAR) { |
- EXPECT_CALL( |
- *child_context, |
- texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, child_filter)); |
- EXPECT_CALL( |
- *child_context, |
- texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, child_filter)); |
- } |
- SetResourceFilter(child_resource_provider.get(), id, child_filter); |
- Mock::VerifyAndClearExpectations(child_context); |
- |
- ReturnedResourceArray returned_to_child; |
- int child_id = parent_resource_provider->CreateChild( |
- GetReturnCallback(&returned_to_child)); |
- { |
- // Transfer some resource to the parent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(id); |
- TransferableResourceArray list; |
- |
- EXPECT_CALL(*child_context, |
- produceTextureDirectCHROMIUM(_, GL_TEXTURE_2D, _)); |
- EXPECT_CALL(*child_context, insertSyncPoint()); |
- child_resource_provider->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- Mock::VerifyAndClearExpectations(child_context); |
- |
- ASSERT_EQ(1u, list.size()); |
- EXPECT_EQ(static_cast<unsigned>(child_filter), list[0].filter); |
- |
- EXPECT_CALL(*parent_context, |
- createAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, _)) |
- .WillOnce(Return(parent_texture_id)); |
- |
- parent_resource_provider->ReceiveFromChild(child_id, list); |
- { |
- parent_resource_provider->WaitSyncPointIfNeeded(list[0].id); |
- ResourceProvider::ScopedReadLockGL lock(parent_resource_provider.get(), |
- list[0].id); |
- } |
- Mock::VerifyAndClearExpectations(parent_context); |
- |
- parent_resource_provider->DeclareUsedResourcesFromChild( |
- child_id, resource_ids_to_transfer); |
- Mock::VerifyAndClearExpectations(parent_context); |
- } |
- ResourceProvider::ResourceIdMap resource_map = |
- parent_resource_provider->GetChildToParentMap(child_id); |
- ResourceProvider::ResourceId mapped_id = resource_map[id]; |
- EXPECT_NE(0u, mapped_id); |
- |
- // The texture is set to |parent_filter| in the parent. |
- EXPECT_CALL(*parent_context, bindTexture(GL_TEXTURE_2D, parent_texture_id)); |
- EXPECT_CALL( |
- *parent_context, |
- texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, parent_filter)); |
- EXPECT_CALL( |
- *parent_context, |
- texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, parent_filter)); |
- SetResourceFilter(parent_resource_provider.get(), mapped_id, parent_filter); |
- Mock::VerifyAndClearExpectations(parent_context); |
- |
- // The texture should be reset to |child_filter| in the parent when it is |
- // returned, since that is how it was received. |
- EXPECT_CALL(*parent_context, bindTexture(GL_TEXTURE_2D, parent_texture_id)); |
- EXPECT_CALL( |
- *parent_context, |
- texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, child_filter)); |
- EXPECT_CALL( |
- *parent_context, |
- texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, child_filter)); |
- |
- { |
- EXPECT_EQ(0u, returned_to_child.size()); |
- |
- // Transfer resources back from the parent to the child. Set no resources |
- // as being in use. |
- ResourceProvider::ResourceIdArray no_resources; |
- EXPECT_CALL(*parent_context, insertSyncPoint()); |
- parent_resource_provider->DeclareUsedResourcesFromChild(child_id, |
- no_resources); |
- Mock::VerifyAndClearExpectations(parent_context); |
- |
- ASSERT_EQ(1u, returned_to_child.size()); |
- child_resource_provider->ReceiveReturnsFromParent(returned_to_child); |
- } |
- |
- // The child remembers the texture filter is set to |child_filter|. |
- EXPECT_CALL(*child_context, bindTexture(GL_TEXTURE_2D, child_texture_id)); |
- SetResourceFilter(child_resource_provider.get(), id, child_filter); |
- Mock::VerifyAndClearExpectations(child_context); |
- } |
-}; |
- |
-TEST_P(ResourceProviderTest, TextureFilters_ChildNearestParentLinear) { |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- ResourceProviderTestTextureFilters::RunTest(GL_NEAREST, GL_LINEAR); |
-} |
- |
-TEST_P(ResourceProviderTest, TextureFilters_ChildLinearParentNearest) { |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- ResourceProviderTestTextureFilters::RunTest(GL_LINEAR, GL_NEAREST); |
-} |
- |
-TEST_P(ResourceProviderTest, TransferMailboxResources) { |
- // Other mailbox transfers tested elsewhere. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- 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()->produceTextureDirectCHROMIUM(texture, GL_TEXTURE_2D, mailbox.name); |
- uint32 sync_point = context()->insertSyncPoint(); |
- |
- // All the logic below assumes that the sync points are all positive. |
- EXPECT_LT(0u, sync_point); |
- |
- uint32 release_sync_point = 0; |
- bool lost_resource = false; |
- BlockingTaskRunner* main_thread_task_runner = NULL; |
- ReleaseCallbackImpl callback = base::Bind(ReleaseCallback, |
- &release_sync_point, |
- &lost_resource, |
- &main_thread_task_runner); |
- ResourceProvider::ResourceId resource = |
- resource_provider_->CreateResourceFromTextureMailbox( |
- TextureMailbox(mailbox, GL_TEXTURE_2D, sync_point), |
- SingleReleaseCallbackImpl::Create(callback)); |
- EXPECT_EQ(1u, context()->NumTextures()); |
- EXPECT_EQ(0u, release_sync_point); |
- { |
- // Transfer the resource, expect the sync points to be consistent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(resource); |
- TransferableResourceArray list; |
- resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); |
- ASSERT_EQ(1u, list.size()); |
- EXPECT_LE(sync_point, list[0].mailbox_holder.sync_point); |
- EXPECT_EQ(0, |
- memcmp(mailbox.name, |
- list[0].mailbox_holder.mailbox.name, |
- sizeof(mailbox.name))); |
- EXPECT_EQ(0u, release_sync_point); |
- |
- context()->waitSyncPoint(list[0].mailbox_holder.sync_point); |
- unsigned other_texture = |
- context()->createAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); |
- uint8_t test_data[4] = { 0 }; |
- context()->GetPixels( |
- gfx::Size(1, 1), RGBA_8888, test_data); |
- EXPECT_EQ(0, memcmp(data, test_data, sizeof(data))); |
- |
- context()->produceTextureDirectCHROMIUM(other_texture, GL_TEXTURE_2D, |
- mailbox.name); |
- context()->deleteTexture(other_texture); |
- list[0].mailbox_holder.sync_point = context()->insertSyncPoint(); |
- EXPECT_LT(0u, list[0].mailbox_holder.sync_point); |
- |
- // Receive the resource, then delete it, expect the sync points to be |
- // consistent. |
- ReturnedResourceArray returned; |
- TransferableResource::ReturnResources(list, &returned); |
- resource_provider_->ReceiveReturnsFromParent(returned); |
- EXPECT_EQ(1u, context()->NumTextures()); |
- EXPECT_EQ(0u, release_sync_point); |
- |
- resource_provider_->DeleteResource(resource); |
- EXPECT_LE(list[0].mailbox_holder.sync_point, release_sync_point); |
- EXPECT_FALSE(lost_resource); |
- EXPECT_EQ(main_thread_task_runner_.get(), main_thread_task_runner); |
- } |
- |
- // We're going to do the same thing as above, but testing the case where we |
- // delete the resource before we receive it back. |
- sync_point = release_sync_point; |
- EXPECT_LT(0u, sync_point); |
- release_sync_point = 0; |
- resource = resource_provider_->CreateResourceFromTextureMailbox( |
- TextureMailbox(mailbox, GL_TEXTURE_2D, sync_point), |
- SingleReleaseCallbackImpl::Create(callback)); |
- EXPECT_EQ(1u, context()->NumTextures()); |
- EXPECT_EQ(0u, release_sync_point); |
- { |
- // Transfer the resource, expect the sync points to be consistent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(resource); |
- TransferableResourceArray list; |
- resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); |
- ASSERT_EQ(1u, list.size()); |
- EXPECT_LE(sync_point, list[0].mailbox_holder.sync_point); |
- EXPECT_EQ(0, |
- memcmp(mailbox.name, |
- list[0].mailbox_holder.mailbox.name, |
- sizeof(mailbox.name))); |
- EXPECT_EQ(0u, release_sync_point); |
- |
- context()->waitSyncPoint(list[0].mailbox_holder.sync_point); |
- unsigned other_texture = |
- context()->createAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); |
- uint8_t test_data[4] = { 0 }; |
- context()->GetPixels( |
- gfx::Size(1, 1), RGBA_8888, test_data); |
- EXPECT_EQ(0, memcmp(data, test_data, sizeof(data))); |
- |
- context()->produceTextureDirectCHROMIUM(other_texture, GL_TEXTURE_2D, |
- mailbox.name); |
- context()->deleteTexture(other_texture); |
- list[0].mailbox_holder.sync_point = context()->insertSyncPoint(); |
- EXPECT_LT(0u, list[0].mailbox_holder.sync_point); |
- |
- // Delete the resource, which shouldn't do anything. |
- resource_provider_->DeleteResource(resource); |
- EXPECT_EQ(1u, context()->NumTextures()); |
- EXPECT_EQ(0u, release_sync_point); |
- |
- // Then receive the resource which should release the mailbox, expect the |
- // sync points to be consistent. |
- ReturnedResourceArray returned; |
- TransferableResource::ReturnResources(list, &returned); |
- resource_provider_->ReceiveReturnsFromParent(returned); |
- EXPECT_LE(list[0].mailbox_holder.sync_point, release_sync_point); |
- EXPECT_FALSE(lost_resource); |
- EXPECT_EQ(main_thread_task_runner_.get(), main_thread_task_runner); |
- } |
- |
- context()->waitSyncPoint(release_sync_point); |
- texture = |
- context()->createAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); |
- context()->deleteTexture(texture); |
-} |
- |
-TEST_P(ResourceProviderTest, LostResourceInParent) { |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- ResourceProvider::ResourceId resource = |
- child_resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
- format); |
- child_resource_provider_->AllocateForTesting(resource); |
- // Expect a GL resource to be lost. |
- bool should_lose_resource = |
- GetParam() == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE; |
- |
- ReturnedResourceArray returned_to_child; |
- int child_id = |
- resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
- { |
- // Transfer the resource to the parent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(resource); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- EXPECT_EQ(1u, list.size()); |
- |
- resource_provider_->ReceiveFromChild(child_id, list); |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, |
- resource_ids_to_transfer); |
- } |
- |
- // Lose the output surface in the parent. |
- resource_provider_->DidLoseOutputSurface(); |
- |
- { |
- EXPECT_EQ(0u, returned_to_child.size()); |
- |
- // Transfer resources back from the parent to the child. Set no resources as |
- // being in use. |
- ResourceProvider::ResourceIdArray no_resources; |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
- |
- // Expect a GL resource to be lost. |
- ASSERT_EQ(1u, returned_to_child.size()); |
- EXPECT_EQ(should_lose_resource, returned_to_child[0].lost); |
- child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); |
- returned_to_child.clear(); |
- } |
- |
- // A GL resource should be lost. |
- EXPECT_EQ(should_lose_resource, child_resource_provider_->IsLost(resource)); |
- |
- // Lost resources stay in use in the parent forever. |
- EXPECT_EQ(should_lose_resource, |
- child_resource_provider_->InUseByConsumer(resource)); |
-} |
- |
-TEST_P(ResourceProviderTest, LostResourceInGrandParent) { |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- ResourceProvider::ResourceId resource = |
- child_resource_provider_->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
- format); |
- child_resource_provider_->AllocateForTesting(resource); |
- |
- ReturnedResourceArray returned_to_child; |
- int child_id = |
- resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
- { |
- // Transfer the resource to the parent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(resource); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- EXPECT_EQ(1u, list.size()); |
- |
- resource_provider_->ReceiveFromChild(child_id, list); |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, |
- resource_ids_to_transfer); |
- } |
- |
- { |
- ResourceProvider::ResourceIdMap resource_map = |
- resource_provider_->GetChildToParentMap(child_id); |
- ResourceProvider::ResourceId parent_resource = resource_map[resource]; |
- EXPECT_NE(0u, parent_resource); |
- |
- // Transfer to a grandparent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(parent_resource); |
- TransferableResourceArray list; |
- resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); |
- |
- // Receive back a lost resource from the grandparent. |
- EXPECT_EQ(1u, list.size()); |
- EXPECT_EQ(parent_resource, list[0].id); |
- ReturnedResourceArray returned; |
- TransferableResource::ReturnResources(list, &returned); |
- EXPECT_EQ(1u, returned.size()); |
- EXPECT_EQ(parent_resource, returned[0].id); |
- returned[0].lost = true; |
- resource_provider_->ReceiveReturnsFromParent(returned); |
- |
- // The resource should be lost. |
- EXPECT_TRUE(resource_provider_->IsLost(parent_resource)); |
- |
- // Lost resources stay in use in the parent forever. |
- EXPECT_TRUE(resource_provider_->InUseByConsumer(parent_resource)); |
- } |
- |
- { |
- EXPECT_EQ(0u, returned_to_child.size()); |
- |
- // Transfer resources back from the parent to the child. Set no resources as |
- // being in use. |
- ResourceProvider::ResourceIdArray no_resources; |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
- |
- // Expect the resource to be lost. |
- ASSERT_EQ(1u, returned_to_child.size()); |
- EXPECT_TRUE(returned_to_child[0].lost); |
- child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); |
- returned_to_child.clear(); |
- } |
- |
- // The resource should be lost. |
- EXPECT_TRUE(child_resource_provider_->IsLost(resource)); |
- |
- // Lost resources stay in use in the parent forever. |
- EXPECT_TRUE(child_resource_provider_->InUseByConsumer(resource)); |
-} |
- |
-TEST_P(ResourceProviderTest, LostMailboxInParent) { |
- uint32 release_sync_point = 0; |
- bool lost_resource = false; |
- bool release_called = false; |
- uint32 sync_point = 0; |
- ResourceProvider::ResourceId resource = CreateChildMailbox( |
- &release_sync_point, &lost_resource, &release_called, &sync_point); |
- |
- ReturnedResourceArray returned_to_child; |
- int child_id = |
- resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
- { |
- // Transfer the resource to the parent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(resource); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- EXPECT_EQ(1u, list.size()); |
- |
- resource_provider_->ReceiveFromChild(child_id, list); |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, |
- resource_ids_to_transfer); |
- } |
- |
- // Lose the output surface in the parent. |
- resource_provider_->DidLoseOutputSurface(); |
- |
- { |
- EXPECT_EQ(0u, returned_to_child.size()); |
- |
- // Transfer resources back from the parent to the child. Set no resources as |
- // being in use. |
- ResourceProvider::ResourceIdArray no_resources; |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
- |
- ASSERT_EQ(1u, returned_to_child.size()); |
- // Losing an output surface only loses hardware resources. |
- EXPECT_EQ(returned_to_child[0].lost, |
- GetParam() == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE); |
- child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); |
- returned_to_child.clear(); |
- } |
- |
- // Delete the resource in the child. Expect the resource to be lost if it's |
- // a GL texture. |
- child_resource_provider_->DeleteResource(resource); |
- EXPECT_EQ(lost_resource, |
- GetParam() == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE); |
-} |
- |
-TEST_P(ResourceProviderTest, LostMailboxInGrandParent) { |
- uint32 release_sync_point = 0; |
- bool lost_resource = false; |
- bool release_called = false; |
- uint32 sync_point = 0; |
- ResourceProvider::ResourceId resource = CreateChildMailbox( |
- &release_sync_point, &lost_resource, &release_called, &sync_point); |
- |
- ReturnedResourceArray returned_to_child; |
- int child_id = |
- resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
- { |
- // Transfer the resource to the parent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(resource); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- EXPECT_EQ(1u, list.size()); |
- |
- resource_provider_->ReceiveFromChild(child_id, list); |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, |
- resource_ids_to_transfer); |
- } |
- |
- { |
- ResourceProvider::ResourceIdMap resource_map = |
- resource_provider_->GetChildToParentMap(child_id); |
- ResourceProvider::ResourceId parent_resource = resource_map[resource]; |
- EXPECT_NE(0u, parent_resource); |
- |
- // Transfer to a grandparent. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(parent_resource); |
- TransferableResourceArray list; |
- resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); |
- |
- // Receive back a lost resource from the grandparent. |
- EXPECT_EQ(1u, list.size()); |
- EXPECT_EQ(parent_resource, list[0].id); |
- ReturnedResourceArray returned; |
- TransferableResource::ReturnResources(list, &returned); |
- EXPECT_EQ(1u, returned.size()); |
- EXPECT_EQ(parent_resource, returned[0].id); |
- returned[0].lost = true; |
- resource_provider_->ReceiveReturnsFromParent(returned); |
- } |
- |
- { |
- EXPECT_EQ(0u, returned_to_child.size()); |
- |
- // Transfer resources back from the parent to the child. Set no resources as |
- // being in use. |
- ResourceProvider::ResourceIdArray no_resources; |
- resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
- |
- // Expect the resource to be lost. |
- ASSERT_EQ(1u, returned_to_child.size()); |
- EXPECT_TRUE(returned_to_child[0].lost); |
- child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); |
- returned_to_child.clear(); |
- } |
- |
- // Delete the resource in the child. Expect the resource to be lost. |
- child_resource_provider_->DeleteResource(resource); |
- EXPECT_TRUE(lost_resource); |
-} |
- |
-TEST_P(ResourceProviderTest, Shutdown) { |
- uint32 release_sync_point = 0; |
- bool lost_resource = false; |
- bool release_called = false; |
- uint32 sync_point = 0; |
- CreateChildMailbox( |
- &release_sync_point, &lost_resource, &release_called, &sync_point); |
- |
- EXPECT_EQ(0u, release_sync_point); |
- EXPECT_FALSE(lost_resource); |
- |
- child_resource_provider_ = nullptr; |
- |
- if (GetParam() == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) { |
- EXPECT_LE(sync_point, release_sync_point); |
- } |
- EXPECT_TRUE(release_called); |
- EXPECT_FALSE(lost_resource); |
-} |
- |
-TEST_P(ResourceProviderTest, ShutdownWithExportedResource) { |
- uint32 release_sync_point = 0; |
- bool lost_resource = false; |
- bool release_called = false; |
- uint32 sync_point = 0; |
- ResourceProvider::ResourceId resource = CreateChildMailbox( |
- &release_sync_point, &lost_resource, &release_called, &sync_point); |
- |
- // Transfer the resource, so we can't release it properly on shutdown. |
- ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
- resource_ids_to_transfer.push_back(resource); |
- TransferableResourceArray list; |
- child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
- &list); |
- |
- EXPECT_EQ(0u, release_sync_point); |
- EXPECT_FALSE(lost_resource); |
- |
- child_resource_provider_ = nullptr; |
- |
- // Since the resource is in the parent, the child considers it lost. |
- EXPECT_EQ(0u, release_sync_point); |
- EXPECT_TRUE(lost_resource); |
-} |
- |
-TEST_P(ResourceProviderTest, LostContext) { |
- // TextureMailbox callbacks only exist for GL textures for now. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- unsigned texture = context()->createTexture(); |
- context()->bindTexture(GL_TEXTURE_2D, texture); |
- gpu::Mailbox mailbox; |
- context()->genMailboxCHROMIUM(mailbox.name); |
- context()->produceTextureDirectCHROMIUM(texture, GL_TEXTURE_2D, mailbox.name); |
- uint32 sync_point = context()->insertSyncPoint(); |
- |
- EXPECT_LT(0u, sync_point); |
- |
- uint32 release_sync_point = 0; |
- bool lost_resource = false; |
- BlockingTaskRunner* main_thread_task_runner = NULL; |
- scoped_ptr<SingleReleaseCallbackImpl> callback = |
- SingleReleaseCallbackImpl::Create(base::Bind(ReleaseCallback, |
- &release_sync_point, |
- &lost_resource, |
- &main_thread_task_runner)); |
- resource_provider_->CreateResourceFromTextureMailbox( |
- TextureMailbox(mailbox, GL_TEXTURE_2D, sync_point), callback.Pass()); |
- |
- EXPECT_EQ(0u, release_sync_point); |
- EXPECT_FALSE(lost_resource); |
- EXPECT_EQ(NULL, main_thread_task_runner); |
- |
- resource_provider_->DidLoseOutputSurface(); |
- resource_provider_ = nullptr; |
- |
- EXPECT_LE(sync_point, release_sync_point); |
- EXPECT_TRUE(lost_resource); |
- EXPECT_EQ(main_thread_task_runner_.get(), main_thread_task_runner); |
-} |
- |
-TEST_P(ResourceProviderTest, ScopedSampler) { |
- // Sampling is only supported for GL textures. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- |
- scoped_ptr<TextureStateTrackingContext> context_owned( |
- new TextureStateTrackingContext); |
- TextureStateTrackingContext* context = context_owned.get(); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- int texture_id = 1; |
- |
- ResourceProvider::ResourceId id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- |
- // Check that the texture gets created with the right sampler settings. |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)) |
- .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)); |
- |
- resource_provider->AllocateForTesting(id); |
- Mock::VerifyAndClearExpectations(context); |
- |
- // Creating a sampler with the default filter should not change any texture |
- // parameters. |
- { |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)); |
- ResourceProvider::ScopedSamplerGL sampler( |
- resource_provider.get(), id, GL_TEXTURE_2D, GL_LINEAR); |
- Mock::VerifyAndClearExpectations(context); |
- } |
- |
- // Using a different filter should be reflected in the texture parameters. |
- { |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)); |
- 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( |
- resource_provider.get(), id, GL_TEXTURE_2D, GL_NEAREST); |
- Mock::VerifyAndClearExpectations(context); |
- } |
- |
- // Test resetting to the default filter. |
- { |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)); |
- 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( |
- resource_provider.get(), id, GL_TEXTURE_2D, GL_LINEAR); |
- Mock::VerifyAndClearExpectations(context); |
- } |
-} |
- |
-TEST_P(ResourceProviderTest, ManagedResource) { |
- // Sampling is only supported for GL textures. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- |
- scoped_ptr<TextureStateTrackingContext> context_owned( |
- new TextureStateTrackingContext); |
- TextureStateTrackingContext* context = context_owned.get(); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- int texture_id = 1; |
- |
- // Check that the texture gets created with the right sampler settings. |
- ResourceProvider::ResourceId id = resource_provider->CreateManagedResource( |
- size, GL_TEXTURE_2D, GL_CLAMP_TO_EDGE, |
- ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)); |
- 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)); |
- resource_provider->CreateForTesting(id); |
- EXPECT_NE(0u, id); |
- |
- Mock::VerifyAndClearExpectations(context); |
-} |
- |
-TEST_P(ResourceProviderTest, TextureWrapMode) { |
- // Sampling is only supported for GL textures. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- |
- scoped_ptr<TextureStateTrackingContext> context_owned( |
- new TextureStateTrackingContext); |
- TextureStateTrackingContext* context = context_owned.get(); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- GLenum texture_pool = GL_TEXTURE_POOL_UNMANAGED_CHROMIUM; |
- |
- for (int texture_id = 1; texture_id <= 2; ++texture_id) { |
- GLint wrap_mode = texture_id == 1 ? GL_CLAMP_TO_EDGE : GL_REPEAT; |
- // Check that the texture gets created with the right sampler settings. |
- ResourceProvider::ResourceId id = resource_provider->CreateGLTexture( |
- size, GL_TEXTURE_2D, texture_pool, wrap_mode, |
- ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)); |
- 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, wrap_mode)); |
- EXPECT_CALL(*context, |
- texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_mode)); |
- EXPECT_CALL(*context, |
- texParameteri(GL_TEXTURE_2D, |
- GL_TEXTURE_POOL_CHROMIUM, |
- GL_TEXTURE_POOL_UNMANAGED_CHROMIUM)); |
- resource_provider->CreateForTesting(id); |
- EXPECT_NE(0u, id); |
- |
- Mock::VerifyAndClearExpectations(context); |
- } |
-} |
- |
-TEST_P(ResourceProviderTest, TextureHint) { |
- // Sampling is only supported for GL textures. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- |
- scoped_ptr<TextureStateTrackingContext> context_owned( |
- new TextureStateTrackingContext); |
- TextureStateTrackingContext* context = context_owned.get(); |
- context->set_support_texture_storage(true); |
- context->set_support_texture_usage(true); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- GLenum texture_pool = GL_TEXTURE_POOL_UNMANAGED_CHROMIUM; |
- |
- const ResourceProvider::TextureHint hints[4] = { |
- ResourceProvider::TEXTURE_HINT_DEFAULT, |
- ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
- ResourceProvider::TEXTURE_HINT_FRAMEBUFFER, |
- ResourceProvider::TEXTURE_HINT_IMMUTABLE_FRAMEBUFFER, |
- }; |
- for (GLuint texture_id = 1; texture_id <= arraysize(hints); ++texture_id) { |
- // Check that the texture gets created with the right sampler settings. |
- ResourceProvider::ResourceId id = |
- resource_provider->CreateGLTexture(size, |
- GL_TEXTURE_2D, |
- texture_pool, |
- GL_CLAMP_TO_EDGE, |
- hints[texture_id - 1], |
- format); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)); |
- 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)); |
- // Check only TEXTURE_HINT_FRAMEBUFFER set GL_TEXTURE_USAGE_ANGLE. |
- bool is_framebuffer_hint = |
- hints[texture_id - 1] & ResourceProvider::TEXTURE_HINT_FRAMEBUFFER; |
- EXPECT_CALL(*context, |
- texParameteri(GL_TEXTURE_2D, |
- GL_TEXTURE_USAGE_ANGLE, |
- GL_FRAMEBUFFER_ATTACHMENT_ANGLE)) |
- .Times(is_framebuffer_hint ? 1 : 0); |
- resource_provider->CreateForTesting(id); |
- EXPECT_NE(0u, id); |
- |
- Mock::VerifyAndClearExpectations(context); |
- } |
-} |
- |
-TEST_P(ResourceProviderTest, TextureMailbox_SharedMemory) { |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_BITMAP) |
- return; |
- |
- gfx::Size size(64, 64); |
- const uint32_t kBadBeef = 0xbadbeef; |
- scoped_ptr<SharedBitmap> shared_bitmap( |
- CreateAndFillSharedBitmap(shared_bitmap_manager_.get(), size, kBadBeef)); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::CreateSoftware(make_scoped_ptr( |
- new SoftwareOutputDevice))); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- main_thread_task_runner_.get(), |
- 0, |
- false, |
- 1)); |
- |
- uint32 release_sync_point = 0; |
- bool lost_resource = false; |
- BlockingTaskRunner* main_thread_task_runner = NULL; |
- scoped_ptr<SingleReleaseCallbackImpl> callback = |
- SingleReleaseCallbackImpl::Create(base::Bind(&ReleaseCallback, |
- &release_sync_point, |
- &lost_resource, |
- &main_thread_task_runner)); |
- TextureMailbox mailbox(shared_bitmap.get(), size); |
- |
- ResourceProvider::ResourceId id = |
- resource_provider->CreateResourceFromTextureMailbox( |
- mailbox, callback.Pass()); |
- EXPECT_NE(0u, id); |
- |
- { |
- ResourceProvider::ScopedReadLockSoftware lock(resource_provider.get(), id); |
- const SkBitmap* sk_bitmap = lock.sk_bitmap(); |
- EXPECT_EQ(sk_bitmap->width(), size.width()); |
- EXPECT_EQ(sk_bitmap->height(), size.height()); |
- EXPECT_EQ(*sk_bitmap->getAddr32(16, 16), kBadBeef); |
- } |
- |
- resource_provider->DeleteResource(id); |
- EXPECT_EQ(0u, release_sync_point); |
- EXPECT_FALSE(lost_resource); |
- EXPECT_EQ(main_thread_task_runner_.get(), main_thread_task_runner); |
-} |
- |
-class ResourceProviderTestTextureMailboxGLFilters |
- : public ResourceProviderTest { |
- public: |
- static void RunTest(TestSharedBitmapManager* shared_bitmap_manager, |
- TestGpuMemoryBufferManager* gpu_memory_buffer_manager, |
- BlockingTaskRunner* main_thread_task_runner, |
- bool mailbox_nearest_neighbor, |
- GLenum sampler_filter) { |
- scoped_ptr<TextureStateTrackingContext> context_owned( |
- new TextureStateTrackingContext); |
- TextureStateTrackingContext* context = context_owned.get(); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager, |
- gpu_memory_buffer_manager, |
- main_thread_task_runner, |
- 0, |
- false, |
- 1)); |
- |
- unsigned texture_id = 1; |
- uint32 sync_point = 30; |
- unsigned target = GL_TEXTURE_2D; |
- |
- EXPECT_CALL(*context, bindTexture(_, _)).Times(0); |
- EXPECT_CALL(*context, waitSyncPoint(_)).Times(0); |
- EXPECT_CALL(*context, insertSyncPoint()).Times(0); |
- EXPECT_CALL(*context, produceTextureDirectCHROMIUM(_, _, _)).Times(0); |
- EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(_, _)).Times(0); |
- |
- gpu::Mailbox gpu_mailbox; |
- memcpy(gpu_mailbox.name, "Hello world", strlen("Hello world") + 1); |
- uint32 release_sync_point = 0; |
- bool lost_resource = false; |
- BlockingTaskRunner* mailbox_task_runner = NULL; |
- scoped_ptr<SingleReleaseCallbackImpl> callback = |
- SingleReleaseCallbackImpl::Create(base::Bind(&ReleaseCallback, |
- &release_sync_point, |
- &lost_resource, |
- &mailbox_task_runner)); |
- |
- TextureMailbox mailbox(gpu_mailbox, target, sync_point); |
- mailbox.set_nearest_neighbor(mailbox_nearest_neighbor); |
- |
- ResourceProvider::ResourceId id = |
- resource_provider->CreateResourceFromTextureMailbox(mailbox, |
- callback.Pass()); |
- EXPECT_NE(0u, id); |
- |
- Mock::VerifyAndClearExpectations(context); |
- |
- { |
- // Mailbox sync point WaitSyncPoint before using the texture. |
- EXPECT_CALL(*context, waitSyncPoint(sync_point)); |
- resource_provider->WaitSyncPointIfNeeded(id); |
- Mock::VerifyAndClearExpectations(context); |
- |
- EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(target, _)) |
- .WillOnce(Return(texture_id)); |
- EXPECT_CALL(*context, bindTexture(target, texture_id)); |
- |
- EXPECT_CALL(*context, insertSyncPoint()).Times(0); |
- EXPECT_CALL(*context, produceTextureDirectCHROMIUM(_, _, _)).Times(0); |
- |
- // The sampler will reset these if |mailbox_nearest_neighbor| does not |
- // match |sampler_filter|. |
- if (mailbox_nearest_neighbor != (sampler_filter == GL_NEAREST)) { |
- EXPECT_CALL(*context, texParameteri( |
- GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, sampler_filter)); |
- EXPECT_CALL(*context, texParameteri( |
- GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, sampler_filter)); |
- } |
- |
- ResourceProvider::ScopedSamplerGL lock( |
- resource_provider.get(), id, sampler_filter); |
- Mock::VerifyAndClearExpectations(context); |
- |
- // When done with it, a sync point should be inserted, but no produce is |
- // necessary. |
- EXPECT_CALL(*context, bindTexture(_, _)).Times(0); |
- EXPECT_CALL(*context, insertSyncPoint()); |
- EXPECT_CALL(*context, produceTextureDirectCHROMIUM(_, _, _)).Times(0); |
- |
- EXPECT_CALL(*context, waitSyncPoint(_)).Times(0); |
- EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(_, _)).Times(0); |
- } |
- |
- resource_provider->DeleteResource(id); |
- EXPECT_EQ(0u, release_sync_point); |
- EXPECT_FALSE(lost_resource); |
- EXPECT_EQ(main_thread_task_runner, mailbox_task_runner); |
- } |
-}; |
- |
-TEST_P(ResourceProviderTest, TextureMailbox_GLTexture2D_LinearToLinear) { |
- // Mailboxing is only supported for GL textures. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- |
- ResourceProviderTestTextureMailboxGLFilters::RunTest( |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- main_thread_task_runner_.get(), |
- false, |
- GL_LINEAR); |
-} |
- |
-TEST_P(ResourceProviderTest, TextureMailbox_GLTexture2D_NearestToNearest) { |
- // Mailboxing is only supported for GL textures. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- |
- ResourceProviderTestTextureMailboxGLFilters::RunTest( |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- main_thread_task_runner_.get(), |
- true, |
- GL_NEAREST); |
-} |
- |
-TEST_P(ResourceProviderTest, TextureMailbox_GLTexture2D_NearestToLinear) { |
- // Mailboxing is only supported for GL textures. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- |
- ResourceProviderTestTextureMailboxGLFilters::RunTest( |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- main_thread_task_runner_.get(), |
- true, |
- GL_LINEAR); |
-} |
- |
-TEST_P(ResourceProviderTest, TextureMailbox_GLTexture2D_LinearToNearest) { |
- // Mailboxing is only supported for GL textures. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- |
- ResourceProviderTestTextureMailboxGLFilters::RunTest( |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- main_thread_task_runner_.get(), |
- false, |
- GL_NEAREST); |
-} |
- |
-TEST_P(ResourceProviderTest, TextureMailbox_GLTextureExternalOES) { |
- // Mailboxing is only supported for GL textures. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- |
- scoped_ptr<TextureStateTrackingContext> context_owned( |
- new TextureStateTrackingContext); |
- TextureStateTrackingContext* context = context_owned.get(); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- uint32 sync_point = 30; |
- unsigned target = GL_TEXTURE_EXTERNAL_OES; |
- |
- EXPECT_CALL(*context, bindTexture(_, _)).Times(0); |
- EXPECT_CALL(*context, waitSyncPoint(_)).Times(0); |
- EXPECT_CALL(*context, insertSyncPoint()).Times(0); |
- EXPECT_CALL(*context, produceTextureDirectCHROMIUM(_, _, _)).Times(0); |
- EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(_, _)).Times(0); |
- |
- gpu::Mailbox gpu_mailbox; |
- memcpy(gpu_mailbox.name, "Hello world", strlen("Hello world") + 1); |
- scoped_ptr<SingleReleaseCallbackImpl> callback = |
- SingleReleaseCallbackImpl::Create(base::Bind(&EmptyReleaseCallback)); |
- |
- TextureMailbox mailbox(gpu_mailbox, target, sync_point); |
- |
- ResourceProvider::ResourceId id = |
- resource_provider->CreateResourceFromTextureMailbox( |
- mailbox, callback.Pass()); |
- EXPECT_NE(0u, id); |
- |
- Mock::VerifyAndClearExpectations(context); |
- |
- { |
- // Mailbox sync point WaitSyncPoint before using the texture. |
- EXPECT_CALL(*context, waitSyncPoint(sync_point)); |
- resource_provider->WaitSyncPointIfNeeded(id); |
- Mock::VerifyAndClearExpectations(context); |
- |
- unsigned texture_id = 1; |
- |
- EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(target, _)) |
- .WillOnce(Return(texture_id)); |
- |
- EXPECT_CALL(*context, insertSyncPoint()).Times(0); |
- EXPECT_CALL(*context, produceTextureDirectCHROMIUM(_, _, _)).Times(0); |
- |
- ResourceProvider::ScopedReadLockGL lock(resource_provider.get(), id); |
- Mock::VerifyAndClearExpectations(context); |
- |
- // When done with it, a sync point should be inserted, but no produce is |
- // necessary. |
- EXPECT_CALL(*context, bindTexture(_, _)).Times(0); |
- EXPECT_CALL(*context, insertSyncPoint()); |
- EXPECT_CALL(*context, produceTextureDirectCHROMIUM(_, _, _)).Times(0); |
- |
- EXPECT_CALL(*context, waitSyncPoint(_)).Times(0); |
- EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(_, _)).Times(0); |
- } |
-} |
- |
-TEST_P(ResourceProviderTest, |
- TextureMailbox_WaitSyncPointIfNeeded_WithSyncPoint) { |
- // Mailboxing is only supported for GL textures. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- |
- scoped_ptr<TextureStateTrackingContext> context_owned( |
- new TextureStateTrackingContext); |
- TextureStateTrackingContext* context = context_owned.get(); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- uint32 sync_point = 30; |
- unsigned target = GL_TEXTURE_2D; |
- |
- EXPECT_CALL(*context, bindTexture(_, _)).Times(0); |
- EXPECT_CALL(*context, waitSyncPoint(_)).Times(0); |
- EXPECT_CALL(*context, insertSyncPoint()).Times(0); |
- EXPECT_CALL(*context, produceTextureDirectCHROMIUM(_, _, _)).Times(0); |
- EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(_, _)).Times(0); |
- |
- gpu::Mailbox gpu_mailbox; |
- memcpy(gpu_mailbox.name, "Hello world", strlen("Hello world") + 1); |
- scoped_ptr<SingleReleaseCallbackImpl> callback = |
- SingleReleaseCallbackImpl::Create(base::Bind(&EmptyReleaseCallback)); |
- |
- TextureMailbox mailbox(gpu_mailbox, target, sync_point); |
- |
- ResourceProvider::ResourceId id = |
- resource_provider->CreateResourceFromTextureMailbox(mailbox, |
- callback.Pass()); |
- EXPECT_NE(0u, id); |
- |
- Mock::VerifyAndClearExpectations(context); |
- |
- { |
- // First call to WaitSyncPointIfNeeded should call waitSyncPoint. |
- EXPECT_CALL(*context, waitSyncPoint(sync_point)); |
- resource_provider->WaitSyncPointIfNeeded(id); |
- Mock::VerifyAndClearExpectations(context); |
- |
- // Subsequent calls to WaitSyncPointIfNeeded shouldn't call waitSyncPoint. |
- EXPECT_CALL(*context, waitSyncPoint(_)).Times(0); |
- resource_provider->WaitSyncPointIfNeeded(id); |
- Mock::VerifyAndClearExpectations(context); |
- } |
-} |
- |
-TEST_P(ResourceProviderTest, TextureMailbox_WaitSyncPointIfNeeded_NoSyncPoint) { |
- // Mailboxing is only supported for GL textures. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- |
- scoped_ptr<TextureStateTrackingContext> context_owned( |
- new TextureStateTrackingContext); |
- TextureStateTrackingContext* context = context_owned.get(); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- uint32 sync_point = 0; |
- unsigned target = GL_TEXTURE_2D; |
- |
- EXPECT_CALL(*context, bindTexture(_, _)).Times(0); |
- EXPECT_CALL(*context, waitSyncPoint(_)).Times(0); |
- EXPECT_CALL(*context, insertSyncPoint()).Times(0); |
- EXPECT_CALL(*context, produceTextureDirectCHROMIUM(_, _, _)).Times(0); |
- EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(_, _)).Times(0); |
- |
- gpu::Mailbox gpu_mailbox; |
- memcpy(gpu_mailbox.name, "Hello world", strlen("Hello world") + 1); |
- scoped_ptr<SingleReleaseCallbackImpl> callback = |
- SingleReleaseCallbackImpl::Create(base::Bind(&EmptyReleaseCallback)); |
- |
- TextureMailbox mailbox(gpu_mailbox, target, sync_point); |
- |
- ResourceProvider::ResourceId id = |
- resource_provider->CreateResourceFromTextureMailbox(mailbox, |
- callback.Pass()); |
- EXPECT_NE(0u, id); |
- |
- Mock::VerifyAndClearExpectations(context); |
- |
- { |
- // WaitSyncPointIfNeeded with sync_point == 0 shouldn't call waitSyncPoint. |
- EXPECT_CALL(*context, waitSyncPoint(_)).Times(0); |
- resource_provider->WaitSyncPointIfNeeded(id); |
- Mock::VerifyAndClearExpectations(context); |
- } |
-} |
- |
-class AllocationTrackingContext3D : public TestWebGraphicsContext3D { |
- public: |
- MOCK_METHOD0(NextTextureId, GLuint()); |
- MOCK_METHOD1(RetireTextureId, void(GLuint id)); |
- MOCK_METHOD2(bindTexture, void(GLenum target, GLuint texture)); |
- MOCK_METHOD5(texStorage2DEXT, |
- void(GLenum target, |
- GLint levels, |
- GLuint internalformat, |
- GLint width, |
- GLint height)); |
- MOCK_METHOD9(texImage2D, |
- void(GLenum target, |
- GLint level, |
- GLenum internalformat, |
- GLsizei width, |
- GLsizei height, |
- GLint border, |
- GLenum format, |
- GLenum type, |
- const void* pixels)); |
- MOCK_METHOD9(texSubImage2D, |
- void(GLenum target, |
- GLint level, |
- GLint xoffset, |
- GLint yoffset, |
- GLsizei width, |
- GLsizei height, |
- GLenum format, |
- GLenum type, |
- const void* pixels)); |
- MOCK_METHOD9(asyncTexImage2DCHROMIUM, |
- void(GLenum target, |
- GLint level, |
- GLenum internalformat, |
- GLsizei width, |
- GLsizei height, |
- GLint border, |
- GLenum format, |
- GLenum type, |
- const void* pixels)); |
- MOCK_METHOD9(asyncTexSubImage2DCHROMIUM, |
- void(GLenum target, |
- GLint level, |
- GLint xoffset, |
- GLint yoffset, |
- GLsizei width, |
- GLsizei height, |
- GLenum format, |
- GLenum type, |
- const void* pixels)); |
- MOCK_METHOD8(compressedTexImage2D, |
- void(GLenum target, |
- GLint level, |
- GLenum internalformat, |
- GLsizei width, |
- GLsizei height, |
- GLint border, |
- GLsizei image_size, |
- const void* data)); |
- MOCK_METHOD1(waitAsyncTexImage2DCHROMIUM, void(GLenum)); |
- MOCK_METHOD4(createImageCHROMIUM, |
- GLuint(ClientBuffer, GLsizei, GLsizei, GLenum)); |
- MOCK_METHOD1(destroyImageCHROMIUM, void(GLuint)); |
- MOCK_METHOD2(bindTexImage2DCHROMIUM, void(GLenum, GLint)); |
- MOCK_METHOD2(releaseTexImage2DCHROMIUM, void(GLenum, GLint)); |
- |
- // We're mocking bindTexture, so we override |
- // TestWebGraphicsContext3D::texParameteri to avoid assertions related to the |
- // currently bound texture. |
- virtual void texParameteri(GLenum target, GLenum pname, GLint param) {} |
-}; |
- |
-TEST_P(ResourceProviderTest, TextureAllocation) { |
- // Only for GL textures. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- scoped_ptr<AllocationTrackingContext3D> context_owned( |
- new StrictMock<AllocationTrackingContext3D>); |
- AllocationTrackingContext3D* context = context_owned.get(); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- gfx::Size size(2, 2); |
- gfx::Vector2d offset(0, 0); |
- ResourceFormat format = RGBA_8888; |
- ResourceProvider::ResourceId id = 0; |
- uint8_t pixels[16] = { 0 }; |
- int texture_id = 123; |
- |
- // Lazy allocation. Don't allocate when creating the resource. |
- id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- |
- EXPECT_CALL(*context, NextTextureId()).WillOnce(Return(texture_id)); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)).Times(1); |
- resource_provider->CreateForTesting(id); |
- |
- EXPECT_CALL(*context, RetireTextureId(texture_id)).Times(1); |
- resource_provider->DeleteResource(id); |
- |
- Mock::VerifyAndClearExpectations(context); |
- |
- // Do allocate when we set the pixels. |
- id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- |
- EXPECT_CALL(*context, NextTextureId()).WillOnce(Return(texture_id)); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)).Times(3); |
- EXPECT_CALL(*context, texImage2D(_, _, _, 2, 2, _, _, _, _)).Times(1); |
- EXPECT_CALL(*context, texSubImage2D(_, _, _, _, 2, 2, _, _, _)).Times(1); |
- resource_provider->CopyToResource(id, pixels, size); |
- |
- EXPECT_CALL(*context, RetireTextureId(texture_id)).Times(1); |
- resource_provider->DeleteResource(id); |
- |
- Mock::VerifyAndClearExpectations(context); |
- |
- // Same for async version. |
- id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- resource_provider->AcquirePixelBuffer(id); |
- |
- EXPECT_CALL(*context, NextTextureId()).WillOnce(Return(texture_id)); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)).Times(2); |
- EXPECT_CALL(*context, asyncTexImage2DCHROMIUM(_, _, _, 2, 2, _, _, _, _)) |
- .Times(1); |
- resource_provider->BeginSetPixels(id); |
- ASSERT_TRUE(resource_provider->DidSetPixelsComplete(id)); |
- |
- resource_provider->ReleasePixelBuffer(id); |
- |
- EXPECT_CALL(*context, RetireTextureId(texture_id)).Times(1); |
- resource_provider->DeleteResource(id); |
- |
- Mock::VerifyAndClearExpectations(context); |
-} |
- |
-TEST_P(ResourceProviderTest, TextureAllocationHint) { |
- // Only for GL textures. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- scoped_ptr<AllocationTrackingContext3D> context_owned( |
- new StrictMock<AllocationTrackingContext3D>); |
- AllocationTrackingContext3D* context = context_owned.get(); |
- context->set_support_texture_storage(true); |
- context->set_support_texture_usage(true); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- gfx::Size size(2, 2); |
- |
- const ResourceFormat formats[2] = {RGBA_8888, BGRA_8888}; |
- const ResourceProvider::TextureHint hints[4] = { |
- ResourceProvider::TEXTURE_HINT_DEFAULT, |
- ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
- ResourceProvider::TEXTURE_HINT_FRAMEBUFFER, |
- ResourceProvider::TEXTURE_HINT_IMMUTABLE_FRAMEBUFFER, |
- }; |
- for (size_t i = 0; i < arraysize(formats); ++i) { |
- for (GLuint texture_id = 1; texture_id <= arraysize(hints); ++texture_id) { |
- // Lazy allocation. Don't allocate when creating the resource. |
- ResourceProvider::ResourceId id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, hints[texture_id - 1], formats[i]); |
- |
- EXPECT_CALL(*context, NextTextureId()).WillOnce(Return(texture_id)); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)).Times(2); |
- bool is_immutable_hint = |
- hints[texture_id - 1] & ResourceProvider::TEXTURE_HINT_IMMUTABLE; |
- bool support_immutable_texture = |
- is_immutable_hint && formats[i] == RGBA_8888; |
- EXPECT_CALL(*context, texStorage2DEXT(_, _, _, 2, 2)) |
- .Times(support_immutable_texture ? 1 : 0); |
- EXPECT_CALL(*context, texImage2D(_, _, _, 2, 2, _, _, _, _)) |
- .Times(support_immutable_texture ? 0 : 1); |
- resource_provider->AllocateForTesting(id); |
- |
- EXPECT_CALL(*context, RetireTextureId(texture_id)).Times(1); |
- resource_provider->DeleteResource(id); |
- |
- Mock::VerifyAndClearExpectations(context); |
- } |
- } |
-} |
- |
-TEST_P(ResourceProviderTest, TextureAllocationHint_BGRA) { |
- // Only for GL textures. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- scoped_ptr<AllocationTrackingContext3D> context_owned( |
- new StrictMock<AllocationTrackingContext3D>); |
- AllocationTrackingContext3D* context = context_owned.get(); |
- context->set_support_texture_format_bgra8888(true); |
- context->set_support_texture_storage(true); |
- context->set_support_texture_usage(true); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- gfx::Size size(2, 2); |
- const ResourceFormat formats[2] = {RGBA_8888, BGRA_8888}; |
- |
- const ResourceProvider::TextureHint hints[4] = { |
- ResourceProvider::TEXTURE_HINT_DEFAULT, |
- ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
- ResourceProvider::TEXTURE_HINT_FRAMEBUFFER, |
- ResourceProvider::TEXTURE_HINT_IMMUTABLE_FRAMEBUFFER, |
- }; |
- for (size_t i = 0; i < arraysize(formats); ++i) { |
- for (GLuint texture_id = 1; texture_id <= arraysize(hints); ++texture_id) { |
- // Lazy allocation. Don't allocate when creating the resource. |
- ResourceProvider::ResourceId id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, hints[texture_id - 1], formats[i]); |
- |
- EXPECT_CALL(*context, NextTextureId()).WillOnce(Return(texture_id)); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)).Times(2); |
- bool is_immutable_hint = |
- hints[texture_id - 1] & ResourceProvider::TEXTURE_HINT_IMMUTABLE; |
- EXPECT_CALL(*context, texStorage2DEXT(_, _, _, 2, 2)) |
- .Times(is_immutable_hint ? 1 : 0); |
- EXPECT_CALL(*context, texImage2D(_, _, _, 2, 2, _, _, _, _)) |
- .Times(is_immutable_hint ? 0 : 1); |
- resource_provider->AllocateForTesting(id); |
- |
- EXPECT_CALL(*context, RetireTextureId(texture_id)).Times(1); |
- resource_provider->DeleteResource(id); |
- |
- Mock::VerifyAndClearExpectations(context); |
- } |
- } |
-} |
- |
-TEST_P(ResourceProviderTest, PixelBuffer_GLTexture) { |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- scoped_ptr<AllocationTrackingContext3D> context_owned( |
- new StrictMock<AllocationTrackingContext3D>); |
- AllocationTrackingContext3D* context = context_owned.get(); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- gfx::Size size(2, 2); |
- ResourceFormat format = RGBA_8888; |
- ResourceProvider::ResourceId id = 0; |
- int texture_id = 123; |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- resource_provider->AcquirePixelBuffer(id); |
- |
- EXPECT_CALL(*context, NextTextureId()).WillOnce(Return(texture_id)); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)).Times(2); |
- EXPECT_CALL(*context, asyncTexImage2DCHROMIUM(_, _, _, 2, 2, _, _, _, _)) |
- .Times(1); |
- resource_provider->BeginSetPixels(id); |
- |
- EXPECT_TRUE(resource_provider->DidSetPixelsComplete(id)); |
- |
- resource_provider->ReleasePixelBuffer(id); |
- |
- EXPECT_CALL(*context, RetireTextureId(texture_id)).Times(1); |
- resource_provider->DeleteResource(id); |
- |
- Mock::VerifyAndClearExpectations(context); |
-} |
- |
-TEST_P(ResourceProviderTest, ForcingAsyncUploadToComplete) { |
- // Only for GL textures. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- scoped_ptr<AllocationTrackingContext3D> context_owned( |
- new StrictMock<AllocationTrackingContext3D>); |
- AllocationTrackingContext3D* context = context_owned.get(); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- gfx::Size size(2, 2); |
- ResourceFormat format = RGBA_8888; |
- ResourceProvider::ResourceId id = 0; |
- int texture_id = 123; |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- resource_provider->AcquirePixelBuffer(id); |
- |
- EXPECT_CALL(*context, NextTextureId()).WillOnce(Return(texture_id)); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)).Times(2); |
- EXPECT_CALL(*context, asyncTexImage2DCHROMIUM(_, _, _, 2, 2, _, _, _, _)) |
- .Times(1); |
- resource_provider->BeginSetPixels(id); |
- |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)).Times(1); |
- EXPECT_CALL(*context, waitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)).Times(1); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, 0)).Times(1); |
- resource_provider->ForceSetPixelsToComplete(id); |
- |
- resource_provider->ReleasePixelBuffer(id); |
- |
- EXPECT_CALL(*context, RetireTextureId(texture_id)).Times(1); |
- resource_provider->DeleteResource(id); |
- |
- Mock::VerifyAndClearExpectations(context); |
-} |
- |
-TEST_P(ResourceProviderTest, PixelBufferLostContext) { |
- scoped_ptr<AllocationTrackingContext3D> context_owned( |
- new NiceMock<AllocationTrackingContext3D>); |
- AllocationTrackingContext3D* context = context_owned.get(); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- gfx::Size size(2, 2); |
- ResourceFormat format = RGBA_8888; |
- ResourceProvider::ResourceId id = 0; |
- int texture_id = 123; |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- EXPECT_CALL(*context, NextTextureId()).WillRepeatedly(Return(texture_id)); |
- |
- id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- context->loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB, |
- GL_INNOCENT_CONTEXT_RESET_ARB); |
- |
- resource_provider->AcquirePixelBuffer(id); |
- int stride; |
- void* buffer = resource_provider->MapPixelBuffer(id, &stride); |
- EXPECT_FALSE(buffer); |
- resource_provider->UnmapPixelBuffer(id); |
- Mock::VerifyAndClearExpectations(context); |
-} |
- |
-TEST_P(ResourceProviderTest, Image_GLTexture) { |
- // Only for GL textures. |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- scoped_ptr<AllocationTrackingContext3D> context_owned( |
- new StrictMock<AllocationTrackingContext3D>); |
- AllocationTrackingContext3D* context = context_owned.get(); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- const int kWidth = 2; |
- const int kHeight = 2; |
- gfx::Size size(kWidth, kHeight); |
- ResourceFormat format = RGBA_8888; |
- ResourceProvider::ResourceId id = 0; |
- const unsigned kTextureId = 123u; |
- const unsigned kImageId = 234u; |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- |
- EXPECT_CALL(*context, createImageCHROMIUM(_, kWidth, kHeight, GL_RGBA)) |
- .WillOnce(Return(kImageId)) |
- .RetiresOnSaturation(); |
- { |
- ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock( |
- resource_provider.get(), id); |
- EXPECT_TRUE(!!lock.GetGpuMemoryBuffer()); |
- } |
- |
- EXPECT_CALL(*context, NextTextureId()) |
- .WillOnce(Return(kTextureId)) |
- .RetiresOnSaturation(); |
- // Once in CreateTextureId and once in BindForSampling |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, kTextureId)).Times(2) |
- .RetiresOnSaturation(); |
- EXPECT_CALL(*context, bindTexImage2DCHROMIUM(GL_TEXTURE_2D, kImageId)) |
- .Times(1) |
- .RetiresOnSaturation(); |
- { |
- ResourceProvider::ScopedSamplerGL lock_gl( |
- resource_provider.get(), id, GL_TEXTURE_2D, GL_LINEAR); |
- EXPECT_EQ(kTextureId, lock_gl.texture_id()); |
- } |
- |
- { |
- ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock( |
- resource_provider.get(), id); |
- EXPECT_TRUE(!!lock.GetGpuMemoryBuffer()); |
- } |
- |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, kTextureId)).Times(1) |
- .RetiresOnSaturation(); |
- EXPECT_CALL(*context, releaseTexImage2DCHROMIUM(GL_TEXTURE_2D, kImageId)) |
- .Times(1) |
- .RetiresOnSaturation(); |
- EXPECT_CALL(*context, bindTexImage2DCHROMIUM(GL_TEXTURE_2D, kImageId)) |
- .Times(1) |
- .RetiresOnSaturation(); |
- EXPECT_CALL(*context, RetireTextureId(kTextureId)) |
- .Times(1) |
- .RetiresOnSaturation(); |
- { |
- ResourceProvider::ScopedSamplerGL lock_gl( |
- resource_provider.get(), id, GL_TEXTURE_2D, GL_LINEAR); |
- EXPECT_EQ(kTextureId, lock_gl.texture_id()); |
- } |
- |
- EXPECT_CALL(*context, destroyImageCHROMIUM(kImageId)) |
- .Times(1) |
- .RetiresOnSaturation(); |
-} |
- |
-TEST_P(ResourceProviderTest, CopyResource_GLTexture) { |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- scoped_ptr<AllocationTrackingContext3D> context_owned( |
- new StrictMock<AllocationTrackingContext3D>); |
- AllocationTrackingContext3D* context = context_owned.get(); |
- context_owned->set_support_sync_query(true); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- ASSERT_TRUE(output_surface->BindToClient(&output_surface_client)); |
- |
- const int kWidth = 2; |
- const int kHeight = 2; |
- gfx::Size size(kWidth, kHeight); |
- ResourceFormat format = RGBA_8888; |
- ResourceProvider::ResourceId source_id = 0; |
- ResourceProvider::ResourceId dest_id = 0; |
- const unsigned kSourceTextureId = 123u; |
- const unsigned kDestTextureId = 321u; |
- const unsigned kImageId = 234u; |
- |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- source_id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- |
- EXPECT_CALL(*context, createImageCHROMIUM(_, kWidth, kHeight, GL_RGBA)) |
- .WillOnce(Return(kImageId)) |
- .RetiresOnSaturation(); |
- { |
- ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock( |
- resource_provider.get(), source_id); |
- EXPECT_TRUE(!!lock.GetGpuMemoryBuffer()); |
- } |
- Mock::VerifyAndClearExpectations(context); |
- |
- dest_id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
- |
- EXPECT_CALL(*context, NextTextureId()) |
- .WillOnce(Return(kDestTextureId)) |
- .RetiresOnSaturation(); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, kDestTextureId)) |
- .Times(2) |
- .RetiresOnSaturation(); |
- EXPECT_CALL(*context, texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, |
- GL_UNSIGNED_BYTE, nullptr)) |
- .Times(1) |
- .RetiresOnSaturation(); |
- EXPECT_CALL(*context, NextTextureId()) |
- .WillOnce(Return(kSourceTextureId)) |
- .RetiresOnSaturation(); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, kSourceTextureId)) |
- .Times(2) |
- .RetiresOnSaturation(); |
- EXPECT_CALL(*context, bindTexImage2DCHROMIUM(GL_TEXTURE_2D, kImageId)) |
- .Times(1) |
- .RetiresOnSaturation(); |
- resource_provider->CopyResource(source_id, dest_id); |
- Mock::VerifyAndClearExpectations(context); |
- |
- EXPECT_CALL(*context, destroyImageCHROMIUM(kImageId)) |
- .Times(1) |
- .RetiresOnSaturation(); |
- EXPECT_CALL(*context, RetireTextureId(kSourceTextureId)) |
- .Times(1) |
- .RetiresOnSaturation(); |
- EXPECT_CALL(*context, RetireTextureId(kDestTextureId)) |
- .Times(1) |
- .RetiresOnSaturation(); |
- resource_provider->DeleteResource(source_id); |
- resource_provider->DeleteResource(dest_id); |
-} |
- |
-void InitializeGLAndCheck(ContextSharedData* shared_data, |
- ResourceProvider* resource_provider, |
- FakeOutputSurface* output_surface) { |
- scoped_ptr<ResourceProviderContext> context_owned = |
- ResourceProviderContext::Create(shared_data); |
- ResourceProviderContext* context = context_owned.get(); |
- |
- scoped_refptr<TestContextProvider> context_provider = |
- TestContextProvider::Create(context_owned.Pass()); |
- output_surface->InitializeAndSetContext3d(context_provider, nullptr); |
- resource_provider->InitializeGL(); |
- |
- CheckCreateResource(ResourceProvider::RESOURCE_TYPE_GL_TEXTURE, |
- resource_provider, context); |
-} |
- |
-TEST(ResourceProviderTest, BasicInitializeGLSoftware) { |
- scoped_ptr<ContextSharedData> shared_data = ContextSharedData::Create(); |
- bool delegated_rendering = false; |
- scoped_ptr<FakeOutputSurface> output_surface( |
- FakeOutputSurface::CreateDeferredGL( |
- scoped_ptr<SoftwareOutputDevice>(new SoftwareOutputDevice), |
- delegated_rendering)); |
- FakeOutputSurfaceClient client(output_surface.get()); |
- EXPECT_TRUE(output_surface->BindToClient(&client)); |
- scoped_ptr<SharedBitmapManager> shared_bitmap_manager( |
- new TestSharedBitmapManager()); |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager.get(), |
- NULL, |
- NULL, |
- 0, |
- false, |
- 1)); |
- |
- CheckCreateResource(ResourceProvider::RESOURCE_TYPE_BITMAP, |
- resource_provider.get(), NULL); |
- |
- InitializeGLAndCheck(shared_data.get(), |
- resource_provider.get(), |
- output_surface.get()); |
- |
- resource_provider->InitializeSoftware(); |
- output_surface->ReleaseGL(); |
- CheckCreateResource(ResourceProvider::RESOURCE_TYPE_BITMAP, |
- resource_provider.get(), NULL); |
- |
- InitializeGLAndCheck(shared_data.get(), |
- resource_provider.get(), |
- output_surface.get()); |
-} |
- |
-TEST_P(ResourceProviderTest, CompressedTextureETC1Allocate) { |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- |
- scoped_ptr<AllocationTrackingContext3D> context_owned( |
- new AllocationTrackingContext3D); |
- AllocationTrackingContext3D* context = context_owned.get(); |
- context_owned->set_support_compressed_texture_etc1(true); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- gfx::Size size(4, 4); |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- int texture_id = 123; |
- |
- ResourceProvider::ResourceId id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, ETC1); |
- EXPECT_NE(0u, id); |
- EXPECT_CALL(*context, NextTextureId()).WillOnce(Return(texture_id)); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)).Times(2); |
- resource_provider->AllocateForTesting(id); |
- |
- EXPECT_CALL(*context, RetireTextureId(texture_id)).Times(1); |
- resource_provider->DeleteResource(id); |
-} |
- |
-TEST_P(ResourceProviderTest, CompressedTextureETC1Upload) { |
- if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) |
- return; |
- |
- scoped_ptr<AllocationTrackingContext3D> context_owned( |
- new AllocationTrackingContext3D); |
- AllocationTrackingContext3D* context = context_owned.get(); |
- context_owned->set_support_compressed_texture_etc1(true); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- |
- gfx::Size size(4, 4); |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- NULL, |
- 0, |
- false, |
- 1)); |
- int texture_id = 123; |
- uint8_t pixels[8]; |
- |
- ResourceProvider::ResourceId id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, ETC1); |
- EXPECT_NE(0u, id); |
- EXPECT_CALL(*context, NextTextureId()).WillOnce(Return(texture_id)); |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)).Times(3); |
- EXPECT_CALL(*context, |
- compressedTexImage2D( |
- _, 0, _, size.width(), size.height(), _, _, _)).Times(1); |
- resource_provider->CopyToResource(id, pixels, size); |
- |
- EXPECT_CALL(*context, RetireTextureId(texture_id)).Times(1); |
- resource_provider->DeleteResource(id); |
-} |
- |
-INSTANTIATE_TEST_CASE_P( |
- ResourceProviderTests, |
- ResourceProviderTest, |
- ::testing::Values(ResourceProvider::RESOURCE_TYPE_GL_TEXTURE, |
- ResourceProvider::RESOURCE_TYPE_BITMAP)); |
- |
-class TextureIdAllocationTrackingContext : public TestWebGraphicsContext3D { |
- public: |
- GLuint NextTextureId() override { |
- base::AutoLock lock(namespace_->lock); |
- return namespace_->next_texture_id++; |
- } |
- void RetireTextureId(GLuint) override {} |
- GLuint PeekTextureId() { |
- base::AutoLock lock(namespace_->lock); |
- return namespace_->next_texture_id; |
- } |
-}; |
- |
-TEST(ResourceProviderTest, TextureAllocationChunkSize) { |
- scoped_ptr<TextureIdAllocationTrackingContext> context_owned( |
- new TextureIdAllocationTrackingContext); |
- TextureIdAllocationTrackingContext* context = context_owned.get(); |
- |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
- scoped_ptr<SharedBitmapManager> shared_bitmap_manager( |
- new TestSharedBitmapManager()); |
- |
- gfx::Size size(1, 1); |
- ResourceFormat format = RGBA_8888; |
- |
- { |
- size_t kTextureAllocationChunkSize = 1; |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager.get(), |
- NULL, |
- NULL, |
- 0, |
- false, |
- kTextureAllocationChunkSize)); |
- |
- ResourceProvider::ResourceId id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
- format); |
- resource_provider->AllocateForTesting(id); |
- Mock::VerifyAndClearExpectations(context); |
- |
- DCHECK_EQ(2u, context->PeekTextureId()); |
- resource_provider->DeleteResource(id); |
- } |
- |
- { |
- size_t kTextureAllocationChunkSize = 8; |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager.get(), |
- NULL, |
- NULL, |
- 0, |
- false, |
- kTextureAllocationChunkSize)); |
- |
- ResourceProvider::ResourceId id = resource_provider->CreateResource( |
- size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
- format); |
- resource_provider->AllocateForTesting(id); |
- Mock::VerifyAndClearExpectations(context); |
- |
- DCHECK_EQ(10u, context->PeekTextureId()); |
- resource_provider->DeleteResource(id); |
- } |
-} |
- |
-} // namespace |
-} // namespace cc |