| 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 |