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

Side by Side Diff: gpu/command_buffer/service/in_process_command_buffer.cc

Issue 331723003: gpu: Remove Create/DeleteImage IPC by adding an X11_PIXMAP_BUFFER GpuMemoryBuffer type. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 5 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "gpu/command_buffer/service/in_process_command_buffer.h" 5 #include "gpu/command_buffer/service/in_process_command_buffer.h"
6 6
7 #include <queue> 7 #include <queue>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 10
11 #include <GLES2/gl2.h> 11 #include <GLES2/gl2.h>
12 #ifndef GL_GLEXT_PROTOTYPES 12 #ifndef GL_GLEXT_PROTOTYPES
13 #define GL_GLEXT_PROTOTYPES 1 13 #define GL_GLEXT_PROTOTYPES 1
14 #endif 14 #endif
15 #include <GLES2/gl2ext.h> 15 #include <GLES2/gl2ext.h>
16 #include <GLES2/gl2extchromium.h> 16 #include <GLES2/gl2extchromium.h>
17 17
18 #include "base/bind.h" 18 #include "base/bind.h"
19 #include "base/bind_helpers.h" 19 #include "base/bind_helpers.h"
20 #include "base/lazy_instance.h" 20 #include "base/lazy_instance.h"
21 #include "base/logging.h" 21 #include "base/logging.h"
22 #include "base/memory/weak_ptr.h" 22 #include "base/memory/weak_ptr.h"
23 #include "base/message_loop/message_loop_proxy.h" 23 #include "base/message_loop/message_loop_proxy.h"
24 #include "base/sequence_checker.h" 24 #include "base/sequence_checker.h"
25 #include "base/synchronization/condition_variable.h" 25 #include "base/synchronization/condition_variable.h"
26 #include "base/threading/thread.h" 26 #include "base/threading/thread.h"
27 #include "gpu/command_buffer/client/gpu_memory_buffer_factory.h"
28 #include "gpu/command_buffer/service/command_buffer_service.h" 27 #include "gpu/command_buffer/service/command_buffer_service.h"
29 #include "gpu/command_buffer/service/context_group.h" 28 #include "gpu/command_buffer/service/context_group.h"
30 #include "gpu/command_buffer/service/gl_context_virtual.h" 29 #include "gpu/command_buffer/service/gl_context_virtual.h"
31 #include "gpu/command_buffer/service/gpu_control_service.h"
32 #include "gpu/command_buffer/service/gpu_scheduler.h" 30 #include "gpu/command_buffer/service/gpu_scheduler.h"
33 #include "gpu/command_buffer/service/image_manager.h" 31 #include "gpu/command_buffer/service/image_manager.h"
34 #include "gpu/command_buffer/service/mailbox_manager.h" 32 #include "gpu/command_buffer/service/mailbox_manager.h"
33 #include "gpu/command_buffer/service/query_manager.h"
35 #include "gpu/command_buffer/service/transfer_buffer_manager.h" 34 #include "gpu/command_buffer/service/transfer_buffer_manager.h"
36 #include "ui/gfx/size.h" 35 #include "ui/gfx/size.h"
37 #include "ui/gl/gl_context.h" 36 #include "ui/gl/gl_context.h"
38 #include "ui/gl/gl_image.h" 37 #include "ui/gl/gl_image.h"
39 #include "ui/gl/gl_share_group.h" 38 #include "ui/gl/gl_share_group.h"
40 39
41 #if defined(OS_ANDROID) 40 #if defined(OS_ANDROID)
42 #include "gpu/command_buffer/service/stream_texture_manager_in_process_android.h " 41 #include "gpu/command_buffer/service/stream_texture_manager_in_process_android.h "
43 #include "ui/gl/android/surface_texture.h" 42 #include "ui/gl/android/surface_texture.h"
44 #endif 43 #endif
45 44
46 namespace gpu { 45 namespace gpu {
47 46
48 namespace { 47 namespace {
49 48
50 static GpuMemoryBufferFactory* g_gpu_memory_buffer_factory = NULL; 49 static InProcessGpuMemoryBufferFactory* g_gpu_memory_buffer_factory = NULL;
51 50
52 template <typename T> 51 template <typename T>
53 static void RunTaskWithResult(base::Callback<T(void)> task, 52 static void RunTaskWithResult(base::Callback<T(void)> task,
54 T* result, 53 T* result,
55 base::WaitableEvent* completion) { 54 base::WaitableEvent* completion) {
56 *result = task.Run(); 55 *result = task.Run();
57 completion->Signal(); 56 completion->Signal();
58 } 57 }
59 58
60 class GpuInProcessThread 59 class GpuInProcessThread
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 #if defined(OS_ANDROID) 335 #if defined(OS_ANDROID)
337 stream_texture_manager_.reset(new StreamTextureManagerInProcess); 336 stream_texture_manager_.reset(new StreamTextureManagerInProcess);
338 #endif 337 #endif
339 338
340 bool bind_generates_resource = false; 339 bool bind_generates_resource = false;
341 decoder_.reset(gles2::GLES2Decoder::Create( 340 decoder_.reset(gles2::GLES2Decoder::Create(
342 params.context_group 341 params.context_group
343 ? params.context_group->decoder_->GetContextGroup() 342 ? params.context_group->decoder_->GetContextGroup()
344 : new gles2::ContextGroup(NULL, 343 : new gles2::ContextGroup(NULL,
345 NULL, 344 NULL,
346 NULL,
347 service_->shader_translator_cache(), 345 service_->shader_translator_cache(),
348 NULL, 346 NULL,
349 bind_generates_resource))); 347 bind_generates_resource)));
350 348
351 gpu_scheduler_.reset( 349 gpu_scheduler_.reset(
352 new GpuScheduler(command_buffer.get(), decoder_.get(), decoder_.get())); 350 new GpuScheduler(command_buffer.get(), decoder_.get(), decoder_.get()));
353 command_buffer->SetGetBufferChangeCallback(base::Bind( 351 command_buffer->SetGetBufferChangeCallback(base::Bind(
354 &GpuScheduler::SetGetBuffer, base::Unretained(gpu_scheduler_.get()))); 352 &GpuScheduler::SetGetBuffer, base::Unretained(gpu_scheduler_.get())));
355 command_buffer_ = command_buffer.Pass(); 353 command_buffer_ = command_buffer.Pass();
356 354
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
408 params.is_offscreen, 406 params.is_offscreen,
409 params.size, 407 params.size,
410 disallowed_features, 408 disallowed_features,
411 params.attribs)) { 409 params.attribs)) {
412 LOG(ERROR) << "Could not initialize decoder."; 410 LOG(ERROR) << "Could not initialize decoder.";
413 DestroyOnGpuThread(); 411 DestroyOnGpuThread();
414 return false; 412 return false;
415 } 413 }
416 *params.capabilities = decoder_->GetCapabilities(); 414 *params.capabilities = decoder_->GetCapabilities();
417 415
418 gpu_control_.reset(
419 new GpuControlService(decoder_->GetContextGroup()->image_manager(),
420 decoder_->GetQueryManager()));
421
422 if (!params.is_offscreen) { 416 if (!params.is_offscreen) {
423 decoder_->SetResizeCallback(base::Bind( 417 decoder_->SetResizeCallback(base::Bind(
424 &InProcessCommandBuffer::OnResizeView, gpu_thread_weak_ptr_)); 418 &InProcessCommandBuffer::OnResizeView, gpu_thread_weak_ptr_));
425 } 419 }
426 decoder_->SetWaitSyncPointCallback(base::Bind(&WaitSyncPoint)); 420 decoder_->SetWaitSyncPointCallback(base::Bind(&WaitSyncPoint));
427 421
428 return true; 422 return true;
429 } 423 }
430 424
431 void InProcessCommandBuffer::Destroy() { 425 void InProcessCommandBuffer::Destroy() {
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
580 scoped_refptr<Buffer> InProcessCommandBuffer::CreateTransferBuffer(size_t size, 574 scoped_refptr<Buffer> InProcessCommandBuffer::CreateTransferBuffer(size_t size,
581 int32* id) { 575 int32* id) {
582 CheckSequencedThread(); 576 CheckSequencedThread();
583 base::AutoLock lock(command_buffer_lock_); 577 base::AutoLock lock(command_buffer_lock_);
584 return command_buffer_->CreateTransferBuffer(size, id); 578 return command_buffer_->CreateTransferBuffer(size, id);
585 } 579 }
586 580
587 void InProcessCommandBuffer::DestroyTransferBuffer(int32 id) { 581 void InProcessCommandBuffer::DestroyTransferBuffer(int32 id) {
588 CheckSequencedThread(); 582 CheckSequencedThread();
589 base::Closure task = 583 base::Closure task =
590 base::Bind(&InProcessCommandBuffer::DestroyTransferBufferOnGputhread, 584 base::Bind(&InProcessCommandBuffer::DestroyTransferBufferOnGpuThread,
591 base::Unretained(this), 585 base::Unretained(this),
592 id); 586 id);
593 587
594 QueueTask(task); 588 QueueTask(task);
595 } 589 }
596 590
597 void InProcessCommandBuffer::DestroyTransferBufferOnGputhread(int32 id) { 591 void InProcessCommandBuffer::DestroyTransferBufferOnGpuThread(int32 id) {
598 base::AutoLock lock(command_buffer_lock_); 592 base::AutoLock lock(command_buffer_lock_);
599 command_buffer_->DestroyTransferBuffer(id); 593 command_buffer_->DestroyTransferBuffer(id);
600 } 594 }
601 595
602 gpu::Capabilities InProcessCommandBuffer::GetCapabilities() { 596 gpu::Capabilities InProcessCommandBuffer::GetCapabilities() {
603 return capabilities_; 597 return capabilities_;
604 } 598 }
605 599
606 gfx::GpuMemoryBuffer* InProcessCommandBuffer::CreateGpuMemoryBuffer( 600 gfx::GpuMemoryBuffer* InProcessCommandBuffer::CreateGpuMemoryBuffer(
607 size_t width, 601 size_t width,
608 size_t height, 602 size_t height,
609 unsigned internalformat, 603 unsigned internalformat,
610 unsigned usage, 604 unsigned usage,
611 int32* id) { 605 int32* id) {
612 CheckSequencedThread(); 606 CheckSequencedThread();
613 607
614 *id = -1; 608 *id = -1;
615 linked_ptr<gfx::GpuMemoryBuffer> buffer = 609
616 make_linked_ptr(g_gpu_memory_buffer_factory->CreateGpuMemoryBuffer( 610 scoped_ptr<gfx::GpuMemoryBuffer> buffer =
617 width, height, internalformat, usage)); 611 g_gpu_memory_buffer_factory->AllocateGpuMemoryBuffer(
612 width, height, internalformat, usage);
618 if (!buffer.get()) 613 if (!buffer.get())
619 return NULL; 614 return NULL;
620 615
621 static int32 next_id = 1; 616 static int32 next_id = 1;
622 *id = next_id++; 617 int32 new_id = next_id++;
623 618
624 base::Closure task = base::Bind(&GpuControlService::RegisterGpuMemoryBuffer, 619 base::Closure task =
625 base::Unretained(gpu_control_.get()), 620 base::Bind(&InProcessCommandBuffer::RegisterGpuMemoryBufferOnGpuThread,
626 *id, 621 base::Unretained(this),
627 buffer->GetHandle(), 622 new_id,
628 width, 623 buffer->GetHandle(),
629 height, 624 width,
630 internalformat); 625 height,
626 internalformat);
631 627
632 QueueTask(task); 628 QueueTask(task);
633 629
634 gpu_memory_buffers_[*id] = buffer; 630 *id = new_id;
635 return buffer.get(); 631 DCHECK(gpu_memory_buffers_.find(new_id) == gpu_memory_buffers_.end());
632 return gpu_memory_buffers_.add(new_id, buffer.Pass()).first->second;
633 }
634
635 void InProcessCommandBuffer::RegisterGpuMemoryBufferOnGpuThread(
636 int32 id,
637 const gfx::GpuMemoryBufferHandle& handle,
638 size_t width,
639 size_t height,
640 unsigned internalformat) {
641 scoped_refptr<gfx::GLImage> image =
642 g_gpu_memory_buffer_factory->CreateImageForGpuMemoryBuffer(
643 handle, gfx::Size(width, height), internalformat);
644 if (!image)
645 return;
646
647 // For Android specific workaround.
648 gles2::ContextGroup* context_group = decoder_->GetContextGroup();
649 if (context_group->feature_info()->workarounds().release_image_after_use)
650 image->SetReleaseAfterUse();
651
652 if (decoder_) {
653 gpu::gles2::ImageManager* image_manager = decoder_->GetImageManager();
654 DCHECK(image_manager);
655 image_manager->AddImage(image.get(), id);
656 }
636 } 657 }
637 658
638 void InProcessCommandBuffer::DestroyGpuMemoryBuffer(int32 id) { 659 void InProcessCommandBuffer::DestroyGpuMemoryBuffer(int32 id) {
639 CheckSequencedThread(); 660 CheckSequencedThread();
640 GpuMemoryBufferMap::iterator it = gpu_memory_buffers_.find(id); 661
641 if (it != gpu_memory_buffers_.end()) 662 base::Closure task =
642 gpu_memory_buffers_.erase(it); 663 base::Bind(&InProcessCommandBuffer::UnregisterGpuMemoryBufferOnGpuThread,
643 base::Closure task = base::Bind(&GpuControlService::UnregisterGpuMemoryBuffer, 664 base::Unretained(this),
644 base::Unretained(gpu_control_.get()), 665 id);
645 id);
646 666
647 QueueTask(task); 667 QueueTask(task);
668
669 gpu_memory_buffers_.erase(id);
670 }
671
672 void InProcessCommandBuffer::UnregisterGpuMemoryBufferOnGpuThread(int32 id) {
673 if (decoder_) {
674 gpu::gles2::ImageManager* image_manager = decoder_->GetImageManager();
675 DCHECK(image_manager);
676 image_manager->RemoveImage(id);
677 }
648 } 678 }
649 679
650 uint32 InProcessCommandBuffer::InsertSyncPoint() { 680 uint32 InProcessCommandBuffer::InsertSyncPoint() {
651 uint32 sync_point = g_sync_point_manager.Get().GenerateSyncPoint(); 681 uint32 sync_point = g_sync_point_manager.Get().GenerateSyncPoint();
652 QueueTask(base::Bind(&InProcessCommandBuffer::RetireSyncPointOnGpuThread, 682 QueueTask(base::Bind(&InProcessCommandBuffer::RetireSyncPointOnGpuThread,
653 base::Unretained(this), 683 base::Unretained(this),
654 sync_point)); 684 sync_point));
655 return sync_point; 685 return sync_point;
656 } 686 }
657 687
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 callback.Run(); 719 callback.Run();
690 } else { 720 } else {
691 service_->ScheduleIdleWork( 721 service_->ScheduleIdleWork(
692 base::Bind(&InProcessCommandBuffer::SignalSyncPointOnGpuThread, 722 base::Bind(&InProcessCommandBuffer::SignalSyncPointOnGpuThread,
693 gpu_thread_weak_ptr_, 723 gpu_thread_weak_ptr_,
694 sync_point, 724 sync_point,
695 callback)); 725 callback));
696 } 726 }
697 } 727 }
698 728
699 void InProcessCommandBuffer::SignalQuery(unsigned query, 729 void InProcessCommandBuffer::SignalQuery(unsigned query_id,
700 const base::Closure& callback) { 730 const base::Closure& callback) {
701 CheckSequencedThread(); 731 CheckSequencedThread();
702 QueueTask(base::Bind(&GpuControlService::SignalQuery, 732 QueueTask(base::Bind(&InProcessCommandBuffer::SignalQueryOnGpuThread,
703 base::Unretained(gpu_control_.get()), 733 base::Unretained(this),
704 query, 734 query_id,
705 WrapCallback(callback))); 735 WrapCallback(callback)));
706 } 736 }
707 737
738 void InProcessCommandBuffer::SignalQueryOnGpuThread(
739 unsigned query_id,
740 const base::Closure& callback) {
741 gles2::QueryManager* query_manager_ = decoder_->GetQueryManager();
742 DCHECK(query_manager_);
743
744 gles2::QueryManager::Query* query = query_manager_->GetQuery(query_id);
745 if (!query)
746 callback.Run();
747 else
748 query->AddCallback(callback);
749 }
750
708 void InProcessCommandBuffer::SetSurfaceVisible(bool visible) {} 751 void InProcessCommandBuffer::SetSurfaceVisible(bool visible) {}
709 752
710 void InProcessCommandBuffer::Echo(const base::Closure& callback) { 753 void InProcessCommandBuffer::Echo(const base::Closure& callback) {
711 QueueTask(WrapCallback(callback)); 754 QueueTask(WrapCallback(callback));
712 } 755 }
713 756
714 uint32 InProcessCommandBuffer::CreateStreamTexture(uint32 texture_id) { 757 uint32 InProcessCommandBuffer::CreateStreamTexture(uint32 texture_id) {
715 base::WaitableEvent completion(true, false); 758 base::WaitableEvent completion(true, false);
716 uint32 stream_id = 0; 759 uint32 stream_id = 0;
717 base::Callback<uint32(void)> task = 760 base::Callback<uint32(void)> task =
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
778 #if defined(OS_ANDROID) 821 #if defined(OS_ANDROID)
779 scoped_refptr<gfx::SurfaceTexture> 822 scoped_refptr<gfx::SurfaceTexture>
780 InProcessCommandBuffer::GetSurfaceTexture(uint32 stream_id) { 823 InProcessCommandBuffer::GetSurfaceTexture(uint32 stream_id) {
781 DCHECK(stream_texture_manager_); 824 DCHECK(stream_texture_manager_);
782 return stream_texture_manager_->GetSurfaceTexture(stream_id); 825 return stream_texture_manager_->GetSurfaceTexture(stream_id);
783 } 826 }
784 #endif 827 #endif
785 828
786 // static 829 // static
787 void InProcessCommandBuffer::SetGpuMemoryBufferFactory( 830 void InProcessCommandBuffer::SetGpuMemoryBufferFactory(
788 GpuMemoryBufferFactory* factory) { 831 InProcessGpuMemoryBufferFactory* factory) {
789 g_gpu_memory_buffer_factory = factory; 832 g_gpu_memory_buffer_factory = factory;
790 } 833 }
791 834
792 } // namespace gpu 835 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/in_process_command_buffer.h ('k') | gpu/command_buffer/service/query_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698