Move VertexAttribManager to another file.
Just trying to slowly pair down gles2_cmd_decoder.cc
TEST=unit tests
BUG=none
[email protected]
Review URL: http://codereview.chromium.org/7331023
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@92029 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 9c344e1..674cc63 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -36,6 +36,7 @@
#include "gpu/command_buffer/service/shader_translator.h"
#include "gpu/command_buffer/service/surface_manager.h"
#include "gpu/command_buffer/service/texture_manager.h"
+#include "gpu/command_buffer/service/vertex_attrib_manager.h"
#include "gpu/GLES2/gles2_command_buffer.h"
#include "ui/gfx/gl/gl_context.h"
#include "ui/gfx/gl/gl_implementation.h"
@@ -441,264 +442,6 @@
GLES2Decoder::~GLES2Decoder() {
}
-class VertexAttribManager {
- public:
- // Info about Vertex Attributes. This is used to track what the user currently
- // has bound on each Vertex Attribute so that checking can be done at
- // glDrawXXX time.
- class VertexAttribInfo {
- public:
- typedef std::list<VertexAttribInfo*> VertexAttribInfoList;
- struct Vec4 {
- float v[4];
- };
-
- VertexAttribInfo()
- : index_(0),
- enabled_(false),
- size_(4),
- type_(GL_FLOAT),
- offset_(0),
- normalized_(GL_FALSE),
- gl_stride_(0),
- real_stride_(16),
- list_(NULL) {
- value_.v[0] = 0.0f;
- value_.v[1] = 0.0f;
- value_.v[2] = 0.0f;
- value_.v[3] = 1.0f;
- }
-
- // Returns true if this VertexAttrib can access index.
- bool CanAccess(GLuint index) const;
-
- BufferManager::BufferInfo* buffer() const {
- return buffer_;
- }
-
- GLsizei offset() const {
- return offset_;
- }
-
- GLuint index() const {
- return index_;
- }
-
- GLint size() const {
- return size_;
- }
-
- GLenum type() const {
- return type_;
- }
-
- GLboolean normalized() const {
- return normalized_;
- }
-
- GLsizei gl_stride() const {
- return gl_stride_;
- }
-
- bool enabled() const {
- return enabled_;
- }
-
- void set_value(const Vec4& value) {
- value_ = value;
- }
-
- const Vec4& value() const {
- return value_;
- }
-
- private:
- friend class VertexAttribManager;
-
- void set_enabled(bool enabled) {
- enabled_ = enabled;
- }
-
- void set_index(GLuint index) {
- index_ = index;
- }
-
- void SetList(VertexAttribInfoList* new_list) {
- DCHECK(new_list);
-
- if (list_) {
- list_->erase(it_);
- }
-
- it_ = new_list->insert(new_list->end(), this);
- list_ = new_list;
- }
-
- void SetInfo(
- BufferManager::BufferInfo* buffer,
- GLint size,
- GLenum type,
- GLboolean normalized,
- GLsizei gl_stride,
- GLsizei real_stride,
- GLsizei offset) {
- DCHECK_GT(real_stride, 0);
- buffer_ = buffer;
- size_ = size;
- type_ = type;
- normalized_ = normalized;
- gl_stride_ = gl_stride;
- real_stride_ = real_stride;
- offset_ = offset;
- }
-
- // The index of this attrib.
- GLuint index_;
-
- // Whether or not this attribute is enabled.
- bool enabled_;
-
- // number of components (1, 2, 3, 4)
- GLint size_;
-
- // GL_BYTE, GL_FLOAT, etc. See glVertexAttribPointer.
- GLenum type_;
-
- // The offset into the buffer.
- GLsizei offset_;
-
- GLboolean normalized_;
-
- // The stride passed to glVertexAttribPointer.
- GLsizei gl_stride_;
-
- // The stride that will be used to access the buffer. This is the actual
- // stide, NOT the GL bogus stride. In other words there is never a stride
- // of 0.
- GLsizei real_stride_;
-
- // The current value of the attrib.
- Vec4 value_;
-
- // The buffer bound to this attribute.
- BufferManager::BufferInfo::Ref buffer_;
-
- // List this info is on.
- VertexAttribInfoList* list_;
-
- // Iterator for list this info is on. Enabled/Disabled
- VertexAttribInfoList::iterator it_;
- };
-
- typedef std::list<VertexAttribInfo*> VertexAttribInfoList;
-
- VertexAttribManager()
- : max_vertex_attribs_(0),
- num_fixed_attribs_(0) {
- }
-
- void Initialize(uint32 num_vertex_attribs);
-
- bool Enable(GLuint index, bool enable);
-
- bool HaveFixedAttribs() const {
- return num_fixed_attribs_ != 0;
- }
-
- const VertexAttribInfoList& GetEnabledVertexAttribInfos() const {
- return enabled_vertex_attribs_;
- }
-
- VertexAttribInfo* GetVertexAttribInfo(GLuint index) {
- if (index < max_vertex_attribs_) {
- return &vertex_attrib_infos_[index];
- }
- return NULL;
- }
-
- void SetAttribInfo(
- GLuint index,
- BufferManager::BufferInfo* buffer,
- GLint size,
- GLenum type,
- GLboolean normalized,
- GLsizei gl_stride,
- GLsizei real_stride,
- GLsizei offset) {
- VertexAttribInfo* info = GetVertexAttribInfo(index);
- if (info) {
- if (info->type() == GL_FIXED) {
- --num_fixed_attribs_;
- }
- if (type == GL_FIXED) {
- ++num_fixed_attribs_;
- }
- info->SetInfo(
- buffer, size, type, normalized, gl_stride, real_stride, offset);
- }
- }
-
-
- private:
- uint32 max_vertex_attribs_;
-
- // number of attribs using type GL_FIXED.
- int num_fixed_attribs_;
-
- // Info for each vertex attribute saved so we can check at glDrawXXX time
- // if it is safe to draw.
- scoped_array<VertexAttribInfo> vertex_attrib_infos_;
-
- // Lists for which vertex attribs are enabled, disabled.
- VertexAttribInfoList enabled_vertex_attribs_;
- VertexAttribInfoList disabled_vertex_attribs_;
-};
-
-bool VertexAttribManager::VertexAttribInfo::CanAccess(GLuint index) const {
- if (!enabled_) {
- return true;
- }
-
- if (!buffer_ || buffer_->IsDeleted()) {
- return false;
- }
-
- // The number of elements that can be accessed.
- GLsizeiptr buffer_size = buffer_->size();
- if (offset_ > buffer_size || real_stride_ == 0) {
- return false;
- }
-
- uint32 usable_size = buffer_size - offset_;
- GLuint num_elements = usable_size / real_stride_ +
- ((usable_size % real_stride_) >=
- (GLES2Util::GetGLTypeSizeForTexturesAndBuffers(type_) * size_) ? 1 : 0);
- return index < num_elements;
-}
-
-
-void VertexAttribManager::Initialize(uint32 max_vertex_attribs) {
- max_vertex_attribs_ = max_vertex_attribs;
- vertex_attrib_infos_.reset(
- new VertexAttribInfo[max_vertex_attribs]);
- for (uint32 vv = 0; vv < max_vertex_attribs; ++vv) {
- vertex_attrib_infos_[vv].set_index(vv);
- vertex_attrib_infos_[vv].SetList(&disabled_vertex_attribs_);
- }
-}
-
-bool VertexAttribManager::Enable(GLuint index, bool enable) {
- if (index >= max_vertex_attribs_) {
- return false;
- }
- VertexAttribInfo& info = vertex_attrib_infos_[index];
- if (info.enabled() != enable) {
- info.set_enabled(enable);
- info.SetList(enable ? &enabled_vertex_attribs_ : &disabled_vertex_attribs_);
- }
- return true;
-}
-
// This class implements GLES2Decoder so we don't have to expose all the GLES2
// cmd stuff to outside this class.
class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>,