summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-27 08:48:55 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-27 08:48:55 +0000
commit5db34bf2b5174c6e715571a49b65dc64c5e79ab3 (patch)
tree0b5288e4256648b62f2100d7ad3f8afd68b334d1 /gpu
parentac05b750f64659f450fc123087b0b44066eddf73 (diff)
downloadchromium_src-5db34bf2b5174c6e715571a49b65dc64c5e79ab3.zip
chromium_src-5db34bf2b5174c6e715571a49b65dc64c5e79ab3.tar.gz
chromium_src-5db34bf2b5174c6e715571a49b65dc64c5e79ab3.tar.bz2
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
Diffstat (limited to 'gpu')
-rw-r--r--gpu/command_buffer/client/gles2_implementation.cc6
-rw-r--r--gpu/command_buffer/client/gles2_implementation.h2
-rw-r--r--gpu/command_buffer/client/mapped_memory.cc8
-rw-r--r--gpu/command_buffer/client/mapped_memory.h10
-rw-r--r--gpu/command_buffer/client/mapped_memory_unittest.cc25
5 files changed, 49 insertions, 2 deletions
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<MemoryChunk*> 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