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 <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 Loading... |
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 Loading... |
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), |
| 108 progress_reporter_(progress_reporter), |
106 passthrough_resources_(new PassthroughResources) { | 109 passthrough_resources_(new PassthroughResources) { |
107 { | 110 { |
108 DCHECK(feature_info_); | 111 DCHECK(feature_info_); |
| 112 DCHECK(progress_reporter_); |
109 if (!mailbox_manager_.get()) | 113 if (!mailbox_manager_.get()) |
110 mailbox_manager_ = new MailboxManagerImpl; | 114 mailbox_manager_ = new MailboxManagerImpl; |
111 transfer_buffer_manager_ = new TransferBufferManager(memory_tracker_.get()); | 115 transfer_buffer_manager_ = new TransferBufferManager(memory_tracker_.get()); |
112 } | 116 } |
113 } | 117 } |
114 | 118 |
115 bool ContextGroup::Initialize(GLES2Decoder* decoder, | 119 bool ContextGroup::Initialize(GLES2Decoder* decoder, |
116 ContextType context_type, | 120 ContextType context_type, |
117 const DisallowedFeatures& disallowed_features) { | 121 const DisallowedFeatures& disallowed_features) { |
118 if (HaveContexts()) { | 122 if (HaveContexts()) { |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 } | 209 } |
206 | 210 |
207 buffer_manager_.reset( | 211 buffer_manager_.reset( |
208 new BufferManager(memory_tracker_.get(), feature_info_.get())); | 212 new BufferManager(memory_tracker_.get(), feature_info_.get())); |
209 framebuffer_manager_.reset(new FramebufferManager( | 213 framebuffer_manager_.reset(new FramebufferManager( |
210 max_draw_buffers_, max_color_attachments_, feature_info_->context_type(), | 214 max_draw_buffers_, max_color_attachments_, feature_info_->context_type(), |
211 framebuffer_completeness_cache_)); | 215 framebuffer_completeness_cache_)); |
212 renderbuffer_manager_.reset(new RenderbufferManager( | 216 renderbuffer_manager_.reset(new RenderbufferManager( |
213 memory_tracker_.get(), max_renderbuffer_size, max_samples, | 217 memory_tracker_.get(), max_renderbuffer_size, max_samples, |
214 feature_info_.get())); | 218 feature_info_.get())); |
215 shader_manager_.reset(new ShaderManager()); | 219 shader_manager_.reset(new ShaderManager(progress_reporter_)); |
216 sampler_manager_.reset(new SamplerManager(feature_info_.get())); | 220 sampler_manager_.reset(new SamplerManager(feature_info_.get())); |
217 | 221 |
218 // Lookup GL things we need to know. | 222 // Lookup GL things we need to know. |
219 const GLint kGLES2RequiredMinimumVertexAttribs = 8u; | 223 const GLint kGLES2RequiredMinimumVertexAttribs = 8u; |
220 if (!QueryGLFeatureU( | 224 if (!QueryGLFeatureU( |
221 GL_MAX_VERTEX_ATTRIBS, kGLES2RequiredMinimumVertexAttribs, | 225 GL_MAX_VERTEX_ATTRIBS, kGLES2RequiredMinimumVertexAttribs, |
222 &max_vertex_attribs_)) { | 226 &max_vertex_attribs_)) { |
223 DLOG(ERROR) << "ContextGroup::Initialize failed because too few " | 227 DLOG(ERROR) << "ContextGroup::Initialize failed because too few " |
224 << "vertex attributes supported (" << max_vertex_attribs_ | 228 << "vertex attributes supported (" << max_vertex_attribs_ |
225 << ", should be " << kGLES2RequiredMinimumVertexAttribs << ")."; | 229 << ", should be " << kGLES2RequiredMinimumVertexAttribs << ")."; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 | 296 |
293 if (feature_info_->workarounds().max_texture_size) { | 297 if (feature_info_->workarounds().max_texture_size) { |
294 max_texture_size = std::min( | 298 max_texture_size = std::min( |
295 max_texture_size, | 299 max_texture_size, |
296 feature_info_->workarounds().max_texture_size); | 300 feature_info_->workarounds().max_texture_size); |
297 max_rectangle_texture_size = std::min( | 301 max_rectangle_texture_size = std::min( |
298 max_rectangle_texture_size, | 302 max_rectangle_texture_size, |
299 feature_info_->workarounds().max_texture_size); | 303 feature_info_->workarounds().max_texture_size); |
300 } | 304 } |
301 | 305 |
302 texture_manager_.reset(new TextureManager(memory_tracker_.get(), | 306 texture_manager_.reset(new TextureManager( |
303 feature_info_.get(), | 307 memory_tracker_.get(), feature_info_.get(), max_texture_size, |
304 max_texture_size, | 308 max_cube_map_texture_size, max_rectangle_texture_size, |
305 max_cube_map_texture_size, | 309 max_3d_texture_size, max_array_texture_layers, bind_generates_resource_, |
306 max_rectangle_texture_size, | 310 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()); | 311 texture_manager_->set_framebuffer_manager(framebuffer_manager_.get()); |
311 | 312 |
312 const GLint kMinTextureImageUnits = 8; | 313 const GLint kMinTextureImageUnits = 8; |
313 const GLint kMinVertexTextureImageUnits = 0; | 314 const GLint kMinVertexTextureImageUnits = 0; |
314 if (!QueryGLFeatureU(GL_MAX_TEXTURE_IMAGE_UNITS, kMinTextureImageUnits, | 315 if (!QueryGLFeatureU(GL_MAX_TEXTURE_IMAGE_UNITS, kMinTextureImageUnits, |
315 &max_texture_image_units_)) { | 316 &max_texture_image_units_)) { |
316 DLOG(ERROR) << "ContextGroup::Initialize failed because too few " | 317 DLOG(ERROR) << "ContextGroup::Initialize failed because too few " |
317 << "texture image units supported (" | 318 << "texture image units supported (" |
318 << max_texture_image_units_ | 319 << max_texture_image_units_ |
319 << ", should be " << kMinTextureImageUnits << ")."; | 320 << ", should be " << kMinTextureImageUnits << ")."; |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
428 DLOG(ERROR) << "ContextGroup::Initialize failed because maximum " | 429 DLOG(ERROR) << "ContextGroup::Initialize failed because maximum " |
429 << "cube texture size is too small (" | 430 << "cube texture size is too small (" |
430 << max_cube_map_texture_size << ", should be " | 431 << max_cube_map_texture_size << ", should be " |
431 << kES3MinCubeMapSize << ")."; | 432 << kES3MinCubeMapSize << ")."; |
432 return false; | 433 return false; |
433 } | 434 } |
434 } | 435 } |
435 | 436 |
436 path_manager_.reset(new PathManager()); | 437 path_manager_.reset(new PathManager()); |
437 | 438 |
438 program_manager_.reset( | 439 program_manager_.reset(new ProgramManager( |
439 new ProgramManager(program_cache_, | 440 program_cache_, max_varying_vectors_, max_draw_buffers_, |
440 max_varying_vectors_, | 441 max_dual_source_draw_buffers_, max_vertex_attribs_, gpu_preferences_, |
441 max_draw_buffers_, | 442 feature_info_.get(), progress_reporter_)); |
442 max_dual_source_draw_buffers_, | |
443 max_vertex_attribs_, | |
444 gpu_preferences_, | |
445 feature_info_.get())); | |
446 | 443 |
447 if (!texture_manager_->Initialize()) { | 444 if (!texture_manager_->Initialize()) { |
448 DLOG(ERROR) << "Context::Group::Initialize failed because texture manager " | 445 DLOG(ERROR) << "Context::Group::Initialize failed because texture manager " |
449 << "failed to initialize."; | 446 << "failed to initialize."; |
450 return false; | 447 return false; |
451 } | 448 } |
452 | 449 |
453 decoders_.push_back(base::AsWeakPtr<GLES2Decoder>(decoder)); | 450 decoders_.push_back(base::AsWeakPtr<GLES2Decoder>(decoder)); |
454 return true; | 451 return true; |
455 } | 452 } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
489 if (HaveContexts()) { | 486 if (HaveContexts()) { |
490 return; | 487 return; |
491 } | 488 } |
492 | 489 |
493 if (buffer_manager_ != nullptr) { | 490 if (buffer_manager_ != nullptr) { |
494 if (!have_context) { | 491 if (!have_context) { |
495 buffer_manager_->MarkContextLost(); | 492 buffer_manager_->MarkContextLost(); |
496 } | 493 } |
497 buffer_manager_->Destroy(); | 494 buffer_manager_->Destroy(); |
498 buffer_manager_.reset(); | 495 buffer_manager_.reset(); |
| 496 progress_reporter_->ReportProgress(); |
499 } | 497 } |
500 | 498 |
501 if (framebuffer_manager_ != NULL) { | 499 if (framebuffer_manager_ != NULL) { |
502 framebuffer_manager_->Destroy(have_context); | 500 framebuffer_manager_->Destroy(have_context); |
503 if (texture_manager_) | 501 if (texture_manager_) |
504 texture_manager_->set_framebuffer_manager(NULL); | 502 texture_manager_->set_framebuffer_manager(NULL); |
505 framebuffer_manager_.reset(); | 503 framebuffer_manager_.reset(); |
| 504 progress_reporter_->ReportProgress(); |
506 } | 505 } |
507 | 506 |
508 if (renderbuffer_manager_ != NULL) { | 507 if (renderbuffer_manager_ != NULL) { |
509 renderbuffer_manager_->Destroy(have_context); | 508 renderbuffer_manager_->Destroy(have_context); |
510 renderbuffer_manager_.reset(); | 509 renderbuffer_manager_.reset(); |
| 510 progress_reporter_->ReportProgress(); |
511 } | 511 } |
512 | 512 |
513 if (texture_manager_ != NULL) { | 513 if (texture_manager_ != NULL) { |
514 texture_manager_->Destroy(have_context); | 514 texture_manager_->Destroy(have_context); |
515 texture_manager_.reset(); | 515 texture_manager_.reset(); |
| 516 progress_reporter_->ReportProgress(); |
516 } | 517 } |
517 | 518 |
518 if (path_manager_ != NULL) { | 519 if (path_manager_ != NULL) { |
519 path_manager_->Destroy(have_context); | 520 path_manager_->Destroy(have_context); |
520 path_manager_.reset(); | 521 path_manager_.reset(); |
| 522 progress_reporter_->ReportProgress(); |
521 } | 523 } |
522 | 524 |
523 if (program_manager_ != NULL) { | 525 if (program_manager_ != NULL) { |
524 program_manager_->Destroy(have_context); | 526 program_manager_->Destroy(have_context); |
525 program_manager_.reset(); | 527 program_manager_.reset(); |
| 528 progress_reporter_->ReportProgress(); |
526 } | 529 } |
527 | 530 |
528 if (shader_manager_ != NULL) { | 531 if (shader_manager_ != NULL) { |
529 shader_manager_->Destroy(have_context); | 532 shader_manager_->Destroy(have_context); |
530 shader_manager_.reset(); | 533 shader_manager_.reset(); |
| 534 progress_reporter_->ReportProgress(); |
531 } | 535 } |
532 | 536 |
533 if (sampler_manager_ != NULL) { | 537 if (sampler_manager_ != NULL) { |
534 sampler_manager_->Destroy(have_context); | 538 sampler_manager_->Destroy(have_context); |
535 sampler_manager_.reset(); | 539 sampler_manager_.reset(); |
| 540 progress_reporter_->ReportProgress(); |
536 } | 541 } |
537 | 542 |
538 memory_tracker_ = NULL; | 543 memory_tracker_ = NULL; |
539 | 544 |
540 passthrough_resources_->Destroy(have_context); | 545 passthrough_resources_->Destroy(have_context); |
541 passthrough_resources_.reset(); | 546 passthrough_resources_.reset(); |
| 547 progress_reporter_->ReportProgress(); |
542 } | 548 } |
543 | 549 |
544 uint32_t ContextGroup::GetMemRepresented() const { | 550 uint32_t ContextGroup::GetMemRepresented() const { |
545 uint32_t total = 0; | 551 uint32_t total = 0; |
546 if (buffer_manager_.get()) | 552 if (buffer_manager_.get()) |
547 total += buffer_manager_->mem_represented(); | 553 total += buffer_manager_->mem_represented(); |
548 if (renderbuffer_manager_.get()) | 554 if (renderbuffer_manager_.get()) |
549 total += renderbuffer_manager_->mem_represented(); | 555 total += renderbuffer_manager_->mem_represented(); |
550 if (texture_manager_.get()) | 556 if (texture_manager_.get()) |
551 total += texture_manager_->mem_represented(); | 557 total += texture_manager_->mem_represented(); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 GLuint client_id, GLuint* service_id) const { | 613 GLuint client_id, GLuint* service_id) const { |
608 Buffer* buffer = buffer_manager_->GetBuffer(client_id); | 614 Buffer* buffer = buffer_manager_->GetBuffer(client_id); |
609 if (!buffer) | 615 if (!buffer) |
610 return false; | 616 return false; |
611 *service_id = buffer->service_id(); | 617 *service_id = buffer->service_id(); |
612 return true; | 618 return true; |
613 } | 619 } |
614 | 620 |
615 } // namespace gles2 | 621 } // namespace gles2 |
616 } // namespace gpu | 622 } // namespace gpu |
OLD | NEW |