blob: f30d485bfc78d14fa283b04a7000d41f12c7ce2b [file] [log] [blame]
// Copyright 2015 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 COMPONENTS_MUS_GLES2_GPU_STATE_H_
#define COMPONENTS_MUS_GLES2_GPU_STATE_H_
#include <memory>
#include "base/memory/ref_counted.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread.h"
#include "components/mus/gles2/command_buffer_driver_manager.h"
#include "components/mus/gles2/command_buffer_task_runner.h"
#include "gpu/command_buffer/service/gpu_preferences.h"
#include "gpu/command_buffer/service/mailbox_manager_impl.h"
#include "gpu/command_buffer/service/sync_point_manager.h"
#include "gpu/config/gpu_driver_bug_workarounds.h"
#include "gpu/config/gpu_info.h"
#include "ui/gl/gl_share_group.h"
namespace {
class WaitableEvent;
}
namespace mus {
// We need to share these across all CommandBuffer instances so that contexts
// they create can share resources with each other via mailboxes.
class GpuState : public base::RefCountedThreadSafe<GpuState> {
public:
GpuState();
// We run the CommandBufferImpl on the control_task_runner, which forwards
// most method class to the CommandBufferDriver, which runs on the "driver",
// thread (i.e., the thread on which GpuImpl instances are created).
scoped_refptr<base::SingleThreadTaskRunner> control_task_runner() {
return control_thread_task_runner_;
}
void StopThreads();
const gpu::GpuPreferences& gpu_preferences() const {
return gpu_preferences_;
}
const gpu::GpuDriverBugWorkarounds& gpu_driver_bug_workarounds() const {
return gpu_driver_bug_workarounds_;
}
CommandBufferTaskRunner* command_buffer_task_runner() const {
return command_buffer_task_runner_.get();
}
CommandBufferDriverManager* driver_manager() const {
return driver_manager_.get();
}
// These objects are intended to be used on the "driver" thread (i.e., the
// thread on which GpuImpl instances are created).
gl::GLShareGroup* share_group() const { return share_group_.get(); }
gpu::gles2::MailboxManager* mailbox_manager() const {
return mailbox_manager_.get();
}
gpu::SyncPointManager* sync_point_manager() const {
return sync_point_manager_.get();
}
const gpu::GPUInfo& gpu_info() const {
return gpu_info_;
}
bool HardwareRenderingAvailable() const {
return hardware_rendering_available_;
}
private:
friend class base::RefCountedThreadSafe<GpuState>;
~GpuState();
void InitializeOnGpuThread(base::WaitableEvent* event);
void DestroyGpuSpecificStateOnGpuThread();
// |gpu_thread_| is for executing OS GL calls.
base::Thread gpu_thread_;
// |control_thread_| is for mojo incoming calls of CommandBufferImpl.
base::Thread control_thread_;
// Same as control_thread_->task_runner(). The TaskRunner is cached as it may
// be needed during shutdown.
scoped_refptr<base::SingleThreadTaskRunner> control_thread_task_runner_;
gpu::GpuPreferences gpu_preferences_;
const gpu::GpuDriverBugWorkarounds gpu_driver_bug_workarounds_;
scoped_refptr<CommandBufferTaskRunner> command_buffer_task_runner_;
std::unique_ptr<CommandBufferDriverManager> driver_manager_;
std::unique_ptr<gpu::SyncPointManager> sync_point_manager_;
scoped_refptr<gl::GLShareGroup> share_group_;
scoped_refptr<gpu::gles2::MailboxManager> mailbox_manager_;
gpu::GPUInfo gpu_info_;
bool hardware_rendering_available_;
};
} // namespace mus
#endif // COMPONENTS_MUS_GLES2_GPU_STATE_H_