// Copyright (c) 2012 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_COMMAND_BUFFER_TESTS_GL_MANAGER_H_ #define GPU_COMMAND_BUFFER_TESTS_GL_MANAGER_H_ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "gpu/command_buffer/service/feature_info.h" #include "ui/gfx/size.h" namespace gfx { class GLContext; class GLShareGroup; class GLSurface; } namespace gpu { class CommandBufferService; class GpuControlService; class GpuMemoryBufferFactory; class GpuScheduler; class TransferBuffer; namespace gles2 { class ContextGroup; class MailboxManager; class GLES2Decoder; class GLES2CmdHelper; class GLES2Implementation; class ImageFactory; class ImageManager; class ShareGroup; }; class GLManager { public: struct Options { Options(); // The size of the backbuffer. gfx::Size size; // If not null will share resources with this context. GLManager* share_group_manager; // If not null will share a mailbox manager with this context. GLManager* share_mailbox_manager; // If not null will create a virtual manager based on this context. GLManager* virtual_manager; // Whether or not glBindXXX generates a resource. bool bind_generates_resource; // Whether or not the context is auto-lost when GL_OUT_OF_MEMORY occurs. bool lose_context_when_out_of_memory; // Whether or not it's ok to lose the context. bool context_lost_allowed; // Image manager to be used. gles2::ImageManager* image_manager; // GpuMemoryBuffer factory to be used. GpuMemoryBufferFactory* gpu_memory_buffer_factory; }; GLManager(); ~GLManager(); void Initialize(const Options& options); void Destroy(); void MakeCurrent(); void SetSurface(gfx::GLSurface* surface); gles2::GLES2Decoder* decoder() const { return decoder_.get(); } gles2::MailboxManager* mailbox_manager() const { return mailbox_manager_.get(); } gfx::GLShareGroup* share_group() const { return share_group_.get(); } gles2::GLES2Implementation* gles2_implementation() const { return gles2_implementation_.get(); } gfx::GLContext* context() { return context_.get(); } const gpu::gles2::FeatureInfo::Workarounds& workarounds() const; private: void PumpCommands(); bool GetBufferChanged(int32 transfer_buffer_id); void SetupBaseContext(); scoped_refptr mailbox_manager_; scoped_refptr share_group_; scoped_ptr command_buffer_; scoped_ptr gpu_control_; scoped_ptr decoder_; scoped_ptr gpu_scheduler_; scoped_refptr surface_; scoped_refptr context_; scoped_ptr gles2_helper_; scoped_ptr transfer_buffer_; scoped_ptr gles2_implementation_; bool context_lost_allowed_; // Used on Android to virtualize GL for all contexts. static int use_count_; static scoped_refptr* base_share_group_; static scoped_refptr* base_surface_; static scoped_refptr* base_context_; }; } // namespace gpu #endif // GPU_COMMAND_BUFFER_TESTS_GL_MANAGER_H_