Edit

kc3-lang/angle/src/libANGLE/VertexAttribute.h

Branch :

  • Show log

    Commit

  • Author : Geoff Lang
    Date : 2015-05-01 11:07:46
    Hash : 27464aa9
    Message : Sync the generic vertex attribute data. BUG=angleproject:883 Change-Id: If5616bf24c1ac5477ae80cf1d25efa70b62edea1 Reviewed-on: https://chromium-review.googlesource.com/268750 Reviewed-by: Kenneth Russell <kbr@chromium.org> Reviewed-by: Brandon Jones <bajones@chromium.org> Tested-by: Geoff Lang <geofflang@chromium.org>

  • src/libANGLE/VertexAttribute.h
  • //
    // Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    // Helper structure describing a single vertex attribute
    //
    
    #ifndef LIBANGLE_VERTEXATTRIBUTE_H_
    #define LIBANGLE_VERTEXATTRIBUTE_H_
    
    #include "libANGLE/Buffer.h"
    
    namespace gl
    {
    
    struct VertexAttribute
    {
        bool enabled; // From glEnable/DisableVertexAttribArray
    
        GLenum type;
        GLuint size;
        bool normalized;
        bool pureInteger;
        GLuint stride; // 0 means natural stride
    
        union
        {
            const GLvoid *pointer;
            GLintptr offset;
        };
        BindingPointer<Buffer> buffer; // Captured when glVertexAttribPointer is called.
    
        GLuint divisor;
    
        VertexAttribute();
    };
    
    bool operator==(const VertexAttribute &a, const VertexAttribute &b);
    bool operator!=(const VertexAttribute &a, const VertexAttribute &b);
    
    template <typename T>
    T QuerySingleVertexAttributeParameter(const VertexAttribute& attrib, GLenum pname)
    {
      switch (pname)
      {
        case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
          return static_cast<T>(attrib.enabled ? GL_TRUE : GL_FALSE);
        case GL_VERTEX_ATTRIB_ARRAY_SIZE:
          return static_cast<T>(attrib.size);
        case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
          return static_cast<T>(attrib.stride);
        case GL_VERTEX_ATTRIB_ARRAY_TYPE:
          return static_cast<T>(attrib.type);
        case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
          return static_cast<T>(attrib.normalized ? GL_TRUE : GL_FALSE);
        case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
          return static_cast<T>(attrib.buffer.id());
        case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
          return static_cast<T>(attrib.divisor);
        case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
          return static_cast<T>(attrib.pureInteger ? GL_TRUE : GL_FALSE);
        default:
          UNREACHABLE();
          return static_cast<T>(0);
      }
    }
    
    size_t ComputeVertexAttributeTypeSize(const VertexAttribute& attrib);
    size_t ComputeVertexAttributeStride(const VertexAttribute& attrib);
    
    struct VertexAttribCurrentValueData
    {
        union
        {
            GLfloat FloatValues[4];
            GLint IntValues[4];
            GLuint UnsignedIntValues[4];
        };
        GLenum Type;
    
        VertexAttribCurrentValueData()
            : Type(GL_FLOAT)
        {
            FloatValues[0] = 0.0f;
            FloatValues[1] = 0.0f;
            FloatValues[2] = 0.0f;
            FloatValues[3] = 1.0f;
        }
    
        void setFloatValues(const GLfloat floatValues[4])
        {
            for (unsigned int valueIndex = 0; valueIndex < 4; valueIndex++)
            {
                FloatValues[valueIndex] = floatValues[valueIndex];
            }
            Type = GL_FLOAT;
        }
    
        void setIntValues(const GLint intValues[4])
        {
            for (unsigned int valueIndex = 0; valueIndex < 4; valueIndex++)
            {
                IntValues[valueIndex] = intValues[valueIndex];
            }
            Type = GL_INT;
        }
    
        void setUnsignedIntValues(const GLuint unsignedIntValues[4])
        {
            for (unsigned int valueIndex = 0; valueIndex < 4; valueIndex++)
            {
                UnsignedIntValues[valueIndex] = unsignedIntValues[valueIndex];
            }
            Type = GL_UNSIGNED_INT;
        }
    
        bool operator==(const VertexAttribCurrentValueData &other)
        {
            return (Type == other.Type && memcmp(FloatValues, other.FloatValues, sizeof(float) * 4) == 0);
        }
    
        bool operator!=(const VertexAttribCurrentValueData &other)
        {
            return !(*this == other);
        }
    };
    
    }
    
    #endif // LIBANGLE_VERTEXATTRIBUTE_H_