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

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

Issue 2378583003: Ping watchdog thread during GpuChannel destruction (Closed)
Patch Set: Fix lifetime and use nullptr Created 4 years, 2 months 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
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 <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
11 #include <string> 11 #include <string>
12 12
13 #include "base/command_line.h" 13 #include "base/command_line.h"
14 #include "gpu/command_buffer/service/buffer_manager.h" 14 #include "gpu/command_buffer/service/buffer_manager.h"
15 #include "gpu/command_buffer/service/framebuffer_manager.h" 15 #include "gpu/command_buffer/service/framebuffer_manager.h"
16 #include "gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h" 16 #include "gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h"
17 #include "gpu/command_buffer/service/gpu_preferences.h" 17 #include "gpu/command_buffer/service/gpu_preferences.h"
18 #include "gpu/command_buffer/service/mailbox_manager_impl.h" 18 #include "gpu/command_buffer/service/mailbox_manager_impl.h"
19 #include "gpu/command_buffer/service/path_manager.h" 19 #include "gpu/command_buffer/service/path_manager.h"
20 #include "gpu/command_buffer/service/program_manager.h" 20 #include "gpu/command_buffer/service/program_manager.h"
21 #include "gpu/command_buffer/service/progress_reporter.h"
21 #include "gpu/command_buffer/service/renderbuffer_manager.h" 22 #include "gpu/command_buffer/service/renderbuffer_manager.h"
22 #include "gpu/command_buffer/service/sampler_manager.h" 23 #include "gpu/command_buffer/service/sampler_manager.h"
23 #include "gpu/command_buffer/service/shader_manager.h" 24 #include "gpu/command_buffer/service/shader_manager.h"
24 #include "gpu/command_buffer/service/texture_manager.h" 25 #include "gpu/command_buffer/service/texture_manager.h"
25 #include "gpu/command_buffer/service/transfer_buffer_manager.h" 26 #include "gpu/command_buffer/service/transfer_buffer_manager.h"
26 #include "ui/gl/gl_bindings.h" 27 #include "ui/gl/gl_bindings.h"
27 #include "ui/gl/gl_version_info.h" 28 #include "ui/gl/gl_version_info.h"
28 29
29 namespace gpu { 30 namespace gpu {
30 namespace gles2 { 31 namespace gles2 {
(...skipping 27 matching lines...) Expand all
58 59
59 ContextGroup::ContextGroup( 60 ContextGroup::ContextGroup(
60 const GpuPreferences& gpu_preferences, 61 const GpuPreferences& gpu_preferences,
61 const scoped_refptr<MailboxManager>& mailbox_manager, 62 const scoped_refptr<MailboxManager>& mailbox_manager,
62 const scoped_refptr<MemoryTracker>& memory_tracker, 63 const scoped_refptr<MemoryTracker>& memory_tracker,
63 const scoped_refptr<ShaderTranslatorCache>& shader_translator_cache, 64 const scoped_refptr<ShaderTranslatorCache>& shader_translator_cache,
64 const scoped_refptr<FramebufferCompletenessCache>& 65 const scoped_refptr<FramebufferCompletenessCache>&
65 framebuffer_completeness_cache, 66 framebuffer_completeness_cache,
66 const scoped_refptr<FeatureInfo>& feature_info, 67 const scoped_refptr<FeatureInfo>& feature_info,
67 bool bind_generates_resource, 68 bool bind_generates_resource,
68 gpu::ImageFactory* image_factory) 69 gpu::ImageFactory* image_factory,
70 ProgressReporter* progress_reporter)
69 : gpu_preferences_(gpu_preferences), 71 : gpu_preferences_(gpu_preferences),
70 mailbox_manager_(mailbox_manager), 72 mailbox_manager_(mailbox_manager),
71 memory_tracker_(memory_tracker), 73 memory_tracker_(memory_tracker),
72 shader_translator_cache_(shader_translator_cache), 74 shader_translator_cache_(shader_translator_cache),
73 #if defined(OS_MACOSX) 75 #if defined(OS_MACOSX)
74 // Framebuffer completeness is not cacheable on OS X because of dynamic 76 // Framebuffer completeness is not cacheable on OS X because of dynamic
75 // graphics switching. 77 // graphics switching.
76 // http://crbug.com/180876 78 // http://crbug.com/180876
77 // TODO(tobiasjs): determine whether GPU switching is possible 79 // TODO(tobiasjs): determine whether GPU switching is possible
78 // programmatically, rather than just hardcoding this behaviour 80 // programmatically, rather than just hardcoding this behaviour
(...skipping 17 matching lines...) Expand all
96 max_vertex_output_components_(0u), 98 max_vertex_output_components_(0u),
97 max_fragment_input_components_(0u), 99 max_fragment_input_components_(0u),
98 min_program_texel_offset_(0), 100 min_program_texel_offset_(0),
99 max_program_texel_offset_(0), 101 max_program_texel_offset_(0),
100 max_transform_feedback_separate_attribs_(0u), 102 max_transform_feedback_separate_attribs_(0u),
101 max_uniform_buffer_bindings_(0u), 103 max_uniform_buffer_bindings_(0u),
102 uniform_buffer_offset_alignment_(1u), 104 uniform_buffer_offset_alignment_(1u),
103 program_cache_(NULL), 105 program_cache_(NULL),
104 feature_info_(feature_info), 106 feature_info_(feature_info),
105 image_factory_(image_factory), 107 image_factory_(image_factory),
106 passthrough_resources_(new PassthroughResources) { 108 passthrough_resources_(new PassthroughResources),
109 progress_reporter_(progress_reporter) {
107 { 110 {
108 DCHECK(feature_info_); 111 DCHECK(feature_info_);
109 if (!mailbox_manager_.get()) 112 if (!mailbox_manager_.get())
110 mailbox_manager_ = new MailboxManagerImpl; 113 mailbox_manager_ = new MailboxManagerImpl;
111 transfer_buffer_manager_ = new TransferBufferManager(memory_tracker_.get()); 114 transfer_buffer_manager_ = new TransferBufferManager(memory_tracker_.get());
112 } 115 }
113 } 116 }
114 117
115 bool ContextGroup::Initialize(GLES2Decoder* decoder, 118 bool ContextGroup::Initialize(GLES2Decoder* decoder,
116 ContextType context_type, 119 ContextType context_type,
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 } 208 }
206 209
207 buffer_manager_.reset( 210 buffer_manager_.reset(
208 new BufferManager(memory_tracker_.get(), feature_info_.get())); 211 new BufferManager(memory_tracker_.get(), feature_info_.get()));
209 framebuffer_manager_.reset( 212 framebuffer_manager_.reset(
210 new FramebufferManager(max_draw_buffers_, max_color_attachments_, 213 new FramebufferManager(max_draw_buffers_, max_color_attachments_,
211 framebuffer_completeness_cache_)); 214 framebuffer_completeness_cache_));
212 renderbuffer_manager_.reset(new RenderbufferManager( 215 renderbuffer_manager_.reset(new RenderbufferManager(
213 memory_tracker_.get(), max_renderbuffer_size, max_samples, 216 memory_tracker_.get(), max_renderbuffer_size, max_samples,
214 feature_info_.get())); 217 feature_info_.get()));
215 shader_manager_.reset(new ShaderManager()); 218 shader_manager_.reset(new ShaderManager(progress_reporter_));
216 sampler_manager_.reset(new SamplerManager(feature_info_.get())); 219 sampler_manager_.reset(new SamplerManager(feature_info_.get()));
217 220
218 // Lookup GL things we need to know. 221 // Lookup GL things we need to know.
219 const GLint kGLES2RequiredMinimumVertexAttribs = 8u; 222 const GLint kGLES2RequiredMinimumVertexAttribs = 8u;
220 if (!QueryGLFeatureU( 223 if (!QueryGLFeatureU(
221 GL_MAX_VERTEX_ATTRIBS, kGLES2RequiredMinimumVertexAttribs, 224 GL_MAX_VERTEX_ATTRIBS, kGLES2RequiredMinimumVertexAttribs,
222 &max_vertex_attribs_)) { 225 &max_vertex_attribs_)) {
223 DLOG(ERROR) << "ContextGroup::Initialize failed because too few " 226 DLOG(ERROR) << "ContextGroup::Initialize failed because too few "
224 << "vertex attributes supported (" << max_vertex_attribs_ 227 << "vertex attributes supported (" << max_vertex_attribs_
225 << ", should be " << kGLES2RequiredMinimumVertexAttribs << ")."; 228 << ", should be " << kGLES2RequiredMinimumVertexAttribs << ").";
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 295
293 if (feature_info_->workarounds().max_texture_size) { 296 if (feature_info_->workarounds().max_texture_size) {
294 max_texture_size = std::min( 297 max_texture_size = std::min(
295 max_texture_size, 298 max_texture_size,
296 feature_info_->workarounds().max_texture_size); 299 feature_info_->workarounds().max_texture_size);
297 max_rectangle_texture_size = std::min( 300 max_rectangle_texture_size = std::min(
298 max_rectangle_texture_size, 301 max_rectangle_texture_size,
299 feature_info_->workarounds().max_texture_size); 302 feature_info_->workarounds().max_texture_size);
300 } 303 }
301 304
302 texture_manager_.reset(new TextureManager(memory_tracker_.get(), 305 texture_manager_.reset(new TextureManager(
303 feature_info_.get(), 306 memory_tracker_.get(), feature_info_.get(), max_texture_size,
304 max_texture_size, 307 max_cube_map_texture_size, max_rectangle_texture_size,
305 max_cube_map_texture_size, 308 max_3d_texture_size, max_array_texture_layers, bind_generates_resource_,
306 max_rectangle_texture_size, 309 progress_reporter_));
307 max_3d_texture_size,
308 max_array_texture_layers,
309 bind_generates_resource_));
310 texture_manager_->set_framebuffer_manager(framebuffer_manager_.get()); 310 texture_manager_->set_framebuffer_manager(framebuffer_manager_.get());
311 311
312 const GLint kMinTextureImageUnits = 8; 312 const GLint kMinTextureImageUnits = 8;
313 const GLint kMinVertexTextureImageUnits = 0; 313 const GLint kMinVertexTextureImageUnits = 0;
314 if (!QueryGLFeatureU(GL_MAX_TEXTURE_IMAGE_UNITS, kMinTextureImageUnits, 314 if (!QueryGLFeatureU(GL_MAX_TEXTURE_IMAGE_UNITS, kMinTextureImageUnits,
315 &max_texture_image_units_)) { 315 &max_texture_image_units_)) {
316 DLOG(ERROR) << "ContextGroup::Initialize failed because too few " 316 DLOG(ERROR) << "ContextGroup::Initialize failed because too few "
317 << "texture image units supported (" 317 << "texture image units supported ("
318 << max_texture_image_units_ 318 << max_texture_image_units_
319 << ", should be " << kMinTextureImageUnits << ")."; 319 << ", should be " << kMinTextureImageUnits << ").";
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 DLOG(ERROR) << "ContextGroup::Initialize failed because maximum " 428 DLOG(ERROR) << "ContextGroup::Initialize failed because maximum "
429 << "cube texture size is too small (" 429 << "cube texture size is too small ("
430 << max_cube_map_texture_size << ", should be " 430 << max_cube_map_texture_size << ", should be "
431 << kES3MinCubeMapSize << ")."; 431 << kES3MinCubeMapSize << ").";
432 return false; 432 return false;
433 } 433 }
434 } 434 }
435 435
436 path_manager_.reset(new PathManager()); 436 path_manager_.reset(new PathManager());
437 437
438 program_manager_.reset( 438 program_manager_.reset(new ProgramManager(
439 new ProgramManager(program_cache_, 439 program_cache_, max_varying_vectors_, max_draw_buffers_,
440 max_varying_vectors_, 440 max_dual_source_draw_buffers_, max_vertex_attribs_, gpu_preferences_,
441 max_draw_buffers_, 441 feature_info_.get(), progress_reporter_));
442 max_dual_source_draw_buffers_,
443 max_vertex_attribs_,
444 gpu_preferences_,
445 feature_info_.get()));
446 442
447 if (!texture_manager_->Initialize()) { 443 if (!texture_manager_->Initialize()) {
448 DLOG(ERROR) << "Context::Group::Initialize failed because texture manager " 444 DLOG(ERROR) << "Context::Group::Initialize failed because texture manager "
449 << "failed to initialize."; 445 << "failed to initialize.";
450 return false; 446 return false;
451 } 447 }
452 448
453 decoders_.push_back(base::AsWeakPtr<GLES2Decoder>(decoder)); 449 decoders_.push_back(base::AsWeakPtr<GLES2Decoder>(decoder));
454 return true; 450 return true;
455 } 451 }
(...skipping 18 matching lines...) Expand all
474 }; 470 };
475 471
476 } // namespace anonymous 472 } // namespace anonymous
477 473
478 bool ContextGroup::HaveContexts() { 474 bool ContextGroup::HaveContexts() {
479 decoders_.erase(std::remove_if(decoders_.begin(), decoders_.end(), IsNull), 475 decoders_.erase(std::remove_if(decoders_.begin(), decoders_.end(), IsNull),
480 decoders_.end()); 476 decoders_.end());
481 return !decoders_.empty(); 477 return !decoders_.empty();
482 } 478 }
483 479
480 void ContextGroup::ReportProgress() {
481 if (progress_reporter_)
482 progress_reporter_->ReportProgress();
483 }
484
484 void ContextGroup::Destroy(GLES2Decoder* decoder, bool have_context) { 485 void ContextGroup::Destroy(GLES2Decoder* decoder, bool have_context) {
485 decoders_.erase(std::remove_if(decoders_.begin(), decoders_.end(), 486 decoders_.erase(std::remove_if(decoders_.begin(), decoders_.end(),
486 WeakPtrEquals<gles2::GLES2Decoder>(decoder)), 487 WeakPtrEquals<gles2::GLES2Decoder>(decoder)),
487 decoders_.end()); 488 decoders_.end());
488 // If we still have contexts do nothing. 489 // If we still have contexts do nothing.
489 if (HaveContexts()) { 490 if (HaveContexts()) {
490 return; 491 return;
491 } 492 }
492 493
493 if (buffer_manager_ != nullptr) { 494 if (buffer_manager_ != nullptr) {
494 if (!have_context) { 495 if (!have_context) {
495 buffer_manager_->MarkContextLost(); 496 buffer_manager_->MarkContextLost();
496 } 497 }
497 buffer_manager_->Destroy(); 498 buffer_manager_->Destroy();
498 buffer_manager_.reset(); 499 buffer_manager_.reset();
500 ReportProgress();
499 } 501 }
500 502
501 if (framebuffer_manager_ != NULL) { 503 if (framebuffer_manager_ != NULL) {
502 framebuffer_manager_->Destroy(have_context); 504 framebuffer_manager_->Destroy(have_context);
503 if (texture_manager_) 505 if (texture_manager_)
504 texture_manager_->set_framebuffer_manager(NULL); 506 texture_manager_->set_framebuffer_manager(NULL);
505 framebuffer_manager_.reset(); 507 framebuffer_manager_.reset();
508 ReportProgress();
506 } 509 }
507 510
508 if (renderbuffer_manager_ != NULL) { 511 if (renderbuffer_manager_ != NULL) {
509 renderbuffer_manager_->Destroy(have_context); 512 renderbuffer_manager_->Destroy(have_context);
510 renderbuffer_manager_.reset(); 513 renderbuffer_manager_.reset();
514 ReportProgress();
511 } 515 }
512 516
513 if (texture_manager_ != NULL) { 517 if (texture_manager_ != NULL) {
514 texture_manager_->Destroy(have_context); 518 texture_manager_->Destroy(have_context);
515 texture_manager_.reset(); 519 texture_manager_.reset();
520 ReportProgress();
516 } 521 }
517 522
518 if (path_manager_ != NULL) { 523 if (path_manager_ != NULL) {
519 path_manager_->Destroy(have_context); 524 path_manager_->Destroy(have_context);
520 path_manager_.reset(); 525 path_manager_.reset();
526 ReportProgress();
521 } 527 }
522 528
523 if (program_manager_ != NULL) { 529 if (program_manager_ != NULL) {
524 program_manager_->Destroy(have_context); 530 program_manager_->Destroy(have_context);
525 program_manager_.reset(); 531 program_manager_.reset();
532 ReportProgress();
526 } 533 }
527 534
528 if (shader_manager_ != NULL) { 535 if (shader_manager_ != NULL) {
529 shader_manager_->Destroy(have_context); 536 shader_manager_->Destroy(have_context);
530 shader_manager_.reset(); 537 shader_manager_.reset();
538 ReportProgress();
531 } 539 }
532 540
533 if (sampler_manager_ != NULL) { 541 if (sampler_manager_ != NULL) {
534 sampler_manager_->Destroy(have_context); 542 sampler_manager_->Destroy(have_context);
535 sampler_manager_.reset(); 543 sampler_manager_.reset();
544 ReportProgress();
536 } 545 }
537 546
538 memory_tracker_ = NULL; 547 memory_tracker_ = NULL;
539 548
540 passthrough_resources_->Destroy(have_context); 549 passthrough_resources_->Destroy(have_context);
541 passthrough_resources_.reset(); 550 passthrough_resources_.reset();
551 ReportProgress();
danakj 2016/10/06 21:49:54 nit: This one seems unneeded, when you're leaving
danakj 2016/10/06 21:51:01 Or maybe it's worth keeping to chain with other fu
542 } 552 }
543 553
544 uint32_t ContextGroup::GetMemRepresented() const { 554 uint32_t ContextGroup::GetMemRepresented() const {
545 uint32_t total = 0; 555 uint32_t total = 0;
546 if (buffer_manager_.get()) 556 if (buffer_manager_.get())
547 total += buffer_manager_->mem_represented(); 557 total += buffer_manager_->mem_represented();
548 if (renderbuffer_manager_.get()) 558 if (renderbuffer_manager_.get())
549 total += renderbuffer_manager_->mem_represented(); 559 total += renderbuffer_manager_->mem_represented();
550 if (texture_manager_.get()) 560 if (texture_manager_.get())
551 total += texture_manager_->mem_represented(); 561 total += texture_manager_->mem_represented();
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 GLuint client_id, GLuint* service_id) const { 617 GLuint client_id, GLuint* service_id) const {
608 Buffer* buffer = buffer_manager_->GetBuffer(client_id); 618 Buffer* buffer = buffer_manager_->GetBuffer(client_id);
609 if (!buffer) 619 if (!buffer)
610 return false; 620 return false;
611 *service_id = buffer->service_id(); 621 *service_id = buffer->service_id();
612 return true; 622 return true;
613 } 623 }
614 624
615 } // namespace gles2 625 } // namespace gles2
616 } // namespace gpu 626 } // 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