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/command_line.h" | 5 #include "base/command_line.h" |
6 #include "base/memory/ptr_util.h" | 6 #include "base/memory/ptr_util.h" |
7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
8 #include "build/build_config.h" | 8 #include "build/build_config.h" |
9 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" | 9 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" |
10 #include "content/browser/gpu/gpu_process_host_ui_shim.h" | 10 #include "content/browser/gpu/gpu_process_host_ui_shim.h" |
(...skipping 26 matching lines...) Expand all Loading... |
37 attributes.bind_generates_resource = false; | 37 attributes.bind_generates_resource = false; |
38 constexpr bool automatic_flushes = false; | 38 constexpr bool automatic_flushes = false; |
39 constexpr bool support_locking = false; | 39 constexpr bool support_locking = false; |
40 return make_scoped_refptr(new content::ContextProviderCommandBuffer( | 40 return make_scoped_refptr(new content::ContextProviderCommandBuffer( |
41 std::move(gpu_channel_host), gpu::GPU_STREAM_DEFAULT, | 41 std::move(gpu_channel_host), gpu::GPU_STREAM_DEFAULT, |
42 gpu::GpuStreamPriority::NORMAL, gpu::kNullSurfaceHandle, GURL(), | 42 gpu::GpuStreamPriority::NORMAL, gpu::kNullSurfaceHandle, GURL(), |
43 automatic_flushes, support_locking, gpu::SharedMemoryLimits(), attributes, | 43 automatic_flushes, support_locking, gpu::SharedMemoryLimits(), attributes, |
44 nullptr, content::command_buffer_metrics::OFFSCREEN_CONTEXT_FOR_TESTING)); | 44 nullptr, content::command_buffer_metrics::OFFSCREEN_CONTEXT_FOR_TESTING)); |
45 } | 45 } |
46 | 46 |
47 class ContextTestBase : public content::ContentBrowserTest { | 47 void OnEstablishedGpuChannel( |
| 48 const base::Closure& quit_closure, |
| 49 scoped_refptr<gpu::GpuChannelHost>* retvalue, |
| 50 scoped_refptr<gpu::GpuChannelHost> established_host) { |
| 51 if (retvalue) |
| 52 *retvalue = std::move(established_host); |
| 53 quit_closure.Run(); |
| 54 } |
| 55 |
| 56 class EstablishGpuChannelHelper { |
48 public: | 57 public: |
49 void SetUpOnMainThread() override { | 58 EstablishGpuChannelHelper() {} |
50 // This may leave the provider_ null in some cases, so tests need to early | 59 ~EstablishGpuChannelHelper() {} |
51 // out. | |
52 if (!content::BrowserGpuChannelHostFactory::CanUseForTesting()) | |
53 return; | |
54 | 60 |
| 61 scoped_refptr<gpu::GpuChannelHost> EstablishGpuChannelSyncRunLoop() { |
55 if (!content::BrowserGpuChannelHostFactory::instance()) | 62 if (!content::BrowserGpuChannelHostFactory::instance()) |
56 content::BrowserGpuChannelHostFactory::Initialize(true); | 63 content::BrowserGpuChannelHostFactory::Initialize(true); |
57 | 64 |
58 content::BrowserGpuChannelHostFactory* factory = | 65 content::BrowserGpuChannelHostFactory* factory = |
59 content::BrowserGpuChannelHostFactory::instance(); | 66 content::BrowserGpuChannelHostFactory::instance(); |
60 CHECK(factory); | 67 CHECK(factory); |
61 base::RunLoop run_loop; | 68 base::RunLoop run_loop; |
62 factory->EstablishGpuChannel(kInitCause, run_loop.QuitClosure()); | 69 factory->EstablishGpuChannel( |
| 70 kInitCause, base::Bind(&OnEstablishedGpuChannel, run_loop.QuitClosure(), |
| 71 &gpu_channel_host_)); |
63 run_loop.Run(); | 72 run_loop.Run(); |
64 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host( | 73 return std::move(gpu_channel_host_); |
65 factory->GetGpuChannel()); | 74 } |
| 75 |
| 76 private: |
| 77 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host_; |
| 78 DISALLOW_COPY_AND_ASSIGN(EstablishGpuChannelHelper); |
| 79 }; |
| 80 |
| 81 class ContextTestBase : public content::ContentBrowserTest { |
| 82 public: |
| 83 void SetUpOnMainThread() override { |
| 84 // This may leave the provider_ null in some cases, so tests need to early |
| 85 // out. |
| 86 if (!content::BrowserGpuChannelHostFactory::CanUseForTesting()) |
| 87 return; |
| 88 |
| 89 EstablishGpuChannelHelper helper; |
| 90 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host = |
| 91 helper.EstablishGpuChannelSyncRunLoop(); |
66 CHECK(gpu_channel_host); | 92 CHECK(gpu_channel_host); |
67 | 93 |
68 provider_ = CreateContext(std::move(gpu_channel_host)); | 94 provider_ = CreateContext(std::move(gpu_channel_host)); |
69 bool bound = provider_->BindToCurrentThread(); | 95 bool bound = provider_->BindToCurrentThread(); |
70 CHECK(bound); | 96 CHECK(bound); |
71 gl_ = provider_->ContextGL(); | 97 gl_ = provider_->ContextGL(); |
72 context_support_ = provider_->ContextSupport(); | 98 context_support_ = provider_->ContextSupport(); |
73 | 99 |
74 ContentBrowserTest::SetUpOnMainThread(); | 100 ContentBrowserTest::SetUpOnMainThread(); |
75 } | 101 } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 // Start all tests without a gpu channel so that the tests exercise a | 142 // Start all tests without a gpu channel so that the tests exercise a |
117 // consistent codepath. | 143 // consistent codepath. |
118 command_line->AppendSwitch(switches::kDisableGpuEarlyInit); | 144 command_line->AppendSwitch(switches::kDisableGpuEarlyInit); |
119 } | 145 } |
120 | 146 |
121 void OnContextLost(const base::Closure callback, int* counter) { | 147 void OnContextLost(const base::Closure callback, int* counter) { |
122 (*counter)++; | 148 (*counter)++; |
123 callback.Run(); | 149 callback.Run(); |
124 } | 150 } |
125 | 151 |
| 152 void Signal(bool* event, |
| 153 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host) { |
| 154 CHECK_EQ(*event, false); |
| 155 *event = true; |
| 156 gpu_channel_host_ = std::move(gpu_channel_host); |
| 157 } |
| 158 |
126 protected: | 159 protected: |
127 BrowserGpuChannelHostFactory* GetFactory() { | 160 BrowserGpuChannelHostFactory* GetFactory() { |
128 return BrowserGpuChannelHostFactory::instance(); | 161 return BrowserGpuChannelHostFactory::instance(); |
129 } | 162 } |
130 | 163 |
131 bool IsChannelEstablished() { | 164 bool IsChannelEstablished() { |
132 return GetFactory()->GetGpuChannel() != NULL; | 165 return gpu_channel_host_ && !gpu_channel_host_->IsLost(); |
133 } | 166 } |
134 | 167 |
135 void EstablishAndWait() { | 168 void EstablishAndWait() { |
136 base::RunLoop run_loop; | 169 EstablishGpuChannelHelper helper; |
137 GetFactory()->EstablishGpuChannel(kInitCause, run_loop.QuitClosure()); | 170 gpu_channel_host_ = helper.EstablishGpuChannelSyncRunLoop(); |
138 run_loop.Run(); | |
139 } | 171 } |
140 | 172 |
141 gpu::GpuChannelHost* GetGpuChannel() { return GetFactory()->GetGpuChannel(); } | 173 gpu::GpuChannelHost* GetGpuChannel() { return gpu_channel_host_.get(); } |
142 | 174 |
143 static void Signal(bool *event) { | 175 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host_; |
144 CHECK_EQ(*event, false); | |
145 *event = true; | |
146 } | |
147 }; | 176 }; |
148 | 177 |
149 // Test fails on Chromeos + Mac, flaky on Windows because UI Compositor | 178 // Test fails on Chromeos + Mac, flaky on Windows because UI Compositor |
150 // establishes a GPU channel. | 179 // establishes a GPU channel. |
151 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | 180 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
152 #define MAYBE_Basic Basic | 181 #define MAYBE_Basic Basic |
153 #else | 182 #else |
154 #define MAYBE_Basic DISABLED_Basic | 183 #define MAYBE_Basic DISABLED_Basic |
155 #endif | 184 #endif |
156 IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest, MAYBE_Basic) { | 185 IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest, MAYBE_Basic) { |
157 DCHECK(!IsChannelEstablished()); | 186 DCHECK(!IsChannelEstablished()); |
158 EstablishAndWait(); | 187 EstablishAndWait(); |
159 EXPECT_TRUE(GetGpuChannel() != NULL); | 188 EXPECT_TRUE(GetGpuChannel() != NULL); |
160 } | 189 } |
161 | 190 |
162 // Test fails on Chromeos + Mac, flaky on Windows because UI Compositor | 191 // Test fails on Chromeos + Mac, flaky on Windows because UI Compositor |
163 // establishes a GPU channel. | 192 // establishes a GPU channel. |
164 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | 193 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
165 #define MAYBE_EstablishAndTerminate EstablishAndTerminate | 194 #define MAYBE_EstablishAndTerminate EstablishAndTerminate |
166 #else | 195 #else |
167 #define MAYBE_EstablishAndTerminate DISABLED_EstablishAndTerminate | 196 #define MAYBE_EstablishAndTerminate DISABLED_EstablishAndTerminate |
168 #endif | 197 #endif |
169 IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest, | 198 IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest, |
170 MAYBE_EstablishAndTerminate) { | 199 MAYBE_EstablishAndTerminate) { |
171 DCHECK(!IsChannelEstablished()); | 200 DCHECK(!IsChannelEstablished()); |
172 base::RunLoop run_loop; | 201 base::RunLoop run_loop; |
173 GetFactory()->EstablishGpuChannel(kInitCause, run_loop.QuitClosure()); | 202 GetFactory()->EstablishGpuChannel( |
| 203 kInitCause, |
| 204 base::Bind(&OnEstablishedGpuChannel, run_loop.QuitClosure(), nullptr)); |
174 GetFactory()->Terminate(); | 205 GetFactory()->Terminate(); |
175 | 206 |
176 // The callback should still trigger. | 207 // The callback should still trigger. |
177 run_loop.Run(); | 208 run_loop.Run(); |
178 } | 209 } |
179 | 210 |
180 #if !defined(OS_ANDROID) | 211 #if !defined(OS_ANDROID) |
181 // Test fails on Chromeos + Mac, flaky on Windows because UI Compositor | 212 // Test fails on Chromeos + Mac, flaky on Windows because UI Compositor |
182 // establishes a GPU channel. | 213 // establishes a GPU channel. |
183 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | 214 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
184 #define MAYBE_AlreadyEstablished AlreadyEstablished | 215 #define MAYBE_AlreadyEstablished AlreadyEstablished |
185 #else | 216 #else |
186 #define MAYBE_AlreadyEstablished DISABLED_AlreadyEstablished | 217 #define MAYBE_AlreadyEstablished DISABLED_AlreadyEstablished |
187 #endif | 218 #endif |
188 IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest, | 219 IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest, |
189 MAYBE_AlreadyEstablished) { | 220 MAYBE_AlreadyEstablished) { |
190 DCHECK(!IsChannelEstablished()); | 221 DCHECK(!IsChannelEstablished()); |
191 scoped_refptr<gpu::GpuChannelHost> gpu_channel = | 222 scoped_refptr<gpu::GpuChannelHost> gpu_channel = |
192 GetFactory()->EstablishGpuChannelSync(kInitCause); | 223 GetFactory()->EstablishGpuChannelSync(kInitCause); |
193 | 224 |
194 // Expect established callback immediately. | 225 // Expect established callback immediately. |
195 bool event = false; | 226 bool event = false; |
196 GetFactory()->EstablishGpuChannel( | 227 GetFactory()->EstablishGpuChannel( |
197 kInitCause, | 228 kInitCause, base::Bind(&BrowserGpuChannelHostFactoryTest::Signal, |
198 base::Bind(&BrowserGpuChannelHostFactoryTest::Signal, &event)); | 229 base::Unretained(this), &event)); |
199 EXPECT_TRUE(event); | 230 EXPECT_TRUE(event); |
200 EXPECT_EQ(gpu_channel.get(), GetGpuChannel()); | 231 EXPECT_EQ(gpu_channel.get(), GetGpuChannel()); |
201 } | 232 } |
202 #endif | 233 #endif |
203 | 234 |
204 // Test fails on Windows because GPU Channel set-up fails. | 235 // Test fails on Windows because GPU Channel set-up fails. |
205 #if !defined(OS_WIN) | 236 #if !defined(OS_WIN) |
206 #define MAYBE_GrContextKeepsGpuChannelAlive GrContextKeepsGpuChannelAlive | 237 #define MAYBE_GrContextKeepsGpuChannelAlive GrContextKeepsGpuChannelAlive |
207 #else | 238 #else |
208 #define MAYBE_GrContextKeepsGpuChannelAlive \ | 239 #define MAYBE_GrContextKeepsGpuChannelAlive \ |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 SkPaint greenFillPaint; | 282 SkPaint greenFillPaint; |
252 greenFillPaint.setColor(SK_ColorGREEN); | 283 greenFillPaint.setColor(SK_ColorGREEN); |
253 greenFillPaint.setStyle(SkPaint::kFill_Style); | 284 greenFillPaint.setStyle(SkPaint::kFill_Style); |
254 // Passes by not crashing | 285 // Passes by not crashing |
255 surface->getCanvas()->drawRect(SkRect::MakeWH(100, 100), greenFillPaint); | 286 surface->getCanvas()->drawRect(SkRect::MakeWH(100, 100), greenFillPaint); |
256 } | 287 } |
257 | 288 |
258 // Test fails on Chromeos + Mac, flaky on Windows because UI Compositor | 289 // Test fails on Chromeos + Mac, flaky on Windows because UI Compositor |
259 // establishes a GPU channel. | 290 // establishes a GPU channel. |
260 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | 291 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
261 #define MAYBE_CrashAndRecover | 292 #define MAYBE_CrashAndRecover CrashAndRecover |
262 #else | 293 #else |
263 #define MAYBE_CrashAndRecover DISABLED_CrashAndRecover | 294 #define MAYBE_CrashAndRecover DISABLED_CrashAndRecover |
264 #endif | 295 #endif |
265 IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest, | 296 IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest, |
266 MAYBE_CrashAndRecover) { | 297 MAYBE_CrashAndRecover) { |
267 DCHECK(!IsChannelEstablished()); | 298 DCHECK(!IsChannelEstablished()); |
268 EstablishAndWait(); | 299 EstablishAndWait(); |
269 scoped_refptr<gpu::GpuChannelHost> host = GetGpuChannel(); | 300 scoped_refptr<gpu::GpuChannelHost> host = GetGpuChannel(); |
270 | 301 |
271 scoped_refptr<ContextProviderCommandBuffer> provider = | 302 scoped_refptr<ContextProviderCommandBuffer> provider = |
(...skipping 10 matching lines...) Expand all Loading... |
282 shim->SimulateCrash(); | 313 shim->SimulateCrash(); |
283 run_loop.Run(); | 314 run_loop.Run(); |
284 | 315 |
285 EXPECT_EQ(1, counter); | 316 EXPECT_EQ(1, counter); |
286 EXPECT_FALSE(IsChannelEstablished()); | 317 EXPECT_FALSE(IsChannelEstablished()); |
287 EstablishAndWait(); | 318 EstablishAndWait(); |
288 EXPECT_TRUE(IsChannelEstablished()); | 319 EXPECT_TRUE(IsChannelEstablished()); |
289 } | 320 } |
290 | 321 |
291 } // namespace content | 322 } // namespace content |
OLD | NEW |