From 5db34bf2b5174c6e715571a49b65dc64c5e79ab3 Mon Sep 17 00:00:00 2001 From: "gman@chromium.org" Date: Thu, 27 Oct 2011 08:48:55 +0000 Subject: Make GLES2Implementation use a larger chunk size for mapping functions. This will make it allocate less shared memory blocks resulting in less file descriptors. BUG=none TEST=unit tests Review URL: http://codereview.chromium.org/8340003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@107544 0039d316-1c4b-4281-b951-d872f2087c98 --- gpu/command_buffer/client/gles2_implementation.cc | 6 ++++++ gpu/command_buffer/client/gles2_implementation.h | 2 ++ gpu/command_buffer/client/mapped_memory.cc | 8 +++++-- gpu/command_buffer/client/mapped_memory.h | 10 +++++++++ .../client/mapped_memory_unittest.cc | 25 ++++++++++++++++++++++ 5 files changed, 49 insertions(+), 2 deletions(-) (limited to 'gpu') diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc index 9a9cd85..12238da 100644 --- a/gpu/command_buffer/client/gles2_implementation.cc +++ b/gpu/command_buffer/client/gles2_implementation.cc @@ -562,6 +562,7 @@ GLES2Implementation::GLES2Implementation( memset(&reserved_ids_, 0, sizeof(reserved_ids_)); mapped_memory_.reset(new MappedMemoryManager(helper_)); + SetSharedMemoryChunkSizeMultiple(1024 * 1024 * 2); if (share_resources) { if (!bind_generates_resource) { @@ -641,6 +642,11 @@ GLES2Implementation::~GLES2Implementation() { #endif } +void GLES2Implementation::SetSharedMemoryChunkSizeMultiple( + unsigned int multiple) { + mapped_memory_->set_chunk_size_multiple(multiple); +} + void GLES2Implementation::FreeUnusedSharedMemory() { mapped_memory_->FreeUnused(); } diff --git a/gpu/command_buffer/client/gles2_implementation.h b/gpu/command_buffer/client/gles2_implementation.h index 43cb2ad..81f0145 100644 --- a/gpu/command_buffer/client/gles2_implementation.h +++ b/gpu/command_buffer/client/gles2_implementation.h @@ -197,6 +197,8 @@ class GLES2Implementation { texture_id_handler_->FreeIds(1, &id); } + void SetSharedMemoryChunkSizeMultiple(unsigned int multiple); + void FreeUnusedSharedMemory(); private: diff --git a/gpu/command_buffer/client/mapped_memory.cc b/gpu/command_buffer/client/mapped_memory.cc index 461343e..c8d400e 100644 --- a/gpu/command_buffer/client/mapped_memory.cc +++ b/gpu/command_buffer/client/mapped_memory.cc @@ -23,7 +23,8 @@ MemoryChunk::MemoryChunk( } MappedMemoryManager::MappedMemoryManager(CommandBufferHelper* helper) - : helper_(helper) { + : chunk_size_multiple_(1), + helper_(helper) { } MappedMemoryManager::~MappedMemoryManager() { @@ -52,7 +53,10 @@ void* MappedMemoryManager::Alloc( // Make a new chunk to satisfy the request. CommandBuffer* cmd_buf = helper_->command_buffer(); - int32 id = cmd_buf->CreateTransferBuffer(size, -1); + unsigned int chunk_size = + ((size + chunk_size_multiple_ - 1) / chunk_size_multiple_) * + chunk_size_multiple_; + int32 id = cmd_buf->CreateTransferBuffer(chunk_size, -1); if (id == -1) { return NULL; } diff --git a/gpu/command_buffer/client/mapped_memory.h b/gpu/command_buffer/client/mapped_memory.h index ed66664..f38470f 100644 --- a/gpu/command_buffer/client/mapped_memory.h +++ b/gpu/command_buffer/client/mapped_memory.h @@ -110,6 +110,14 @@ class MappedMemoryManager { ~MappedMemoryManager(); + unsigned int chunk_size_multiple() const { + return chunk_size_multiple_; + } + + void set_chunk_size_multiple(unsigned int multiple) { + chunk_size_multiple_ = multiple; + } + // Allocates a block of memory // Parameters: // size: size of memory to allocate. @@ -145,6 +153,8 @@ class MappedMemoryManager { private: typedef std::vector MemoryChunkVector; + // size a chunk is rounded up to. + unsigned int chunk_size_multiple_; CommandBufferHelper* helper_; MemoryChunkVector chunks_; diff --git a/gpu/command_buffer/client/mapped_memory_unittest.cc b/gpu/command_buffer/client/mapped_memory_unittest.cc index 0b60897..6ca8c14 100644 --- a/gpu/command_buffer/client/mapped_memory_unittest.cc +++ b/gpu/command_buffer/client/mapped_memory_unittest.cc @@ -273,6 +273,31 @@ TEST_F(MappedMemoryManagerTest, FreeUnused) { EXPECT_EQ(0u, manager_->num_chunks()); } +TEST_F(MappedMemoryManagerTest, ChunkSizeMultiple) { + const unsigned int kSize = 1024; + manager_->set_chunk_size_multiple(kSize * 2); + // Check if we allocate less than the chunk size multiple we get + // chunks arounded up. + int32 id1 = -1; + unsigned int offset1 = 0xFFFFFFFFU; + void* mem1 = manager_->Alloc(kSize, &id1, &offset1); + int32 id2 = -1; + unsigned int offset2 = 0xFFFFFFFFU; + void* mem2 = manager_->Alloc(kSize, &id2, &offset2); + int32 id3 = -1; + unsigned int offset3 = 0xFFFFFFFFU; + void* mem3 = manager_->Alloc(kSize, &id3, &offset3); + ASSERT_TRUE(mem1); + ASSERT_TRUE(mem2); + ASSERT_TRUE(mem3); + EXPECT_NE(-1, id1); + EXPECT_EQ(id1, id2); + EXPECT_NE(id2, id3); + EXPECT_EQ(0u, offset1); + EXPECT_EQ(kSize, offset2); + EXPECT_EQ(0u, offset3); +} + } // namespace gpu -- cgit v1.1