• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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