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

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: wip 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" 30 #include "gpu/command_buffer/service/gpu_control_service.h"
32 #include "gpu/command_buffer/service/gpu_scheduler.h" 31 #include "gpu/command_buffer/service/gpu_scheduler.h"
33 #include "gpu/command_buffer/service/image_manager.h" 32 #include "gpu/command_buffer/service/image_manager.h"
34 #include "gpu/command_buffer/service/mailbox_manager.h" 33 #include "gpu/command_buffer/service/mailbox_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;
51
52 template <typename T> 49 template <typename T>
53 static void RunTaskWithResult(base::Callback<T(void)> task, 50 static void RunTaskWithResult(base::Callback<T(void)> task,
54 T* result, 51 T* result,
55 base::WaitableEvent* completion) { 52 base::WaitableEvent* completion) {
56 *result = task.Run(); 53 *result = task.Run();
57 completion->Signal(); 54 completion->Signal();
58 } 55 }
59 56
60 class GpuInProcessThread 57 class GpuInProcessThread
61 : public base::Thread, 58 : public base::Thread,
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 base::Bind(&InProcessCommandBuffer::InitializeOnGpuThread, 287 base::Bind(&InProcessCommandBuffer::InitializeOnGpuThread,
291 base::Unretained(this), 288 base::Unretained(this),
292 params); 289 params);
293 290
294 base::WaitableEvent completion(true, false); 291 base::WaitableEvent completion(true, false);
295 bool result = false; 292 bool result = false;
296 QueueTask( 293 QueueTask(
297 base::Bind(&RunTaskWithResult<bool>, init_task, &result, &completion)); 294 base::Bind(&RunTaskWithResult<bool>, init_task, &result, &completion));
298 completion.Wait(); 295 completion.Wait();
299 296
300 if (result) { 297 if (result)
301 capabilities_ = capabilities; 298 capabilities_ = capabilities;
302 capabilities_.map_image =
303 capabilities_.map_image && g_gpu_memory_buffer_factory;
304 }
305 return result; 299 return result;
306 } 300 }
307 301
308 bool InProcessCommandBuffer::InitializeOnGpuThread( 302 bool InProcessCommandBuffer::InitializeOnGpuThread(
309 const InitializeOnGpuThreadParams& params) { 303 const InitializeOnGpuThreadParams& params) {
310 CheckSequencedThread(); 304 CheckSequencedThread();
311 gpu_thread_weak_ptr_ = gpu_thread_weak_ptr_factory_.GetWeakPtr(); 305 gpu_thread_weak_ptr_ = gpu_thread_weak_ptr_factory_.GetWeakPtr();
312 306
313 DCHECK(params.size.width() >= 0 && params.size.height() >= 0); 307 DCHECK(params.size.width() >= 0 && params.size.height() >= 0);
314 308
(...skipping 21 matching lines...) Expand all
336 #if defined(OS_ANDROID) 330 #if defined(OS_ANDROID)
337 stream_texture_manager_.reset(new StreamTextureManagerInProcess); 331 stream_texture_manager_.reset(new StreamTextureManagerInProcess);
338 #endif 332 #endif
339 333
340 bool bind_generates_resource = false; 334 bool bind_generates_resource = false;
341 decoder_.reset(gles2::GLES2Decoder::Create( 335 decoder_.reset(gles2::GLES2Decoder::Create(
342 params.context_group 336 params.context_group
343 ? params.context_group->decoder_->GetContextGroup() 337 ? params.context_group->decoder_->GetContextGroup()
344 : new gles2::ContextGroup(NULL, 338 : new gles2::ContextGroup(NULL,
345 NULL, 339 NULL,
346 NULL,
347 service_->shader_translator_cache(), 340 service_->shader_translator_cache(),
348 NULL, 341 NULL,
349 bind_generates_resource))); 342 bind_generates_resource)));
350 343
351 gpu_scheduler_.reset( 344 gpu_scheduler_.reset(
352 new GpuScheduler(command_buffer.get(), decoder_.get(), decoder_.get())); 345 new GpuScheduler(command_buffer.get(), decoder_.get(), decoder_.get()));
353 command_buffer->SetGetBufferChangeCallback(base::Bind( 346 command_buffer->SetGetBufferChangeCallback(base::Bind(
354 &GpuScheduler::SetGetBuffer, base::Unretained(gpu_scheduler_.get()))); 347 &GpuScheduler::SetGetBuffer, base::Unretained(gpu_scheduler_.get())));
355 command_buffer_ = command_buffer.Pass(); 348 command_buffer_ = command_buffer.Pass();
356 349
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
408 params.is_offscreen, 401 params.is_offscreen,
409 params.size, 402 params.size,
410 disallowed_features, 403 disallowed_features,
411 params.attribs)) { 404 params.attribs)) {
412 LOG(ERROR) << "Could not initialize decoder."; 405 LOG(ERROR) << "Could not initialize decoder.";
413 DestroyOnGpuThread(); 406 DestroyOnGpuThread();
414 return false; 407 return false;
415 } 408 }
416 *params.capabilities = decoder_->GetCapabilities(); 409 *params.capabilities = decoder_->GetCapabilities();
417 410
418 gpu_control_.reset( 411 gpu_control_.reset(new GpuControlService(decoder_->GetQueryManager()));
419 new GpuControlService(decoder_->GetContextGroup()->image_manager(),
420 decoder_->GetQueryManager()));
421 412
422 if (!params.is_offscreen) { 413 if (!params.is_offscreen) {
423 decoder_->SetResizeCallback(base::Bind( 414 decoder_->SetResizeCallback(base::Bind(
424 &InProcessCommandBuffer::OnResizeView, gpu_thread_weak_ptr_)); 415 &InProcessCommandBuffer::OnResizeView, gpu_thread_weak_ptr_));
425 } 416 }
426 decoder_->SetWaitSyncPointCallback(base::Bind(&WaitSyncPoint)); 417 decoder_->SetWaitSyncPointCallback(base::Bind(&WaitSyncPoint));
427 418
428 return true; 419 return true;
429 } 420 }
430 421
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
580 scoped_refptr<Buffer> InProcessCommandBuffer::CreateTransferBuffer(size_t size, 571 scoped_refptr<Buffer> InProcessCommandBuffer::CreateTransferBuffer(size_t size,
581 int32* id) { 572 int32* id) {
582 CheckSequencedThread(); 573 CheckSequencedThread();
583 base::AutoLock lock(command_buffer_lock_); 574 base::AutoLock lock(command_buffer_lock_);
584 return command_buffer_->CreateTransferBuffer(size, id); 575 return command_buffer_->CreateTransferBuffer(size, id);
585 } 576 }
586 577
587 void InProcessCommandBuffer::DestroyTransferBuffer(int32 id) { 578 void InProcessCommandBuffer::DestroyTransferBuffer(int32 id) {
588 CheckSequencedThread(); 579 CheckSequencedThread();
589 base::Closure task = 580 base::Closure task =
590 base::Bind(&InProcessCommandBuffer::DestroyTransferBufferOnGputhread, 581 base::Bind(&InProcessCommandBuffer::DestroyTransferBufferOnGpuThread,
591 base::Unretained(this), 582 base::Unretained(this),
592 id); 583 id);
593 584
594 QueueTask(task); 585 QueueTask(task);
595 } 586 }
596 587
597 void InProcessCommandBuffer::DestroyTransferBufferOnGputhread(int32 id) { 588 void InProcessCommandBuffer::DestroyTransferBufferOnGpuThread(int32 id) {
598 base::AutoLock lock(command_buffer_lock_); 589 base::AutoLock lock(command_buffer_lock_);
599 command_buffer_->DestroyTransferBuffer(id); 590 command_buffer_->DestroyTransferBuffer(id);
600 } 591 }
601 592
602 gpu::Capabilities InProcessCommandBuffer::GetCapabilities() { 593 gpu::Capabilities InProcessCommandBuffer::GetCapabilities() {
603 return capabilities_; 594 return capabilities_;
604 } 595 }
605 596
606 gfx::GpuMemoryBuffer* InProcessCommandBuffer::CreateGpuMemoryBuffer( 597 gfx::GpuMemoryBuffer* InProcessCommandBuffer::CreateGpuMemoryBuffer(
607 size_t width, 598 size_t width,
608 size_t height, 599 size_t height,
609 unsigned internalformat, 600 unsigned internalformat,
610 unsigned usage, 601 unsigned usage,
611 int32* id) { 602 int32* id) {
612 CheckSequencedThread(); 603 CheckSequencedThread();
613 604
614 *id = -1; 605 *id = -1;
615 linked_ptr<gfx::GpuMemoryBuffer> buffer = 606
616 make_linked_ptr(g_gpu_memory_buffer_factory->CreateGpuMemoryBuffer( 607 // TODO: Use content::GpuMemoryBufferImpl::Create() to create this instance.
no sievers 2014/07/01 22:49:07 And for this we have to somehow unify the code in
reveman 2014/07/02 14:47:54 I'm not too worried about unifying them, I'll figu
no sievers 2014/07/03 00:20:42 I like the latter two ideas better. Having things
617 width, height, internalformat, usage)); 608 linked_ptr<gfx::GpuMemoryBuffer> buffer;
618 if (!buffer.get()) 609 if (!buffer.get())
619 return NULL; 610 return NULL;
620 611
621 static int32 next_id = 1; 612 static int32 next_id = 1;
622 *id = next_id++; 613 *id = next_id++;
623 614
624 base::Closure task = base::Bind(&GpuControlService::RegisterGpuMemoryBuffer, 615 base::Closure task =
625 base::Unretained(gpu_control_.get()), 616 base::Bind(&InProcessCommandBuffer::RegisterGpuMemoryBufferOnGpuThread,
626 *id, 617 base::Unretained(this),
627 buffer->GetHandle(), 618 *id,
628 width, 619 buffer->GetHandle(),
629 height, 620 width,
630 internalformat); 621 height,
622 internalformat);
631 623
632 QueueTask(task); 624 QueueTask(task);
633 625
634 gpu_memory_buffers_[*id] = buffer; 626 gpu_memory_buffers_[*id] = buffer;
635 return buffer.get(); 627 return buffer.get();
636 } 628 }
637 629
630 void InProcessCommandBuffer::RegisterGpuMemoryBufferOnGpuThread(
631 int32 id,
632 const gfx::GpuMemoryBufferHandle& handle,
633 size_t width,
634 size_t height,
635 unsigned internalformat) {
636 // TODO: Use content::GpuMemoryBufferFactory::CreateImageForGpuMemoryBuffer()
no sievers 2014/07/01 22:49:07 So this is not a problem or is it? Looks like the
reveman 2014/07/02 14:47:54 Same problem here. GpuMemoryBufferFactory lives in
637 // to create this instance.
638 scoped_refptr<gfx::GLImage> image;
639 if (!image)
640 return;
641
642 // For Android specific workaround.
643 gles2::ContextGroup* context_group = decoder_->GetContextGroup();
644 if (context_group->feature_info()->workarounds().release_image_after_use)
645 image->SetReleaseAfterUse();
646
647 if (decoder_) {
648 gpu::gles2::ImageManager* image_manager = decoder_->GetImageManager();
649 if (image_manager)
650 image_manager->AddImage(image, id);
651 }
652 }
653
638 void InProcessCommandBuffer::DestroyGpuMemoryBuffer(int32 id) { 654 void InProcessCommandBuffer::DestroyGpuMemoryBuffer(int32 id) {
639 CheckSequencedThread(); 655 CheckSequencedThread();
640 GpuMemoryBufferMap::iterator it = gpu_memory_buffers_.find(id); 656 GpuMemoryBufferMap::iterator it = gpu_memory_buffers_.find(id);
641 if (it != gpu_memory_buffers_.end()) 657 if (it != gpu_memory_buffers_.end())
642 gpu_memory_buffers_.erase(it); 658 gpu_memory_buffers_.erase(it);
643 base::Closure task = base::Bind(&GpuControlService::UnregisterGpuMemoryBuffer, 659 base::Closure task =
644 base::Unretained(gpu_control_.get()), 660 base::Bind(&InProcessCommandBuffer::UnregisterGpuMemoryBufferOnGpuThread,
645 id); 661 base::Unretained(this),
662 id);
646 663
647 QueueTask(task); 664 QueueTask(task);
648 } 665 }
649 666
667 void InProcessCommandBuffer::UnregisterGpuMemoryBufferOnGpuThread(int32 id) {
668 if (decoder_) {
669 gpu::gles2::ImageManager* image_manager = decoder_->GetImageManager();
670 if (image_manager)
671 image_manager->RemoveImage(id);
672 }
673 }
674
650 uint32 InProcessCommandBuffer::InsertSyncPoint() { 675 uint32 InProcessCommandBuffer::InsertSyncPoint() {
651 uint32 sync_point = g_sync_point_manager.Get().GenerateSyncPoint(); 676 uint32 sync_point = g_sync_point_manager.Get().GenerateSyncPoint();
652 QueueTask(base::Bind(&InProcessCommandBuffer::RetireSyncPointOnGpuThread, 677 QueueTask(base::Bind(&InProcessCommandBuffer::RetireSyncPointOnGpuThread,
653 base::Unretained(this), 678 base::Unretained(this),
654 sync_point)); 679 sync_point));
655 return sync_point; 680 return sync_point;
656 } 681 }
657 682
658 void InProcessCommandBuffer::RetireSyncPointOnGpuThread(uint32 sync_point) { 683 void InProcessCommandBuffer::RetireSyncPointOnGpuThread(uint32 sync_point) {
659 gles2::MailboxManager* mailbox_manager = 684 gles2::MailboxManager* mailbox_manager =
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 } 791 }
767 792
768 #if defined(OS_ANDROID) 793 #if defined(OS_ANDROID)
769 scoped_refptr<gfx::SurfaceTexture> 794 scoped_refptr<gfx::SurfaceTexture>
770 InProcessCommandBuffer::GetSurfaceTexture(uint32 stream_id) { 795 InProcessCommandBuffer::GetSurfaceTexture(uint32 stream_id) {
771 DCHECK(stream_texture_manager_); 796 DCHECK(stream_texture_manager_);
772 return stream_texture_manager_->GetSurfaceTexture(stream_id); 797 return stream_texture_manager_->GetSurfaceTexture(stream_id);
773 } 798 }
774 #endif 799 #endif
775 800
776 // static
777 void InProcessCommandBuffer::SetGpuMemoryBufferFactory(
778 GpuMemoryBufferFactory* factory) {
779 g_gpu_memory_buffer_factory = factory;
780 }
781
782 } // namespace gpu 801 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698