| // Copyright 2019 The Chromium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef GPU_COMMAND_BUFFER_SERVICE_GPU_TASK_SCHEDULER_HELPER_H_ | |
| #define GPU_COMMAND_BUFFER_SERVICE_GPU_TASK_SCHEDULER_HELPER_H_ | |
| #include <vector> | |
| #include "base/functional/callback.h" | |
| #include "base/memory/raw_ptr.h" | |
| #include "gpu/command_buffer/common/sync_token.h" | |
| #include "gpu/command_buffer/service/sequence_id.h" | |
| #include "gpu/command_buffer/service/task_graph.h" | |
| #include "gpu/gpu_gles2_export.h" | |
| namespace viz { | |
| class DisplayCompositorMemoryAndTaskController; | |
| } | |
| namespace gpu { | |
| class CommandBufferTaskExecutor; | |
| class CommandBufferHelper; | |
| class GLInProcessContext; | |
| class SingleTaskSequence; | |
| class InProcessCommandBuffer; | |
| // This class is a wrapper around a |gpu::SingleTaskSequence|. When we have | |
| // SkiaRenderer enabled, this should behave exactly like a | |
| // |gpu::SingleTaskSequence|. When we have GLRenderer with CommandBuffer, we | |
| // need to initialize this class with a |CommandBufferHelper|. This is because | |
| // when this class is used outside of actual CommandBuffer, we would need to | |
| // make sure the order of post tasks still corresponds to the order that tasks | |
| // are posted to the CommandBuffer. | |
| // This class is per display compositor. When this is used with SkiaRenderer, it | |
| // is created on SkiaOutputSurfaceImpl. Each user of this class would hold a | |
| // reference. | |
| class GPU_GLES2_EXPORT GpuTaskSchedulerHelper { | |
| public: | |
| // This constructor is only used for SkiaOutputSurface. | |
| explicit GpuTaskSchedulerHelper( | |
| std::unique_ptr<SingleTaskSequence> task_sequence); | |
| // This constructor is used for command buffer GLOutputSurface. | |
| explicit GpuTaskSchedulerHelper( | |
| CommandBufferTaskExecutor* command_buffer_task_executor); | |
| GpuTaskSchedulerHelper(const GpuTaskSchedulerHelper&) = delete; | |
| GpuTaskSchedulerHelper& operator=(const GpuTaskSchedulerHelper&) = delete; | |
| ~GpuTaskSchedulerHelper(); | |
| // This function sets up the |command_buffer_helper| which flushes the command | |
| // buffer when a user outside of the command buffer shares the same | |
| // GpuTaskSchedulerHelper. This is only needed for sharing with the command | |
| // buffer, thus no need to be called when using SkiaRenderer. | |
| void Initialize(CommandBufferHelper* command_buffer_helper); | |
| // This is called outside of CommandBuffer and would need to flush the command | |
| // buffer if the CommandBufferHelper is present. CommandBuffer is a friend of | |
| // this class and gets a direct pointer to the internal | |
| // |gpu::SingleTaskSequence|. | |
| void ScheduleGpuTask(base::OnceClosure task, | |
| std::vector<SyncToken> sync_token_fences, | |
| const SyncToken& release, | |
| ReportingCallback report_callback = ReportingCallback()); | |
| // This is only called with SkiaOutputSurface, no need to flush command buffer | |
| // here. | |
| void ScheduleOrRetainGpuTask(base::OnceClosure task, | |
| std::vector<SyncToken> sync_token_fences); | |
| // This is only called with SkiaOutputSurface. | |
| SequenceId GetSequenceId(); | |
| // Creates a SyncPointClientState associated with the sequence. | |
| [[nodiscard]] ScopedSyncPointClientState CreateSyncPointClientState( | |
| CommandBufferNamespace namespace_id, | |
| CommandBufferId command_buffer_id); | |
| private: | |
| // If |using_command_buffer_| is true, we are using this class with | |
| // GLOutputSurface. Otherwise we are using this class with | |
| // SkiaOutputSurface. | |
| bool using_command_buffer_; | |
| friend class gpu::GLInProcessContext; | |
| friend class gpu::InProcessCommandBuffer; | |
| friend class viz::DisplayCompositorMemoryAndTaskController; | |
| // Only used for inside CommandBuffer implementation. | |
| SingleTaskSequence* GetTaskSequence() const; | |
| // This |task_sequence_| handles task scheduling. | |
| const std::unique_ptr<SingleTaskSequence> task_sequence_; | |
| // When this class is used with the command buffer, this bool indicates | |
| // whether we have initialized the |command_buffer_helper_|. The command | |
| // buffer requires the |task_sequence_| in order to initialize on gpu thread, | |
| // but the |command_buffer_helper_| is created after initialization of the | |
| // command buffer. | |
| bool initialized_; | |
| // In the case where the TaskSequence is shared between command buffer and | |
| // other users, |command_buffer_helper_| is used to flush the command buffer | |
| // before posting tasks from a different user. This gives the command buffer a | |
| // chance to post any pending tasks and maintains the ordering between command | |
| // buffer and other user tasks. | |
| raw_ptr<CommandBufferHelper> command_buffer_helper_ = nullptr; | |
| }; | |
| } // namespace gpu | |
| #endif // GPU_COMMAND_BUFFER_SERVICE_GPU_TASK_SCHEDULER_HELPER_H_ |