| 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/common/value_state.h" | |
| 15 #include "gpu/command_buffer/service/buffer_manager.h" | 14 #include "gpu/command_buffer/service/buffer_manager.h" |
| 16 #include "gpu/command_buffer/service/framebuffer_manager.h" | 15 #include "gpu/command_buffer/service/framebuffer_manager.h" |
| 17 #include "gpu/command_buffer/service/gpu_preferences.h" | 16 #include "gpu/command_buffer/service/gpu_preferences.h" |
| 18 #include "gpu/command_buffer/service/mailbox_manager_impl.h" | 17 #include "gpu/command_buffer/service/mailbox_manager_impl.h" |
| 19 #include "gpu/command_buffer/service/path_manager.h" | 18 #include "gpu/command_buffer/service/path_manager.h" |
| 20 #include "gpu/command_buffer/service/program_manager.h" | 19 #include "gpu/command_buffer/service/program_manager.h" |
| 21 #include "gpu/command_buffer/service/renderbuffer_manager.h" | 20 #include "gpu/command_buffer/service/renderbuffer_manager.h" |
| 22 #include "gpu/command_buffer/service/sampler_manager.h" | 21 #include "gpu/command_buffer/service/sampler_manager.h" |
| 23 #include "gpu/command_buffer/service/shader_manager.h" | 22 #include "gpu/command_buffer/service/shader_manager.h" |
| 24 #include "gpu/command_buffer/service/texture_manager.h" | 23 #include "gpu/command_buffer/service/texture_manager.h" |
| 25 #include "gpu/command_buffer/service/transfer_buffer_manager.h" | 24 #include "gpu/command_buffer/service/transfer_buffer_manager.h" |
| 26 #include "gpu/command_buffer/service/valuebuffer_manager.h" | |
| 27 #include "ui/gl/gl_bindings.h" | 25 #include "ui/gl/gl_bindings.h" |
| 28 #include "ui/gl/gl_version_info.h" | 26 #include "ui/gl/gl_version_info.h" |
| 29 | 27 |
| 30 namespace gpu { | 28 namespace gpu { |
| 31 namespace gles2 { | 29 namespace gles2 { |
| 32 | 30 |
| 33 namespace { | 31 namespace { |
| 34 | 32 |
| 35 void GetIntegerv(GLenum pname, uint32_t* var) { | 33 void GetIntegerv(GLenum pname, uint32_t* var) { |
| 36 GLint value = 0; | 34 GLint value = 0; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 58 } // namespace anonymous | 56 } // namespace anonymous |
| 59 | 57 |
| 60 ContextGroup::ContextGroup( | 58 ContextGroup::ContextGroup( |
| 61 const GpuPreferences& gpu_preferences, | 59 const GpuPreferences& gpu_preferences, |
| 62 const scoped_refptr<MailboxManager>& mailbox_manager, | 60 const scoped_refptr<MailboxManager>& mailbox_manager, |
| 63 const scoped_refptr<MemoryTracker>& memory_tracker, | 61 const scoped_refptr<MemoryTracker>& memory_tracker, |
| 64 const scoped_refptr<ShaderTranslatorCache>& shader_translator_cache, | 62 const scoped_refptr<ShaderTranslatorCache>& shader_translator_cache, |
| 65 const scoped_refptr<FramebufferCompletenessCache>& | 63 const scoped_refptr<FramebufferCompletenessCache>& |
| 66 framebuffer_completeness_cache, | 64 framebuffer_completeness_cache, |
| 67 const scoped_refptr<FeatureInfo>& feature_info, | 65 const scoped_refptr<FeatureInfo>& feature_info, |
| 68 const scoped_refptr<SubscriptionRefSet>& subscription_ref_set, | |
| 69 const scoped_refptr<ValueStateMap>& pending_valuebuffer_state, | |
| 70 bool bind_generates_resource) | 66 bool bind_generates_resource) |
| 71 : gpu_preferences_(gpu_preferences), | 67 : gpu_preferences_(gpu_preferences), |
| 72 mailbox_manager_(mailbox_manager), | 68 mailbox_manager_(mailbox_manager), |
| 73 memory_tracker_(memory_tracker), | 69 memory_tracker_(memory_tracker), |
| 74 shader_translator_cache_(shader_translator_cache), | 70 shader_translator_cache_(shader_translator_cache), |
| 75 #if defined(OS_MACOSX) | 71 #if defined(OS_MACOSX) |
| 76 // Framebuffer completeness is not cacheable on OS X because of dynamic | 72 // Framebuffer completeness is not cacheable on OS X because of dynamic |
| 77 // graphics switching. | 73 // graphics switching. |
| 78 // http://crbug.com/180876 | 74 // http://crbug.com/180876 |
| 79 // TODO(tobiasjs): determine whether GPU switching is possible | 75 // TODO(tobiasjs): determine whether GPU switching is possible |
| 80 // programmatically, rather than just hardcoding this behaviour | 76 // programmatically, rather than just hardcoding this behaviour |
| 81 // for OS X. | 77 // for OS X. |
| 82 framebuffer_completeness_cache_(NULL), | 78 framebuffer_completeness_cache_(NULL), |
| 83 #else | 79 #else |
| 84 framebuffer_completeness_cache_(framebuffer_completeness_cache), | 80 framebuffer_completeness_cache_(framebuffer_completeness_cache), |
| 85 #endif | 81 #endif |
| 86 subscription_ref_set_(subscription_ref_set), | |
| 87 pending_valuebuffer_state_(pending_valuebuffer_state), | |
| 88 enforce_gl_minimums_(gpu_preferences_.enforce_gl_minimums), | 82 enforce_gl_minimums_(gpu_preferences_.enforce_gl_minimums), |
| 89 bind_generates_resource_(bind_generates_resource), | 83 bind_generates_resource_(bind_generates_resource), |
| 90 max_vertex_attribs_(0u), | 84 max_vertex_attribs_(0u), |
| 91 max_texture_units_(0u), | 85 max_texture_units_(0u), |
| 92 max_texture_image_units_(0u), | 86 max_texture_image_units_(0u), |
| 93 max_vertex_texture_image_units_(0u), | 87 max_vertex_texture_image_units_(0u), |
| 94 max_fragment_uniform_vectors_(0u), | 88 max_fragment_uniform_vectors_(0u), |
| 95 max_varying_vectors_(0u), | 89 max_varying_vectors_(0u), |
| 96 max_vertex_uniform_vectors_(0u), | 90 max_vertex_uniform_vectors_(0u), |
| 97 max_color_attachments_(1u), | 91 max_color_attachments_(1u), |
| 98 max_draw_buffers_(1u), | 92 max_draw_buffers_(1u), |
| 99 max_dual_source_draw_buffers_(0u), | 93 max_dual_source_draw_buffers_(0u), |
| 100 max_vertex_output_components_(0u), | 94 max_vertex_output_components_(0u), |
| 101 max_fragment_input_components_(0u), | 95 max_fragment_input_components_(0u), |
| 102 min_program_texel_offset_(0), | 96 min_program_texel_offset_(0), |
| 103 max_program_texel_offset_(0), | 97 max_program_texel_offset_(0), |
| 104 program_cache_(NULL), | 98 program_cache_(NULL), |
| 105 feature_info_(feature_info) { | 99 feature_info_(feature_info) { |
| 106 { | 100 { |
| 107 DCHECK(feature_info_); | 101 DCHECK(feature_info_); |
| 108 if (!mailbox_manager_.get()) | 102 if (!mailbox_manager_.get()) |
| 109 mailbox_manager_ = new MailboxManagerImpl; | 103 mailbox_manager_ = new MailboxManagerImpl; |
| 110 if (!subscription_ref_set_.get()) | |
| 111 subscription_ref_set_ = new SubscriptionRefSet(); | |
| 112 if (!pending_valuebuffer_state_.get()) | |
| 113 pending_valuebuffer_state_ = new ValueStateMap(); | |
| 114 transfer_buffer_manager_ = new TransferBufferManager(memory_tracker_.get()); | 104 transfer_buffer_manager_ = new TransferBufferManager(memory_tracker_.get()); |
| 115 } | 105 } |
| 116 } | 106 } |
| 117 | 107 |
| 118 bool ContextGroup::Initialize(GLES2Decoder* decoder, | 108 bool ContextGroup::Initialize(GLES2Decoder* decoder, |
| 119 ContextType context_type, | 109 ContextType context_type, |
| 120 const DisallowedFeatures& disallowed_features) { | 110 const DisallowedFeatures& disallowed_features) { |
| 121 if (HaveContexts()) { | 111 if (HaveContexts()) { |
| 122 if (context_type != feature_info_->context_type()) { | 112 if (context_type != feature_info_->context_type()) { |
| 123 LOG(ERROR) << "ContextGroup::Initialize failed because the type of " | 113 LOG(ERROR) << "ContextGroup::Initialize failed because the type of " |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 buffer_manager_.reset( | 168 buffer_manager_.reset( |
| 179 new BufferManager(memory_tracker_.get(), feature_info_.get())); | 169 new BufferManager(memory_tracker_.get(), feature_info_.get())); |
| 180 framebuffer_manager_.reset(new FramebufferManager( | 170 framebuffer_manager_.reset(new FramebufferManager( |
| 181 max_draw_buffers_, max_color_attachments_, feature_info_->context_type(), | 171 max_draw_buffers_, max_color_attachments_, feature_info_->context_type(), |
| 182 framebuffer_completeness_cache_)); | 172 framebuffer_completeness_cache_)); |
| 183 renderbuffer_manager_.reset(new RenderbufferManager( | 173 renderbuffer_manager_.reset(new RenderbufferManager( |
| 184 memory_tracker_.get(), max_renderbuffer_size, max_samples, | 174 memory_tracker_.get(), max_renderbuffer_size, max_samples, |
| 185 feature_info_.get())); | 175 feature_info_.get())); |
| 186 shader_manager_.reset(new ShaderManager()); | 176 shader_manager_.reset(new ShaderManager()); |
| 187 sampler_manager_.reset(new SamplerManager(feature_info_.get())); | 177 sampler_manager_.reset(new SamplerManager(feature_info_.get())); |
| 188 valuebuffer_manager_.reset( | |
| 189 new ValuebufferManager(subscription_ref_set_.get(), | |
| 190 pending_valuebuffer_state_.get())); | |
| 191 | 178 |
| 192 // Lookup GL things we need to know. | 179 // Lookup GL things we need to know. |
| 193 const GLint kGLES2RequiredMinimumVertexAttribs = 8u; | 180 const GLint kGLES2RequiredMinimumVertexAttribs = 8u; |
| 194 if (!QueryGLFeatureU( | 181 if (!QueryGLFeatureU( |
| 195 GL_MAX_VERTEX_ATTRIBS, kGLES2RequiredMinimumVertexAttribs, | 182 GL_MAX_VERTEX_ATTRIBS, kGLES2RequiredMinimumVertexAttribs, |
| 196 &max_vertex_attribs_)) { | 183 &max_vertex_attribs_)) { |
| 197 LOG(ERROR) << "ContextGroup::Initialize failed because too few " | 184 LOG(ERROR) << "ContextGroup::Initialize failed because too few " |
| 198 << "vertex attributes supported (" << max_vertex_attribs_ | 185 << "vertex attributes supported (" << max_vertex_attribs_ |
| 199 << ", should be " << kGLES2RequiredMinimumVertexAttribs << ")."; | 186 << ", should be " << kGLES2RequiredMinimumVertexAttribs << ")."; |
| 200 return false; | 187 return false; |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 if (shader_manager_ != NULL) { | 474 if (shader_manager_ != NULL) { |
| 488 shader_manager_->Destroy(have_context); | 475 shader_manager_->Destroy(have_context); |
| 489 shader_manager_.reset(); | 476 shader_manager_.reset(); |
| 490 } | 477 } |
| 491 | 478 |
| 492 if (sampler_manager_ != NULL) { | 479 if (sampler_manager_ != NULL) { |
| 493 sampler_manager_->Destroy(have_context); | 480 sampler_manager_->Destroy(have_context); |
| 494 sampler_manager_.reset(); | 481 sampler_manager_.reset(); |
| 495 } | 482 } |
| 496 | 483 |
| 497 if (valuebuffer_manager_ != NULL) { | |
| 498 valuebuffer_manager_->Destroy(); | |
| 499 valuebuffer_manager_.reset(); | |
| 500 } | |
| 501 | |
| 502 memory_tracker_ = NULL; | 484 memory_tracker_ = NULL; |
| 503 } | 485 } |
| 504 | 486 |
| 505 uint32_t ContextGroup::GetMemRepresented() const { | 487 uint32_t ContextGroup::GetMemRepresented() const { |
| 506 uint32_t total = 0; | 488 uint32_t total = 0; |
| 507 if (buffer_manager_.get()) | 489 if (buffer_manager_.get()) |
| 508 total += buffer_manager_->mem_represented(); | 490 total += buffer_manager_->mem_represented(); |
| 509 if (renderbuffer_manager_.get()) | 491 if (renderbuffer_manager_.get()) |
| 510 total += renderbuffer_manager_->mem_represented(); | 492 total += renderbuffer_manager_->mem_represented(); |
| 511 if (texture_manager_.get()) | 493 if (texture_manager_.get()) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 565 GLuint client_id, GLuint* service_id) const { | 547 GLuint client_id, GLuint* service_id) const { |
| 566 Buffer* buffer = buffer_manager_->GetBuffer(client_id); | 548 Buffer* buffer = buffer_manager_->GetBuffer(client_id); |
| 567 if (!buffer) | 549 if (!buffer) |
| 568 return false; | 550 return false; |
| 569 *service_id = buffer->service_id(); | 551 *service_id = buffer->service_id(); |
| 570 return true; | 552 return true; |
| 571 } | 553 } |
| 572 | 554 |
| 573 } // namespace gles2 | 555 } // namespace gles2 |
| 574 } // namespace gpu | 556 } // namespace gpu |
| OLD | NEW |