// 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_SERVICE_CONTEXT_GROUP_H_ #define GPU_COMMAND_BUFFER_SERVICE_CONTEXT_GROUP_H_ #include #include #include "base/basictypes.h" #include "base/containers/hash_tables.h" #include "base/memory/linked_ptr.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "gpu/command_buffer/common/gles2_cmd_format.h" #include "gpu/command_buffer/service/feature_info.h" #include "gpu/command_buffer/service/gles2_cmd_validation.h" #include "gpu/command_buffer/service/shader_translator_cache.h" #include "gpu/gpu_export.h" namespace gpu { class TransferBufferManagerInterface; class ValueStateMap; namespace gles2 { class ProgramCache; class BufferManager; class GLES2Decoder; class FramebufferManager; class MailboxManager; class RenderbufferManager; class ProgramManager; class ShaderManager; class TextureManager; class SubscriptionRefSet; class ValuebufferManager; class MemoryTracker; struct DisallowedFeatures; // A Context Group helps manage multiple GLES2Decoders that share // resources. class GPU_EXPORT ContextGroup : public base::RefCounted { public: ContextGroup( const scoped_refptr& mailbox_manager, const scoped_refptr& memory_tracker, const scoped_refptr& shader_translator_cache, const scoped_refptr& feature_info, const scoped_refptr& subscription_ref_set, const scoped_refptr& pending_valuebuffer_state, bool bind_generates_resource); // This should only be called by GLES2Decoder. This must be paired with a // call to destroy if it succeeds. bool Initialize( GLES2Decoder* decoder, const DisallowedFeatures& disallowed_features); // Destroys all the resources when called for the last context in the group. // It should only be called by GLES2Decoder. void Destroy(GLES2Decoder* decoder, bool have_context); MailboxManager* mailbox_manager() const { return mailbox_manager_.get(); } MemoryTracker* memory_tracker() const { return memory_tracker_.get(); } ShaderTranslatorCache* shader_translator_cache() const { return shader_translator_cache_.get(); } bool bind_generates_resource() { return bind_generates_resource_; } uint32 max_vertex_attribs() const { return max_vertex_attribs_; } uint32 max_texture_units() const { return max_texture_units_; } uint32 max_texture_image_units() const { return max_texture_image_units_; } uint32 max_vertex_texture_image_units() const { return max_vertex_texture_image_units_; } uint32 max_fragment_uniform_vectors() const { return max_fragment_uniform_vectors_; } uint32 max_varying_vectors() const { return max_varying_vectors_; } uint32 max_vertex_uniform_vectors() const { return max_vertex_uniform_vectors_; } uint32 max_color_attachments() const { return max_color_attachments_; } uint32 max_draw_buffers() const { return max_draw_buffers_; } FeatureInfo* feature_info() { return feature_info_.get(); } BufferManager* buffer_manager() const { return buffer_manager_.get(); } FramebufferManager* framebuffer_manager() const { return framebuffer_manager_.get(); } RenderbufferManager* renderbuffer_manager() const { return renderbuffer_manager_.get(); } ValuebufferManager* valuebuffer_manager() const { return valuebuffer_manager_.get(); } ValueStateMap* pending_valuebuffer_state() const { return pending_valuebuffer_state_.get(); } TextureManager* texture_manager() const { return texture_manager_.get(); } ProgramManager* program_manager() const { return program_manager_.get(); } bool has_program_cache() const { return program_cache_ != NULL; } void set_program_cache(ProgramCache* program_cache) { program_cache_ = program_cache; } ShaderManager* shader_manager() const { return shader_manager_.get(); } TransferBufferManagerInterface* transfer_buffer_manager() const { return transfer_buffer_manager_.get(); } uint32 GetMemRepresented() const; // Loses all the context associated with this group. void LoseContexts(error::ContextLostReason reason); // EXT_draw_buffer related states for backbuffer. GLenum draw_buffer() const { return draw_buffer_; } void set_draw_buffer(GLenum buf) { draw_buffer_ = buf; } bool GetBufferServiceId(GLuint client_id, GLuint* service_id) const; void AddSamplerId(GLuint client_id, GLuint service_id) { samplers_id_map_[client_id] = service_id; } bool GetSamplerServiceId(GLuint client_id, GLuint* service_id) const { base::hash_map::const_iterator iter = samplers_id_map_.find(client_id); if (iter == samplers_id_map_.end()) return false; if (service_id) *service_id = iter->second; return true; } void RemoveSamplerId(GLuint client_id) { samplers_id_map_.erase(client_id); } void AddTransformFeedbackId(GLuint client_id, GLuint service_id) { transformfeedbacks_id_map_[client_id] = service_id; } bool GetTransformFeedbackServiceId( GLuint client_id, GLuint* service_id) const { base::hash_map::const_iterator iter = transformfeedbacks_id_map_.find(client_id); if (iter == transformfeedbacks_id_map_.end()) return false; if (service_id) *service_id = iter->second; return true; } void RemoveTransformFeedbackId(GLuint client_id) { transformfeedbacks_id_map_.erase(client_id); } void AddSyncId(GLuint client_id, GLsync service_id) { syncs_id_map_[client_id] = service_id; } bool GetSyncServiceId(GLuint client_id, GLsync* service_id) const { base::hash_map::const_iterator iter = syncs_id_map_.find(client_id); if (iter == syncs_id_map_.end()) return false; if (service_id) *service_id = iter->second; return true; } void RemoveSyncId(GLuint client_id) { syncs_id_map_.erase(client_id); } private: friend class base::RefCounted; ~ContextGroup(); bool CheckGLFeature(GLint min_required, GLint* v); bool CheckGLFeatureU(GLint min_required, uint32* v); bool QueryGLFeature(GLenum pname, GLint min_required, GLint* v); bool QueryGLFeatureU(GLenum pname, GLint min_required, uint32* v); bool HaveContexts(); scoped_refptr mailbox_manager_; scoped_refptr memory_tracker_; scoped_refptr shader_translator_cache_; scoped_ptr transfer_buffer_manager_; scoped_refptr subscription_ref_set_; scoped_refptr pending_valuebuffer_state_; bool enforce_gl_minimums_; bool bind_generates_resource_; uint32 max_vertex_attribs_; uint32 max_texture_units_; uint32 max_texture_image_units_; uint32 max_vertex_texture_image_units_; uint32 max_fragment_uniform_vectors_; uint32 max_varying_vectors_; uint32 max_vertex_uniform_vectors_; uint32 max_color_attachments_; uint32 max_draw_buffers_; ProgramCache* program_cache_; scoped_ptr buffer_manager_; scoped_ptr framebuffer_manager_; scoped_ptr renderbuffer_manager_; scoped_ptr texture_manager_; scoped_ptr program_manager_; scoped_ptr shader_manager_; scoped_ptr valuebuffer_manager_; scoped_refptr feature_info_; std::vector > decoders_; // Mappings from client side IDs to service side IDs. base::hash_map samplers_id_map_; base::hash_map transformfeedbacks_id_map_; base::hash_map syncs_id_map_; GLenum draw_buffer_; DISALLOW_COPY_AND_ASSIGN(ContextGroup); }; } // namespace gles2 } // namespace gpu #endif // GPU_COMMAND_BUFFER_SERVICE_CONTEXT_GROUP_H_