Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(38)

Side by Side Diff: gpu/command_buffer/service/context_group.cc

Issue 11568029: Add a command to lose the context (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add docs, lose parent and children, fix typo Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/context_group.h ('k') | gpu/command_buffer/service/context_group_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698