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

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

Issue 20017005: gpu: Refactor GpuMemoryBuffer framework for multi-process support. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 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 | 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 <utility> 8 #include <utility>
9 9
10 #include <GLES2/gl2.h> 10 #include <GLES2/gl2.h>
11 #ifndef GL_GLEXT_PROTOTYPES 11 #ifndef GL_GLEXT_PROTOTYPES
12 #define GL_GLEXT_PROTOTYPES 1 12 #define GL_GLEXT_PROTOTYPES 1
13 #endif 13 #endif
14 #include <GLES2/gl2ext.h> 14 #include <GLES2/gl2ext.h>
15 #include <GLES2/gl2extchromium.h> 15 #include <GLES2/gl2extchromium.h>
16 16
17 #include "base/bind.h" 17 #include "base/bind.h"
18 #include "base/bind_helpers.h" 18 #include "base/bind_helpers.h"
19 #include "base/lazy_instance.h" 19 #include "base/lazy_instance.h"
20 #include "base/logging.h" 20 #include "base/logging.h"
21 #include "base/memory/weak_ptr.h" 21 #include "base/memory/weak_ptr.h"
22 #include "base/message_loop/message_loop_proxy.h" 22 #include "base/message_loop/message_loop_proxy.h"
23 #include "base/sequence_checker.h" 23 #include "base/sequence_checker.h"
24 #include "base/threading/thread.h" 24 #include "base/threading/thread.h"
25 #include "gpu/command_buffer/common/id_allocator.h"
26 #include "gpu/command_buffer/service/command_buffer_service.h" 25 #include "gpu/command_buffer/service/command_buffer_service.h"
27 #include "gpu/command_buffer/service/context_group.h" 26 #include "gpu/command_buffer/service/context_group.h"
28 #include "gpu/command_buffer/service/gl_context_virtual.h" 27 #include "gpu/command_buffer/service/gl_context_virtual.h"
28 #include "gpu/command_buffer/service/gpu_control_service.h"
29 #include "gpu/command_buffer/service/gpu_scheduler.h" 29 #include "gpu/command_buffer/service/gpu_scheduler.h"
30 #include "gpu/command_buffer/service/image_manager.h" 30 #include "gpu/command_buffer/service/image_manager.h"
31 #include "gpu/command_buffer/service/transfer_buffer_manager.h" 31 #include "gpu/command_buffer/service/transfer_buffer_manager.h"
32 #include "ui/gfx/size.h" 32 #include "ui/gfx/size.h"
33 #include "ui/gl/gl_context.h" 33 #include "ui/gl/gl_context.h"
34 #include "ui/gl/gl_image.h" 34 #include "ui/gl/gl_image.h"
35 #include "ui/gl/gl_share_group.h" 35 #include "ui/gl/gl_share_group.h"
36 36
37 namespace gpu { 37 namespace gpu {
38 38
39 namespace { 39 namespace {
40 40
41 static base::LazyInstance<std::set<InProcessCommandBuffer*> > 41 static base::LazyInstance<std::set<InProcessCommandBuffer*> >
42 g_all_shared_contexts = LAZY_INSTANCE_INITIALIZER; 42 g_all_shared_contexts = LAZY_INSTANCE_INITIALIZER;
43 43
44 static bool g_use_virtualized_gl_context = false; 44 static bool g_use_virtualized_gl_context = false;
45 static bool g_uses_explicit_scheduling = false; 45 static bool g_uses_explicit_scheduling = false;
46 static GpuMemoryBufferFactory* g_gpu_memory_buffer_factory = NULL;
46 47
47 template <typename T> 48 template <typename T>
48 static void RunTaskWithResult(base::Callback<T(void)> task, 49 static void RunTaskWithResult(base::Callback<T(void)> task,
49 T* result, 50 T* result,
50 base::WaitableEvent* completion) { 51 base::WaitableEvent* completion) {
51 *result = task.Run(); 52 *result = task.Run();
52 completion->Signal(); 53 completion->Signal();
53 } 54 }
54 55
55 class GpuInProcessThread 56 class GpuInProcessThread
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 context_group ? context_group->decoder_->GetContextGroup() 384 context_group ? context_group->decoder_->GetContextGroup()
384 : new gles2::ContextGroup( 385 : new gles2::ContextGroup(
385 NULL, NULL, NULL, NULL, bind_generates_resource))); 386 NULL, NULL, NULL, NULL, bind_generates_resource)));
386 387
387 gpu_scheduler_.reset( 388 gpu_scheduler_.reset(
388 new GpuScheduler(command_buffer.get(), decoder_.get(), decoder_.get())); 389 new GpuScheduler(command_buffer.get(), decoder_.get(), decoder_.get()));
389 command_buffer->SetGetBufferChangeCallback(base::Bind( 390 command_buffer->SetGetBufferChangeCallback(base::Bind(
390 &GpuScheduler::SetGetBuffer, base::Unretained(gpu_scheduler_.get()))); 391 &GpuScheduler::SetGetBuffer, base::Unretained(gpu_scheduler_.get())));
391 command_buffer_ = command_buffer.Pass(); 392 command_buffer_ = command_buffer.Pass();
392 393
394 gpu_control_.reset(
395 new GpuControlService(decoder_->GetContextGroup()->image_manager(),
396 g_gpu_memory_buffer_factory));
397
393 decoder_->set_engine(gpu_scheduler_.get()); 398 decoder_->set_engine(gpu_scheduler_.get());
394 399
395 if (!surface_) { 400 if (!surface_) {
396 if (is_offscreen) 401 if (is_offscreen)
397 surface_ = gfx::GLSurface::CreateOffscreenGLSurface(size); 402 surface_ = gfx::GLSurface::CreateOffscreenGLSurface(size);
398 else 403 else
399 surface_ = gfx::GLSurface::CreateViewGLSurface(window); 404 surface_ = gfx::GLSurface::CreateViewGLSurface(window);
400 } 405 }
401 406
402 if (!surface_.get()) { 407 if (!surface_.get()) {
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 494
490 g_all_shared_contexts.Pointer()->erase(this); 495 g_all_shared_contexts.Pointer()->erase(this);
491 return true; 496 return true;
492 } 497 }
493 498
494 void InProcessCommandBuffer::CheckSequencedThread() { 499 void InProcessCommandBuffer::CheckSequencedThread() {
495 DCHECK(!sequence_checker_ || 500 DCHECK(!sequence_checker_ ||
496 sequence_checker_->CalledOnValidSequencedThread()); 501 sequence_checker_->CalledOnValidSequencedThread());
497 } 502 }
498 503
499 unsigned int InProcessCommandBuffer::CreateImageForGpuMemoryBuffer(
500 gfx::GpuMemoryBufferHandle buffer,
501 gfx::Size size) {
502 CheckSequencedThread();
503 unsigned int image_id;
504 {
505 // TODO: ID allocation should go through CommandBuffer
506 base::AutoLock lock(command_buffer_lock_);
507 gles2::ContextGroup* group = decoder_->GetContextGroup();
508 image_id =
509 group->GetIdAllocator(gles2::id_namespaces::kImages)->AllocateID();
510 }
511 base::Closure image_task =
512 base::Bind(&InProcessCommandBuffer::CreateImageOnGpuThread,
513 base::Unretained(this), buffer, size, image_id);
514 QueueTask(image_task);
515 return image_id;
516 }
517
518 void InProcessCommandBuffer::CreateImageOnGpuThread(
519 gfx::GpuMemoryBufferHandle buffer,
520 gfx::Size size,
521 unsigned int image_id) {
522 CheckSequencedThread();
523 scoped_refptr<gfx::GLImage> gl_image =
524 gfx::GLImage::CreateGLImageForGpuMemoryBuffer(buffer, size);
525 decoder_->GetContextGroup()->image_manager()->AddImage(gl_image, image_id);
526 }
527
528 void InProcessCommandBuffer::RemoveImage(unsigned int image_id) {
529 CheckSequencedThread();
530 {
531 // TODO: ID allocation should go through CommandBuffer
532 base::AutoLock lock(command_buffer_lock_);
533 gles2::ContextGroup* group = decoder_->GetContextGroup();
534 group->GetIdAllocator(gles2::id_namespaces::kImages)->FreeID(image_id);
535 }
536 base::Closure image_manager_task =
537 base::Bind(&InProcessCommandBuffer::RemoveImageOnGpuThread,
538 base::Unretained(this),
539 image_id);
540 QueueTask(image_manager_task);
541 }
542
543 void InProcessCommandBuffer::RemoveImageOnGpuThread(unsigned int image_id) {
544 CheckSequencedThread();
545 decoder_->GetContextGroup()->image_manager()->RemoveImage(image_id);
546 }
547
548 void InProcessCommandBuffer::OnContextLost() { 504 void InProcessCommandBuffer::OnContextLost() {
549 CheckSequencedThread(); 505 CheckSequencedThread();
550 if (!context_lost_callback_.is_null()) { 506 if (!context_lost_callback_.is_null()) {
551 context_lost_callback_.Run(); 507 context_lost_callback_.Run();
552 context_lost_callback_.Reset(); 508 context_lost_callback_.Reset();
553 } 509 }
554 510
555 context_lost_ = true; 511 context_lost_ = true;
556 if (share_resources_) { 512 if (share_resources_) {
557 for (std::set<InProcessCommandBuffer*>::iterator it = 513 for (std::set<InProcessCommandBuffer*>::iterator it =
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
673 uint32 InProcessCommandBuffer::InsertSyncPoint() { 629 uint32 InProcessCommandBuffer::InsertSyncPoint() {
674 NOTREACHED(); 630 NOTREACHED();
675 return 0; 631 return 0;
676 } 632 }
677 void InProcessCommandBuffer::SignalSyncPoint(unsigned sync_point, 633 void InProcessCommandBuffer::SignalSyncPoint(unsigned sync_point,
678 const base::Closure& callback) { 634 const base::Closure& callback) {
679 CheckSequencedThread(); 635 CheckSequencedThread();
680 QueueTask(WrapCallback(callback)); 636 QueueTask(WrapCallback(callback));
681 } 637 }
682 638
639 gfx::GpuMemoryBuffer* InProcessCommandBuffer::CreateGpuMemoryBuffer(
640 size_t width,
641 size_t height,
642 unsigned internalformat,
643 int32* id) {
644 CheckSequencedThread();
645 base::AutoLock lock(command_buffer_lock_);
646 return gpu_control_->CreateGpuMemoryBuffer(width,
647 height,
648 internalformat,
649 id);
650 }
651
652 void InProcessCommandBuffer::DestroyGpuMemoryBuffer(int32 id) {
653 CheckSequencedThread();
654 base::Closure task = base::Bind(&GpuControl::DestroyGpuMemoryBuffer,
655 base::Unretained(gpu_control_.get()),
656 id);
657
658 QueueTask(task);
659 }
660
683 gpu::error::Error InProcessCommandBuffer::GetLastError() { 661 gpu::error::Error InProcessCommandBuffer::GetLastError() {
684 CheckSequencedThread(); 662 CheckSequencedThread();
685 return last_state_.error; 663 return last_state_.error;
686 } 664 }
687 665
688 bool InProcessCommandBuffer::Initialize() { 666 bool InProcessCommandBuffer::Initialize() {
689 NOTREACHED(); 667 NOTREACHED();
690 return false; 668 return false;
691 } 669 }
692 670
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
746 DCHECK(!SchedulerClientBase::HasClients()); 724 DCHECK(!SchedulerClientBase::HasClients());
747 g_uses_explicit_scheduling = true; 725 g_uses_explicit_scheduling = true;
748 g_gpu_queue.Get().SetScheduleCallback(callback); 726 g_gpu_queue.Get().SetScheduleCallback(callback);
749 } 727 }
750 728
751 // static 729 // static
752 void InProcessCommandBuffer::ProcessGpuWorkOnCurrentThread() { 730 void InProcessCommandBuffer::ProcessGpuWorkOnCurrentThread() {
753 g_gpu_queue.Get().RunTasks(); 731 g_gpu_queue.Get().RunTasks();
754 } 732 }
755 733
734 // static
735 void InProcessCommandBuffer::SetGpuMemoryBufferFactory(
736 GpuMemoryBufferFactory* factory) {
737 g_gpu_memory_buffer_factory = factory;
738 }
739
756 } // namespace gpu 740 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/in_process_command_buffer.h ('k') | gpu/command_buffer/tests/gl_gpu_memory_buffer_unittests.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698