| 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/vertex_attrib_manager.h" | 5 #include "gpu/command_buffer/service/vertex_attrib_manager.h" |
| 6 | 6 |
| 7 #include <list> | 7 #include <list> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 } | 56 } |
| 57 | 57 |
| 58 uint32 usable_size = buffer_size - offset_; | 58 uint32 usable_size = buffer_size - offset_; |
| 59 GLuint num_elements = usable_size / real_stride_ + | 59 GLuint num_elements = usable_size / real_stride_ + |
| 60 ((usable_size % real_stride_) >= | 60 ((usable_size % real_stride_) >= |
| 61 (GLES2Util::GetGLTypeSizeForTexturesAndBuffers(type_) * size_) ? 1 : 0); | 61 (GLES2Util::GetGLTypeSizeForTexturesAndBuffers(type_) * size_) ? 1 : 0); |
| 62 return index < num_elements; | 62 return index < num_elements; |
| 63 } | 63 } |
| 64 | 64 |
| 65 VertexAttribManager::VertexAttribManager() | 65 VertexAttribManager::VertexAttribManager() |
| 66 : max_vertex_attribs_(0), | 66 : num_fixed_attribs_(0), |
| 67 num_fixed_attribs_(0), | |
| 68 element_array_buffer_(NULL), | 67 element_array_buffer_(NULL), |
| 69 manager_(NULL), | 68 manager_(NULL), |
| 70 deleted_(false), | 69 deleted_(false), |
| 71 service_id_(0) { | 70 service_id_(0) { |
| 72 } | 71 } |
| 73 | 72 |
| 74 VertexAttribManager::VertexAttribManager( | 73 VertexAttribManager::VertexAttribManager( |
| 75 VertexArrayManager* manager, GLuint service_id, uint32 num_vertex_attribs) | 74 VertexArrayManager* manager, GLuint service_id, uint32 num_vertex_attribs) |
| 76 : max_vertex_attribs_(0), | 75 : num_fixed_attribs_(0), |
| 77 num_fixed_attribs_(0), | |
| 78 element_array_buffer_(NULL), | 76 element_array_buffer_(NULL), |
| 79 manager_(manager), | 77 manager_(manager), |
| 80 deleted_(false), | 78 deleted_(false), |
| 81 service_id_(service_id) { | 79 service_id_(service_id) { |
| 82 manager_->StartTracking(this); | 80 manager_->StartTracking(this); |
| 83 Initialize(num_vertex_attribs, false); | 81 Initialize(num_vertex_attribs, false); |
| 84 } | 82 } |
| 85 | 83 |
| 86 VertexAttribManager::~VertexAttribManager() { | 84 VertexAttribManager::~VertexAttribManager() { |
| 87 if (manager_) { | 85 if (manager_) { |
| 88 if (manager_->have_context_) { | 86 if (manager_->have_context_) { |
| 89 if (service_id_ != 0) // 0 indicates an emulated VAO | 87 if (service_id_ != 0) // 0 indicates an emulated VAO |
| 90 glDeleteVertexArraysOES(1, &service_id_); | 88 glDeleteVertexArraysOES(1, &service_id_); |
| 91 } | 89 } |
| 92 manager_->StopTracking(this); | 90 manager_->StopTracking(this); |
| 93 manager_ = NULL; | 91 manager_ = NULL; |
| 94 } | 92 } |
| 95 } | 93 } |
| 96 | 94 |
| 97 void VertexAttribManager::Initialize( | 95 void VertexAttribManager::Initialize( |
| 98 uint32 max_vertex_attribs, bool init_attribs) { | 96 uint32 max_vertex_attribs, bool init_attribs) { |
| 99 max_vertex_attribs_ = max_vertex_attribs; | 97 vertex_attrib_infos_.resize(max_vertex_attribs); |
| 100 vertex_attrib_infos_.reset( | |
| 101 new VertexAttribInfo[max_vertex_attribs]); | |
| 102 bool disable_workarounds = CommandLine::ForCurrentProcess()->HasSwitch( | 98 bool disable_workarounds = CommandLine::ForCurrentProcess()->HasSwitch( |
| 103 switches::kDisableGpuDriverBugWorkarounds); | 99 switches::kDisableGpuDriverBugWorkarounds); |
| 104 | 100 |
| 105 for (uint32 vv = 0; vv < max_vertex_attribs; ++vv) { | 101 for (uint32 vv = 0; vv < vertex_attrib_infos_.size(); ++vv) { |
| 106 vertex_attrib_infos_[vv].set_index(vv); | 102 vertex_attrib_infos_[vv].set_index(vv); |
| 107 vertex_attrib_infos_[vv].SetList(&disabled_vertex_attribs_); | 103 vertex_attrib_infos_[vv].SetList(&disabled_vertex_attribs_); |
| 108 | 104 |
| 109 if (!disable_workarounds && init_attribs) { | 105 if (!disable_workarounds && init_attribs) { |
| 110 glVertexAttrib4f(vv, 0.0f, 0.0f, 0.0f, 1.0f); | 106 glVertexAttrib4f(vv, 0.0f, 0.0f, 0.0f, 1.0f); |
| 111 } | 107 } |
| 112 } | 108 } |
| 113 } | 109 } |
| 114 | 110 |
| 115 bool VertexAttribManager::Enable(GLuint index, bool enable) { | 111 bool VertexAttribManager::Enable(GLuint index, bool enable) { |
| 116 if (index >= max_vertex_attribs_) { | 112 if (index >= vertex_attrib_infos_.size()) { |
| 117 return false; | 113 return false; |
| 118 } | 114 } |
| 119 VertexAttribInfo& info = vertex_attrib_infos_[index]; | 115 VertexAttribInfo& info = vertex_attrib_infos_[index]; |
| 120 if (info.enabled() != enable) { | 116 if (info.enabled() != enable) { |
| 121 info.set_enabled(enable); | 117 info.set_enabled(enable); |
| 122 info.SetList(enable ? &enabled_vertex_attribs_ : &disabled_vertex_attribs_); | 118 info.SetList(enable ? &enabled_vertex_attribs_ : &disabled_vertex_attribs_); |
| 123 } | 119 } |
| 124 return true; | 120 return true; |
| 125 } | 121 } |
| 126 | 122 |
| 127 void VertexAttribManager::Unbind(BufferManager::BufferInfo* buffer) { | 123 void VertexAttribManager::Unbind(BufferManager::BufferInfo* buffer) { |
| 128 if (element_array_buffer_ == buffer) { | 124 if (element_array_buffer_ == buffer) { |
| 129 element_array_buffer_ = NULL; | 125 element_array_buffer_ = NULL; |
| 130 } | 126 } |
| 131 for (uint32 vv = 0; vv < max_vertex_attribs_; ++vv) { | 127 for (uint32 vv = 0; vv < vertex_attrib_infos_.size(); ++vv) { |
| 132 vertex_attrib_infos_[vv].Unbind(buffer); | 128 vertex_attrib_infos_[vv].Unbind(buffer); |
| 133 } | 129 } |
| 134 } | 130 } |
| 135 | 131 |
| 136 } // namespace gles2 | 132 } // namespace gles2 |
| 137 } // namespace gpu | 133 } // namespace gpu |
| OLD | NEW |