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 |