| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/test/test_gpu_memory_buffer_manager.h" | 5 #include "cc/test/test_gpu_memory_buffer_manager.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
| 12 #include "base/numerics/safe_conversions.h" | 12 #include "base/numerics/safe_conversions.h" |
| 13 #include "ui/gfx/buffer_format_util.h" | 13 #include "ui/gfx/buffer_format_util.h" |
| 14 #include "ui/gfx/gpu_memory_buffer.h" | 14 #include "ui/gfx/gpu_memory_buffer.h" |
| 15 | 15 |
| 16 namespace cc { | 16 namespace cc { |
| 17 namespace { | 17 namespace { |
| 18 | 18 |
| 19 int g_gpu_memory_buffer_id_counter = 0; | |
| 20 | |
| 21 class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer { | 19 class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer { |
| 22 public: | 20 public: |
| 23 GpuMemoryBufferImpl(const gfx::Size& size, | 21 GpuMemoryBufferImpl(TestGpuMemoryBufferManager* manager, |
| 22 int id, |
| 23 const gfx::Size& size, |
| 24 gfx::BufferFormat format, | 24 gfx::BufferFormat format, |
| 25 std::unique_ptr<base::SharedMemory> shared_memory, | 25 std::unique_ptr<base::SharedMemory> shared_memory, |
| 26 size_t offset, | 26 size_t offset, |
| 27 size_t stride) | 27 size_t stride) |
| 28 : id_(++g_gpu_memory_buffer_id_counter), | 28 : manager_(manager), |
| 29 id_(id), |
| 29 size_(size), | 30 size_(size), |
| 30 format_(format), | 31 format_(format), |
| 31 shared_memory_(std::move(shared_memory)), | 32 shared_memory_(std::move(shared_memory)), |
| 32 offset_(offset), | 33 offset_(offset), |
| 33 stride_(stride), | 34 stride_(stride), |
| 34 mapped_(false), | 35 mapped_(false), |
| 35 is_in_use_by_window_server_(false) {} | 36 is_in_use_by_window_server_(false) {} |
| 36 | 37 |
| 38 ~GpuMemoryBufferImpl() override { manager_->OnGpuMemoryBufferDestroyed(id_); } |
| 39 |
| 37 // Overridden from gfx::GpuMemoryBuffer: | 40 // Overridden from gfx::GpuMemoryBuffer: |
| 38 bool Map() override { | 41 bool Map() override { |
| 39 DCHECK(!mapped_); | 42 DCHECK(!mapped_); |
| 40 DCHECK_EQ(stride_, gfx::RowSizeForBufferFormat(size_.width(), format_, 0)); | 43 DCHECK_EQ(stride_, gfx::RowSizeForBufferFormat(size_.width(), format_, 0)); |
| 41 if (!shared_memory_->Map(offset_ + | 44 if (!shared_memory_->Map(offset_ + |
| 42 gfx::BufferSizeForBufferFormat(size_, format_))) | 45 gfx::BufferSizeForBufferFormat(size_, format_))) |
| 43 return false; | 46 return false; |
| 44 mapped_ = true; | 47 mapped_ = true; |
| 45 return true; | 48 return true; |
| 46 } | 49 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 76 } | 79 } |
| 77 ClientBuffer AsClientBuffer() override { | 80 ClientBuffer AsClientBuffer() override { |
| 78 return reinterpret_cast<ClientBuffer>(this); | 81 return reinterpret_cast<ClientBuffer>(this); |
| 79 } | 82 } |
| 80 | 83 |
| 81 void SetIsInUseByMacOSWindowServer(bool value) { | 84 void SetIsInUseByMacOSWindowServer(bool value) { |
| 82 is_in_use_by_window_server_ = value; | 85 is_in_use_by_window_server_ = value; |
| 83 } | 86 } |
| 84 | 87 |
| 85 private: | 88 private: |
| 89 TestGpuMemoryBufferManager* manager_; |
| 86 gfx::GpuMemoryBufferId id_; | 90 gfx::GpuMemoryBufferId id_; |
| 87 const gfx::Size size_; | 91 const gfx::Size size_; |
| 88 gfx::BufferFormat format_; | 92 gfx::BufferFormat format_; |
| 89 std::unique_ptr<base::SharedMemory> shared_memory_; | 93 std::unique_ptr<base::SharedMemory> shared_memory_; |
| 90 size_t offset_; | 94 size_t offset_; |
| 91 size_t stride_; | 95 size_t stride_; |
| 92 bool mapped_; | 96 bool mapped_; |
| 93 bool is_in_use_by_window_server_; | 97 bool is_in_use_by_window_server_; |
| 94 }; | 98 }; |
| 95 | 99 |
| 100 class GpuMemoryBufferFromClient : public gfx::GpuMemoryBuffer { |
| 101 public: |
| 102 GpuMemoryBufferFromClient(TestGpuMemoryBufferManager* manager, |
| 103 int id, |
| 104 gfx::GpuMemoryBuffer* client_buffer) |
| 105 : manager_(manager), id_(id), client_buffer_(client_buffer) {} |
| 106 |
| 107 ~GpuMemoryBufferFromClient() override { |
| 108 manager_->OnGpuMemoryBufferDestroyed(id_); |
| 109 } |
| 110 |
| 111 bool Map() override { return client_buffer_->Map(); } |
| 112 void* memory(size_t plane) override { return client_buffer_->memory(plane); } |
| 113 void Unmap() override { client_buffer_->Unmap(); } |
| 114 bool IsInUseByMacOSWindowServer() const override { |
| 115 return client_buffer_->IsInUseByMacOSWindowServer(); |
| 116 } |
| 117 gfx::Size GetSize() const override { return client_buffer_->GetSize(); } |
| 118 gfx::BufferFormat GetFormat() const override { |
| 119 return client_buffer_->GetFormat(); |
| 120 } |
| 121 int stride(size_t plane) const override { |
| 122 return client_buffer_->stride(plane); |
| 123 } |
| 124 gfx::GpuMemoryBufferId GetId() const override { return id_; } |
| 125 gfx::GpuMemoryBufferHandle GetHandle() const override { |
| 126 return client_buffer_->GetHandle(); |
| 127 } |
| 128 ClientBuffer AsClientBuffer() override { |
| 129 return client_buffer_->AsClientBuffer(); |
| 130 } |
| 131 |
| 132 private: |
| 133 TestGpuMemoryBufferManager* manager_; |
| 134 gfx::GpuMemoryBufferId id_; |
| 135 gfx::GpuMemoryBuffer* client_buffer_; |
| 136 }; |
| 137 |
| 96 } // namespace | 138 } // namespace |
| 97 | 139 |
| 98 TestGpuMemoryBufferManager::TestGpuMemoryBufferManager() { | 140 TestGpuMemoryBufferManager::TestGpuMemoryBufferManager() { |
| 99 } | 141 } |
| 100 | 142 |
| 101 TestGpuMemoryBufferManager::~TestGpuMemoryBufferManager() { | 143 TestGpuMemoryBufferManager::~TestGpuMemoryBufferManager() { |
| 144 DCHECK(buffers_.empty()); |
| 145 DCHECK(clients_.empty()); |
| 146 if (parent_gpu_memory_buffer_manager_) |
| 147 parent_gpu_memory_buffer_manager_->clients_.erase(client_id_); |
| 148 } |
| 149 |
| 150 std::unique_ptr<TestGpuMemoryBufferManager> |
| 151 TestGpuMemoryBufferManager::CreateClientGpuMemoryBufferManager() { |
| 152 std::unique_ptr<TestGpuMemoryBufferManager> client( |
| 153 new TestGpuMemoryBufferManager); |
| 154 client->client_id_ = ++last_client_id_; |
| 155 client->parent_gpu_memory_buffer_manager_ = this; |
| 156 |
| 157 clients_[client->client_id_] = client.get(); |
| 158 return client; |
| 102 } | 159 } |
| 103 | 160 |
| 104 void TestGpuMemoryBufferManager::SetGpuMemoryBufferIsInUseByMacOSWindowServer( | 161 void TestGpuMemoryBufferManager::SetGpuMemoryBufferIsInUseByMacOSWindowServer( |
| 105 gfx::GpuMemoryBuffer* gpu_memory_buffer, | 162 gfx::GpuMemoryBuffer* gpu_memory_buffer, |
| 106 bool in_use) { | 163 bool in_use) { |
| 107 static_cast<GpuMemoryBufferImpl*>(gpu_memory_buffer) | 164 static_cast<GpuMemoryBufferImpl*>(gpu_memory_buffer) |
| 108 ->SetIsInUseByMacOSWindowServer(in_use); | 165 ->SetIsInUseByMacOSWindowServer(in_use); |
| 109 } | 166 } |
| 110 | 167 |
| 168 void TestGpuMemoryBufferManager::OnGpuMemoryBufferDestroyed( |
| 169 gfx::GpuMemoryBufferId gpu_memory_buffer_id) { |
| 170 DCHECK(buffers_.find(gpu_memory_buffer_id.id) != buffers_.end()); |
| 171 buffers_.erase(gpu_memory_buffer_id.id); |
| 172 } |
| 173 |
| 111 std::unique_ptr<gfx::GpuMemoryBuffer> | 174 std::unique_ptr<gfx::GpuMemoryBuffer> |
| 112 TestGpuMemoryBufferManager::AllocateGpuMemoryBuffer( | 175 TestGpuMemoryBufferManager::AllocateGpuMemoryBuffer( |
| 113 const gfx::Size& size, | 176 const gfx::Size& size, |
| 114 gfx::BufferFormat format, | 177 gfx::BufferFormat format, |
| 115 gfx::BufferUsage usage, | 178 gfx::BufferUsage usage, |
| 116 gpu::SurfaceHandle surface_handle) { | 179 gpu::SurfaceHandle surface_handle) { |
| 117 std::unique_ptr<base::SharedMemory> shared_memory(new base::SharedMemory); | 180 std::unique_ptr<base::SharedMemory> shared_memory(new base::SharedMemory); |
| 118 const size_t buffer_size = gfx::BufferSizeForBufferFormat(size, format); | 181 const size_t buffer_size = gfx::BufferSizeForBufferFormat(size, format); |
| 119 if (!shared_memory->CreateAnonymous(buffer_size)) | 182 if (!shared_memory->CreateAnonymous(buffer_size)) |
| 120 return nullptr; | 183 return nullptr; |
| 121 return base::WrapUnique<gfx::GpuMemoryBuffer>(new GpuMemoryBufferImpl( | 184 |
| 122 size, format, std::move(shared_memory), 0, | 185 last_gpu_memory_buffer_id_ += 1; |
| 123 base::checked_cast<int>( | 186 std::unique_ptr<gfx::GpuMemoryBuffer> result(new GpuMemoryBufferImpl( |
| 124 gfx::RowSizeForBufferFormat(size.width(), format, 0)))); | 187 this, last_gpu_memory_buffer_id_, size, format, std::move(shared_memory), |
| 188 0, base::checked_cast<int>( |
| 189 gfx::RowSizeForBufferFormat(size.width(), format, 0)))); |
| 190 buffers_[last_gpu_memory_buffer_id_] = result.get(); |
| 191 return result; |
| 125 } | 192 } |
| 126 | 193 |
| 127 std::unique_ptr<gfx::GpuMemoryBuffer> | 194 std::unique_ptr<gfx::GpuMemoryBuffer> |
| 128 TestGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle( | 195 TestGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle( |
| 129 const gfx::GpuMemoryBufferHandle& handle, | 196 const gfx::GpuMemoryBufferHandle& handle, |
| 130 const gfx::Size& size, | 197 const gfx::Size& size, |
| 131 gfx::BufferFormat format) { | 198 gfx::BufferFormat format) { |
| 132 if (handle.type != gfx::SHARED_MEMORY_BUFFER) | 199 if (handle.type != gfx::SHARED_MEMORY_BUFFER) |
| 133 return nullptr; | 200 return nullptr; |
| 134 | 201 |
| 135 return base::WrapUnique<gfx::GpuMemoryBuffer>(new GpuMemoryBufferImpl( | 202 last_gpu_memory_buffer_id_ += 1; |
| 136 size, format, | 203 std::unique_ptr<gfx::GpuMemoryBuffer> result(new GpuMemoryBufferImpl( |
| 204 this, last_gpu_memory_buffer_id_, size, format, |
| 137 base::WrapUnique(new base::SharedMemory(handle.handle, false)), | 205 base::WrapUnique(new base::SharedMemory(handle.handle, false)), |
| 138 handle.offset, handle.stride)); | 206 handle.offset, handle.stride)); |
| 207 buffers_[last_gpu_memory_buffer_id_] = result.get(); |
| 208 return result; |
| 139 } | 209 } |
| 140 | 210 |
| 141 gfx::GpuMemoryBuffer* | 211 gfx::GpuMemoryBuffer* |
| 142 TestGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer( | 212 TestGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer( |
| 143 ClientBuffer buffer) { | 213 ClientBuffer buffer) { |
| 144 return reinterpret_cast<gfx::GpuMemoryBuffer*>(buffer); | 214 return reinterpret_cast<gfx::GpuMemoryBuffer*>(buffer); |
| 145 } | 215 } |
| 146 | 216 |
| 147 std::unique_ptr<gfx::GpuMemoryBuffer> | 217 std::unique_ptr<gfx::GpuMemoryBuffer> |
| 148 TestGpuMemoryBufferManager::CreateGpuMemoryBufferFromClientId( | 218 TestGpuMemoryBufferManager::CreateGpuMemoryBufferFromClientId( |
| 149 int client_id, | 219 int client_id, |
| 150 const gfx::GpuMemoryBufferId& gpu_memory_buffer_id) { | 220 const gfx::GpuMemoryBufferId& gpu_memory_buffer_id) { |
| 151 NOTIMPLEMENTED(); | 221 // Check that the client and id are valid to ensure that the ResourceProvider |
| 152 return nullptr; | 222 // is doing appropriate validation. |
| 223 auto client_it = clients_.find(client_id); |
| 224 DCHECK(client_it != clients_.end()); |
| 225 auto buffer_it = client_it->second->buffers_.find(gpu_memory_buffer_id.id); |
| 226 DCHECK(buffer_it != client_it->second->buffers_.end()); |
| 227 |
| 228 gfx::GpuMemoryBuffer* found = buffer_it->second; |
| 229 |
| 230 last_gpu_memory_buffer_id_ += 1; |
| 231 std::unique_ptr<gfx::GpuMemoryBuffer> result( |
| 232 new GpuMemoryBufferFromClient(this, last_gpu_memory_buffer_id_, found)); |
| 233 buffers_[last_gpu_memory_buffer_id_] = result.get(); |
| 234 return result; |
| 153 } | 235 } |
| 154 | 236 |
| 155 void TestGpuMemoryBufferManager::SetDestructionSyncToken( | 237 void TestGpuMemoryBufferManager::SetDestructionSyncToken( |
| 156 gfx::GpuMemoryBuffer* buffer, | 238 gfx::GpuMemoryBuffer* buffer, |
| 157 const gpu::SyncToken& sync_token) {} | 239 const gpu::SyncToken& sync_token) {} |
| 158 | 240 |
| 159 } // namespace cc | 241 } // namespace cc |
| OLD | NEW |