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
3 // found in the LICENSE file.
5 #include "base/command_line.h"
6 #include "base/run_loop.h"
7 #include "content/browser/gpu/browser_gpu_channel_host_factory.h"
8 #include "content/browser/gpu/gpu_process_host_ui_shim.h"
9 #include "content/common/gpu/client/context_provider_command_buffer.h"
10 #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
11 #include "content/common/gpu/gpu_process_launch_causes.h"
12 #include "content/public/browser/gpu_data_manager.h"
13 #include "content/public/common/content_switches.h"
14 #include "content/public/test/content_browser_test.h"
15 #include "ui/gl/gl_switches.h"
16 #include "webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h"
20 using content::WebGraphicsContext3DCommandBufferImpl
;
22 const content::CauseForGpuLaunch kInitCause
=
24 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE
;
26 class ContextTestBase
: public content::ContentBrowserTest
{
28 virtual void SetUpOnMainThread() OVERRIDE
{
29 if (!content::BrowserGpuChannelHostFactory::CanUseForTesting())
32 if (!content::BrowserGpuChannelHostFactory::instance())
33 content::BrowserGpuChannelHostFactory::Initialize(true);
35 content::BrowserGpuChannelHostFactory
* factory
=
36 content::BrowserGpuChannelHostFactory::instance();
38 scoped_refptr
<content::GpuChannelHost
> gpu_channel_host(
39 factory
->EstablishGpuChannelSync(kInitCause
));
41 WebGraphicsContext3DCommandBufferImpl::CreateOffscreenContext(
42 gpu_channel_host
.get(),
43 blink::WebGraphicsContext3D::Attributes(),
45 WebGraphicsContext3DCommandBufferImpl::SharedMemoryLimits(),
47 CHECK(context_
.get());
48 context_
->makeContextCurrent();
49 context_support_
= context_
->GetContextSupport();
50 ContentBrowserTest::SetUpOnMainThread();
53 virtual void TearDownOnMainThread() OVERRIDE
{
54 // Must delete the context first.
56 ContentBrowserTest::TearDownOnMainThread();
60 scoped_ptr
<content::WebGraphicsContext3DCommandBufferImpl
> context_
;
61 gpu::ContextSupport
* context_support_
;
66 // Include the shared tests.
67 #define CONTEXT_TEST_F IN_PROC_BROWSER_TEST_F
68 #include "content/common/gpu/client/gpu_context_tests.h"
72 class BrowserGpuChannelHostFactoryTest
: public ContentBrowserTest
{
74 virtual void SetUpOnMainThread() OVERRIDE
{
75 if (!BrowserGpuChannelHostFactory::CanUseForTesting())
78 // Start all tests without a gpu channel so that the tests exercise a
79 // consistent codepath.
80 if (!BrowserGpuChannelHostFactory::instance())
81 BrowserGpuChannelHostFactory::Initialize(false);
85 ContentBrowserTest::SetUpOnMainThread();
88 void OnContextLost(const base::Closure callback
, int* counter
) {
94 BrowserGpuChannelHostFactory
* GetFactory() {
95 return BrowserGpuChannelHostFactory::instance();
98 bool IsChannelEstablished() {
99 return GetFactory()->GetGpuChannel() != NULL
;
102 void EstablishAndWait() {
103 base::RunLoop run_loop
;
104 GetFactory()->EstablishGpuChannel(kInitCause
, run_loop
.QuitClosure());
108 GpuChannelHost
* GetGpuChannel() {
109 return GetFactory()->GetGpuChannel();
112 static void Signal(bool *event
) {
113 CHECK_EQ(*event
, false);
117 scoped_ptr
<WebGraphicsContext3DCommandBufferImpl
> CreateContext() {
118 return make_scoped_ptr(
119 WebGraphicsContext3DCommandBufferImpl::CreateOffscreenContext(
121 blink::WebGraphicsContext3D::Attributes(),
123 WebGraphicsContext3DCommandBufferImpl::SharedMemoryLimits(),
128 // Fails since UI Compositor establishes a GpuChannel.
129 IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest
, DISABLED_Basic
) {
130 DCHECK(!IsChannelEstablished());
132 EXPECT_TRUE(GetGpuChannel() != NULL
);
135 // Fails since UI Compositor establishes a GpuChannel.
136 IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest
,
137 DISABLED_EstablishAndTerminate
) {
138 DCHECK(!IsChannelEstablished());
139 base::RunLoop run_loop
;
140 GetFactory()->EstablishGpuChannel(kInitCause
, run_loop
.QuitClosure());
141 GetFactory()->Terminate();
143 // The callback should still trigger.
147 // Fails since UI Compositor establishes a GpuChannel.
148 IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest
,
149 DISABLED_AlreadyEstablished
) {
150 DCHECK(!IsChannelEstablished());
151 scoped_refptr
<GpuChannelHost
> gpu_channel
=
152 GetFactory()->EstablishGpuChannelSync(kInitCause
);
154 // Expect established callback immediately.
156 GetFactory()->EstablishGpuChannel(
158 base::Bind(&BrowserGpuChannelHostFactoryTest::Signal
, &event
));
160 EXPECT_EQ(gpu_channel
, GetGpuChannel());
163 // Fails since UI Compositor establishes a GpuChannel.
164 IN_PROC_BROWSER_TEST_F(BrowserGpuChannelHostFactoryTest
,
165 DISABLED_CrashAndRecover
) {
166 DCHECK(!IsChannelEstablished());
168 scoped_refptr
<GpuChannelHost
> host
= GetGpuChannel();
170 scoped_refptr
<ContextProviderCommandBuffer
> provider
=
171 ContextProviderCommandBuffer::Create(CreateContext(),
172 "BrowserGpuChannelHostFactoryTest");
173 base::RunLoop run_loop
;
175 provider
->SetLostContextCallback(
176 base::Bind(&BrowserGpuChannelHostFactoryTest::OnContextLost
,
177 base::Unretained(this), run_loop
.QuitClosure(), &counter
));
178 EXPECT_TRUE(provider
->BindToCurrentThread());
179 GpuProcessHostUIShim
* shim
=
180 GpuProcessHostUIShim::FromID(GetFactory()->GpuProcessHostId());
181 EXPECT_TRUE(shim
!= NULL
);
182 shim
->SimulateCrash();
185 EXPECT_EQ(1, counter
);
186 EXPECT_FALSE(IsChannelEstablished());
188 EXPECT_TRUE(IsChannelEstablished());
191 } // namespace content