in_process_command_buffer.h revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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#ifndef GPU_COMMAND_BUFFER_SERVICE_IN_PROCESS_COMMAND_BUFFER_H_ 6#define GPU_COMMAND_BUFFER_SERVICE_IN_PROCESS_COMMAND_BUFFER_H_ 7 8#include <vector> 9 10#include "base/callback.h" 11#include "base/compiler_specific.h" 12#include "base/memory/ref_counted.h" 13#include "base/memory/scoped_ptr.h" 14#include "base/memory/weak_ptr.h" 15#include "base/synchronization/lock.h" 16#include "base/synchronization/waitable_event.h" 17#include "gpu/command_buffer/common/command_buffer.h" 18#include "gpu/command_buffer/common/gpu_control.h" 19#include "gpu/gpu_export.h" 20#include "ui/gfx/gpu_memory_buffer.h" 21#include "ui/gfx/native_widget_types.h" 22#include "ui/gl/gl_surface.h" 23#include "ui/gl/gpu_preference.h" 24 25namespace base { 26class SequenceChecker; 27} 28 29namespace gfx { 30class GLContext; 31class GLSurface; 32class Size; 33} 34 35#if defined(OS_ANDROID) 36namespace gfx { 37class SurfaceTexture; 38} 39namespace gpu { 40class StreamTextureManagerInProcess; 41} 42#endif 43 44namespace gpu { 45 46namespace gles2 { 47class GLES2Decoder; 48} 49 50class GpuMemoryBufferFactory; 51class GpuScheduler; 52class TransferBufferManagerInterface; 53 54// This class provides a thread-safe interface to the global GPU service (for 55// example GPU thread) when being run in single process mode. 56// However, the behavior for accessing one context (i.e. one instance of this 57// class) from different client threads is undefined. 58class GPU_EXPORT InProcessCommandBuffer : public CommandBuffer, 59 public GpuControl { 60 public: 61 InProcessCommandBuffer(); 62 virtual ~InProcessCommandBuffer(); 63 64 // Used to override the GPU thread with explicit scheduling. 65 // (By default an internal GPU thread will be spawned to handle all GL work 66 // and the two functions are unused.) 67 // The callback will be called from different client threads. After the 68 // callback is issued, the client is expected to eventually call 69 // ProcessGpuWorkOnCurrentThread(). The latter cannot be called from different 70 // threads. 71 // The callback needs to be set before any context is created. 72 static void SetScheduleCallback(const base::Closure& callback); 73 static void ProcessGpuWorkOnCurrentThread(); 74 75 static void EnableVirtualizedContext(); 76 static void SetGpuMemoryBufferFactory(GpuMemoryBufferFactory* factory); 77 78 // If |surface| is not NULL, use it directly; in this case, the command 79 // buffer gpu thread must be the same as the client thread. Otherwise create 80 // a new GLSurface. 81 bool Initialize(scoped_refptr<gfx::GLSurface> surface, 82 bool is_offscreen, 83 bool share_resources, 84 gfx::AcceleratedWidget window, 85 const gfx::Size& size, 86 const std::vector<int32>& attribs, 87 gfx::GpuPreference gpu_preference, 88 const base::Closure& context_lost_callback, 89 unsigned int share_group_id); 90 void Destroy(); 91 92 // CommandBuffer implementation: 93 virtual bool Initialize() OVERRIDE; 94 virtual State GetState() OVERRIDE; 95 virtual State GetLastState() OVERRIDE; 96 virtual int32 GetLastToken() OVERRIDE; 97 virtual void Flush(int32 put_offset) OVERRIDE; 98 virtual State FlushSync(int32 put_offset, int32 last_known_get) OVERRIDE; 99 virtual void SetGetBuffer(int32 shm_id) OVERRIDE; 100 virtual void SetGetOffset(int32 get_offset) OVERRIDE; 101 virtual gpu::Buffer CreateTransferBuffer(size_t size, int32* id) OVERRIDE; 102 virtual void DestroyTransferBuffer(int32 id) OVERRIDE; 103 virtual gpu::Buffer GetTransferBuffer(int32 id) OVERRIDE; 104 virtual void SetToken(int32 token) OVERRIDE; 105 virtual void SetParseError(gpu::error::Error error) OVERRIDE; 106 virtual void SetContextLostReason( 107 gpu::error::ContextLostReason reason) OVERRIDE; 108 virtual gpu::error::Error GetLastError() OVERRIDE; 109 110 // GpuControl implementation: 111 virtual bool SupportsGpuMemoryBuffer() OVERRIDE; 112 virtual gfx::GpuMemoryBuffer* CreateGpuMemoryBuffer( 113 size_t width, 114 size_t height, 115 unsigned internalformat, 116 int32* id) OVERRIDE; 117 virtual void DestroyGpuMemoryBuffer(int32 id) OVERRIDE; 118 virtual bool GenerateMailboxNames(unsigned num, 119 std::vector<gpu::Mailbox>* names) OVERRIDE; 120 virtual uint32 InsertSyncPoint() OVERRIDE; 121 virtual void SignalSyncPoint(uint32 sync_point, 122 const base::Closure& callback) OVERRIDE; 123 virtual void SignalQuery(uint32 query, 124 const base::Closure& callback) OVERRIDE; 125 virtual void SendManagedMemoryStats(const gpu::ManagedMemoryStats& stats) 126 OVERRIDE; 127 128 // The serializer interface to the GPU service (i.e. thread). 129 class SchedulerClient { 130 public: 131 virtual ~SchedulerClient() {} 132 133 // Queues a task to run as soon as possible. 134 virtual void QueueTask(const base::Closure& task) = 0; 135 136 // Schedules |callback| to run at an appropriate time for performing idle 137 // work. 138 virtual void ScheduleIdleWork(const base::Closure& task) = 0; 139 }; 140 141#if defined(OS_ANDROID) 142 scoped_refptr<gfx::SurfaceTexture> GetSurfaceTexture( 143 uint32 stream_id); 144#endif 145 146 private: 147 bool InitializeOnGpuThread(bool is_offscreen, 148 gfx::AcceleratedWidget window, 149 const gfx::Size& size, 150 const std::vector<int32>& attribs, 151 gfx::GpuPreference gpu_preference); 152 bool DestroyOnGpuThread(); 153 void FlushOnGpuThread(int32 put_offset); 154 bool MakeCurrent(); 155 bool IsContextLost(); 156 base::Closure WrapCallback(const base::Closure& callback); 157 State GetStateFast(); 158 void QueueTask(const base::Closure& task) { queue_->QueueTask(task); } 159 void CheckSequencedThread(); 160 161 // Callbacks: 162 void OnContextLost(); 163 void OnResizeView(gfx::Size size, float scale_factor); 164 bool GetBufferChanged(int32 transfer_buffer_id); 165 void PumpCommands(); 166 void ScheduleMoreIdleWork(); 167 168 // Members accessed on the gpu thread (possibly with the exception of 169 // creation): 170 bool context_lost_; 171 bool share_resources_; 172 scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_; 173 scoped_ptr<GpuScheduler> gpu_scheduler_; 174 scoped_ptr<gles2::GLES2Decoder> decoder_; 175 scoped_refptr<gfx::GLContext> context_; 176 scoped_refptr<gfx::GLSurface> surface_; 177 base::Closure context_lost_callback_; 178 unsigned int share_group_id_; 179 180 // Members accessed on the client thread: 181 State last_state_; 182 int32 last_put_offset_; 183 bool supports_gpu_memory_buffer_; 184 185 // Accessed on both threads: 186 scoped_ptr<CommandBuffer> command_buffer_; 187 base::Lock command_buffer_lock_; 188 base::WaitableEvent flush_event_; 189 scoped_ptr<SchedulerClient> queue_; 190 State state_after_last_flush_; 191 base::Lock state_after_last_flush_lock_; 192 scoped_ptr<GpuControl> gpu_control_; 193 194#if defined(OS_ANDROID) 195 scoped_refptr<StreamTextureManagerInProcess> stream_texture_manager_; 196#endif 197 198 // Only used with explicit scheduling and the gpu thread is the same as 199 // the client thread. 200 scoped_ptr<base::SequenceChecker> sequence_checker_; 201 202 base::WeakPtr<InProcessCommandBuffer> gpu_thread_weak_ptr_; 203 base::WeakPtrFactory<InProcessCommandBuffer> gpu_thread_weak_ptr_factory_; 204 205 DISALLOW_COPY_AND_ASSIGN(InProcessCommandBuffer); 206}; 207 208} // namespace gpu 209 210#endif // GPU_COMMAND_BUFFER_SERVICE_IN_PROCESS_COMMAND_BUFFER_H_ 211