1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef GPU_COMMAND_BUFFER_SERVICE_CONTEXT_GROUP_H_ 6 #define GPU_COMMAND_BUFFER_SERVICE_CONTEXT_GROUP_H_ 7 8 #include <string> 9 #include <vector> 10 #include "base/basictypes.h" 11 #include "base/containers/hash_tables.h" 12 #include "base/memory/linked_ptr.h" 13 #include "base/memory/ref_counted.h" 14 #include "base/memory/scoped_ptr.h" 15 #include "base/memory/weak_ptr.h" 16 #include "gpu/command_buffer/common/gles2_cmd_format.h" 17 #include "gpu/command_buffer/service/feature_info.h" 18 #include "gpu/command_buffer/service/gles2_cmd_validation.h" 19 #include "gpu/command_buffer/service/shader_translator_cache.h" 20 #include "gpu/gpu_export.h" 21 22 namespace gpu { 23 24 class IdAllocatorInterface; 25 class TransferBufferManagerInterface; 26 27 namespace gles2 { 28 29 class ProgramCache; 30 class BufferManager; 31 class GLES2Decoder; 32 class FramebufferManager; 33 class MailboxManager; 34 class RenderbufferManager; 35 class ProgramManager; 36 class ShaderManager; 37 class TextureManager; 38 class MemoryTracker; 39 struct DisallowedFeatures; 40 41 // A Context Group helps manage multiple GLES2Decoders that share 42 // resources. 43 class GPU_EXPORT ContextGroup : public base::RefCounted<ContextGroup> { 44 public: 45 ContextGroup( 46 const scoped_refptr<MailboxManager>& mailbox_manager, 47 const scoped_refptr<MemoryTracker>& memory_tracker, 48 const scoped_refptr<ShaderTranslatorCache>& shader_translator_cache, 49 const scoped_refptr<FeatureInfo>& feature_info, 50 bool bind_generates_resource); 51 52 // This should only be called by GLES2Decoder. This must be paired with a 53 // call to destroy if it succeeds. 54 bool Initialize( 55 GLES2Decoder* decoder, 56 const DisallowedFeatures& disallowed_features); 57 58 // Destroys all the resources when called for the last context in the group. 59 // It should only be called by GLES2Decoder. 60 void Destroy(GLES2Decoder* decoder, bool have_context); 61 62 MailboxManager* mailbox_manager() const { 63 return mailbox_manager_.get(); 64 } 65 66 MemoryTracker* memory_tracker() const { 67 return memory_tracker_.get(); 68 } 69 70 ShaderTranslatorCache* shader_translator_cache() const { 71 return shader_translator_cache_.get(); 72 } 73 74 bool bind_generates_resource() { 75 return bind_generates_resource_; 76 } 77 78 uint32 max_vertex_attribs() const { 79 return max_vertex_attribs_; 80 } 81 82 uint32 max_texture_units() const { 83 return max_texture_units_; 84 } 85 86 uint32 max_texture_image_units() const { 87 return max_texture_image_units_; 88 } 89 90 uint32 max_vertex_texture_image_units() const { 91 return max_vertex_texture_image_units_; 92 } 93 94 uint32 max_fragment_uniform_vectors() const { 95 return max_fragment_uniform_vectors_; 96 } 97 98 uint32 max_varying_vectors() const { 99 return max_varying_vectors_; 100 } 101 102 uint32 max_vertex_uniform_vectors() const { 103 return max_vertex_uniform_vectors_; 104 } 105 106 uint32 max_color_attachments() const { 107 return max_color_attachments_; 108 } 109 110 uint32 max_draw_buffers() const { 111 return max_draw_buffers_; 112 } 113 114 FeatureInfo* feature_info() { 115 return feature_info_.get(); 116 } 117 118 BufferManager* buffer_manager() const { 119 return buffer_manager_.get(); 120 } 121 122 FramebufferManager* framebuffer_manager() const { 123 return framebuffer_manager_.get(); 124 } 125 126 RenderbufferManager* renderbuffer_manager() const { 127 return renderbuffer_manager_.get(); 128 } 129 130 TextureManager* texture_manager() const { 131 return texture_manager_.get(); 132 } 133 134 ProgramManager* program_manager() const { 135 return program_manager_.get(); 136 } 137 138 bool has_program_cache() const { 139 return program_cache_ != NULL; 140 } 141 142 void set_program_cache(ProgramCache* program_cache) { 143 program_cache_ = program_cache; 144 } 145 146 ShaderManager* shader_manager() const { 147 return shader_manager_.get(); 148 } 149 150 TransferBufferManagerInterface* transfer_buffer_manager() const { 151 return transfer_buffer_manager_.get(); 152 } 153 154 IdAllocatorInterface* GetIdAllocator(unsigned namespace_id); 155 156 uint32 GetMemRepresented() const; 157 158 // Loses all the context associated with this group. 159 void LoseContexts(GLenum reset_status); 160 161 // EXT_draw_buffer related states for backbuffer. 162 GLenum draw_buffer() const { 163 return draw_buffer_; 164 } 165 void set_draw_buffer(GLenum buf) { 166 draw_buffer_ = buf; 167 } 168 169 private: 170 friend class base::RefCounted<ContextGroup>; 171 ~ContextGroup(); 172 173 bool CheckGLFeature(GLint min_required, GLint* v); 174 bool CheckGLFeatureU(GLint min_required, uint32* v); 175 bool QueryGLFeature(GLenum pname, GLint min_required, GLint* v); 176 bool QueryGLFeatureU(GLenum pname, GLint min_required, uint32* v); 177 bool HaveContexts(); 178 179 scoped_refptr<MailboxManager> mailbox_manager_; 180 scoped_refptr<MemoryTracker> memory_tracker_; 181 scoped_refptr<ShaderTranslatorCache> shader_translator_cache_; 182 scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_; 183 184 bool enforce_gl_minimums_; 185 bool bind_generates_resource_; 186 187 uint32 max_vertex_attribs_; 188 uint32 max_texture_units_; 189 uint32 max_texture_image_units_; 190 uint32 max_vertex_texture_image_units_; 191 uint32 max_fragment_uniform_vectors_; 192 uint32 max_varying_vectors_; 193 uint32 max_vertex_uniform_vectors_; 194 uint32 max_color_attachments_; 195 uint32 max_draw_buffers_; 196 197 ProgramCache* program_cache_; 198 199 scoped_ptr<BufferManager> buffer_manager_; 200 201 scoped_ptr<FramebufferManager> framebuffer_manager_; 202 203 scoped_ptr<RenderbufferManager> renderbuffer_manager_; 204 205 scoped_ptr<TextureManager> texture_manager_; 206 207 scoped_ptr<ProgramManager> program_manager_; 208 209 scoped_ptr<ShaderManager> shader_manager_; 210 211 linked_ptr<IdAllocatorInterface> 212 id_namespaces_[id_namespaces::kNumIdNamespaces]; 213 214 scoped_refptr<FeatureInfo> feature_info_; 215 216 std::vector<base::WeakPtr<gles2::GLES2Decoder> > decoders_; 217 218 GLenum draw_buffer_; 219 220 DISALLOW_COPY_AND_ASSIGN(ContextGroup); 221 }; 222 223 } // namespace gles2 224 } // namespace gpu 225 226 #endif // GPU_COMMAND_BUFFER_SERVICE_CONTEXT_GROUP_H_ 227 228 229