| 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 "content/browser/gpu/browser_gpu_memory_buffer_manager.h" | 5 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 ~CreateGpuMemoryBufferFromHandleRequest() {} | 147 ~CreateGpuMemoryBufferFromHandleRequest() {} |
| 148 gfx::GpuMemoryBufferHandle handle; | 148 gfx::GpuMemoryBufferHandle handle; |
| 149 }; | 149 }; |
| 150 | 150 |
| 151 BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager( | 151 BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager( |
| 152 int gpu_client_id, | 152 int gpu_client_id, |
| 153 uint64_t gpu_client_tracing_id) | 153 uint64_t gpu_client_tracing_id) |
| 154 : native_configurations_(GetNativeGpuMemoryBufferConfigurations()), | 154 : native_configurations_(GetNativeGpuMemoryBufferConfigurations()), |
| 155 gpu_client_id_(gpu_client_id), | 155 gpu_client_id_(gpu_client_id), |
| 156 gpu_client_tracing_id_(gpu_client_tracing_id), | 156 gpu_client_tracing_id_(gpu_client_tracing_id), |
| 157 gpu_memory_buffer_manager_(new gpu::GpuHostMemoryBufferManager()), |
| 157 gpu_host_id_(0) { | 158 gpu_host_id_(0) { |
| 158 DCHECK(!g_gpu_memory_buffer_manager); | 159 DCHECK(!g_gpu_memory_buffer_manager); |
| 159 g_gpu_memory_buffer_manager = this; | 160 g_gpu_memory_buffer_manager = this; |
| 161 gpu_memory_buffer_manager_->SetIO(BrowserThread::GetTaskRunnerForThread( |
| 162 BrowserThread::IO)); |
| 160 } | 163 } |
| 161 | 164 |
| 162 BrowserGpuMemoryBufferManager::~BrowserGpuMemoryBufferManager() { | 165 BrowserGpuMemoryBufferManager::~BrowserGpuMemoryBufferManager() { |
| 163 g_gpu_memory_buffer_manager = nullptr; | 166 g_gpu_memory_buffer_manager = nullptr; |
| 164 } | 167 } |
| 165 | 168 |
| 166 // static | 169 // static |
| 167 BrowserGpuMemoryBufferManager* BrowserGpuMemoryBufferManager::current() { | 170 BrowserGpuMemoryBufferManager* BrowserGpuMemoryBufferManager::current() { |
| 168 return g_gpu_memory_buffer_manager; | 171 return g_gpu_memory_buffer_manager; |
| 169 } | 172 } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 gfx::BufferUsage usage, | 225 gfx::BufferUsage usage, |
| 223 gpu::SurfaceHandle surface_handle) { | 226 gpu::SurfaceHandle surface_handle) { |
| 224 return AllocateGpuMemoryBufferForSurface(size, format, usage, surface_handle); | 227 return AllocateGpuMemoryBufferForSurface(size, format, usage, surface_handle); |
| 225 } | 228 } |
| 226 | 229 |
| 227 std::unique_ptr<gfx::GpuMemoryBuffer> | 230 std::unique_ptr<gfx::GpuMemoryBuffer> |
| 228 BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle( | 231 BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle( |
| 229 const gfx::GpuMemoryBufferHandle& handle, | 232 const gfx::GpuMemoryBufferHandle& handle, |
| 230 const gfx::Size& size, | 233 const gfx::Size& size, |
| 231 gfx::BufferFormat format) { | 234 gfx::BufferFormat format) { |
| 235 #if 0 |
| 232 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); | 236 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 233 | 237 |
| 234 CreateGpuMemoryBufferFromHandleRequest request(handle, size, format, | 238 CreateGpuMemoryBufferFromHandleRequest request(handle, size, format, |
| 235 gpu_client_id_); | 239 gpu_client_id_); |
| 236 BrowserThread::PostTask( | 240 BrowserThread::PostTask( |
| 237 BrowserThread::IO, FROM_HERE, | 241 BrowserThread::IO, FROM_HERE, |
| 238 base::Bind(&BrowserGpuMemoryBufferManager:: | 242 base::Bind(&BrowserGpuMemoryBufferManager:: |
| 239 HandleCreateGpuMemoryBufferFromHandleOnIO, | 243 HandleCreateGpuMemoryBufferFromHandleOnIO, |
| 240 base::Unretained(this), // Safe as we wait for result below. | 244 base::Unretained(this), // Safe as we wait for result below. |
| 241 base::Unretained(&request))); | 245 base::Unretained(&request))); |
| 242 | 246 |
| 243 // We're blocking the UI thread, which is generally undesirable. | 247 // We're blocking the UI thread, which is generally undesirable. |
| 244 TRACE_EVENT0( | 248 TRACE_EVENT0( |
| 245 "browser", | 249 "browser", |
| 246 "BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle"); | 250 "BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle"); |
| 247 base::ThreadRestrictions::ScopedAllowWait allow_wait; | 251 base::ThreadRestrictions::ScopedAllowWait allow_wait; |
| 248 request.event.Wait(); | 252 request.event.Wait(); |
| 249 return std::move(request.result); | 253 return std::move(request.result); |
| 254 #else |
| 255 return gpu_memory_buffer_manager_->CreateGpuMemoryBufferFromHandle(handle, |
| 256 size, |
| 257 format); |
| 258 #endif |
| 250 } | 259 } |
| 251 | 260 |
| 252 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess( | 261 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess( |
| 253 gfx::GpuMemoryBufferId id, | 262 gfx::GpuMemoryBufferId id, |
| 254 const gfx::Size& size, | 263 const gfx::Size& size, |
| 255 gfx::BufferFormat format, | 264 gfx::BufferFormat format, |
| 256 gfx::BufferUsage usage, | 265 gfx::BufferUsage usage, |
| 257 base::ProcessHandle child_process_handle, | 266 base::ProcessHandle child_process_handle, |
| 258 int child_client_id, | 267 int child_client_id, |
| 259 const AllocationCallback& callback) { | 268 const AllocationCallback& callback) { |
| 260 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 269 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 261 | 270 |
| 262 // Use service side allocation for native configurations. | 271 // Use service side allocation for native configurations. |
| 263 if (IsNativeGpuMemoryBufferConfiguration(format, usage)) { | 272 if (IsNativeGpuMemoryBufferConfiguration(format, usage)) { |
| 264 CreateGpuMemoryBufferOnIO( | 273 CreateGpuMemoryBufferOnIO( |
| 265 base::Bind(&HostCreateGpuMemoryBuffer, gpu::kNullSurfaceHandle), id, | 274 base::Bind(&HostCreateGpuMemoryBuffer, gpu::kNullSurfaceHandle), id, |
| 266 size, format, usage, child_client_id, false, callback); | 275 size, format, usage, child_client_id, false, callback); |
| 267 return; | 276 return; |
| 268 } | 277 } |
| 269 | 278 |
| 279 #if 0 |
| 270 // Early out if we cannot fallback to shared memory buffer. | 280 // Early out if we cannot fallback to shared memory buffer. |
| 271 if (!gpu::GpuMemoryBufferImplSharedMemory::IsUsageSupported(usage) || | 281 if (!gpu::GpuMemoryBufferImplSharedMemory::IsUsageSupported(usage) || |
| 272 !gpu::GpuMemoryBufferImplSharedMemory::IsSizeValidForFormat(size, | 282 !gpu::GpuMemoryBufferImplSharedMemory::IsSizeValidForFormat(size, |
| 273 format)) { | 283 format)) { |
| 274 callback.Run(gfx::GpuMemoryBufferHandle()); | 284 callback.Run(gfx::GpuMemoryBufferHandle()); |
| 275 return; | 285 return; |
| 276 } | 286 } |
| 277 | 287 |
| 278 BufferMap& buffers = clients_[child_client_id]; | 288 BufferMap& buffers = clients_[child_client_id]; |
| 279 | 289 |
| 280 // Allocate shared memory buffer as fallback. | 290 // Allocate shared memory buffer as fallback. |
| 281 auto insert_result = buffers.insert(std::make_pair( | 291 auto insert_result = buffers.insert(std::make_pair( |
| 282 id, BufferInfo(size, gfx::SHARED_MEMORY_BUFFER, format, usage, 0))); | 292 id, BufferInfo(size, gfx::SHARED_MEMORY_BUFFER, format, usage, 0))); |
| 283 if (!insert_result.second) { | 293 if (!insert_result.second) { |
| 284 DLOG(ERROR) << "Child process attempted to allocate a GpuMemoryBuffer with " | 294 DLOG(ERROR) << "Child process attempted to allocate a GpuMemoryBuffer with " |
| 285 "an existing ID."; | 295 "an existing ID."; |
| 286 callback.Run(gfx::GpuMemoryBufferHandle()); | 296 callback.Run(gfx::GpuMemoryBufferHandle()); |
| 287 return; | 297 return; |
| 288 } | 298 } |
| 289 | 299 |
| 290 callback.Run(gpu::GpuMemoryBufferImplSharedMemory::AllocateForChildProcess( | 300 callback.Run(gpu::GpuMemoryBufferImplSharedMemory::AllocateForChildProcess( |
| 291 id, size, format, child_process_handle)); | 301 id, size, format, child_process_handle)); |
| 302 #else |
| 303 gpu_memory_buffer_manager_->AllocateGpuMemoryBufferForClient(id, size, format, |
| 304 usage, |
| 305 child_client_id, |
| 306 callback); |
| 307 #endif |
| 292 } | 308 } |
| 293 | 309 |
| 294 gfx::GpuMemoryBuffer* | 310 gfx::GpuMemoryBuffer* |
| 295 BrowserGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer( | 311 BrowserGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer( |
| 296 ClientBuffer buffer) { | 312 ClientBuffer buffer) { |
| 297 return gpu::GpuMemoryBufferImpl::FromClientBuffer(buffer); | 313 return gpu::GpuMemoryBufferImpl::FromClientBuffer(buffer); |
| 298 } | 314 } |
| 299 | 315 |
| 300 void BrowserGpuMemoryBufferManager::SetDestructionSyncToken( | 316 void BrowserGpuMemoryBufferManager::SetDestructionSyncToken( |
| 301 gfx::GpuMemoryBuffer* buffer, | 317 gfx::GpuMemoryBuffer* buffer, |
| 302 const gpu::SyncToken& sync_token) { | 318 const gpu::SyncToken& sync_token) { |
| 303 static_cast<gpu::GpuMemoryBufferImpl*>(buffer)->set_destruction_sync_token( | 319 static_cast<gpu::GpuMemoryBufferImpl*>(buffer)->set_destruction_sync_token( |
| 304 sync_token); | 320 sync_token); |
| 305 } | 321 } |
| 306 | 322 |
| 307 bool BrowserGpuMemoryBufferManager::OnMemoryDump( | 323 bool BrowserGpuMemoryBufferManager::OnMemoryDump( |
| 308 const base::trace_event::MemoryDumpArgs& args, | 324 const base::trace_event::MemoryDumpArgs& args, |
| 309 base::trace_event::ProcessMemoryDump* pmd) { | 325 base::trace_event::ProcessMemoryDump* pmd) { |
| 310 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 326 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 311 | 327 #if 0 |
| 312 for (const auto& client : clients_) { | 328 for (const auto& client : clients_) { |
| 313 int client_id = client.first; | 329 int client_id = client.first; |
| 314 | 330 |
| 315 for (const auto& buffer : client.second) { | 331 for (const auto& buffer : client.second) { |
| 316 if (buffer.second.type == gfx::EMPTY_BUFFER) | 332 if (buffer.second.type == gfx::EMPTY_BUFFER) |
| 317 continue; | 333 continue; |
| 318 | 334 |
| 319 gfx::GpuMemoryBufferId buffer_id = buffer.first; | 335 gfx::GpuMemoryBufferId buffer_id = buffer.first; |
| 320 base::trace_event::MemoryAllocatorDump* dump = | 336 base::trace_event::MemoryAllocatorDump* dump = |
| 321 pmd->CreateAllocatorDump(base::StringPrintf( | 337 pmd->CreateAllocatorDump(base::StringPrintf( |
| (...skipping 14 matching lines...) Expand all Loading... |
| 336 uint64_t client_tracing_process_id = | 352 uint64_t client_tracing_process_id = |
| 337 ClientIdToTracingProcessId(client_id); | 353 ClientIdToTracingProcessId(client_id); |
| 338 | 354 |
| 339 base::trace_event::MemoryAllocatorDumpGuid shared_buffer_guid = | 355 base::trace_event::MemoryAllocatorDumpGuid shared_buffer_guid = |
| 340 gfx::GetGpuMemoryBufferGUIDForTracing(client_tracing_process_id, | 356 gfx::GetGpuMemoryBufferGUIDForTracing(client_tracing_process_id, |
| 341 buffer_id); | 357 buffer_id); |
| 342 pmd->CreateSharedGlobalAllocatorDump(shared_buffer_guid); | 358 pmd->CreateSharedGlobalAllocatorDump(shared_buffer_guid); |
| 343 pmd->AddOwnershipEdge(dump->guid(), shared_buffer_guid); | 359 pmd->AddOwnershipEdge(dump->guid(), shared_buffer_guid); |
| 344 } | 360 } |
| 345 } | 361 } |
| 346 | 362 #endif |
| 347 return true; | 363 return true; |
| 348 } | 364 } |
| 349 | 365 |
| 350 void BrowserGpuMemoryBufferManager::ChildProcessDeletedGpuMemoryBuffer( | 366 void BrowserGpuMemoryBufferManager::ChildProcessDeletedGpuMemoryBuffer( |
| 351 gfx::GpuMemoryBufferId id, | 367 gfx::GpuMemoryBufferId id, |
| 352 base::ProcessHandle child_process_handle, | 368 base::ProcessHandle child_process_handle, |
| 353 int child_client_id, | 369 int child_client_id, |
| 354 const gpu::SyncToken& sync_token) { | 370 const gpu::SyncToken& sync_token) { |
| 355 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 371 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 356 | 372 |
| 357 DestroyGpuMemoryBufferOnIO(id, child_client_id, sync_token); | 373 DestroyGpuMemoryBufferOnIO(id, child_client_id, sync_token); |
| 358 } | 374 } |
| 359 | 375 |
| 360 void BrowserGpuMemoryBufferManager::ProcessRemoved( | 376 void BrowserGpuMemoryBufferManager::ProcessRemoved( |
| 361 base::ProcessHandle process_handle, | 377 base::ProcessHandle process_handle, |
| 362 int client_id) { | 378 int client_id) { |
| 363 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 379 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 364 | 380 |
| 381 #if 0 // XXX |
| 365 ClientMap::iterator client_it = clients_.find(client_id); | 382 ClientMap::iterator client_it = clients_.find(client_id); |
| 366 if (client_it == clients_.end()) | 383 if (client_it == clients_.end()) |
| 367 return; | 384 return; |
| 368 | 385 |
| 369 for (const auto& buffer : client_it->second) { | 386 for (const auto& buffer : client_it->second) { |
| 370 // This might happen if buffer is currenlty in the process of being | 387 // This might happen if buffer is currenlty in the process of being |
| 371 // allocated. The buffer will in that case be cleaned up when allocation | 388 // allocated. The buffer will in that case be cleaned up when allocation |
| 372 // completes. | 389 // completes. |
| 373 if (buffer.second.type == gfx::EMPTY_BUFFER) | 390 if (buffer.second.type == gfx::EMPTY_BUFFER) |
| 374 continue; | 391 continue; |
| 375 | 392 |
| 376 GpuProcessHost* host = GpuProcessHost::FromID(buffer.second.gpu_host_id); | 393 GpuProcessHost* host = GpuProcessHost::FromID(buffer.second.gpu_host_id); |
| 377 if (host) | 394 if (host) |
| 378 host->DestroyGpuMemoryBuffer(buffer.first, client_id, gpu::SyncToken()); | 395 host->DestroyGpuMemoryBuffer(buffer.first, client_id, gpu::SyncToken()); |
| 379 } | 396 } |
| 380 | 397 |
| 381 clients_.erase(client_it); | 398 clients_.erase(client_it); |
| 399 #endif |
| 382 } | 400 } |
| 383 | 401 |
| 384 bool BrowserGpuMemoryBufferManager::IsNativeGpuMemoryBufferConfiguration( | 402 bool BrowserGpuMemoryBufferManager::IsNativeGpuMemoryBufferConfiguration( |
| 385 gfx::BufferFormat format, | 403 gfx::BufferFormat format, |
| 386 gfx::BufferUsage usage) const { | 404 gfx::BufferUsage usage) const { |
| 387 return native_configurations_.find(std::make_pair(format, usage)) != | 405 return native_configurations_.find(std::make_pair(format, usage)) != |
| 388 native_configurations_.end(); | 406 native_configurations_.end(); |
| 389 } | 407 } |
| 390 | 408 |
| 391 std::unique_ptr<gfx::GpuMemoryBuffer> | 409 std::unique_ptr<gfx::GpuMemoryBuffer> |
| 392 BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForSurface( | 410 BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForSurface( |
| 393 const gfx::Size& size, | 411 const gfx::Size& size, |
| 394 gfx::BufferFormat format, | 412 gfx::BufferFormat format, |
| 395 gfx::BufferUsage usage, | 413 gfx::BufferUsage usage, |
| 396 gpu::SurfaceHandle surface_handle) { | 414 gpu::SurfaceHandle surface_handle) { |
| 415 return gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer(size, format, |
| 416 usage, |
| 417 surface_handle); |
| 418 #if 0 |
| 397 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); | 419 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 398 | 420 |
| 399 CreateGpuMemoryBufferRequest request(size, format, usage, gpu_client_id_, | 421 CreateGpuMemoryBufferRequest request(size, format, usage, gpu_client_id_, |
| 400 surface_handle); | 422 surface_handle); |
| 401 BrowserThread::PostTask( | 423 BrowserThread::PostTask( |
| 402 BrowserThread::IO, FROM_HERE, | 424 BrowserThread::IO, FROM_HERE, |
| 403 base::Bind( | 425 base::Bind( |
| 404 &BrowserGpuMemoryBufferManager::HandleCreateGpuMemoryBufferOnIO, | 426 &BrowserGpuMemoryBufferManager::HandleCreateGpuMemoryBufferOnIO, |
| 405 base::Unretained(this), // Safe as we wait for result below. | 427 base::Unretained(this), // Safe as we wait for result below. |
| 406 base::Unretained(&request))); | 428 base::Unretained(&request))); |
| 407 | 429 |
| 408 // We're blocking the UI thread, which is generally undesirable. | 430 // We're blocking the UI thread, which is generally undesirable. |
| 409 TRACE_EVENT0( | 431 TRACE_EVENT0( |
| 410 "browser", | 432 "browser", |
| 411 "BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForSurface"); | 433 "BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForSurface"); |
| 412 base::ThreadRestrictions::ScopedAllowWait allow_wait; | 434 base::ThreadRestrictions::ScopedAllowWait allow_wait; |
| 413 request.event.Wait(); | 435 request.event.Wait(); |
| 414 return std::move(request.result); | 436 return std::move(request.result); |
| 437 #endif |
| 415 } | 438 } |
| 416 | 439 |
| 417 void BrowserGpuMemoryBufferManager::HandleCreateGpuMemoryBufferOnIO( | 440 void BrowserGpuMemoryBufferManager::HandleCreateGpuMemoryBufferOnIO( |
| 418 CreateGpuMemoryBufferRequest* request) { | 441 CreateGpuMemoryBufferRequest* request) { |
| 442 #if 0 |
| 419 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 443 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 420 | 444 |
| 421 gfx::GpuMemoryBufferId new_id = content::GetNextGenericSharedMemoryId(); | 445 gfx::GpuMemoryBufferId new_id = content::GetNextGenericSharedMemoryId(); |
| 422 | 446 |
| 423 // Use service side allocation for native configurations. | 447 // Use service side allocation for native configurations. |
| 424 if (IsNativeGpuMemoryBufferConfiguration(request->format, request->usage)) { | 448 if (IsNativeGpuMemoryBufferConfiguration(request->format, request->usage)) { |
| 425 // Note: Unretained is safe as this is only used for synchronous allocation | 449 // Note: Unretained is safe as this is only used for synchronous allocation |
| 426 // from a non-IO thread. | 450 // from a non-IO thread. |
| 427 CreateGpuMemoryBufferOnIO( | 451 CreateGpuMemoryBufferOnIO( |
| 428 base::Bind(&HostCreateGpuMemoryBuffer, request->surface_handle), new_id, | 452 base::Bind(&HostCreateGpuMemoryBuffer, request->surface_handle), new_id, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 448 // Note: Unretained is safe as IO thread is stopped before manager is | 472 // Note: Unretained is safe as IO thread is stopped before manager is |
| 449 // destroyed. | 473 // destroyed. |
| 450 request->result = gpu::GpuMemoryBufferImplSharedMemory::Create( | 474 request->result = gpu::GpuMemoryBufferImplSharedMemory::Create( |
| 451 new_id, request->size, request->format, | 475 new_id, request->size, request->format, |
| 452 base::Bind( | 476 base::Bind( |
| 453 &GpuMemoryBufferDeleted, | 477 &GpuMemoryBufferDeleted, |
| 454 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO), | 478 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO), |
| 455 base::Bind(&BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO, | 479 base::Bind(&BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO, |
| 456 base::Unretained(this), new_id, request->client_id))); | 480 base::Unretained(this), new_id, request->client_id))); |
| 457 request->event.Signal(); | 481 request->event.Signal(); |
| 482 #endif |
| 458 } | 483 } |
| 459 | 484 |
| 460 void BrowserGpuMemoryBufferManager::HandleCreateGpuMemoryBufferFromHandleOnIO( | 485 void BrowserGpuMemoryBufferManager::HandleCreateGpuMemoryBufferFromHandleOnIO( |
| 461 CreateGpuMemoryBufferFromHandleRequest* request) { | 486 CreateGpuMemoryBufferFromHandleRequest* request) { |
| 487 #if 0 |
| 462 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 488 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 463 | 489 |
| 464 gfx::GpuMemoryBufferId new_id = content::GetNextGenericSharedMemoryId(); | 490 gfx::GpuMemoryBufferId new_id = content::GetNextGenericSharedMemoryId(); |
| 465 | 491 |
| 466 BufferMap& buffers = clients_[request->client_id]; | 492 BufferMap& buffers = clients_[request->client_id]; |
| 467 auto insert_result = buffers.insert(std::make_pair( | 493 auto insert_result = buffers.insert(std::make_pair( |
| 468 new_id, BufferInfo(request->size, request->handle.type, | 494 new_id, BufferInfo(request->size, request->handle.type, |
| 469 request->format, request->usage, 0))); | 495 request->format, request->usage, 0))); |
| 470 DCHECK(insert_result.second); | 496 DCHECK(insert_result.second); |
| 471 | 497 |
| 472 gfx::GpuMemoryBufferHandle handle = request->handle; | 498 gfx::GpuMemoryBufferHandle handle = request->handle; |
| 473 handle.id = new_id; | 499 handle.id = new_id; |
| 474 | 500 |
| 475 // Note: Unretained is safe as IO thread is stopped before manager is | 501 // Note: Unretained is safe as IO thread is stopped before manager is |
| 476 // destroyed. | 502 // destroyed. |
| 477 request->result = gpu::GpuMemoryBufferImpl::CreateFromHandle( | 503 request->result = gpu::GpuMemoryBufferImpl::CreateFromHandle( |
| 478 handle, request->size, request->format, request->usage, | 504 handle, request->size, request->format, request->usage, |
| 479 base::Bind( | 505 base::Bind( |
| 480 &GpuMemoryBufferDeleted, | 506 &GpuMemoryBufferDeleted, |
| 481 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO), | 507 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO), |
| 482 base::Bind(&BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO, | 508 base::Bind(&BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO, |
| 483 base::Unretained(this), new_id, request->client_id))); | 509 base::Unretained(this), new_id, request->client_id))); |
| 484 request->event.Signal(); | 510 request->event.Signal(); |
| 511 #endif |
| 485 } | 512 } |
| 486 | 513 |
| 487 void BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO( | 514 void BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO( |
| 488 CreateGpuMemoryBufferRequest* request, | 515 CreateGpuMemoryBufferRequest* request, |
| 489 const gfx::GpuMemoryBufferHandle& handle) { | 516 const gfx::GpuMemoryBufferHandle& handle) { |
| 490 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 517 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 491 | 518 |
| 492 // Early out if factory failed to create the buffer. | 519 // Early out if factory failed to create the buffer. |
| 493 if (handle.is_null()) { | 520 if (handle.is_null()) { |
| 494 request->event.Signal(); | 521 request->event.Signal(); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 628 buffer_it->second.gpu_host_id = gpu_host_id; | 655 buffer_it->second.gpu_host_id = gpu_host_id; |
| 629 | 656 |
| 630 callback.Run(handle); | 657 callback.Run(handle); |
| 631 } | 658 } |
| 632 | 659 |
| 633 void BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO( | 660 void BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO( |
| 634 gfx::GpuMemoryBufferId id, | 661 gfx::GpuMemoryBufferId id, |
| 635 int client_id, | 662 int client_id, |
| 636 const gpu::SyncToken& sync_token) { | 663 const gpu::SyncToken& sync_token) { |
| 637 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 664 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 665 if (clients_.find(client_id) == clients_.end()) |
| 666 return; |
| 667 |
| 638 DCHECK(clients_.find(client_id) != clients_.end()); | 668 DCHECK(clients_.find(client_id) != clients_.end()); |
| 639 | 669 |
| 640 BufferMap& buffers = clients_[client_id]; | 670 BufferMap& buffers = clients_[client_id]; |
| 641 | 671 |
| 642 BufferMap::iterator buffer_it = buffers.find(id); | 672 BufferMap::iterator buffer_it = buffers.find(id); |
| 643 if (buffer_it == buffers.end()) { | 673 if (buffer_it == buffers.end()) { |
| 644 LOG(ERROR) << "Invalid GpuMemoryBuffer ID for client."; | 674 LOG(ERROR) << "Invalid GpuMemoryBuffer ID for client."; |
| 645 return; | 675 return; |
| 646 } | 676 } |
| 647 | 677 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 685 format(format), | 715 format(format), |
| 686 usage(usage), | 716 usage(usage), |
| 687 gpu_host_id(gpu_host_id) {} | 717 gpu_host_id(gpu_host_id) {} |
| 688 | 718 |
| 689 BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(const BufferInfo& other) = | 719 BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(const BufferInfo& other) = |
| 690 default; | 720 default; |
| 691 | 721 |
| 692 BrowserGpuMemoryBufferManager::BufferInfo::~BufferInfo() {} | 722 BrowserGpuMemoryBufferManager::BufferInfo::~BufferInfo() {} |
| 693 | 723 |
| 694 } // namespace content | 724 } // namespace content |
| OLD | NEW |