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 mailbox_manager()62 MailboxManager* mailbox_manager() const { 63 return mailbox_manager_.get(); 64 } 65 memory_tracker()66 MemoryTracker* memory_tracker() const { 67 return memory_tracker_.get(); 68 } 69 shader_translator_cache()70 ShaderTranslatorCache* shader_translator_cache() const { 71 return shader_translator_cache_.get(); 72 } 73 bind_generates_resource()74 bool bind_generates_resource() { 75 return bind_generates_resource_; 76 } 77 max_vertex_attribs()78 uint32 max_vertex_attribs() const { 79 return max_vertex_attribs_; 80 } 81 max_texture_units()82 uint32 max_texture_units() const { 83 return max_texture_units_; 84 } 85 max_texture_image_units()86 uint32 max_texture_image_units() const { 87 return max_texture_image_units_; 88 } 89 max_vertex_texture_image_units()90 uint32 max_vertex_texture_image_units() const { 91 return max_vertex_texture_image_units_; 92 } 93 max_fragment_uniform_vectors()94 uint32 max_fragment_uniform_vectors() const { 95 return max_fragment_uniform_vectors_; 96 } 97 max_varying_vectors()98 uint32 max_varying_vectors() const { 99 return max_varying_vectors_; 100 } 101 max_vertex_uniform_vectors()102 uint32 max_vertex_uniform_vectors() const { 103 return max_vertex_uniform_vectors_; 104 } 105 max_color_attachments()106 uint32 max_color_attachments() const { 107 return max_color_attachments_; 108 } 109 max_draw_buffers()110 uint32 max_draw_buffers() const { 111 return max_draw_buffers_; 112 } 113 feature_info()114 FeatureInfo* feature_info() { 115 return feature_info_.get(); 116 } 117 buffer_manager()118 BufferManager* buffer_manager() const { 119 return buffer_manager_.get(); 120 } 121 framebuffer_manager()122 FramebufferManager* framebuffer_manager() const { 123 return framebuffer_manager_.get(); 124 } 125 renderbuffer_manager()126 RenderbufferManager* renderbuffer_manager() const { 127 return renderbuffer_manager_.get(); 128 } 129 texture_manager()130 TextureManager* texture_manager() const { 131 return texture_manager_.get(); 132 } 133 program_manager()134 ProgramManager* program_manager() const { 135 return program_manager_.get(); 136 } 137 has_program_cache()138 bool has_program_cache() const { 139 return program_cache_ != NULL; 140 } 141 set_program_cache(ProgramCache * program_cache)142 void set_program_cache(ProgramCache* program_cache) { 143 program_cache_ = program_cache; 144 } 145 shader_manager()146 ShaderManager* shader_manager() const { 147 return shader_manager_.get(); 148 } 149 transfer_buffer_manager()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. draw_buffer()162 GLenum draw_buffer() const { 163 return draw_buffer_; 164 } set_draw_buffer(GLenum buf)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