Index: services/ui/gles2/command_buffer_driver.h |
diff --git a/services/ui/gles2/command_buffer_driver.h b/services/ui/gles2/command_buffer_driver.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d942b4f18c18a74c1e080c9599c238faf9e0fe0d |
--- /dev/null |
+++ b/services/ui/gles2/command_buffer_driver.h |
@@ -0,0 +1,173 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef SERVICES_UI_GLES2_COMMAND_BUFFER_DRIVER_H_ |
+#define SERVICES_UI_GLES2_COMMAND_BUFFER_DRIVER_H_ |
+ |
+#include <stdint.h> |
+ |
+#include <memory> |
+ |
+#include "base/callback.h" |
+#include "base/macros.h" |
+#include "base/memory/weak_ptr.h" |
+#include "base/single_thread_task_runner.h" |
+#include "base/threading/non_thread_safe.h" |
+#include "base/time/time.h" |
+#include "gpu/command_buffer/common/capabilities.h" |
+#include "gpu/command_buffer/common/command_buffer.h" |
+#include "gpu/command_buffer/common/command_buffer_id.h" |
+#include "gpu/command_buffer/common/constants.h" |
+#include "mojo/public/cpp/bindings/array.h" |
+#include "mojo/public/cpp/system/buffer.h" |
+#include "ui/gfx/buffer_types.h" |
+#include "ui/gfx/geometry/mojo/geometry.mojom.h" |
+#include "ui/gfx/geometry/size.h" |
+#include "ui/gfx/native_widget_types.h" |
+#include "ui/gfx/swap_result.h" |
+ |
+namespace gl { |
+class GLContext; |
+class GLSurface; |
+} |
+ |
+namespace gpu { |
+class CommandBufferService; |
+class CommandExecutor; |
+class SyncPointClient; |
+class SyncPointOrderData; |
+ |
+namespace gles2 { |
+class GLES2Decoder; |
+} // namespace gles2 |
+ |
+} // namespace gpu |
+ |
+namespace ui { |
+class NativePixmap; |
+} |
+ |
+namespace ui { |
+ |
+class GpuState; |
+ |
+// This class receives CommandBuffer messages on the same thread as the native |
+// viewport. |
+class CommandBufferDriver : base::NonThreadSafe { |
+ public: |
+ class Client { |
+ public: |
+ virtual ~Client(); |
+ virtual void DidLoseContext(uint32_t reason) = 0; |
+ virtual void UpdateVSyncParameters(const base::TimeTicks& timebase, |
+ const base::TimeDelta& interval) = 0; |
+ virtual void OnGpuCompletedSwapBuffers(gfx::SwapResult result) = 0; |
+ }; |
+ CommandBufferDriver(gpu::CommandBufferNamespace command_buffer_namespace, |
+ gpu::CommandBufferId command_buffer_id, |
+ gfx::AcceleratedWidget widget, |
+ scoped_refptr<GpuState> gpu_state); |
+ ~CommandBufferDriver(); |
+ |
+ // The class owning the CommandBufferDriver instance (e.g. CommandBufferLocal) |
+ // is itself the Client implementation so CommandBufferDriver does not own the |
+ // client. |
+ void set_client(Client* client) { client_ = client; } |
+ |
+ bool Initialize(mojo::ScopedSharedBufferHandle shared_state, |
+ mojo::Array<int32_t> attribs); |
+ void SetGetBuffer(int32_t buffer); |
+ void Flush(int32_t put_offset); |
+ void RegisterTransferBuffer(int32_t id, |
+ mojo::ScopedSharedBufferHandle transfer_buffer, |
+ uint32_t size); |
+ void DestroyTransferBuffer(int32_t id); |
+ void CreateImage(int32_t id, |
+ mojo::ScopedHandle memory_handle, |
+ int32_t type, |
+ const gfx::Size& size, |
+ int32_t format, |
+ int32_t internal_format); |
+ void CreateImageNativeOzone(int32_t id, |
+ int32_t type, |
+ gfx::Size size, |
+ gfx::BufferFormat format, |
+ uint32_t internal_format, |
+ ui::NativePixmap* pixmap); |
+ void DestroyImage(int32_t id); |
+ bool IsScheduled() const; |
+ bool HasUnprocessedCommands() const; |
+ gpu::Capabilities GetCapabilities() const; |
+ gpu::CommandBuffer::State GetLastState() const; |
+ gpu::CommandBufferNamespace GetNamespaceID() const { |
+ return command_buffer_namespace_; |
+ } |
+ gpu::CommandBufferId GetCommandBufferID() const { return command_buffer_id_; } |
+ gpu::SyncPointOrderData* sync_point_order_data() { |
+ return sync_point_order_data_.get(); |
+ } |
+ uint32_t GetUnprocessedOrderNum() const; |
+ uint32_t GetProcessedOrderNum() const; |
+ void SignalQuery(uint32_t query_id, const base::Closure& callback); |
+ |
+ private: |
+ bool MakeCurrent(); |
+ |
+ // Process pending queries and call |ScheduleDelayedWork| to schedule |
+ // processing of delayed work. |
+ void ProcessPendingAndIdleWork(); |
+ |
+ // Schedule processing of delayed work. This updates the time at which |
+ // delayed work should be processed. |process_delayed_work_time_| is |
+ // updated to current time + delay. Call this after processing some amount |
+ // of delayed work. |
+ void ScheduleDelayedWork(base::TimeDelta delay); |
+ |
+ // Poll the command buffer to execute work. |
+ void PollWork(); |
+ void PerformWork(); |
+ |
+ void DestroyDecoder(); |
+ |
+ // Callbacks: |
+ void OnUpdateVSyncParameters(const base::TimeTicks timebase, |
+ const base::TimeDelta interval); |
+ void OnFenceSyncRelease(uint64_t release); |
+ bool OnWaitFenceSync(gpu::CommandBufferNamespace namespace_id, |
+ gpu::CommandBufferId command_buffer_id, |
+ uint64_t release); |
+ void OnDescheduleUntilFinished(); |
+ void OnRescheduleAfterFinished(); |
+ void OnParseError(); |
+ void OnContextLost(uint32_t reason); |
+ void OnGpuCompletedSwapBuffers(gfx::SwapResult result); |
+ |
+ const gpu::CommandBufferNamespace command_buffer_namespace_; |
+ const gpu::CommandBufferId command_buffer_id_; |
+ gfx::AcceleratedWidget widget_; |
+ Client* client_; // NOT OWNED. |
+ std::unique_ptr<gpu::CommandBufferService> command_buffer_; |
+ std::unique_ptr<gpu::gles2::GLES2Decoder> decoder_; |
+ std::unique_ptr<gpu::CommandExecutor> executor_; |
+ scoped_refptr<gpu::SyncPointOrderData> sync_point_order_data_; |
+ std::unique_ptr<gpu::SyncPointClient> sync_point_client_; |
+ scoped_refptr<gl::GLContext> context_; |
+ scoped_refptr<gl::GLSurface> surface_; |
+ scoped_refptr<GpuState> gpu_state_; |
+ |
+ scoped_refptr<base::SingleThreadTaskRunner> context_lost_task_runner_; |
+ base::Callback<void(int32_t)> context_lost_callback_; |
+ |
+ base::TimeTicks process_delayed_work_time_; |
+ uint32_t previous_processed_num_; |
+ base::TimeTicks last_idle_time_; |
+ |
+ base::WeakPtrFactory<CommandBufferDriver> weak_factory_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CommandBufferDriver); |
+}; |
+ |
+} // namespace ui |
+ |
+#endif // COMPONENTS_GLES2_COMMAND_BUFFER_DRIVER_H_ |