• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 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 #ifndef ANDROID_WEBVIEW_BROWSER_DEFERRED_GPU_COMMAND_SERVICE_H_
6 #define ANDROID_WEBVIEW_BROWSER_DEFERRED_GPU_COMMAND_SERVICE_H_
7 
8 #include <queue>
9 #include <utility>
10 
11 #include "base/lazy_instance.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/threading/thread_local.h"
14 #include "base/time/time.h"
15 #include "gpu/command_buffer/service/in_process_command_buffer.h"
16 
17 namespace android_webview {
18 
19 class ScopedAllowGL {
20  public:
21   ScopedAllowGL();
22   ~ScopedAllowGL();
23 
24   static bool IsAllowed();
25 
26  private:
27   static base::LazyInstance<base::ThreadLocalBoolean> allow_gl;
28 
29   DISALLOW_COPY_AND_ASSIGN(ScopedAllowGL);
30 };
31 
32 class DeferredGpuCommandService
33     : public gpu::InProcessCommandBuffer::Service,
34       public base::RefCountedThreadSafe<DeferredGpuCommandService> {
35  public:
36   static void SetInstance();
37   static DeferredGpuCommandService* GetInstance();
38 
39   virtual void ScheduleTask(const base::Closure& task) OVERRIDE;
40   virtual void ScheduleIdleWork(const base::Closure& task) OVERRIDE;
41   virtual bool UseVirtualizedGLContexts() OVERRIDE;
42   virtual scoped_refptr<gpu::gles2::ShaderTranslatorCache>
43       shader_translator_cache() OVERRIDE;
44 
45   void RunTasks();
46   // If |is_idle| is false, this will only run older idle tasks.
47   void PerformIdleWork(bool is_idle);
48   // Flush the idle queue until it is empty. This is different from
49   // PerformIdleWork(is_idle = true), which does not run any newly scheduled
50   // idle tasks during the idle run.
51   void PerformAllIdleWork();
52 
53   virtual void AddRef() const OVERRIDE;
54   virtual void Release() const OVERRIDE;
55 
56  protected:
57   virtual ~DeferredGpuCommandService();
58   friend class base::RefCountedThreadSafe<DeferredGpuCommandService>;
59 
60  private:
61   friend class ScopedAllowGL;
62   static void RequestProcessGL();
63 
64   DeferredGpuCommandService();
65   size_t IdleQueueSize();
66 
67   base::Lock tasks_lock_;
68   std::queue<base::Closure> tasks_;
69   std::queue<std::pair<base::Time, base::Closure> > idle_tasks_;
70 
71   scoped_refptr<gpu::gles2::ShaderTranslatorCache> shader_translator_cache_;
72   DISALLOW_COPY_AND_ASSIGN(DeferredGpuCommandService);
73 };
74 
75 }  // namespace android_webview
76 
77 #endif  // ANDROID_WEBVIEW_BROWSER_DEFERRED_GPU_COMMAND_SERVICE_H_
78