Edit

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

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2018-05-10 15:10:55
    Hash : 2fc0806f
    Message : Micro-optimize uniform updates. This CL is adapted from work by matavenrath@nvidia.com. It does the following small optimizations: * inlines a bunch of accessors. * reorders checks to hit the cache more often Also some small style updates. Bug: angleproject:1671 Change-Id: I8f21318e6644dcfe1f99c98f7f377742fcad78d3 Reviewed-on: https://chromium-review.googlesource.com/1054367 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Corentin Wallez <cwallez@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 structures about Generic Vertex Attribute.
    //
    
    #ifndef LIBANGLE_VERTEXATTRIBUTE_H_
    #define LIBANGLE_VERTEXATTRIBUTE_H_
    
    #include "libANGLE/Buffer.h"
    
    namespace gl
    {
    class VertexArray;
    
    //
    // Implementation of Generic Vertex Attribute Bindings for ES3.1. The members are intentionally made
    // private in order to hide implementation details.
    //
    class VertexBinding final : angle::NonCopyable
    {
      public:
        VertexBinding();
        VertexBinding(VertexBinding &&binding);
        ~VertexBinding();
        VertexBinding &operator=(VertexBinding &&binding);
    
        GLuint getStride() const { return mStride; }
        void setStride(GLuint strideIn) { mStride = strideIn; }
    
        GLuint getDivisor() const { return mDivisor; }
        void setDivisor(GLuint divisorIn) { mDivisor = divisorIn; }
    
        GLintptr getOffset() const { return mOffset; }
        void setOffset(GLintptr offsetIn) { mOffset = offsetIn; }
    
        const BindingPointer<Buffer> &getBuffer() const { return mBuffer; }
        void setBuffer(const gl::Context *context, Buffer *bufferIn, bool containerIsBound);
    
        void onContainerBindingChanged(const Context *context, bool bound) const;
    
        GLuint64 getCachedBufferSizeMinusOffset() const
        {
            return mCachedBufferSizeMinusOffset;
        }
    
        // Called from VertexArray.
        void updateCachedBufferSizeMinusOffset();
    
      private:
        GLuint mStride;
        GLuint mDivisor;
        GLintptr mOffset;
    
        BindingPointer<Buffer> mBuffer;
    
        // This is kept in sync by the VertexArray. It is used to optimize draw call validation.
        GLuint64 mCachedBufferSizeMinusOffset;
    };
    
    //
    // Implementation of Generic Vertex Attributes for ES3.1
    //
    struct VertexAttribute final : private angle::NonCopyable
    {
        explicit VertexAttribute(GLuint bindingIndex);
        VertexAttribute(VertexAttribute &&attrib);
        VertexAttribute &operator=(VertexAttribute &&attrib);
    
        // Called from VertexArray.
        void updateCachedSizePlusRelativeOffset();
    
        bool enabled;  // For glEnable/DisableVertexAttribArray
        GLenum type;
        GLuint size;
        bool normalized;
        bool pureInteger;
    
        const void *pointer;
        GLuint relativeOffset;
    
        GLuint vertexAttribArrayStride;  // ONLY for queries of VERTEX_ATTRIB_ARRAY_STRIDE
        GLuint bindingIndex;
    
        // This is kept in sync by the VertexArray. It is used to optimize draw call validation.
        GLuint64 cachedSizePlusRelativeOffset;
    };
    
    size_t ComputeVertexAttributeTypeSize(const VertexAttribute &attrib);
    
    // Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
    size_t ComputeVertexAttributeStride(const VertexAttribute &attrib, const VertexBinding &binding);
    
    // Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
    GLintptr ComputeVertexAttributeOffset(const VertexAttribute &attrib, const VertexBinding &binding);
    
    size_t ComputeVertexBindingElementCount(GLuint divisor, size_t drawCount, size_t instanceCount);
    
    GLenum GetVertexAttributeBaseType(const VertexAttribute &attrib);
    
    struct VertexAttribCurrentValueData
    {
        union {
            GLfloat FloatValues[4];
            GLint IntValues[4];
            GLuint UnsignedIntValues[4];
        };
        GLenum Type;
    
        VertexAttribCurrentValueData();
    
        void setFloatValues(const GLfloat floatValues[4]);
        void setIntValues(const GLint intValues[4]);
        void setUnsignedIntValues(const GLuint unsignedIntValues[4]);
    };
    
    bool operator==(const VertexAttribCurrentValueData &a, const VertexAttribCurrentValueData &b);
    bool operator!=(const VertexAttribCurrentValueData &a, const VertexAttribCurrentValueData &b);
    
    }  // namespace gl
    
    #include "VertexAttribute.inl"
    
    #endif  // LIBANGLE_VERTEXATTRIBUTE_H_