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

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

Issue 1993333002: Implement GpuMemoryBufferManager::CreateGpuMemoryBufferFromClientId (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add todos and bug numbers Created 4 years, 6 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 <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 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 for (auto& usage : kGPUReadWriteUsages) { 123 for (auto& usage : kGPUReadWriteUsages) {
124 if (IsNativeGpuMemoryBufferFactoryConfigurationSupported(format, usage)) 124 if (IsNativeGpuMemoryBufferFactoryConfigurationSupported(format, usage))
125 configurations.insert(std::make_pair(format, usage)); 125 configurations.insert(std::make_pair(format, usage));
126 } 126 }
127 } 127 }
128 } 128 }
129 129
130 return configurations; 130 return configurations;
131 } 131 }
132 132
133 void DestroyGpuMemoryBuffer(const gpu::SyncToken& sync_token) {
134 // No additional state needs to be cleaned up.
135 }
136
133 BrowserGpuMemoryBufferManager* g_gpu_memory_buffer_manager = nullptr; 137 BrowserGpuMemoryBufferManager* g_gpu_memory_buffer_manager = nullptr;
134 138
135 } // namespace 139 } // namespace
136 140
137 struct BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferRequest { 141 struct BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferRequest {
138 CreateGpuMemoryBufferRequest(const gfx::Size& size, 142 CreateGpuMemoryBufferRequest(const gfx::Size& size,
139 gfx::BufferFormat format, 143 gfx::BufferFormat format,
140 gfx::BufferUsage usage, 144 gfx::BufferUsage usage,
141 int client_id, 145 int client_id,
142 gpu::SurfaceHandle surface_handle) 146 gpu::SurfaceHandle surface_handle)
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after
591 return; 595 return;
592 } 596 }
593 BufferMap& buffers = client_it->second; 597 BufferMap& buffers = client_it->second;
594 BufferMap::iterator buffer_it = buffers.find(request->gpu_memory_buffer_id); 598 BufferMap::iterator buffer_it = buffers.find(request->gpu_memory_buffer_id);
595 if (buffer_it == buffers.end()) { 599 if (buffer_it == buffers.end()) {
596 LOG(ERROR) << "CreateGpuMemoryBufferFromClientId: invalid id."; 600 LOG(ERROR) << "CreateGpuMemoryBufferFromClientId: invalid id.";
597 request->event.Signal(); 601 request->event.Signal();
598 return; 602 return;
599 } 603 }
600 604
601 // TODO(ccameron): Implement this. 605 // Create a copy of the buffer to provide to the caller.
602 NOTIMPLEMENTED(); 606 if (buffer_it->second.buffer) {
607 request->result = gpu::GpuMemoryBufferImpl::CreateFromHandle(
608 buffer_it->second.buffer->GetHandle(),
609 buffer_it->second.size, buffer_it->second.format,
610 buffer_it->second.usage, base::Bind(DestroyGpuMemoryBuffer));
611 }
612
603 request->event.Signal(); 613 request->event.Signal();
604 } 614 }
605 615
606 void BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO( 616 void BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO(
607 CreateGpuMemoryBufferRequest* request, 617 CreateGpuMemoryBufferRequest* request,
608 const gfx::GpuMemoryBufferHandle& handle) { 618 const gfx::GpuMemoryBufferHandle& handle) {
609 DCHECK_CURRENTLY_ON(BrowserThread::IO); 619 DCHECK_CURRENTLY_ON(BrowserThread::IO);
610 620
611 // Early out if factory failed to create the buffer. 621 // Early out if factory failed to create the buffer.
612 if (handle.is_null()) { 622 if (handle.is_null()) {
(...skipping 16 matching lines...) Expand all
629 void BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferOnIO( 639 void BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferOnIO(
630 const CreateDelegate& create_delegate, 640 const CreateDelegate& create_delegate,
631 gfx::GpuMemoryBufferId id, 641 gfx::GpuMemoryBufferId id,
632 const gfx::Size& size, 642 const gfx::Size& size,
633 gfx::BufferFormat format, 643 gfx::BufferFormat format,
634 gfx::BufferUsage usage, 644 gfx::BufferUsage usage,
635 int client_id, 645 int client_id,
636 bool reused_gpu_process, 646 bool reused_gpu_process,
637 const CreateCallback& callback) { 647 const CreateCallback& callback) {
638 DCHECK_CURRENTLY_ON(BrowserThread::IO); 648 DCHECK_CURRENTLY_ON(BrowserThread::IO);
649 TRACE_EVENT0("browser",
650 "BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferOnIO");
639 651
640 GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_); 652 GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_);
641 if (!host) { 653 if (!host) {
642 host = GpuProcessHost::Get(GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED, 654 host = GpuProcessHost::Get(GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED,
643 CAUSE_FOR_GPU_LAUNCH_GPU_MEMORY_BUFFER_ALLOCATE); 655 CAUSE_FOR_GPU_LAUNCH_GPU_MEMORY_BUFFER_ALLOCATE);
644 if (!host) { 656 if (!host) {
645 LOG(ERROR) << "Failed to launch GPU process."; 657 LOG(ERROR) << "Failed to launch GPU process.";
646 callback.Run(gfx::GpuMemoryBufferHandle()); 658 callback.Run(gfx::GpuMemoryBufferHandle());
647 return; 659 return;
648 } 660 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
686 698
687 void BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO( 699 void BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO(
688 const CreateDelegate& create_delegate, 700 const CreateDelegate& create_delegate,
689 gfx::GpuMemoryBufferId id, 701 gfx::GpuMemoryBufferId id,
690 int client_id, 702 int client_id,
691 int gpu_host_id, 703 int gpu_host_id,
692 bool reused_gpu_process, 704 bool reused_gpu_process,
693 const CreateCallback& callback, 705 const CreateCallback& callback,
694 const gfx::GpuMemoryBufferHandle& handle) { 706 const gfx::GpuMemoryBufferHandle& handle) {
695 DCHECK_CURRENTLY_ON(BrowserThread::IO); 707 DCHECK_CURRENTLY_ON(BrowserThread::IO);
708 TRACE_EVENT0("browser",
709 "BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO");
696 710
697 ClientMap::iterator client_it = clients_.find(client_id); 711 ClientMap::iterator client_it = clients_.find(client_id);
698 712
699 // This can happen if client is removed while the buffer is being allocated. 713 // This can happen if client is removed while the buffer is being allocated.
700 if (client_it == clients_.end()) { 714 if (client_it == clients_.end()) {
701 if (!handle.is_null()) { 715 if (!handle.is_null()) {
702 GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id); 716 GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id);
703 if (host) 717 if (host)
704 host->DestroyGpuMemoryBuffer(handle.id, client_id, gpu::SyncToken()); 718 host->DestroyGpuMemoryBuffer(handle.id, client_id, gpu::SyncToken());
705 } 719 }
706 callback.Run(gfx::GpuMemoryBufferHandle()); 720 callback.Run(gfx::GpuMemoryBufferHandle());
707 return; 721 return;
708 } 722 }
709 723
710 BufferMap& buffers = client_it->second; 724 BufferMap& buffers = client_it->second;
711 725
712 BufferMap::iterator buffer_it = buffers.find(id); 726 BufferMap::iterator buffer_it = buffers.find(id);
713 DCHECK(buffer_it != buffers.end()); 727 DCHECK(buffer_it != buffers.end());
714 DCHECK_EQ(buffer_it->second.type, gfx::EMPTY_BUFFER); 728 DCHECK_EQ(buffer_it->second.type, gfx::EMPTY_BUFFER);
715 729
716 // If the handle isn't valid, that means that the GPU process crashed or is 730 // If the handle isn't valid, that means that the GPU process crashed or is
717 // misbehaving. 731 // misbehaving.
718 bool valid_handle = !handle.is_null() && handle.id == id; 732 bool valid_handle = !handle.is_null() && handle.id == id;
733
734 // Open a copy of the buffer in the browser process for future use.
735 std::unique_ptr<gpu::GpuMemoryBufferImpl> buffer;
736 if (valid_handle) {
737 // TODO(ccameron): Enable this for all buffer types.
738 // https://crbug.com/614791
739 if (handle.type == gfx::IO_SURFACE_BUFFER) {
740 buffer = gpu::GpuMemoryBufferImpl::CreateFromHandle(
741 handle, buffer_it->second.size, buffer_it->second.format,
742 buffer_it->second.usage, base::Bind(DestroyGpuMemoryBuffer));
743 if (!buffer)
744 valid_handle = false;
745 }
746 }
747
719 if (!valid_handle) { 748 if (!valid_handle) {
720 // If we failed after re-using the GPU process, it may have died in the 749 // If we failed after re-using the GPU process, it may have died in the
721 // mean time. Retry to have a chance to create a fresh GPU process. 750 // mean time. Retry to have a chance to create a fresh GPU process.
722 if (handle.is_null() && reused_gpu_process) { 751 if (handle.is_null() && reused_gpu_process) {
723 DVLOG(1) << "Failed to create buffer through existing GPU process. " 752 DVLOG(1) << "Failed to create buffer through existing GPU process. "
724 "Trying to restart GPU process."; 753 "Trying to restart GPU process.";
725 // If the GPU process has already been restarted, retry without failure 754 // If the GPU process has already been restarted, retry without failure
726 // when GPU process host ID already exists. 755 // when GPU process host ID already exists.
727 if (gpu_host_id != gpu_host_id_) 756 if (gpu_host_id != gpu_host_id_)
728 reused_gpu_process = false; 757 reused_gpu_process = false;
(...skipping 10 matching lines...) Expand all
739 buffers.erase(buffer_it); 768 buffers.erase(buffer_it);
740 callback.Run(gfx::GpuMemoryBufferHandle()); 769 callback.Run(gfx::GpuMemoryBufferHandle());
741 } 770 }
742 return; 771 return;
743 } 772 }
744 773
745 // Store the type and host id of this buffer so it can be cleaned up if the 774 // Store the type and host id of this buffer so it can be cleaned up if the
746 // client is removed. 775 // client is removed.
747 buffer_it->second.type = handle.type; 776 buffer_it->second.type = handle.type;
748 buffer_it->second.gpu_host_id = gpu_host_id; 777 buffer_it->second.gpu_host_id = gpu_host_id;
778 buffer_it->second.buffer = std::move(buffer);
749 779
750 callback.Run(handle); 780 callback.Run(handle);
751 } 781 }
752 782
753 void BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO( 783 void BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO(
754 gfx::GpuMemoryBufferId id, 784 gfx::GpuMemoryBufferId id,
755 int client_id, 785 int client_id,
756 const gpu::SyncToken& sync_token) { 786 const gpu::SyncToken& sync_token) {
757 DCHECK_CURRENTLY_ON(BrowserThread::IO); 787 DCHECK_CURRENTLY_ON(BrowserThread::IO);
758 DCHECK(clients_.find(client_id) != clients_.end()); 788 DCHECK(clients_.find(client_id) != clients_.end());
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
799 gfx::GpuMemoryBufferType type, 829 gfx::GpuMemoryBufferType type,
800 gfx::BufferFormat format, 830 gfx::BufferFormat format,
801 gfx::BufferUsage usage, 831 gfx::BufferUsage usage,
802 int gpu_host_id) 832 int gpu_host_id)
803 : size(size), 833 : size(size),
804 type(type), 834 type(type),
805 format(format), 835 format(format),
806 usage(usage), 836 usage(usage),
807 gpu_host_id(gpu_host_id) {} 837 gpu_host_id(gpu_host_id) {}
808 838
809 BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(const BufferInfo& other) = 839 BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(BufferInfo&& other)
810 default; 840 : size(other.size),
841 type(other.type),
842 format(other.format),
843 usage(other.usage),
844 gpu_host_id(other.gpu_host_id),
845 buffer(std::move(other.buffer)) {}
811 846
812 BrowserGpuMemoryBufferManager::BufferInfo::~BufferInfo() {} 847 BrowserGpuMemoryBufferManager::BufferInfo::~BufferInfo() {}
813 848
814 } // namespace content 849 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/gpu/browser_gpu_memory_buffer_manager.h ('k') | gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698