Edit

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

Branch :

  • Show log

    Commit

  • Author : Geoff Lang
    Date : 2015-06-05 10:59:04
    Hash : d5451f11
    Message : Inline comparison operators of several small ANGLE structs. Improves draw call overhead of RendererGL. DrawCallPerf_gl: Before: 129779 score After: 136973 score Improvement: 5.543% No noticeable difference in DLL size or draw call perf of the D3D renderers. BUG=angleproject:959 Change-Id: Id54d49e9e2cfb69431ee26d632c58fee2c42b82c Reviewed-on: https://chromium-review.googlesource.com/275408 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org> Tested-by: Geoff Lang <geofflang@chromium.org>

  • src/libANGLE/VertexAttribute.inl
  • //
    // Copyright (c) 2015 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.
    //
    // VertexAttribute.inl: Inline vertex attribute methods
    //
    
    namespace gl
    {
    
    inline bool operator==(const VertexAttribute &a, const VertexAttribute &b)
    {
        return a.enabled == b.enabled &&
               a.type == b.type &&
               a.size == b.size &&
               a.normalized == b.normalized &&
               a.pureInteger == b.pureInteger &&
               a.stride == b.stride &&
               a.pointer == b.pointer &&
               a.buffer.get() == b.buffer.get() &&
               a.divisor == b.divisor;
    }
    
    inline bool operator!=(const VertexAttribute &a, const VertexAttribute &b)
    {
        return !(a == 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);
      }
    }
    
    inline VertexAttribCurrentValueData::VertexAttribCurrentValueData()
        : Type(GL_FLOAT)
    {
        FloatValues[0] = 0.0f;
        FloatValues[1] = 0.0f;
        FloatValues[2] = 0.0f;
        FloatValues[3] = 1.0f;
    }
    
    inline void VertexAttribCurrentValueData::setFloatValues(const GLfloat floatValues[4])
    {
        for (unsigned int valueIndex = 0; valueIndex < 4; valueIndex++)
        {
            FloatValues[valueIndex] = floatValues[valueIndex];
        }
        Type = GL_FLOAT;
    }
    
    inline void VertexAttribCurrentValueData::setIntValues(const GLint intValues[4])
    {
        for (unsigned int valueIndex = 0; valueIndex < 4; valueIndex++)
        {
            IntValues[valueIndex] = intValues[valueIndex];
        }
        Type = GL_INT;
    }
    
    inline void VertexAttribCurrentValueData::setUnsignedIntValues(const GLuint unsignedIntValues[4])
    {
        for (unsigned int valueIndex = 0; valueIndex < 4; valueIndex++)
        {
            UnsignedIntValues[valueIndex] = unsignedIntValues[valueIndex];
        }
        Type = GL_UNSIGNED_INT;
    }
    
    inline bool operator==(const VertexAttribCurrentValueData &a, const VertexAttribCurrentValueData &b)
    {
        return (a.Type == b.Type && memcmp(a.FloatValues, b.FloatValues, sizeof(float) * 4) == 0);
    }
    
    inline bool operator!=(const VertexAttribCurrentValueData &a, const VertexAttribCurrentValueData &b)
    {
        return !(a == b);
    }
    
    }