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

Side by Side Diff: content/browser/gpu/browser_gpu_memory_buffer_manager.cc

Issue 1269503007: Unify graphics buffer format & usage enums for GpuMemoryBuffer & SurfaceFactoryOzone (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add header to BUILD.gn Created 5 years, 4 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 "content/browser/gpu/browser_gpu_memory_buffer_manager.h" 5 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h"
6 6
7 #include "base/atomic_sequence_num.h" 7 #include "base/atomic_sequence_num.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/strings/stringprintf.h" 10 #include "base/strings/stringprintf.h"
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 // The GPU service will always use the preferred type. 84 // The GPU service will always use the preferred type.
85 return supported_types[0]; 85 return supported_types[0];
86 } 86 }
87 87
88 std::vector<GpuMemoryBufferFactory::Configuration> 88 std::vector<GpuMemoryBufferFactory::Configuration>
89 GetSupportedGpuMemoryBufferConfigurations(gfx::GpuMemoryBufferType type) { 89 GetSupportedGpuMemoryBufferConfigurations(gfx::GpuMemoryBufferType type) {
90 std::vector<GpuMemoryBufferFactory::Configuration> configurations; 90 std::vector<GpuMemoryBufferFactory::Configuration> configurations;
91 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 91 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
92 switches::kEnableNativeGpuMemoryBuffers)) { 92 switches::kEnableNativeGpuMemoryBuffers)) {
93 const GpuMemoryBufferFactory::Configuration kNativeConfigurations[] = { 93 const GpuMemoryBufferFactory::Configuration kNativeConfigurations[] = {
94 {gfx::GpuMemoryBuffer::R_8, gfx::GpuMemoryBuffer::MAP}, 94 {gfx::BufferFormat::R_8, gfx::BufferUsage::MAP},
95 {gfx::GpuMemoryBuffer::R_8, gfx::GpuMemoryBuffer::PERSISTENT_MAP}, 95 {gfx::BufferFormat::R_8, gfx::BufferUsage::PERSISTENT_MAP},
96 {gfx::GpuMemoryBuffer::RGBA_4444, gfx::GpuMemoryBuffer::MAP}, 96 {gfx::BufferFormat::RGBA_4444, gfx::BufferUsage::MAP},
97 {gfx::GpuMemoryBuffer::RGBA_4444, gfx::GpuMemoryBuffer::PERSISTENT_MAP}, 97 {gfx::BufferFormat::RGBA_4444, gfx::BufferUsage::PERSISTENT_MAP},
98 {gfx::GpuMemoryBuffer::RGBA_8888, gfx::GpuMemoryBuffer::MAP}, 98 {gfx::BufferFormat::RGBA_8888, gfx::BufferUsage::MAP},
99 {gfx::GpuMemoryBuffer::RGBA_8888, gfx::GpuMemoryBuffer::PERSISTENT_MAP}, 99 {gfx::BufferFormat::RGBA_8888, gfx::BufferUsage::PERSISTENT_MAP},
100 {gfx::GpuMemoryBuffer::BGRA_8888, gfx::GpuMemoryBuffer::MAP}, 100 {gfx::BufferFormat::BGRA_8888, gfx::BufferUsage::MAP},
101 {gfx::GpuMemoryBuffer::BGRA_8888, 101 {gfx::BufferFormat::BGRA_8888, gfx::BufferUsage::PERSISTENT_MAP}};
102 gfx::GpuMemoryBuffer::PERSISTENT_MAP}};
103 for (auto& configuration : kNativeConfigurations) { 102 for (auto& configuration : kNativeConfigurations) {
104 if (IsGpuMemoryBufferFactoryConfigurationSupported(type, configuration)) 103 if (IsGpuMemoryBufferFactoryConfigurationSupported(type, configuration))
105 configurations.push_back(configuration); 104 configurations.push_back(configuration);
106 } 105 }
107 } 106 }
108 107
109 #if defined(USE_OZONE) || defined(OS_MACOSX) 108 #if defined(USE_OZONE) || defined(OS_MACOSX)
110 const GpuMemoryBufferFactory::Configuration kScanoutConfigurations[] = { 109 const GpuMemoryBufferFactory::Configuration kScanoutConfigurations[] = {
111 {gfx::GpuMemoryBuffer::BGRA_8888, gfx::GpuMemoryBuffer::SCANOUT}, 110 {gfx::BufferFormat::BGRA_8888, gfx::BufferUsage::SCANOUT},
112 {gfx::GpuMemoryBuffer::RGBX_8888, gfx::GpuMemoryBuffer::SCANOUT}}; 111 {gfx::BufferFormat::RGBX_8888, gfx::BufferUsage::SCANOUT}};
113 for (auto& configuration : kScanoutConfigurations) { 112 for (auto& configuration : kScanoutConfigurations) {
114 if (IsGpuMemoryBufferFactoryConfigurationSupported(type, configuration)) 113 if (IsGpuMemoryBufferFactoryConfigurationSupported(type, configuration))
115 configurations.push_back(configuration); 114 configurations.push_back(configuration);
116 } 115 }
117 #endif 116 #endif
118 117
119 return configurations; 118 return configurations;
120 } 119 }
121 120
122 BrowserGpuMemoryBufferManager* g_gpu_memory_buffer_manager = nullptr; 121 BrowserGpuMemoryBufferManager* g_gpu_memory_buffer_manager = nullptr;
123 122
124 // Global atomic to generate gpu memory buffer unique IDs. 123 // Global atomic to generate gpu memory buffer unique IDs.
125 base::StaticAtomicSequenceNumber g_next_gpu_memory_buffer_id; 124 base::StaticAtomicSequenceNumber g_next_gpu_memory_buffer_id;
126 125
127 } // namespace 126 } // namespace
128 127
129 struct BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferRequest { 128 struct BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferRequest {
130 AllocateGpuMemoryBufferRequest(const gfx::Size& size, 129 AllocateGpuMemoryBufferRequest(const gfx::Size& size,
131 gfx::GpuMemoryBuffer::Format format, 130 gfx::BufferFormat format,
132 gfx::GpuMemoryBuffer::Usage usage, 131 gfx::BufferUsage usage,
133 int client_id, 132 int client_id,
134 int surface_id) 133 int surface_id)
135 : event(true, false), 134 : event(true, false),
136 size(size), 135 size(size),
137 format(format), 136 format(format),
138 usage(usage), 137 usage(usage),
139 client_id(client_id), 138 client_id(client_id),
140 surface_id(surface_id) {} 139 surface_id(surface_id) {}
141 ~AllocateGpuMemoryBufferRequest() {} 140 ~AllocateGpuMemoryBufferRequest() {}
142 base::WaitableEvent event; 141 base::WaitableEvent event;
143 gfx::Size size; 142 gfx::Size size;
144 gfx::GpuMemoryBuffer::Format format; 143 gfx::BufferFormat format;
145 gfx::GpuMemoryBuffer::Usage usage; 144 gfx::BufferUsage usage;
146 int client_id; 145 int client_id;
147 int surface_id; 146 int surface_id;
148 scoped_ptr<gfx::GpuMemoryBuffer> result; 147 scoped_ptr<gfx::GpuMemoryBuffer> result;
149 }; 148 };
150 149
151 BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager(int gpu_client_id) 150 BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager(int gpu_client_id)
152 : factory_type_(GetGpuMemoryBufferFactoryType()), 151 : factory_type_(GetGpuMemoryBufferFactoryType()),
153 supported_configurations_( 152 supported_configurations_(
154 GetSupportedGpuMemoryBufferConfigurations(factory_type_)), 153 GetSupportedGpuMemoryBufferConfigurations(factory_type_)),
155 gpu_client_id_(gpu_client_id), 154 gpu_client_id_(gpu_client_id),
156 gpu_host_id_(0) { 155 gpu_host_id_(0) {
157 DCHECK(!g_gpu_memory_buffer_manager); 156 DCHECK(!g_gpu_memory_buffer_manager);
158 g_gpu_memory_buffer_manager = this; 157 g_gpu_memory_buffer_manager = this;
159 } 158 }
160 159
161 BrowserGpuMemoryBufferManager::~BrowserGpuMemoryBufferManager() { 160 BrowserGpuMemoryBufferManager::~BrowserGpuMemoryBufferManager() {
162 g_gpu_memory_buffer_manager = nullptr; 161 g_gpu_memory_buffer_manager = nullptr;
163 } 162 }
164 163
165 // static 164 // static
166 BrowserGpuMemoryBufferManager* BrowserGpuMemoryBufferManager::current() { 165 BrowserGpuMemoryBufferManager* BrowserGpuMemoryBufferManager::current() {
167 return g_gpu_memory_buffer_manager; 166 return g_gpu_memory_buffer_manager;
168 } 167 }
169 168
170 // static 169 // static
171 uint32 BrowserGpuMemoryBufferManager::GetImageTextureTarget( 170 uint32 BrowserGpuMemoryBufferManager::GetImageTextureTarget(
172 gfx::GpuMemoryBuffer::Format format, 171 gfx::BufferFormat format,
173 gfx::GpuMemoryBuffer::Usage usage) { 172 gfx::BufferUsage usage) {
174 gfx::GpuMemoryBufferType type = GetGpuMemoryBufferFactoryType(); 173 gfx::GpuMemoryBufferType type = GetGpuMemoryBufferFactoryType();
175 for (auto& configuration : GetSupportedGpuMemoryBufferConfigurations(type)) { 174 for (auto& configuration : GetSupportedGpuMemoryBufferConfigurations(type)) {
176 if (configuration.format != format || configuration.usage != usage) 175 if (configuration.format != format || configuration.usage != usage)
177 continue; 176 continue;
178 177
179 switch (type) { 178 switch (type) {
180 case gfx::SURFACE_TEXTURE_BUFFER: 179 case gfx::SURFACE_TEXTURE_BUFFER:
181 case gfx::OZONE_NATIVE_PIXMAP: 180 case gfx::OZONE_NATIVE_PIXMAP:
182 // GPU memory buffers that are shared with the GL using EGLImages 181 // GPU memory buffers that are shared with the GL using EGLImages
183 // require TEXTURE_EXTERNAL_OES. 182 // require TEXTURE_EXTERNAL_OES.
184 return GL_TEXTURE_EXTERNAL_OES; 183 return GL_TEXTURE_EXTERNAL_OES;
185 case gfx::IO_SURFACE_BUFFER: 184 case gfx::IO_SURFACE_BUFFER:
186 // IOSurface backed images require GL_TEXTURE_RECTANGLE_ARB. 185 // IOSurface backed images require GL_TEXTURE_RECTANGLE_ARB.
187 return GL_TEXTURE_RECTANGLE_ARB; 186 return GL_TEXTURE_RECTANGLE_ARB;
188 default: 187 default:
189 return GL_TEXTURE_2D; 188 return GL_TEXTURE_2D;
190 } 189 }
191 } 190 }
192 191
193 return GL_TEXTURE_2D; 192 return GL_TEXTURE_2D;
194 } 193 }
195 194
196 scoped_ptr<gfx::GpuMemoryBuffer> 195 scoped_ptr<gfx::GpuMemoryBuffer>
197 BrowserGpuMemoryBufferManager::AllocateGpuMemoryBuffer( 196 BrowserGpuMemoryBufferManager::AllocateGpuMemoryBuffer(const gfx::Size& size,
198 const gfx::Size& size, 197 gfx::BufferFormat format,
199 gfx::GpuMemoryBuffer::Format format, 198 gfx::BufferUsage usage) {
200 gfx::GpuMemoryBuffer::Usage usage) {
201 return AllocateGpuMemoryBufferForSurface(size, format, usage, 0); 199 return AllocateGpuMemoryBufferForSurface(size, format, usage, 0);
202 } 200 }
203 201
204 scoped_ptr<gfx::GpuMemoryBuffer> 202 scoped_ptr<gfx::GpuMemoryBuffer>
205 BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForScanout( 203 BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForScanout(
206 const gfx::Size& size, 204 const gfx::Size& size,
207 gfx::GpuMemoryBuffer::Format format, 205 gfx::BufferFormat format,
208 int32 surface_id) { 206 int32 surface_id) {
209 DCHECK_GT(surface_id, 0); 207 DCHECK_GT(surface_id, 0);
210 return AllocateGpuMemoryBufferForSurface( 208 return AllocateGpuMemoryBufferForSurface(
211 size, format, gfx::GpuMemoryBuffer::SCANOUT, surface_id); 209 size, format, gfx::BufferUsage::SCANOUT, surface_id);
212 } 210 }
213 211
214 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess( 212 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess(
215 const gfx::Size& size, 213 const gfx::Size& size,
216 gfx::GpuMemoryBuffer::Format format, 214 gfx::BufferFormat format,
217 gfx::GpuMemoryBuffer::Usage usage, 215 gfx::BufferUsage usage,
218 base::ProcessHandle child_process_handle, 216 base::ProcessHandle child_process_handle,
219 int child_client_id, 217 int child_client_id,
220 const AllocationCallback& callback) { 218 const AllocationCallback& callback) {
221 DCHECK_CURRENTLY_ON(BrowserThread::IO); 219 DCHECK_CURRENTLY_ON(BrowserThread::IO);
222 220
223 gfx::GpuMemoryBufferId new_id = g_next_gpu_memory_buffer_id.GetNext(); 221 gfx::GpuMemoryBufferId new_id = g_next_gpu_memory_buffer_id.GetNext();
224 222
225 // Use service side allocation if this is a supported configuration. 223 // Use service side allocation if this is a supported configuration.
226 if (IsGpuMemoryBufferConfigurationSupported(format, usage)) { 224 if (IsGpuMemoryBufferConfigurationSupported(format, usage)) {
227 AllocateGpuMemoryBufferOnIO(new_id, size, format, usage, child_client_id, 0, 225 AllocateGpuMemoryBufferOnIO(new_id, size, format, usage, child_client_id, 0,
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 if (host) 336 if (host)
339 host->DestroyGpuMemoryBuffer(buffer.first, client_id, 0); 337 host->DestroyGpuMemoryBuffer(buffer.first, client_id, 0);
340 } 338 }
341 339
342 clients_.erase(client_it); 340 clients_.erase(client_it);
343 } 341 }
344 342
345 scoped_ptr<gfx::GpuMemoryBuffer> 343 scoped_ptr<gfx::GpuMemoryBuffer>
346 BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForSurface( 344 BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForSurface(
347 const gfx::Size& size, 345 const gfx::Size& size,
348 gfx::GpuMemoryBuffer::Format format, 346 gfx::BufferFormat format,
349 gfx::GpuMemoryBuffer::Usage usage, 347 gfx::BufferUsage usage,
350 int32 surface_id) { 348 int32 surface_id) {
351 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); 349 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
352 350
353 AllocateGpuMemoryBufferRequest request(size, format, usage, gpu_client_id_, 351 AllocateGpuMemoryBufferRequest request(size, format, usage, gpu_client_id_,
354 surface_id); 352 surface_id);
355 BrowserThread::PostTask( 353 BrowserThread::PostTask(
356 BrowserThread::IO, FROM_HERE, 354 BrowserThread::IO, FROM_HERE,
357 base::Bind( 355 base::Bind(
358 &BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForSurfaceOnIO, 356 &BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForSurfaceOnIO,
359 base::Unretained(this), // Safe as we wait for result below. 357 base::Unretained(this), // Safe as we wait for result below.
360 base::Unretained(&request))); 358 base::Unretained(&request)));
361 359
362 // We're blocking the UI thread, which is generally undesirable. 360 // We're blocking the UI thread, which is generally undesirable.
363 TRACE_EVENT0( 361 TRACE_EVENT0(
364 "browser", 362 "browser",
365 "BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForSurface"); 363 "BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForSurface");
366 base::ThreadRestrictions::ScopedAllowWait allow_wait; 364 base::ThreadRestrictions::ScopedAllowWait allow_wait;
367 request.event.Wait(); 365 request.event.Wait();
368 return request.result.Pass(); 366 return request.result.Pass();
369 } 367 }
370 368
371 bool BrowserGpuMemoryBufferManager::IsGpuMemoryBufferConfigurationSupported( 369 bool BrowserGpuMemoryBufferManager::IsGpuMemoryBufferConfigurationSupported(
372 gfx::GpuMemoryBuffer::Format format, 370 gfx::BufferFormat format,
373 gfx::GpuMemoryBuffer::Usage usage) const { 371 gfx::BufferUsage usage) const {
374 for (auto& configuration : supported_configurations_) { 372 for (auto& configuration : supported_configurations_) {
375 if (configuration.format == format && configuration.usage == usage) 373 if (configuration.format == format && configuration.usage == usage)
376 return true; 374 return true;
377 } 375 }
378 return false; 376 return false;
379 } 377 }
380 378
381 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForSurfaceOnIO( 379 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForSurfaceOnIO(
382 AllocateGpuMemoryBufferRequest* request) { 380 AllocateGpuMemoryBufferRequest* request) {
383 DCHECK_CURRENTLY_ON(BrowserThread::IO); 381 DCHECK_CURRENTLY_ON(BrowserThread::IO);
384 382
385 gfx::GpuMemoryBufferId new_id = g_next_gpu_memory_buffer_id.GetNext(); 383 gfx::GpuMemoryBufferId new_id = g_next_gpu_memory_buffer_id.GetNext();
386 384
387 // Use service side allocation if this is a supported configuration. 385 // Use service side allocation if this is a supported configuration.
388 if (IsGpuMemoryBufferConfigurationSupported(request->format, 386 if (IsGpuMemoryBufferConfigurationSupported(request->format,
389 request->usage)) { 387 request->usage)) {
390 // Note: Unretained is safe as this is only used for synchronous allocation 388 // Note: Unretained is safe as this is only used for synchronous allocation
391 // from a non-IO thread. 389 // from a non-IO thread.
392 AllocateGpuMemoryBufferOnIO( 390 AllocateGpuMemoryBufferOnIO(
393 new_id, request->size, request->format, request->usage, 391 new_id, request->size, request->format, request->usage,
394 request->client_id, request->surface_id, false, 392 request->client_id, request->surface_id, false,
395 base::Bind(&BrowserGpuMemoryBufferManager:: 393 base::Bind(&BrowserGpuMemoryBufferManager::
396 GpuMemoryBufferAllocatedForSurfaceOnIO, 394 GpuMemoryBufferAllocatedForSurfaceOnIO,
397 base::Unretained(this), base::Unretained(request))); 395 base::Unretained(this), base::Unretained(request)));
398 return; 396 return;
399 } 397 }
400 398
401 DCHECK(GpuMemoryBufferImplSharedMemory::IsFormatSupported(request->format)) 399 DCHECK(GpuMemoryBufferImplSharedMemory::IsFormatSupported(request->format))
402 << request->format; 400 << static_cast<int>(request->format);
403 DCHECK(GpuMemoryBufferImplSharedMemory::IsUsageSupported(request->usage)) 401 DCHECK(GpuMemoryBufferImplSharedMemory::IsUsageSupported(request->usage))
404 << request->usage; 402 << static_cast<int>(request->usage);
405 403
406 BufferMap& buffers = clients_[request->client_id]; 404 BufferMap& buffers = clients_[request->client_id];
407 DCHECK(buffers.find(new_id) == buffers.end()); 405 DCHECK(buffers.find(new_id) == buffers.end());
408 406
409 // Allocate shared memory buffer as fallback. 407 // Allocate shared memory buffer as fallback.
410 buffers[new_id] = BufferInfo(request->size, gfx::SHARED_MEMORY_BUFFER, 408 buffers[new_id] = BufferInfo(request->size, gfx::SHARED_MEMORY_BUFFER,
411 request->format, request->usage, 0); 409 request->format, request->usage, 0);
412 // Note: Unretained is safe as IO thread is stopped before manager is 410 // Note: Unretained is safe as IO thread is stopped before manager is
413 // destroyed. 411 // destroyed.
414 request->result = GpuMemoryBufferImplSharedMemory::Create( 412 request->result = GpuMemoryBufferImplSharedMemory::Create(
(...skipping 25 matching lines...) Expand all
440 &GpuMemoryBufferDeleted, 438 &GpuMemoryBufferDeleted,
441 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO), 439 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO),
442 base::Bind(&BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO, 440 base::Bind(&BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO,
443 base::Unretained(this), handle.id, request->client_id))); 441 base::Unretained(this), handle.id, request->client_id)));
444 request->event.Signal(); 442 request->event.Signal();
445 } 443 }
446 444
447 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferOnIO( 445 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferOnIO(
448 gfx::GpuMemoryBufferId id, 446 gfx::GpuMemoryBufferId id,
449 const gfx::Size& size, 447 const gfx::Size& size,
450 gfx::GpuMemoryBuffer::Format format, 448 gfx::BufferFormat format,
451 gfx::GpuMemoryBuffer::Usage usage, 449 gfx::BufferUsage usage,
452 int client_id, 450 int client_id,
453 int surface_id, 451 int surface_id,
454 bool reused_gpu_process, 452 bool reused_gpu_process,
455 const AllocationCallback& callback) { 453 const AllocationCallback& callback) {
456 DCHECK_CURRENTLY_ON(BrowserThread::IO); 454 DCHECK_CURRENTLY_ON(BrowserThread::IO);
457 455
458 BufferMap& buffers = clients_[client_id]; 456 BufferMap& buffers = clients_[client_id];
459 DCHECK(buffers.find(id) == buffers.end()); 457 DCHECK(buffers.find(id) == buffers.end());
460 458
461 GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_); 459 GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_);
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 // If we failed after re-using the GPU process, it may have died in the 530 // If we failed after re-using the GPU process, it may have died in the
533 // mean time. Retry to have a chance to create a fresh GPU process. 531 // mean time. Retry to have a chance to create a fresh GPU process.
534 if (handle.is_null() && reused_gpu_process) { 532 if (handle.is_null() && reused_gpu_process) {
535 DVLOG(1) << "Failed to create buffer through existing GPU process. " 533 DVLOG(1) << "Failed to create buffer through existing GPU process. "
536 "Trying to restart GPU process."; 534 "Trying to restart GPU process.";
537 // If the GPU process has already been restarted, retry without failure 535 // If the GPU process has already been restarted, retry without failure
538 // when GPU process host ID already exists. 536 // when GPU process host ID already exists.
539 if (gpu_host_id != gpu_host_id_) 537 if (gpu_host_id != gpu_host_id_)
540 reused_gpu_process = false; 538 reused_gpu_process = false;
541 gfx::Size size = buffer_it->second.size; 539 gfx::Size size = buffer_it->second.size;
542 gfx::GpuMemoryBuffer::Format format = buffer_it->second.format; 540 gfx::BufferFormat format = buffer_it->second.format;
543 gfx::GpuMemoryBuffer::Usage usage = buffer_it->second.usage; 541 gfx::BufferUsage usage = buffer_it->second.usage;
544 // Remove the buffer entry and call AllocateGpuMemoryBufferOnIO again. 542 // Remove the buffer entry and call AllocateGpuMemoryBufferOnIO again.
545 buffers.erase(buffer_it); 543 buffers.erase(buffer_it);
546 AllocateGpuMemoryBufferOnIO(id, size, format, usage, client_id, 544 AllocateGpuMemoryBufferOnIO(id, size, format, usage, client_id,
547 surface_id, reused_gpu_process, callback); 545 surface_id, reused_gpu_process, callback);
548 } else { 546 } else {
549 // Remove the buffer entry and run the allocation callback with an empty 547 // Remove the buffer entry and run the allocation callback with an empty
550 // handle to indicate failure. 548 // handle to indicate failure.
551 buffers.erase(buffer_it); 549 buffers.erase(buffer_it);
552 callback.Run(gfx::GpuMemoryBufferHandle()); 550 callback.Run(gfx::GpuMemoryBufferHandle());
553 } 551 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
585 } 583 }
586 584
587 GpuProcessHost* host = GpuProcessHost::FromID(buffer_it->second.gpu_host_id); 585 GpuProcessHost* host = GpuProcessHost::FromID(buffer_it->second.gpu_host_id);
588 if (host) 586 if (host)
589 host->DestroyGpuMemoryBuffer(id, client_id, sync_point); 587 host->DestroyGpuMemoryBuffer(id, client_id, sync_point);
590 588
591 buffers.erase(buffer_it); 589 buffers.erase(buffer_it);
592 } 590 }
593 591
594 } // namespace content 592 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/gpu/browser_gpu_memory_buffer_manager.h ('k') | content/browser/gpu/gpu_process_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698