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

Side by Side Diff: chromecast/ozone/surface_factory_chromecast.cc

Issue 1025453002: Implement common Ozone interface for Chromecast. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 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
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 #include "chromecast/ozone/surface_factory_chromecast.h"
lcwu1 2015/03/27 00:51:43 Add a vertical space above.
halliwell 2015/03/27 01:45:03 Done.
5
6 #include "base/callback_helpers.h"
7 #include "chromecast/ozone/chromecast_egl_platform.h"
8 #include "chromecast/ozone/surface_ozone_egl_chromecast.h"
9
10 namespace chromecast {
11 namespace ozone {
12
13 SurfaceFactoryChromecast::SurfaceFactoryChromecast(
14 scoped_ptr<ChromecastEglPlatform> egl_platform)
15 : state_(UNINITIALIZED),
16 destroy_window_pending_state_(kNoDestroyPending),
17 display_type_(0),
18 window_(0),
19 default_display_size_(egl_platform->GetDefaultDisplaySize()),
20 display_size_(default_display_size_),
21 new_display_size_(default_display_size_),
22 egl_platform_(egl_platform.Pass()) {
23 }
24
25 SurfaceFactoryChromecast::~SurfaceFactoryChromecast() {
26 DestroyDisplayTypeAndWindow();
27 }
28
29 void SurfaceFactoryChromecast::InitializeHardware() {
30 if (state_ == INITIALIZED) {
31 return;
32 }
33 CHECK_EQ(state_, UNINITIALIZED);
34
35 if (egl_platform_->InitializeHardware()) {
36 state_ = INITIALIZED;
37 } else {
38 ShutdownHardware();
39 state_ = FAILED;
40 }
41 }
42
43 void SurfaceFactoryChromecast::ShutdownHardware() {
44 DestroyDisplayTypeAndWindow();
45
46 egl_platform_->ShutdownHardware();
47
48 state_ = UNINITIALIZED;
49 }
50
51 intptr_t SurfaceFactoryChromecast::GetNativeDisplay() {
52 CreateDisplayTypeAndWindowIfNeeded();
53 return reinterpret_cast<intptr_t>(display_type_);
54 }
55
56 void SurfaceFactoryChromecast::CreateDisplayTypeAndWindowIfNeeded() {
57 if (state_ == UNINITIALIZED) {
58 InitializeHardware();
59 }
60 if (new_display_size_ != display_size_) {
61 DestroyDisplayTypeAndWindow();
62 display_size_ = new_display_size_;
63 }
64 DCHECK_EQ(state_, INITIALIZED);
65 if (!display_type_) {
66 display_type_ = egl_platform_->CreateDisplayType(display_size_);
67 if (display_type_) {
68 window_ = egl_platform_->CreateWindow(display_type_, display_size_);
69 if (!window_) {
70 DestroyDisplayTypeAndWindow();
derekjchow1 2015/03/19 21:28:02 Would it be reasonable to call ShutdownHardware he
halliwell 2015/03/19 22:21:58 We're about to terminate here (FATAL) so I'm not c
71 state_ = FAILED;
72 LOG(FATAL) << "Create EGLNativeWindowType(" << display_size_.ToString()
73 << ") failed.";
74 }
75 } else {
76 state_ = FAILED;
derekjchow1 2015/03/19 21:28:02 Ditto.
77 LOG(FATAL) << "Create EGLNativeDisplayType(" << display_size_.ToString()
78 << ") failed.";
79 }
80 }
81 }
82
83 intptr_t SurfaceFactoryChromecast::GetNativeWindow() {
84 CreateDisplayTypeAndWindowIfNeeded();
85 return window_;
86 }
87
88 bool SurfaceFactoryChromecast::ResizeDisplay(gfx::Size size) {
89 // set size to at least 1280x720 even if passed 1x1
90 size.SetToMax(default_display_size_);
91 if (display_type_ && size != display_size_) {
92 DestroyDisplayTypeAndWindow();
93 }
94 display_size_ = size;
95 return true;
96 }
97
98 void SurfaceFactoryChromecast::DestroyDisplayTypeAndWindow() {
99 if (window_) {
100 egl_platform_->DestroyWindow(window_);
101 window_ = 0;
102 }
103 if (display_type_) {
104 egl_platform_->DestroyDisplayType(display_type_);
105 display_type_ = 0;
106 }
107 }
108
109 scoped_ptr<ui::SurfaceOzoneEGL>
110 SurfaceFactoryChromecast::CreateEGLSurfaceForWidget(
111 gfx::AcceleratedWidget widget) {
112 new_display_size_ = gfx::Size(widget >> 16, widget & 0xFFFF);
113 new_display_size_.SetToMax(default_display_size_);
114 destroy_window_pending_state_ = kSurfaceExists;
115 SendRelinquishResponse();
116 return make_scoped_ptr<ui::SurfaceOzoneEGL>(
117 new SurfaceOzoneEglChromecast(this));
118 }
119
120 void SurfaceFactoryChromecast::SetToRelinquishDisplay(
121 const base::Closure& callback) {
122 // This is called in response to a RelinquishDisplay message from the
123 // browser task. This call may come before or after the display surface
124 // is actually destroyed.
125 relinquish_display_callback_ = callback;
126 switch (destroy_window_pending_state_) {
127 case kNoDestroyPending:
128 case kSurfaceDestroyedRecently:
129 DestroyDisplayTypeAndWindow();
130 SendRelinquishResponse();
131 destroy_window_pending_state_ = kNoDestroyPending;
132 break;
133 case kSurfaceExists:
134 destroy_window_pending_state_ = kWindowDestroyPending;
135 break;
136 case kWindowDestroyPending:
137 break;
138 default:
139 NOTREACHED();
140 }
141 }
142
143 void SurfaceFactoryChromecast::ChildDestroyed() {
144 if (destroy_window_pending_state_ == kWindowDestroyPending) {
145 DestroyDisplayTypeAndWindow();
146 SendRelinquishResponse();
147 destroy_window_pending_state_ = kNoDestroyPending;
148 } else {
149 destroy_window_pending_state_ = kSurfaceDestroyedRecently;
150 }
151 }
152
153 void SurfaceFactoryChromecast::SendRelinquishResponse() {
154 if (!relinquish_display_callback_.is_null()) {
155 base::ResetAndReturn(&relinquish_display_callback_).Run();
156 }
157 }
158
159 const int32* SurfaceFactoryChromecast::GetEGLSurfaceProperties(
160 const int32* desired_list) {
161 return egl_platform_->GetEGLSurfaceProperties(desired_list);
162 }
163
164 bool SurfaceFactoryChromecast::LoadEGLGLES2Bindings(
165 AddGLLibraryCallback add_gl_library,
166 SetGLGetProcAddressProcCallback set_gl_get_proc_address) {
167 if (state_ != INITIALIZED) {
168 InitializeHardware();
169 if (state_ != INITIALIZED) {
170 return false;
171 }
172 }
173
174 return egl_platform_->LoadEGLGLES2Bindings(add_gl_library,
175 set_gl_get_proc_address);
176 }
177
178 } // namespace ozone
179 } // namespace chromecast
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698