OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gpu/command_buffer/service/context_group.h" | 5 #include "gpu/command_buffer/service/context_group.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 namespace gles2 { | 29 namespace gles2 { |
30 | 30 |
31 ContextGroup::ContextGroup( | 31 ContextGroup::ContextGroup( |
32 MailboxManager* mailbox_manager, | 32 MailboxManager* mailbox_manager, |
33 ImageManager* image_manager, | 33 ImageManager* image_manager, |
34 MemoryTracker* memory_tracker, | 34 MemoryTracker* memory_tracker, |
35 bool bind_generates_resource) | 35 bool bind_generates_resource) |
36 : mailbox_manager_(mailbox_manager ? mailbox_manager : new MailboxManager), | 36 : mailbox_manager_(mailbox_manager ? mailbox_manager : new MailboxManager), |
37 image_manager_(image_manager ? image_manager : new ImageManager), | 37 image_manager_(image_manager ? image_manager : new ImageManager), |
38 memory_tracker_(memory_tracker), | 38 memory_tracker_(memory_tracker), |
39 num_contexts_(0), | |
40 enforce_gl_minimums_(CommandLine::ForCurrentProcess()->HasSwitch( | 39 enforce_gl_minimums_(CommandLine::ForCurrentProcess()->HasSwitch( |
41 switches::kEnforceGLMinimums)), | 40 switches::kEnforceGLMinimums)), |
42 bind_generates_resource_(bind_generates_resource), | 41 bind_generates_resource_(bind_generates_resource), |
43 max_vertex_attribs_(0u), | 42 max_vertex_attribs_(0u), |
44 max_texture_units_(0u), | 43 max_texture_units_(0u), |
45 max_texture_image_units_(0u), | 44 max_texture_image_units_(0u), |
46 max_vertex_texture_image_units_(0u), | 45 max_vertex_texture_image_units_(0u), |
47 max_fragment_uniform_vectors_(0u), | 46 max_fragment_uniform_vectors_(0u), |
48 max_varying_vectors_(0u), | 47 max_varying_vectors_(0u), |
49 max_vertex_uniform_vectors_(0u), | 48 max_vertex_uniform_vectors_(0u), |
(...skipping 14 matching lines...) Expand all Loading... |
64 id_namespaces_[id_namespaces::kQueries].reset(new IdAllocator); | 63 id_namespaces_[id_namespaces::kQueries].reset(new IdAllocator); |
65 id_namespaces_[id_namespaces::kVertexArrays].reset(new IdAllocator); | 64 id_namespaces_[id_namespaces::kVertexArrays].reset(new IdAllocator); |
66 } | 65 } |
67 | 66 |
68 static void GetIntegerv(GLenum pname, uint32* var) { | 67 static void GetIntegerv(GLenum pname, uint32* var) { |
69 GLint value = 0; | 68 GLint value = 0; |
70 glGetIntegerv(pname, &value); | 69 glGetIntegerv(pname, &value); |
71 *var = value; | 70 *var = value; |
72 } | 71 } |
73 | 72 |
74 bool ContextGroup::Initialize(const DisallowedFeatures& disallowed_features, | 73 bool ContextGroup::Initialize( |
75 const char* allowed_features) { | 74 GLES2Decoder* decoder, |
76 if (num_contexts_ > 0) { | 75 const DisallowedFeatures& disallowed_features, |
77 ++num_contexts_; | 76 const char* allowed_features) { |
| 77 // If we've already initialized the group just add the context. |
| 78 if (HaveContexts()) { |
| 79 decoders_.push_back(base::AsWeakPtr<GLES2Decoder>(decoder)); |
78 return true; | 80 return true; |
79 } | 81 } |
80 | 82 |
81 if (!feature_info_->Initialize(disallowed_features, allowed_features)) { | 83 if (!feature_info_->Initialize(disallowed_features, allowed_features)) { |
82 LOG(ERROR) << "ContextGroup::Initialize failed because FeatureInfo " | 84 LOG(ERROR) << "ContextGroup::Initialize failed because FeatureInfo " |
83 << "initialization failed."; | 85 << "initialization failed."; |
84 return false; | 86 return false; |
85 } | 87 } |
86 | 88 |
87 const GLint kMinRenderbufferSize = 512; // GL says 1 pixel! | 89 const GLint kMinRenderbufferSize = 512; // GL says 1 pixel! |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 << "uniforms or varyings supported."; | 196 << "uniforms or varyings supported."; |
195 return false; | 197 return false; |
196 } | 198 } |
197 | 199 |
198 if (!texture_manager_->Initialize()) { | 200 if (!texture_manager_->Initialize()) { |
199 LOG(ERROR) << "Context::Group::Initialize failed because texture manager " | 201 LOG(ERROR) << "Context::Group::Initialize failed because texture manager " |
200 << "failed to initialize."; | 202 << "failed to initialize."; |
201 return false; | 203 return false; |
202 } | 204 } |
203 | 205 |
204 ++num_contexts_; | 206 decoders_.push_back(base::AsWeakPtr<GLES2Decoder>(decoder)); |
205 return true; | 207 return true; |
206 } | 208 } |
207 | 209 |
208 void ContextGroup::Destroy(bool have_context) { | 210 namespace { |
209 DCHECK(num_contexts_ > 0); | 211 |
210 if (--num_contexts_ > 0) | 212 bool IsNull(const base::WeakPtr<gles2::GLES2Decoder>& decoder) { |
| 213 return !decoder; |
| 214 } |
| 215 |
| 216 } // namespace anonymous |
| 217 |
| 218 bool ContextGroup::HaveContexts() { |
| 219 decoders_.erase(std::remove_if(decoders_.begin(), decoders_.end(), IsNull), |
| 220 decoders_.end()); |
| 221 return !decoders_.empty(); |
| 222 } |
| 223 |
| 224 void ContextGroup::Destroy(GLES2Decoder* decoder, bool have_context) { |
| 225 decoders_.erase(std::remove(decoders_.begin(), decoders_.end(), decoder), |
| 226 decoders_.end()); |
| 227 // If we still have contexts do nothing. |
| 228 if (HaveContexts()) { |
211 return; | 229 return; |
| 230 } |
212 | 231 |
213 if (buffer_manager_ != NULL) { | 232 if (buffer_manager_ != NULL) { |
214 buffer_manager_->Destroy(have_context); | 233 buffer_manager_->Destroy(have_context); |
215 buffer_manager_.reset(); | 234 buffer_manager_.reset(); |
216 } | 235 } |
217 | 236 |
218 if (framebuffer_manager_ != NULL) { | 237 if (framebuffer_manager_ != NULL) { |
219 framebuffer_manager_->Destroy(have_context); | 238 framebuffer_manager_->Destroy(have_context); |
220 framebuffer_manager_.reset(); | 239 framebuffer_manager_.reset(); |
221 } | 240 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 uint32 total = 0; | 275 uint32 total = 0; |
257 if (buffer_manager_.get()) | 276 if (buffer_manager_.get()) |
258 total += buffer_manager_->mem_represented(); | 277 total += buffer_manager_->mem_represented(); |
259 if (renderbuffer_manager_.get()) | 278 if (renderbuffer_manager_.get()) |
260 total += renderbuffer_manager_->mem_represented(); | 279 total += renderbuffer_manager_->mem_represented(); |
261 if (texture_manager_.get()) | 280 if (texture_manager_.get()) |
262 total += texture_manager_->mem_represented(); | 281 total += texture_manager_->mem_represented(); |
263 return total; | 282 return total; |
264 } | 283 } |
265 | 284 |
| 285 void ContextGroup::LoseContexts(GLenum reset_status) { |
| 286 for (size_t ii = 0; ii < decoders_.size(); ++ii) { |
| 287 if (decoders_[ii]) { |
| 288 decoders_[ii]->LoseContext(reset_status); |
| 289 } |
| 290 } |
| 291 } |
| 292 |
266 ContextGroup::~ContextGroup() { | 293 ContextGroup::~ContextGroup() { |
267 CHECK(num_contexts_ == 0); | 294 CHECK(!HaveContexts()); |
268 } | 295 } |
269 | 296 |
270 bool ContextGroup::CheckGLFeature(GLint min_required, GLint* v) { | 297 bool ContextGroup::CheckGLFeature(GLint min_required, GLint* v) { |
271 GLint value = *v; | 298 GLint value = *v; |
272 if (enforce_gl_minimums_) { | 299 if (enforce_gl_minimums_) { |
273 value = std::min(min_required, value); | 300 value = std::min(min_required, value); |
274 } | 301 } |
275 *v = value; | 302 *v = value; |
276 return value >= min_required; | 303 return value >= min_required; |
277 } | 304 } |
(...skipping 19 matching lines...) Expand all Loading... |
297 GLenum pname, GLint min_required, uint32* v) { | 324 GLenum pname, GLint min_required, uint32* v) { |
298 uint32 value = 0; | 325 uint32 value = 0; |
299 GetIntegerv(pname, &value); | 326 GetIntegerv(pname, &value); |
300 bool result = CheckGLFeatureU(min_required, &value); | 327 bool result = CheckGLFeatureU(min_required, &value); |
301 *v = value; | 328 *v = value; |
302 return result; | 329 return result; |
303 } | 330 } |
304 | 331 |
305 } // namespace gles2 | 332 } // namespace gles2 |
306 } // namespace gpu | 333 } // namespace gpu |
OLD | NEW |