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

Side by Side Diff: mojo/services/native_viewport/native_viewport_impl.cc

Issue 451753003: Mojo multiple command buffer support and sample (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: better casts Created 6 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 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 "mojo/services/native_viewport/native_viewport_impl.h" 5 #include "mojo/services/native_viewport/native_viewport_impl.h"
6 6
7 #include "base/bind.h"
7 #include "base/macros.h" 8 #include "base/macros.h"
8 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
9 #include "base/time/time.h" 10 #include "base/time/time.h"
10 #include "mojo/public/cpp/application/application_delegate.h" 11 #include "mojo/public/cpp/application/application_delegate.h"
11 #include "mojo/public/cpp/application/interface_factory.h" 12 #include "mojo/public/cpp/application/interface_factory.h"
12 #include "mojo/services/public/cpp/geometry/geometry_type_converters.h" 13 #include "mojo/services/public/cpp/geometry/geometry_type_converters.h"
13 #include "mojo/services/public/cpp/input_events/input_events_type_converters.h" 14 #include "mojo/services/public/cpp/input_events/input_events_type_converters.h"
14 #include "ui/events/event.h" 15 #include "ui/events/event.h"
15 16
16 namespace mojo { 17 namespace mojo {
(...skipping 14 matching lines...) Expand all
31 32
32 NativeViewportImpl::~NativeViewportImpl() { 33 NativeViewportImpl::~NativeViewportImpl() {
33 // Destroy the NativeViewport early on as it may call us back during 34 // Destroy the NativeViewport early on as it may call us back during
34 // destruction and we want to be in a known state. 35 // destruction and we want to be in a known state.
35 platform_viewport_.reset(); 36 platform_viewport_.reset();
36 } 37 }
37 38
38 void NativeViewportImpl::Create(RectPtr bounds) { 39 void NativeViewportImpl::Create(RectPtr bounds) {
39 platform_viewport_ = PlatformViewport::Create(this); 40 platform_viewport_ = PlatformViewport::Create(this);
40 platform_viewport_->Init(bounds.To<gfx::Rect>()); 41 platform_viewport_->Init(bounds.To<gfx::Rect>());
41 client()->OnCreated();
42 OnBoundsChanged(bounds.To<gfx::Rect>()); 42 OnBoundsChanged(bounds.To<gfx::Rect>());
43 } 43 }
44 44
45 void NativeViewportImpl::Show() { 45 void NativeViewportImpl::Show() {
46 platform_viewport_->Show(); 46 platform_viewport_->Show();
47 } 47 }
48 48
49 void NativeViewportImpl::Hide() { 49 void NativeViewportImpl::Hide() {
50 platform_viewport_->Hide(); 50 platform_viewport_->Hide();
51 } 51 }
52 52
53 void NativeViewportImpl::Close() { 53 void NativeViewportImpl::Close() {
54 command_buffer_.reset();
55 DCHECK(platform_viewport_); 54 DCHECK(platform_viewport_);
56 platform_viewport_->Close(); 55 platform_viewport_->Close();
57 } 56 }
58 57
59 void NativeViewportImpl::SetBounds(RectPtr bounds) { 58 void NativeViewportImpl::SetBounds(RectPtr bounds) {
60 platform_viewport_->SetBounds(bounds.To<gfx::Rect>()); 59 platform_viewport_->SetBounds(bounds.To<gfx::Rect>());
61 } 60 }
62 61
63 void NativeViewportImpl::CreateGLES2Context(
64 InterfaceRequest<CommandBuffer> command_buffer_request) {
65 if (command_buffer_ || command_buffer_request_.is_pending()) {
66 LOG(ERROR) << "Can't create multiple contexts on a NativeViewport";
67 return;
68 }
69 command_buffer_request_ = command_buffer_request.Pass();
70 CreateCommandBufferIfNeeded();
71 }
72
73 void NativeViewportImpl::OnBoundsChanged(const gfx::Rect& bounds) { 62 void NativeViewportImpl::OnBoundsChanged(const gfx::Rect& bounds) {
74 CreateCommandBufferIfNeeded();
75 client()->OnBoundsChanged(Rect::From(bounds)); 63 client()->OnBoundsChanged(Rect::From(bounds));
76 } 64 }
77 65
78 void NativeViewportImpl::OnAcceleratedWidgetAvailable( 66 void NativeViewportImpl::OnAcceleratedWidgetAvailable(
79 gfx::AcceleratedWidget widget) { 67 gfx::AcceleratedWidget widget) {
80 widget_ = widget; 68 widget_ = widget;
81 CreateCommandBufferIfNeeded(); 69 uintptr_t widget_ptr = bit_cast<uintptr_t>(widget);
70 client()->OnCreated(static_cast<uint64_t>(widget_ptr));
82 } 71 }
83 72
84 bool NativeViewportImpl::OnEvent(ui::Event* ui_event) { 73 bool NativeViewportImpl::OnEvent(ui::Event* ui_event) {
85 // Must not return early before updating capture. 74 // Must not return early before updating capture.
86 switch (ui_event->type()) { 75 switch (ui_event->type()) {
87 case ui::ET_MOUSE_PRESSED: 76 case ui::ET_MOUSE_PRESSED:
88 case ui::ET_TOUCH_PRESSED: 77 case ui::ET_TOUCH_PRESSED:
89 platform_viewport_->SetCapture(); 78 platform_viewport_->SetCapture();
90 break; 79 break;
91 case ui::ET_MOUSE_RELEASED: 80 case ui::ET_MOUSE_RELEASED:
92 case ui::ET_TOUCH_RELEASED: 81 case ui::ET_TOUCH_RELEASED:
93 platform_viewport_->ReleaseCapture(); 82 platform_viewport_->ReleaseCapture();
94 break; 83 break;
95 default: 84 default:
96 break; 85 break;
97 } 86 }
98 87
99 if (waiting_for_event_ack_ && IsRateLimitedEventType(ui_event)) 88 if (waiting_for_event_ack_ && IsRateLimitedEventType(ui_event))
100 return false; 89 return false;
101 90
102 client()->OnEvent( 91 client()->OnEvent(
103 TypeConverter<EventPtr, ui::Event>::ConvertFrom(*ui_event), 92 TypeConverter<EventPtr, ui::Event>::ConvertFrom(*ui_event),
104 base::Bind(&NativeViewportImpl::AckEvent, 93 base::Bind(&NativeViewportImpl::AckEvent,
105 weak_factory_.GetWeakPtr())); 94 weak_factory_.GetWeakPtr()));
106 waiting_for_event_ack_ = true; 95 waiting_for_event_ack_ = true;
107 return false; 96 return false;
108 } 97 }
109 98
110 void NativeViewportImpl::OnDestroyed() { 99 void NativeViewportImpl::OnDestroyed() {
111 client()->OnDestroyed(base::Bind(&NativeViewportImpl::AckDestroyed, 100 client()->OnDestroyed();
112 base::Unretained(this)));
113 } 101 }
114 102
115 void NativeViewportImpl::AckEvent() { 103 void NativeViewportImpl::AckEvent() {
116 waiting_for_event_ack_ = false; 104 waiting_for_event_ack_ = false;
117 } 105 }
118 106
119 void NativeViewportImpl::CreateCommandBufferIfNeeded() {
120 if (!command_buffer_request_.is_pending())
121 return;
122 DCHECK(!command_buffer_.get());
123 if (widget_ == gfx::kNullAcceleratedWidget)
124 return;
125 gfx::Size size = platform_viewport_->GetSize();
126 if (size.IsEmpty())
127 return;
128 command_buffer_.reset(
129 new CommandBufferImpl(widget_, platform_viewport_->GetSize()));
130 WeakBindToRequest(command_buffer_.get(), &command_buffer_request_);
131 }
132
133 void NativeViewportImpl::AckDestroyed() {
134 command_buffer_.reset();
135 }
136
137 } // namespace mojo 107 } // namespace mojo
138 108
OLDNEW
« no previous file with comments | « mojo/services/native_viewport/native_viewport_impl.h ('k') | mojo/services/public/interfaces/gpu/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698