| 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 28 matching lines...) Expand all Loading... |
| 39 enforce_gl_minimums_(CommandLine::ForCurrentProcess()->HasSwitch( | 39 enforce_gl_minimums_(CommandLine::ForCurrentProcess()->HasSwitch( |
| 40 switches::kEnforceGLMinimums)), | 40 switches::kEnforceGLMinimums)), |
| 41 bind_generates_resource_(bind_generates_resource), | 41 bind_generates_resource_(bind_generates_resource), |
| 42 max_vertex_attribs_(0u), | 42 max_vertex_attribs_(0u), |
| 43 max_texture_units_(0u), | 43 max_texture_units_(0u), |
| 44 max_texture_image_units_(0u), | 44 max_texture_image_units_(0u), |
| 45 max_vertex_texture_image_units_(0u), | 45 max_vertex_texture_image_units_(0u), |
| 46 max_fragment_uniform_vectors_(0u), | 46 max_fragment_uniform_vectors_(0u), |
| 47 max_varying_vectors_(0u), | 47 max_varying_vectors_(0u), |
| 48 max_vertex_uniform_vectors_(0u), | 48 max_vertex_uniform_vectors_(0u), |
| 49 max_color_attachments_(1u), |
| 50 max_draw_buffers_(1u), |
| 49 program_cache_(NULL), | 51 program_cache_(NULL), |
| 50 feature_info_(new FeatureInfo()) { | 52 feature_info_(new FeatureInfo()) { |
| 51 { | 53 { |
| 52 TransferBufferManager* manager = new TransferBufferManager(); | 54 TransferBufferManager* manager = new TransferBufferManager(); |
| 53 transfer_buffer_manager_.reset(manager); | 55 transfer_buffer_manager_.reset(manager); |
| 54 manager->Initialize(); | 56 manager->Initialize(); |
| 55 } | 57 } |
| 56 | 58 |
| 57 id_namespaces_[id_namespaces::kBuffers].reset(new IdAllocator); | 59 id_namespaces_[id_namespaces::kBuffers].reset(new IdAllocator); |
| 58 id_namespaces_[id_namespaces::kFramebuffers].reset(new IdAllocator); | 60 id_namespaces_[id_namespaces::kFramebuffers].reset(new IdAllocator); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 &max_renderbuffer_size)) { | 95 &max_renderbuffer_size)) { |
| 94 LOG(ERROR) << "ContextGroup::Initialize failed because maximum " | 96 LOG(ERROR) << "ContextGroup::Initialize failed because maximum " |
| 95 << "renderbuffer size too small."; | 97 << "renderbuffer size too small."; |
| 96 return false; | 98 return false; |
| 97 } | 99 } |
| 98 GLint max_samples = 0; | 100 GLint max_samples = 0; |
| 99 if (feature_info_->feature_flags().chromium_framebuffer_multisample) { | 101 if (feature_info_->feature_flags().chromium_framebuffer_multisample) { |
| 100 glGetIntegerv(GL_MAX_SAMPLES, &max_samples); | 102 glGetIntegerv(GL_MAX_SAMPLES, &max_samples); |
| 101 } | 103 } |
| 102 | 104 |
| 105 if (feature_info_->feature_flags().ext_draw_buffers) { |
| 106 GetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &max_color_attachments_); |
| 107 if (max_color_attachments_ < 1) |
| 108 max_color_attachments_ = 1; |
| 109 GetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &max_draw_buffers_); |
| 110 if (max_draw_buffers_ < 1) |
| 111 max_draw_buffers_ = 1; |
| 112 } |
| 113 |
| 103 buffer_manager_.reset(new BufferManager( | 114 buffer_manager_.reset(new BufferManager( |
| 104 memory_tracker_, feature_info_.get())); | 115 memory_tracker_, feature_info_.get())); |
| 105 framebuffer_manager_.reset(new FramebufferManager()); | 116 framebuffer_manager_.reset(new FramebufferManager(max_draw_buffers_)); |
| 106 renderbuffer_manager_.reset(new RenderbufferManager(memory_tracker_, | 117 renderbuffer_manager_.reset(new RenderbufferManager(memory_tracker_, |
| 107 max_renderbuffer_size, | 118 max_renderbuffer_size, |
| 108 max_samples)); | 119 max_samples)); |
| 109 shader_manager_.reset(new ShaderManager()); | 120 shader_manager_.reset(new ShaderManager()); |
| 110 program_manager_.reset(new ProgramManager(program_cache_)); | 121 program_manager_.reset(new ProgramManager(program_cache_)); |
| 111 | 122 |
| 112 // Lookup GL things we need to know. | 123 // Lookup GL things we need to know. |
| 113 const GLint kGLES2RequiredMinimumVertexAttribs = 8u; | 124 const GLint kGLES2RequiredMinimumVertexAttribs = 8u; |
| 114 if (!QueryGLFeatureU( | 125 if (!QueryGLFeatureU( |
| 115 GL_MAX_VERTEX_ATTRIBS, kGLES2RequiredMinimumVertexAttribs, | 126 GL_MAX_VERTEX_ATTRIBS, kGLES2RequiredMinimumVertexAttribs, |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 return false; | 209 return false; |
| 199 } | 210 } |
| 200 | 211 |
| 201 if (!texture_manager_->Initialize()) { | 212 if (!texture_manager_->Initialize()) { |
| 202 LOG(ERROR) << "Context::Group::Initialize failed because texture manager " | 213 LOG(ERROR) << "Context::Group::Initialize failed because texture manager " |
| 203 << "failed to initialize."; | 214 << "failed to initialize."; |
| 204 return false; | 215 return false; |
| 205 } | 216 } |
| 206 | 217 |
| 207 decoders_.push_back(base::AsWeakPtr<GLES2Decoder>(decoder)); | 218 decoders_.push_back(base::AsWeakPtr<GLES2Decoder>(decoder)); |
| 219 |
| 220 DCHECK_GT(max_draw_buffers_, 0u); |
| 221 draw_buffers_.reset(new GLenum[max_draw_buffers_]); |
| 222 draw_buffers_[0] = GL_BACK; |
| 223 for (uint32 i = 1; i < max_draw_buffers_; ++i) |
| 224 draw_buffers_[i] = GL_NONE; |
| 225 |
| 208 return true; | 226 return true; |
| 209 } | 227 } |
| 210 | 228 |
| 211 namespace { | 229 namespace { |
| 212 | 230 |
| 213 bool IsNull(const base::WeakPtr<gles2::GLES2Decoder>& decoder) { | 231 bool IsNull(const base::WeakPtr<gles2::GLES2Decoder>& decoder) { |
| 214 return !decoder; | 232 return !decoder; |
| 215 } | 233 } |
| 216 | 234 |
| 217 } // namespace anonymous | 235 } // namespace anonymous |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 | 341 |
| 324 bool ContextGroup::QueryGLFeatureU( | 342 bool ContextGroup::QueryGLFeatureU( |
| 325 GLenum pname, GLint min_required, uint32* v) { | 343 GLenum pname, GLint min_required, uint32* v) { |
| 326 uint32 value = 0; | 344 uint32 value = 0; |
| 327 GetIntegerv(pname, &value); | 345 GetIntegerv(pname, &value); |
| 328 bool result = CheckGLFeatureU(min_required, &value); | 346 bool result = CheckGLFeatureU(min_required, &value); |
| 329 *v = value; | 347 *v = value; |
| 330 return result; | 348 return result; |
| 331 } | 349 } |
| 332 | 350 |
| 351 GLenum ContextGroup::GetDrawBuffer(GLenum draw_buffer) const { |
| 352 GLsizei index = static_cast<GLsizei>( |
| 353 draw_buffer - GL_DRAW_BUFFER0_ARB); |
| 354 DCHECK(index >= 0 && index < static_cast<GLsizei>(max_draw_buffers_)); |
| 355 return draw_buffers_[index]; |
| 356 } |
| 357 |
| 358 void ContextGroup::SetDrawBuffers(GLsizei n, const GLenum* bufs) { |
| 359 DCHECK(n <= static_cast<GLsizei>(max_draw_buffers_)); |
| 360 for (GLsizei i = 0; i < n; ++i) |
| 361 draw_buffers_[i] = bufs[i]; |
| 362 } |
| 363 |
| 333 } // namespace gles2 | 364 } // namespace gles2 |
| 334 } // namespace gpu | 365 } // namespace gpu |
| OLD | NEW |