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.
4
5 #include "cc/test/test_in_process_context_provider.h"
6
7 #include "base/lazy_instance.h"
8 #include "gpu/GLES2/gl2extchromium.h"
9 #include "gpu/command_buffer/client/gl_in_process_context.h"
10 #include "gpu/command_buffer/client/gles2_implementation.h"
11 #include "gpu/command_buffer/client/gles2_lib.h"
12 #include "gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h"
13 #include "third_party/khronos/GLES2/gl2.h"
14 #include "third_party/khronos/GLES2/gl2ext.h"
15 #include "third_party/skia/include/gpu/GrContext.h"
16 #include "third_party/skia/include/gpu/gl/GrGLInterface.h"
17 #include "ui/gfx/native_widget_types.h"
18
19 namespace cc {
20
21 // static
CreateTestInProcessContext()22 scoped_ptr<gpu::GLInProcessContext> CreateTestInProcessContext() {
23 const bool is_offscreen = true;
24 const bool share_resources = true;
25 gpu::GLInProcessContextAttribs attribs;
26 attribs.alpha_size = 8;
27 attribs.blue_size = 8;
28 attribs.green_size = 8;
29 attribs.red_size = 8;
30 attribs.depth_size = 24;
31 attribs.stencil_size = 8;
32 attribs.samples = 0;
33 attribs.sample_buffers = 0;
34 attribs.fail_if_major_perf_caveat = false;
35 gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu;
36
37 scoped_ptr<gpu::GLInProcessContext> context = make_scoped_ptr(
38 gpu::GLInProcessContext::Create(NULL,
39 NULL,
40 is_offscreen,
41 gfx::kNullAcceleratedWidget,
42 gfx::Size(1, 1),
43 NULL,
44 share_resources,
45 attribs,
46 gpu_preference));
47
48 DCHECK(context);
49 return context.Pass();
50 }
51
TestInProcessContextProvider()52 TestInProcessContextProvider::TestInProcessContextProvider()
53 : context_(CreateTestInProcessContext()) {}
54
~TestInProcessContextProvider()55 TestInProcessContextProvider::~TestInProcessContextProvider() {
56 }
57
BindToCurrentThread()58 bool TestInProcessContextProvider::BindToCurrentThread() { return true; }
59
ContextGL()60 gpu::gles2::GLES2Interface* TestInProcessContextProvider::ContextGL() {
61 return context_->GetImplementation();
62 }
63
ContextSupport()64 gpu::ContextSupport* TestInProcessContextProvider::ContextSupport() {
65 return context_->GetImplementation();
66 }
67
68 namespace {
69
70 // Singleton used to initialize and terminate the gles2 library.
71 class GLES2Initializer {
72 public:
GLES2Initializer()73 GLES2Initializer() { ::gles2::Initialize(); }
74
~GLES2Initializer()75 ~GLES2Initializer() { ::gles2::Terminate(); }
76
77 private:
78 DISALLOW_COPY_AND_ASSIGN(GLES2Initializer);
79 };
80
81 static base::LazyInstance<GLES2Initializer> g_gles2_initializer =
82 LAZY_INSTANCE_INITIALIZER;
83
84 } // namespace
85
BindGrContextCallback(const GrGLInterface * interface)86 static void BindGrContextCallback(const GrGLInterface* interface) {
87 TestInProcessContextProvider* context_provider =
88 reinterpret_cast<TestInProcessContextProvider*>(interface->fCallbackData);
89
90 gles2::SetGLContext(context_provider->ContextGL());
91 }
92
GrContext()93 class GrContext* TestInProcessContextProvider::GrContext() {
94 if (gr_context_)
95 return gr_context_.get();
96
97 // The GrGLInterface factory will make GL calls using the C GLES2 interface.
98 // Make sure the gles2 library is initialized first on exactly one thread.
99 g_gles2_initializer.Get();
100 gles2::SetGLContext(ContextGL());
101
102 skia::RefPtr<GrGLInterface> interface =
103 skia::AdoptRef(skia_bindings::CreateCommandBufferSkiaGLBinding());
104 interface->fCallback = BindGrContextCallback;
105 interface->fCallbackData = reinterpret_cast<GrGLInterfaceCallbackData>(this);
106
107 gr_context_ = skia::AdoptRef(GrContext::Create(
108 kOpenGL_GrBackend, reinterpret_cast<GrBackendContext>(interface.get())));
109
110 return gr_context_.get();
111 }
112
113 ContextProvider::Capabilities
ContextCapabilities()114 TestInProcessContextProvider::ContextCapabilities() {
115 return ContextProvider::Capabilities();
116 }
117
IsContextLost()118 bool TestInProcessContextProvider::IsContextLost() { return false; }
119
VerifyContexts()120 void TestInProcessContextProvider::VerifyContexts() {}
121
DeleteCachedResources()122 void TestInProcessContextProvider::DeleteCachedResources() {
123 if (gr_context_)
124 gr_context_->freeGpuResources();
125 }
126
DestroyedOnMainThread()127 bool TestInProcessContextProvider::DestroyedOnMainThread() { return false; }
128
SetLostContextCallback(const LostContextCallback & lost_context_callback)129 void TestInProcessContextProvider::SetLostContextCallback(
130 const LostContextCallback& lost_context_callback) {}
131
SetMemoryPolicyChangedCallback(const MemoryPolicyChangedCallback & memory_policy_changed_callback)132 void TestInProcessContextProvider::SetMemoryPolicyChangedCallback(
133 const MemoryPolicyChangedCallback& memory_policy_changed_callback) {}
134
135 } // namespace cc
136