• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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