blob: d70b09f5a86a145d71275e8f4ea86bc6e5a9e84f [file] [log] [blame]
// Copyright 2018 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 GPU_IPC_COMMAND_BUFFER_TASK_EXECUTOR_H_
#define GPU_IPC_COMMAND_BUFFER_TASK_EXECUTOR_H_
#include <memory>
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "gpu/command_buffer/common/activity_flags.h"
#include "gpu/command_buffer/service/framebuffer_completeness_cache.h"
#include "gpu/command_buffer/service/image_manager.h"
#include "gpu/command_buffer/service/service_discardable_manager.h"
#include "gpu/command_buffer/service/shader_translator_cache.h"
#include "gpu/config/gpu_feature_info.h"
#include "gpu/config/gpu_preferences.h"
#include "gpu/ipc/gl_in_process_context_export.h"
#include "ui/gl/gl_surface_format.h"
namespace gl {
class GLShareGroup;
}
namespace gpu {
class MailboxManager;
class SyncPointManager;
namespace gles2 {
class Outputter;
class ProgramCache;
} // namespace gles2
// Provides accessors for GPU service objects and the serializer interface to
// the GPU thread used by InProcessCommandBuffer.
class GL_IN_PROCESS_CONTEXT_EXPORT CommandBufferTaskExecutor
: public base::RefCountedThreadSafe<CommandBufferTaskExecutor> {
public:
CommandBufferTaskExecutor(const GpuPreferences& gpu_preferences,
const GpuFeatureInfo& gpu_feature_info,
MailboxManager* mailbox_manager,
scoped_refptr<gl::GLShareGroup> share_group,
gl::GLSurfaceFormat share_group_surface_format);
// Queues a task to run as soon as possible.
virtual void ScheduleTask(base::OnceClosure task) = 0;
// Schedules |callback| to run at an appropriate time for performing delayed
// work.
virtual void ScheduleDelayedWork(base::OnceClosure task) = 0;
// Always use virtualized GL contexts if this returns true.
virtual bool ForceVirtualizedGLContexts() = 0;
virtual bool BlockThreadOnWaitSyncToken() const = 0;
virtual SyncPointManager* sync_point_manager() = 0;
const GpuPreferences& gpu_preferences() const { return gpu_preferences_; }
const GpuFeatureInfo& gpu_feature_info() const { return gpu_feature_info_; }
scoped_refptr<gl::GLShareGroup> share_group();
gl::GLSurfaceFormat share_group_surface_format() const {
return share_group_surface_format_;
}
MailboxManager* mailbox_manager() { return mailbox_manager_; }
gles2::Outputter* outputter();
gles2::ProgramCache* program_cache();
gles2::ImageManager* image_manager() { return &image_manager_; }
ServiceDiscardableManager* discardable_manager() {
return &discardable_manager_;
}
gles2::ShaderTranslatorCache* shader_translator_cache() {
return &shader_translator_cache_;
}
gles2::FramebufferCompletenessCache* framebuffer_completeness_cache() {
return &framebuffer_completeness_cache_;
}
protected:
friend class base::RefCountedThreadSafe<CommandBufferTaskExecutor>;
virtual ~CommandBufferTaskExecutor();
private:
const GpuPreferences gpu_preferences_;
const GpuFeatureInfo gpu_feature_info_;
std::unique_ptr<MailboxManager> owned_mailbox_manager_;
MailboxManager* mailbox_manager_ = nullptr;
std::unique_ptr<gles2::Outputter> outputter_;
scoped_refptr<gl::GLShareGroup> share_group_;
gl::GLSurfaceFormat share_group_surface_format_;
std::unique_ptr<gles2::ProgramCache> program_cache_;
gles2::ImageManager image_manager_;
ServiceDiscardableManager discardable_manager_;
gles2::ShaderTranslatorCache shader_translator_cache_;
gles2::FramebufferCompletenessCache framebuffer_completeness_cache_;
// No-op default initialization is used in in-process mode.
GpuProcessActivityFlags activity_flags_;
DISALLOW_COPY_AND_ASSIGN(CommandBufferTaskExecutor);
};
} // namespace gpu
#endif // GPU_IPC_COMMAND_BUFFER_TASK_EXECUTOR_H_