Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Side by Side Diff: cc/test/test_gpu_memory_buffer_manager.cc

Issue 1989453003: cc: Add ScopedReadLockGpuMemoryBuffer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix aura typo Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW
« no previous file with comments | « cc/test/test_gpu_memory_buffer_manager.h ('k') | content/browser/renderer_host/delegated_frame_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698