| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef GPU_COMMAND_BUFFER_SERVICE_IN_PROCESS_COMMAND_BUFFER_H_ | 5 #ifndef GPU_COMMAND_BUFFER_SERVICE_IN_PROCESS_COMMAND_BUFFER_H_ |
| 6 #define GPU_COMMAND_BUFFER_SERVICE_IN_PROCESS_COMMAND_BUFFER_H_ | 6 #define GPU_COMMAND_BUFFER_SERVICE_IN_PROCESS_COMMAND_BUFFER_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/atomic_sequence_num.h" |
| 11 #include "base/callback.h" | 12 #include "base/callback.h" |
| 12 #include "base/compiler_specific.h" | 13 #include "base/compiler_specific.h" |
| 13 #include "base/containers/scoped_ptr_hash_map.h" | 14 #include "base/containers/scoped_ptr_hash_map.h" |
| 14 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
| 15 #include "base/memory/scoped_ptr.h" | 16 #include "base/memory/scoped_ptr.h" |
| 16 #include "base/memory/weak_ptr.h" | 17 #include "base/memory/weak_ptr.h" |
| 17 #include "base/synchronization/lock.h" | 18 #include "base/synchronization/lock.h" |
| 18 #include "base/synchronization/waitable_event.h" | 19 #include "base/synchronization/waitable_event.h" |
| 19 #include "gpu/command_buffer/client/gpu_control.h" | 20 #include "gpu/command_buffer/client/gpu_control.h" |
| 20 #include "gpu/command_buffer/common/command_buffer.h" | 21 #include "gpu/command_buffer/common/command_buffer.h" |
| 21 #include "gpu/gpu_export.h" | 22 #include "gpu/gpu_export.h" |
| 23 #include "ui/gfx/gpu_memory_buffer.h" |
| 22 #include "ui/gfx/native_widget_types.h" | 24 #include "ui/gfx/native_widget_types.h" |
| 23 #include "ui/gl/gl_surface.h" | 25 #include "ui/gl/gl_surface.h" |
| 24 #include "ui/gl/gpu_preference.h" | 26 #include "ui/gl/gpu_preference.h" |
| 25 | 27 |
| 26 namespace base { | 28 namespace base { |
| 27 class SequenceChecker; | 29 class SequenceChecker; |
| 28 } | 30 } |
| 29 | 31 |
| 30 namespace gfx { | 32 namespace gfx { |
| 31 class GLContext; | 33 class GLContext; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 45 | 47 |
| 46 namespace gpu { | 48 namespace gpu { |
| 47 | 49 |
| 48 namespace gles2 { | 50 namespace gles2 { |
| 49 class GLES2Decoder; | 51 class GLES2Decoder; |
| 50 class MailboxManager; | 52 class MailboxManager; |
| 51 class ShaderTranslatorCache; | 53 class ShaderTranslatorCache; |
| 52 } | 54 } |
| 53 | 55 |
| 54 class CommandBufferServiceBase; | 56 class CommandBufferServiceBase; |
| 57 class GpuMemoryBufferManager; |
| 55 class GpuScheduler; | 58 class GpuScheduler; |
| 59 class ImageFactory; |
| 56 class TransferBufferManagerInterface; | 60 class TransferBufferManagerInterface; |
| 57 | 61 |
| 58 // This class provides a thread-safe interface to the global GPU service (for | 62 // This class provides a thread-safe interface to the global GPU service (for |
| 59 // example GPU thread) when being run in single process mode. | 63 // example GPU thread) when being run in single process mode. |
| 60 // However, the behavior for accessing one context (i.e. one instance of this | 64 // However, the behavior for accessing one context (i.e. one instance of this |
| 61 // class) from different client threads is undefined. | 65 // class) from different client threads is undefined. |
| 62 class GPU_EXPORT InProcessCommandBuffer : public CommandBuffer, | 66 class GPU_EXPORT InProcessCommandBuffer : public CommandBuffer, |
| 63 public GpuControl { | 67 public GpuControl { |
| 64 public: | 68 public: |
| 65 class Service; | 69 class Service; |
| 66 explicit InProcessCommandBuffer(const scoped_refptr<Service>& service); | 70 explicit InProcessCommandBuffer(const scoped_refptr<Service>& service); |
| 67 ~InProcessCommandBuffer() override; | 71 ~InProcessCommandBuffer() override; |
| 68 | 72 |
| 69 // If |surface| is not NULL, use it directly; in this case, the command | 73 // If |surface| is not NULL, use it directly; in this case, the command |
| 70 // buffer gpu thread must be the same as the client thread. Otherwise create | 74 // buffer gpu thread must be the same as the client thread. Otherwise create |
| 71 // a new GLSurface. | 75 // a new GLSurface. |
| 72 bool Initialize(scoped_refptr<gfx::GLSurface> surface, | 76 bool Initialize(scoped_refptr<gfx::GLSurface> surface, |
| 73 bool is_offscreen, | 77 bool is_offscreen, |
| 74 gfx::AcceleratedWidget window, | 78 gfx::AcceleratedWidget window, |
| 75 const gfx::Size& size, | 79 const gfx::Size& size, |
| 76 const std::vector<int32>& attribs, | 80 const std::vector<int32>& attribs, |
| 77 gfx::GpuPreference gpu_preference, | 81 gfx::GpuPreference gpu_preference, |
| 78 const base::Closure& context_lost_callback, | 82 const base::Closure& context_lost_callback, |
| 79 InProcessCommandBuffer* share_group); | 83 InProcessCommandBuffer* share_group, |
| 84 GpuMemoryBufferManager* gpu_memory_buffer_manager, |
| 85 ImageFactory* image_factory); |
| 80 void Destroy(); | 86 void Destroy(); |
| 81 | 87 |
| 82 // CommandBuffer implementation: | 88 // CommandBuffer implementation: |
| 83 bool Initialize() override; | 89 bool Initialize() override; |
| 84 State GetLastState() override; | 90 State GetLastState() override; |
| 85 int32 GetLastToken() override; | 91 int32 GetLastToken() override; |
| 86 void Flush(int32 put_offset) override; | 92 void Flush(int32 put_offset) override; |
| 87 void WaitForTokenInRange(int32 start, int32 end) override; | 93 void WaitForTokenInRange(int32 start, int32 end) override; |
| 88 void WaitForGetOffsetInRange(int32 start, int32 end) override; | 94 void WaitForGetOffsetInRange(int32 start, int32 end) override; |
| 89 void SetGetBuffer(int32 shm_id) override; | 95 void SetGetBuffer(int32 shm_id) override; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 | 150 |
| 145 private: | 151 private: |
| 146 struct InitializeOnGpuThreadParams { | 152 struct InitializeOnGpuThreadParams { |
| 147 bool is_offscreen; | 153 bool is_offscreen; |
| 148 gfx::AcceleratedWidget window; | 154 gfx::AcceleratedWidget window; |
| 149 const gfx::Size& size; | 155 const gfx::Size& size; |
| 150 const std::vector<int32>& attribs; | 156 const std::vector<int32>& attribs; |
| 151 gfx::GpuPreference gpu_preference; | 157 gfx::GpuPreference gpu_preference; |
| 152 gpu::Capabilities* capabilities; // Ouptut. | 158 gpu::Capabilities* capabilities; // Ouptut. |
| 153 InProcessCommandBuffer* context_group; | 159 InProcessCommandBuffer* context_group; |
| 160 ImageFactory* image_factory; |
| 154 | 161 |
| 155 InitializeOnGpuThreadParams(bool is_offscreen, | 162 InitializeOnGpuThreadParams(bool is_offscreen, |
| 156 gfx::AcceleratedWidget window, | 163 gfx::AcceleratedWidget window, |
| 157 const gfx::Size& size, | 164 const gfx::Size& size, |
| 158 const std::vector<int32>& attribs, | 165 const std::vector<int32>& attribs, |
| 159 gfx::GpuPreference gpu_preference, | 166 gfx::GpuPreference gpu_preference, |
| 160 gpu::Capabilities* capabilities, | 167 gpu::Capabilities* capabilities, |
| 161 InProcessCommandBuffer* share_group) | 168 InProcessCommandBuffer* share_group, |
| 169 ImageFactory* image_factory) |
| 162 : is_offscreen(is_offscreen), | 170 : is_offscreen(is_offscreen), |
| 163 window(window), | 171 window(window), |
| 164 size(size), | 172 size(size), |
| 165 attribs(attribs), | 173 attribs(attribs), |
| 166 gpu_preference(gpu_preference), | 174 gpu_preference(gpu_preference), |
| 167 capabilities(capabilities), | 175 capabilities(capabilities), |
| 168 context_group(share_group) {} | 176 context_group(share_group), |
| 177 image_factory(image_factory) {} |
| 169 }; | 178 }; |
| 170 | 179 |
| 171 bool InitializeOnGpuThread(const InitializeOnGpuThreadParams& params); | 180 bool InitializeOnGpuThread(const InitializeOnGpuThreadParams& params); |
| 172 bool DestroyOnGpuThread(); | 181 bool DestroyOnGpuThread(); |
| 173 void FlushOnGpuThread(int32 put_offset); | 182 void FlushOnGpuThread(int32 put_offset); |
| 174 void ScheduleIdleWorkOnGpuThread(); | 183 void ScheduleIdleWorkOnGpuThread(); |
| 175 uint32 CreateStreamTextureOnGpuThread(uint32 client_texture_id); | 184 uint32 CreateStreamTextureOnGpuThread(uint32 client_texture_id); |
| 176 bool MakeCurrent(); | 185 bool MakeCurrent(); |
| 177 base::Closure WrapCallback(const base::Closure& callback); | 186 base::Closure WrapCallback(const base::Closure& callback); |
| 178 State GetStateFast(); | 187 State GetStateFast(); |
| 179 void QueueTask(const base::Closure& task) { service_->ScheduleTask(task); } | 188 void QueueTask(const base::Closure& task) { service_->ScheduleTask(task); } |
| 180 void CheckSequencedThread(); | 189 void CheckSequencedThread(); |
| 181 void RetireSyncPointOnGpuThread(uint32 sync_point); | 190 void RetireSyncPointOnGpuThread(uint32 sync_point); |
| 182 void SignalSyncPointOnGpuThread(uint32 sync_point, | 191 void SignalSyncPointOnGpuThread(uint32 sync_point, |
| 183 const base::Closure& callback); | 192 const base::Closure& callback); |
| 184 bool WaitSyncPointOnGpuThread(uint32 sync_point); | 193 bool WaitSyncPointOnGpuThread(uint32 sync_point); |
| 185 void SignalQueryOnGpuThread(unsigned query_id, const base::Closure& callback); | 194 void SignalQueryOnGpuThread(unsigned query_id, const base::Closure& callback); |
| 186 void DestroyTransferBufferOnGpuThread(int32 id); | 195 void DestroyTransferBufferOnGpuThread(int32 id); |
| 196 void CreateImageOnGpuThread(int32 id, |
| 197 const gfx::GpuMemoryBufferHandle& handle, |
| 198 const gfx::Size& size, |
| 199 gfx::GpuMemoryBuffer::Format format, |
| 200 uint32 internalformat); |
| 201 void DestroyImageOnGpuThread(int32 id); |
| 187 | 202 |
| 188 // Callbacks: | 203 // Callbacks: |
| 189 void OnContextLost(); | 204 void OnContextLost(); |
| 190 void OnResizeView(gfx::Size size, float scale_factor); | 205 void OnResizeView(gfx::Size size, float scale_factor); |
| 191 bool GetBufferChanged(int32 transfer_buffer_id); | 206 bool GetBufferChanged(int32 transfer_buffer_id); |
| 192 void PumpCommands(); | 207 void PumpCommands(); |
| 193 void PerformIdleWork(); | 208 void PerformIdleWork(); |
| 194 | 209 |
| 195 static scoped_refptr<Service> GetDefaultService(); | 210 static scoped_refptr<Service> GetDefaultService(); |
| 196 | 211 |
| 197 // Members accessed on the gpu thread (possibly with the exception of | 212 // Members accessed on the gpu thread (possibly with the exception of |
| 198 // creation): | 213 // creation): |
| 199 bool context_lost_; | 214 bool context_lost_; |
| 200 scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_; | 215 scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_; |
| 201 scoped_ptr<GpuScheduler> gpu_scheduler_; | 216 scoped_ptr<GpuScheduler> gpu_scheduler_; |
| 202 scoped_ptr<gles2::GLES2Decoder> decoder_; | 217 scoped_ptr<gles2::GLES2Decoder> decoder_; |
| 203 scoped_refptr<gfx::GLContext> context_; | 218 scoped_refptr<gfx::GLContext> context_; |
| 204 scoped_refptr<gfx::GLSurface> surface_; | 219 scoped_refptr<gfx::GLSurface> surface_; |
| 205 base::Closure context_lost_callback_; | 220 base::Closure context_lost_callback_; |
| 206 bool idle_work_pending_; // Used to throttle PerformIdleWork. | 221 bool idle_work_pending_; // Used to throttle PerformIdleWork. |
| 222 ImageFactory* image_factory_; |
| 207 | 223 |
| 208 // Members accessed on the client thread: | 224 // Members accessed on the client thread: |
| 209 State last_state_; | 225 State last_state_; |
| 210 int32 last_put_offset_; | 226 int32 last_put_offset_; |
| 211 gpu::Capabilities capabilities_; | 227 gpu::Capabilities capabilities_; |
| 228 GpuMemoryBufferManager* gpu_memory_buffer_manager_; |
| 229 base::AtomicSequenceNumber next_image_id_; |
| 212 | 230 |
| 213 // Accessed on both threads: | 231 // Accessed on both threads: |
| 214 scoped_ptr<CommandBufferServiceBase> command_buffer_; | 232 scoped_ptr<CommandBufferServiceBase> command_buffer_; |
| 215 base::Lock command_buffer_lock_; | 233 base::Lock command_buffer_lock_; |
| 216 base::WaitableEvent flush_event_; | 234 base::WaitableEvent flush_event_; |
| 217 scoped_refptr<Service> service_; | 235 scoped_refptr<Service> service_; |
| 218 State state_after_last_flush_; | 236 State state_after_last_flush_; |
| 219 base::Lock state_after_last_flush_lock_; | 237 base::Lock state_after_last_flush_lock_; |
| 220 scoped_refptr<gfx::GLShareGroup> gl_share_group_; | 238 scoped_refptr<gfx::GLShareGroup> gl_share_group_; |
| 221 | 239 |
| 222 #if defined(OS_ANDROID) | 240 #if defined(OS_ANDROID) |
| 223 scoped_ptr<StreamTextureManagerInProcess> stream_texture_manager_; | 241 scoped_ptr<StreamTextureManagerInProcess> stream_texture_manager_; |
| 224 #endif | 242 #endif |
| 225 | 243 |
| 226 // Only used with explicit scheduling and the gpu thread is the same as | 244 // Only used with explicit scheduling and the gpu thread is the same as |
| 227 // the client thread. | 245 // the client thread. |
| 228 scoped_ptr<base::SequenceChecker> sequence_checker_; | 246 scoped_ptr<base::SequenceChecker> sequence_checker_; |
| 229 | 247 |
| 230 base::WeakPtr<InProcessCommandBuffer> gpu_thread_weak_ptr_; | 248 base::WeakPtr<InProcessCommandBuffer> gpu_thread_weak_ptr_; |
| 231 base::WeakPtrFactory<InProcessCommandBuffer> gpu_thread_weak_ptr_factory_; | 249 base::WeakPtrFactory<InProcessCommandBuffer> gpu_thread_weak_ptr_factory_; |
| 232 | 250 |
| 233 DISALLOW_COPY_AND_ASSIGN(InProcessCommandBuffer); | 251 DISALLOW_COPY_AND_ASSIGN(InProcessCommandBuffer); |
| 234 }; | 252 }; |
| 235 | 253 |
| 236 } // namespace gpu | 254 } // namespace gpu |
| 237 | 255 |
| 238 #endif // GPU_COMMAND_BUFFER_SERVICE_IN_PROCESS_COMMAND_BUFFER_H_ | 256 #endif // GPU_COMMAND_BUFFER_SERVICE_IN_PROCESS_COMMAND_BUFFER_H_ |
| OLD | NEW |