Home | History | Annotate | Download | only in libGLESv2
      1 //
      2 // Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
      3 // Use of this source code is governed by a BSD-style license that can be
      4 // found in the LICENSE file.
      5 //
      6 // Helper structure describing a single vertex attribute
      7 //
      8 
      9 #ifndef LIBGLESV2_VERTEXATTRIBUTE_H_
     10 #define LIBGLESV2_VERTEXATTRIBUTE_H_
     11 
     12 #include "libGLESv2/Buffer.h"
     13 
     14 namespace gl
     15 {
     16 
     17 struct VertexAttribute
     18 {
     19     bool enabled; // From glEnable/DisableVertexAttribArray
     20 
     21     GLenum type;
     22     GLuint size;
     23     bool normalized;
     24     bool pureInteger;
     25     GLuint stride; // 0 means natural stride
     26 
     27     union
     28     {
     29         const GLvoid *pointer;
     30         GLintptr offset;
     31     };
     32     BindingPointer<Buffer> buffer; // Captured when glVertexAttribPointer is called.
     33 
     34     GLuint divisor;
     35 
     36     VertexAttribute();
     37 };
     38 
     39 template <typename T>
     40 T QuerySingleVertexAttributeParameter(const VertexAttribute& attrib, GLenum pname)
     41 {
     42   switch (pname)
     43   {
     44     case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
     45       return static_cast<T>(attrib.enabled ? GL_TRUE : GL_FALSE);
     46     case GL_VERTEX_ATTRIB_ARRAY_SIZE:
     47       return static_cast<T>(attrib.size);
     48     case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
     49       return static_cast<T>(attrib.stride);
     50     case GL_VERTEX_ATTRIB_ARRAY_TYPE:
     51       return static_cast<T>(attrib.type);
     52     case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
     53       return static_cast<T>(attrib.normalized ? GL_TRUE : GL_FALSE);
     54     case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
     55       return static_cast<T>(attrib.buffer.id());
     56     case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
     57       return static_cast<T>(attrib.divisor);
     58     case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
     59       return static_cast<T>(attrib.pureInteger ? GL_TRUE : GL_FALSE);
     60     default:
     61       UNREACHABLE();
     62       return static_cast<T>(0);
     63   }
     64 }
     65 
     66 size_t ComputeVertexAttributeTypeSize(const VertexAttribute& attrib);
     67 size_t ComputeVertexAttributeStride(const VertexAttribute& attrib);
     68 
     69 struct VertexAttribCurrentValueData
     70 {
     71     union
     72     {
     73         GLfloat FloatValues[4];
     74         GLint IntValues[4];
     75         GLuint UnsignedIntValues[4];
     76     };
     77     GLenum Type;
     78 
     79     void setFloatValues(const GLfloat floatValues[4])
     80     {
     81         for (unsigned int valueIndex = 0; valueIndex < 4; valueIndex++)
     82         {
     83             FloatValues[valueIndex] = floatValues[valueIndex];
     84         }
     85         Type = GL_FLOAT;
     86     }
     87 
     88     void setIntValues(const GLint intValues[4])
     89     {
     90         for (unsigned int valueIndex = 0; valueIndex < 4; valueIndex++)
     91         {
     92             IntValues[valueIndex] = intValues[valueIndex];
     93         }
     94         Type = GL_INT;
     95     }
     96 
     97     void setUnsignedIntValues(const GLuint unsignedIntValues[4])
     98     {
     99         for (unsigned int valueIndex = 0; valueIndex < 4; valueIndex++)
    100         {
    101             UnsignedIntValues[valueIndex] = unsignedIntValues[valueIndex];
    102         }
    103         Type = GL_UNSIGNED_INT;
    104     }
    105 
    106     bool operator==(const VertexAttribCurrentValueData &other)
    107     {
    108         return (Type == other.Type && memcmp(FloatValues, other.FloatValues, sizeof(float) * 4) == 0);
    109     }
    110 
    111     bool operator!=(const VertexAttribCurrentValueData &other)
    112     {
    113         return !(*this == other);
    114     }
    115 };
    116 
    117 }
    118 
    119 #endif // LIBGLESV2_VERTEXATTRIBUTE_H_
    120