OLD | NEW |
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 "base/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
6 #include "base/message_loop/message_loop.h" | 6 #include "base/message_loop/message_loop.h" |
7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
8 #include "ui/gfx/ozone/impl/drm_skbitmap_ozone.h" | 8 #include "ui/gfx/ozone/impl/dri_skbitmap.h" |
9 #include "ui/gfx/ozone/impl/drm_wrapper_ozone.h" | 9 #include "ui/gfx/ozone/impl/dri_surface.h" |
10 #include "ui/gfx/ozone/impl/hardware_display_controller_ozone.h" | 10 #include "ui/gfx/ozone/impl/dri_surface_factory.h" |
11 #include "ui/gfx/ozone/impl/software_surface_factory_ozone.h" | 11 #include "ui/gfx/ozone/impl/dri_wrapper.h" |
12 #include "ui/gfx/ozone/impl/software_surface_ozone.h" | 12 #include "ui/gfx/ozone/impl/hardware_display_controller.h" |
13 #include "ui/gfx/ozone/surface_factory_ozone.h" | 13 #include "ui/gfx/ozone/surface_factory_ozone.h" |
14 | 14 |
15 namespace { | 15 namespace { |
16 | 16 |
17 const drmModeModeInfo kDefaultMode = | 17 const drmModeModeInfo kDefaultMode = |
18 {0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}}; | 18 {0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}}; |
19 | 19 |
20 // Mock file descriptor ID. | 20 // Mock file descriptor ID. |
21 const int kFd = 3; | 21 const int kFd = 3; |
22 | 22 |
23 // Mock connector ID. | 23 // Mock connector ID. |
24 const uint32_t kConnectorId = 1; | 24 const uint32_t kConnectorId = 1; |
25 | 25 |
26 // Mock CRTC ID. | 26 // Mock CRTC ID. |
27 const uint32_t kCrtcId = 1; | 27 const uint32_t kCrtcId = 1; |
28 | 28 |
29 const uint32_t kDPMSPropertyId = 1; | 29 const uint32_t kDPMSPropertyId = 1; |
30 | 30 |
31 const gfx::AcceleratedWidget kDefaultWidgetHandle = 1; | 31 const gfx::AcceleratedWidget kDefaultWidgetHandle = 1; |
32 | 32 |
33 // The real DrmWrapper makes actual DRM calls which we can't use in unit tests. | 33 // The real DriWrapper makes actual DRM calls which we can't use in unit tests. |
34 class MockDrmWrapperOzone : public gfx::DrmWrapperOzone { | 34 class MockDriWrapper : public gfx::DriWrapper { |
35 public: | 35 public: |
36 MockDrmWrapperOzone(int fd) : DrmWrapperOzone(""), | 36 MockDriWrapper(int fd) : DriWrapper(""), |
37 add_framebuffer_expectation_(true), | 37 add_framebuffer_expectation_(true), |
38 page_flip_expectation_(true) { | 38 page_flip_expectation_(true) { |
39 fd_ = fd; | 39 fd_ = fd; |
40 } | 40 } |
41 | 41 |
42 virtual ~MockDrmWrapperOzone() { fd_ = -1; } | 42 virtual ~MockDriWrapper() { fd_ = -1; } |
43 | 43 |
44 virtual drmModeCrtc* GetCrtc(uint32_t crtc_id) OVERRIDE { | 44 virtual drmModeCrtc* GetCrtc(uint32_t crtc_id) OVERRIDE { |
45 return new drmModeCrtc; | 45 return new drmModeCrtc; |
46 } | 46 } |
47 | 47 |
48 virtual void FreeCrtc(drmModeCrtc* crtc) OVERRIDE { | 48 virtual void FreeCrtc(drmModeCrtc* crtc) OVERRIDE { |
49 delete crtc; | 49 delete crtc; |
50 } | 50 } |
51 | 51 |
52 virtual bool SetCrtc(uint32_t crtc_id, | 52 virtual bool SetCrtc(uint32_t crtc_id, |
(...skipping 14 matching lines...) Expand all Loading... |
67 uint32_t handle, | 67 uint32_t handle, |
68 uint32_t* framebuffer) OVERRIDE { | 68 uint32_t* framebuffer) OVERRIDE { |
69 return add_framebuffer_expectation_; | 69 return add_framebuffer_expectation_; |
70 } | 70 } |
71 | 71 |
72 virtual bool RemoveFramebuffer(uint32_t framebuffer) OVERRIDE { return true; } | 72 virtual bool RemoveFramebuffer(uint32_t framebuffer) OVERRIDE { return true; } |
73 | 73 |
74 virtual bool PageFlip(uint32_t crtc_id, | 74 virtual bool PageFlip(uint32_t crtc_id, |
75 uint32_t framebuffer, | 75 uint32_t framebuffer, |
76 void* data) OVERRIDE { | 76 void* data) OVERRIDE { |
77 static_cast<gfx::HardwareDisplayControllerOzone*>(data)->get_surface() | 77 static_cast<gfx::HardwareDisplayController*>(data)->get_surface() |
78 ->SwapBuffers(); | 78 ->SwapBuffers(); |
79 return page_flip_expectation_; | 79 return page_flip_expectation_; |
80 } | 80 } |
81 | 81 |
82 virtual bool ConnectorSetProperty(uint32_t connector_id, | 82 virtual bool ConnectorSetProperty(uint32_t connector_id, |
83 uint32_t property_id, | 83 uint32_t property_id, |
84 uint64_t value) OVERRIDE { return true; } | 84 uint64_t value) OVERRIDE { return true; } |
85 | 85 |
86 void set_add_framebuffer_expectation(bool state) { | 86 void set_add_framebuffer_expectation(bool state) { |
87 add_framebuffer_expectation_ = state; | 87 add_framebuffer_expectation_ = state; |
88 } | 88 } |
89 | 89 |
90 void set_page_flip_expectation(bool state) { | 90 void set_page_flip_expectation(bool state) { |
91 page_flip_expectation_ = state; | 91 page_flip_expectation_ = state; |
92 } | 92 } |
93 | 93 |
94 private: | 94 private: |
95 bool add_framebuffer_expectation_; | 95 bool add_framebuffer_expectation_; |
96 bool page_flip_expectation_; | 96 bool page_flip_expectation_; |
97 | 97 |
98 DISALLOW_COPY_AND_ASSIGN(MockDrmWrapperOzone); | 98 DISALLOW_COPY_AND_ASSIGN(MockDriWrapper); |
99 }; | 99 }; |
100 | 100 |
101 class MockDrmSkBitmapOzone : public gfx::DrmSkBitmapOzone { | 101 class MockDriSkBitmap : public gfx::DriSkBitmap { |
102 public: | 102 public: |
103 MockDrmSkBitmapOzone() : DrmSkBitmapOzone(kFd) {} | 103 MockDriSkBitmap() : DriSkBitmap(kFd) {} |
104 virtual ~MockDrmSkBitmapOzone() {} | 104 virtual ~MockDriSkBitmap() {} |
105 | 105 |
106 virtual bool Initialize() OVERRIDE { | 106 virtual bool Initialize() OVERRIDE { |
107 allocPixels(); | 107 allocPixels(); |
108 eraseColor(SK_ColorBLACK); | 108 eraseColor(SK_ColorBLACK); |
109 return true; | 109 return true; |
110 } | 110 } |
111 | 111 |
112 private: | 112 private: |
113 DISALLOW_COPY_AND_ASSIGN(MockDrmSkBitmapOzone); | 113 DISALLOW_COPY_AND_ASSIGN(MockDriSkBitmap); |
114 }; | 114 }; |
115 | 115 |
116 class MockSoftwareSurfaceOzone : public gfx::SoftwareSurfaceOzone { | 116 class MockDriSurface : public gfx::DriSurface { |
117 public: | 117 public: |
118 MockSoftwareSurfaceOzone(gfx::HardwareDisplayControllerOzone* controller) | 118 MockDriSurface(gfx::HardwareDisplayController* controller) |
119 : SoftwareSurfaceOzone(controller) {} | 119 : DriSurface(controller) {} |
120 virtual ~MockSoftwareSurfaceOzone() {} | 120 virtual ~MockDriSurface() {} |
121 | 121 |
122 private: | 122 private: |
123 virtual gfx::DrmSkBitmapOzone* CreateBuffer() OVERRIDE { | 123 virtual gfx::DriSkBitmap* CreateBuffer() OVERRIDE { |
124 return new MockDrmSkBitmapOzone(); | 124 return new MockDriSkBitmap(); |
125 } | 125 } |
126 | 126 |
127 DISALLOW_COPY_AND_ASSIGN(MockSoftwareSurfaceOzone); | 127 DISALLOW_COPY_AND_ASSIGN(MockDriSurface); |
128 }; | 128 }; |
129 | 129 |
130 // SSFO would normally allocate DRM resources. We can't rely on having a DRM | 130 // SSFO would normally allocate DRM resources. We can't rely on having a DRM |
131 // backend to allocate and display our buffers. Thus, we replace these | 131 // backend to allocate and display our buffers. Thus, we replace these |
132 // resources with stubs. For DRM calls, we simply use stubs that do nothing and | 132 // resources with stubs. For DRM calls, we simply use stubs that do nothing and |
133 // for buffers we use the default SkBitmap allocator. | 133 // for buffers we use the default SkBitmap allocator. |
134 class MockSoftwareSurfaceFactoryOzone | 134 class MockDriSurfaceFactory |
135 : public gfx::SoftwareSurfaceFactoryOzone { | 135 : public gfx::DriSurfaceFactory { |
136 public: | 136 public: |
137 MockSoftwareSurfaceFactoryOzone() | 137 MockDriSurfaceFactory() |
138 : SoftwareSurfaceFactoryOzone(), | 138 : DriSurfaceFactory(), |
139 mock_drm_(NULL), | 139 mock_drm_(NULL), |
140 drm_wrapper_expectation_(true), | 140 drm_wrapper_expectation_(true), |
141 initialize_controller_expectation_(true) {} | 141 initialize_controller_expectation_(true) {} |
142 virtual ~MockSoftwareSurfaceFactoryOzone() {}; | 142 virtual ~MockDriSurfaceFactory() {}; |
143 | 143 |
144 void set_drm_wrapper_expectation(bool state) { | 144 void set_drm_wrapper_expectation(bool state) { |
145 drm_wrapper_expectation_ = state; | 145 drm_wrapper_expectation_ = state; |
146 } | 146 } |
147 | 147 |
148 void set_initialize_controller_expectation(bool state) { | 148 void set_initialize_controller_expectation(bool state) { |
149 initialize_controller_expectation_ = state; | 149 initialize_controller_expectation_ = state; |
150 } | 150 } |
151 | 151 |
152 MockDrmWrapperOzone* get_drm() const { | 152 MockDriWrapper* get_drm() const { |
153 return mock_drm_; | 153 return mock_drm_; |
154 } | 154 } |
155 | 155 |
156 private: | 156 private: |
157 virtual gfx::SoftwareSurfaceOzone* CreateSurface( | 157 virtual gfx::DriSurface* CreateSurface( |
158 gfx::HardwareDisplayControllerOzone* controller) OVERRIDE { | 158 gfx::HardwareDisplayController* controller) OVERRIDE { |
159 return new MockSoftwareSurfaceOzone(controller); | 159 return new MockDriSurface(controller); |
160 } | 160 } |
161 | 161 |
162 virtual gfx::DrmWrapperOzone* CreateWrapper() OVERRIDE { | 162 virtual gfx::DriWrapper* CreateWrapper() OVERRIDE { |
163 if (drm_wrapper_expectation_) | 163 if (drm_wrapper_expectation_) |
164 mock_drm_ = new MockDrmWrapperOzone(kFd); | 164 mock_drm_ = new MockDriWrapper(kFd); |
165 else | 165 else |
166 mock_drm_ = new MockDrmWrapperOzone(-1); | 166 mock_drm_ = new MockDriWrapper(-1); |
167 | 167 |
168 return mock_drm_; | 168 return mock_drm_; |
169 } | 169 } |
170 | 170 |
171 // Normally we'd use DRM to figure out the controller configuration. But we | 171 // Normally we'd use DRM to figure out the controller configuration. But we |
172 // can't use DRM in unit tests, so we just create a fake configuration. | 172 // can't use DRM in unit tests, so we just create a fake configuration. |
173 virtual bool InitializeControllerForPrimaryDisplay( | 173 virtual bool InitializeControllerForPrimaryDisplay( |
174 gfx::DrmWrapperOzone* drm, | 174 gfx::DriWrapper* drm, |
175 gfx::HardwareDisplayControllerOzone* controller) OVERRIDE { | 175 gfx::HardwareDisplayController* controller) OVERRIDE { |
176 if (initialize_controller_expectation_) { | 176 if (initialize_controller_expectation_) { |
177 controller->SetControllerInfo(drm, | 177 controller->SetControllerInfo(drm, |
178 kConnectorId, | 178 kConnectorId, |
179 kCrtcId, | 179 kCrtcId, |
180 kDPMSPropertyId, | 180 kDPMSPropertyId, |
181 kDefaultMode); | 181 kDefaultMode); |
182 return true; | 182 return true; |
183 } else { | 183 } else { |
184 return false; | 184 return false; |
185 } | 185 } |
186 } | 186 } |
187 | 187 |
188 virtual void WaitForPageFlipEvent(int fd) OVERRIDE {} | 188 virtual void WaitForPageFlipEvent(int fd) OVERRIDE {} |
189 | 189 |
190 MockDrmWrapperOzone* mock_drm_; | 190 MockDriWrapper* mock_drm_; |
191 bool drm_wrapper_expectation_; | 191 bool drm_wrapper_expectation_; |
192 bool initialize_controller_expectation_; | 192 bool initialize_controller_expectation_; |
193 | 193 |
194 DISALLOW_COPY_AND_ASSIGN(MockSoftwareSurfaceFactoryOzone); | 194 DISALLOW_COPY_AND_ASSIGN(MockDriSurfaceFactory); |
195 }; | 195 }; |
196 | 196 |
197 } // namespace | 197 } // namespace |
198 | 198 |
199 class SoftwareSurfaceFactoryOzoneTest : public testing::Test { | 199 class DriSurfaceFactoryTest : public testing::Test { |
200 public: | 200 public: |
201 SoftwareSurfaceFactoryOzoneTest() {} | 201 DriSurfaceFactoryTest() {} |
202 | 202 |
203 virtual void SetUp() OVERRIDE; | 203 virtual void SetUp() OVERRIDE; |
204 virtual void TearDown() OVERRIDE; | 204 virtual void TearDown() OVERRIDE; |
205 protected: | 205 protected: |
206 scoped_ptr<base::MessageLoop> message_loop_; | 206 scoped_ptr<base::MessageLoop> message_loop_; |
207 scoped_ptr<MockSoftwareSurfaceFactoryOzone> factory_; | 207 scoped_ptr<MockDriSurfaceFactory> factory_; |
208 | 208 |
209 private: | 209 private: |
210 DISALLOW_COPY_AND_ASSIGN(SoftwareSurfaceFactoryOzoneTest); | 210 DISALLOW_COPY_AND_ASSIGN(DriSurfaceFactoryTest); |
211 }; | 211 }; |
212 | 212 |
213 void SoftwareSurfaceFactoryOzoneTest::SetUp() { | 213 void DriSurfaceFactoryTest::SetUp() { |
214 message_loop_.reset(new base::MessageLoop(base::MessageLoop::TYPE_UI)); | 214 message_loop_.reset(new base::MessageLoop(base::MessageLoop::TYPE_UI)); |
215 factory_.reset(new MockSoftwareSurfaceFactoryOzone()); | 215 factory_.reset(new MockDriSurfaceFactory()); |
216 } | 216 } |
217 | 217 |
218 void SoftwareSurfaceFactoryOzoneTest::TearDown() { | 218 void DriSurfaceFactoryTest::TearDown() { |
219 factory_.reset(); | 219 factory_.reset(); |
220 message_loop_.reset(); | 220 message_loop_.reset(); |
221 } | 221 } |
222 | 222 |
223 TEST_F(SoftwareSurfaceFactoryOzoneTest, FailInitialization) { | 223 TEST_F(DriSurfaceFactoryTest, FailInitialization) { |
224 factory_->set_drm_wrapper_expectation(false); | 224 factory_->set_drm_wrapper_expectation(false); |
225 | 225 |
226 EXPECT_EQ(gfx::SurfaceFactoryOzone::FAILED, factory_->InitializeHardware()); | 226 EXPECT_EQ(gfx::SurfaceFactoryOzone::FAILED, factory_->InitializeHardware()); |
227 } | 227 } |
228 | 228 |
229 TEST_F(SoftwareSurfaceFactoryOzoneTest, SuccessfulInitialization) { | 229 TEST_F(DriSurfaceFactoryTest, SuccessfulInitialization) { |
230 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED, | 230 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED, |
231 factory_->InitializeHardware()); | 231 factory_->InitializeHardware()); |
232 } | 232 } |
233 | 233 |
234 TEST_F(SoftwareSurfaceFactoryOzoneTest, FailSurfaceInitialization) { | 234 TEST_F(DriSurfaceFactoryTest, FailSurfaceInitialization) { |
235 factory_->set_initialize_controller_expectation(false); | 235 factory_->set_initialize_controller_expectation(false); |
236 | 236 |
237 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED, | 237 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED, |
238 factory_->InitializeHardware()); | 238 factory_->InitializeHardware()); |
239 | 239 |
240 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget(); | 240 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget(); |
241 EXPECT_EQ(kDefaultWidgetHandle, w); | 241 EXPECT_EQ(kDefaultWidgetHandle, w); |
242 | 242 |
243 EXPECT_EQ(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w)); | 243 EXPECT_EQ(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w)); |
244 } | 244 } |
245 | 245 |
246 TEST_F(SoftwareSurfaceFactoryOzoneTest, FailBindingSurfaceToController) { | 246 TEST_F(DriSurfaceFactoryTest, FailBindingSurfaceToController) { |
247 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED, | 247 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED, |
248 factory_->InitializeHardware()); | 248 factory_->InitializeHardware()); |
249 | 249 |
250 factory_->get_drm()->set_add_framebuffer_expectation(false); | 250 factory_->get_drm()->set_add_framebuffer_expectation(false); |
251 | 251 |
252 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget(); | 252 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget(); |
253 EXPECT_EQ(kDefaultWidgetHandle, w); | 253 EXPECT_EQ(kDefaultWidgetHandle, w); |
254 | 254 |
255 EXPECT_EQ(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w)); | 255 EXPECT_EQ(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w)); |
256 } | 256 } |
257 | 257 |
258 TEST_F(SoftwareSurfaceFactoryOzoneTest, SuccessfulWidgetRealization) { | 258 TEST_F(DriSurfaceFactoryTest, SuccessfulWidgetRealization) { |
259 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED, | 259 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED, |
260 factory_->InitializeHardware()); | 260 factory_->InitializeHardware()); |
261 | 261 |
262 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget(); | 262 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget(); |
263 EXPECT_EQ(kDefaultWidgetHandle, w); | 263 EXPECT_EQ(kDefaultWidgetHandle, w); |
264 | 264 |
265 EXPECT_NE(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w)); | 265 EXPECT_NE(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w)); |
266 } | 266 } |
267 | 267 |
268 TEST_F(SoftwareSurfaceFactoryOzoneTest, FailSchedulePageFlip) { | 268 TEST_F(DriSurfaceFactoryTest, FailSchedulePageFlip) { |
269 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED, | 269 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED, |
270 factory_->InitializeHardware()); | 270 factory_->InitializeHardware()); |
271 | 271 |
272 factory_->get_drm()->set_page_flip_expectation(false); | 272 factory_->get_drm()->set_page_flip_expectation(false); |
273 | 273 |
274 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget(); | 274 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget(); |
275 EXPECT_EQ(kDefaultWidgetHandle, w); | 275 EXPECT_EQ(kDefaultWidgetHandle, w); |
276 | 276 |
277 EXPECT_NE(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w)); | 277 EXPECT_NE(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w)); |
278 | 278 |
279 EXPECT_FALSE(factory_->SchedulePageFlip(w)); | 279 EXPECT_FALSE(factory_->SchedulePageFlip(w)); |
280 } | 280 } |
281 | 281 |
282 TEST_F(SoftwareSurfaceFactoryOzoneTest, SuccessfulSchedulePageFlip) { | 282 TEST_F(DriSurfaceFactoryTest, SuccessfulSchedulePageFlip) { |
283 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED, | 283 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED, |
284 factory_->InitializeHardware()); | 284 factory_->InitializeHardware()); |
285 | 285 |
286 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget(); | 286 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget(); |
287 EXPECT_EQ(kDefaultWidgetHandle, w); | 287 EXPECT_EQ(kDefaultWidgetHandle, w); |
288 | 288 |
289 EXPECT_NE(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w)); | 289 EXPECT_NE(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w)); |
290 | 290 |
291 EXPECT_TRUE(factory_->SchedulePageFlip(w)); | 291 EXPECT_TRUE(factory_->SchedulePageFlip(w)); |
292 } | 292 } |
OLD | NEW |