Edit

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

Branch :

  • Show log

    Commit

  • Author : Tom Anderson
    Date : 2019-05-17 10:40:44
    Hash : 08146a27
    Message : Remove non-source sources from binary targets No behavior changes. BUG=chromium:964411 Change-Id: I843757e65f110882c01514fe6bf4aed28e07dd21 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1617011 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Jamie Madill <jmadill@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"
    #include "libANGLE/angletypes.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();
        explicit VertexBinding(GLuint boundAttribute);
        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; }
    
        ANGLE_INLINE void setBuffer(const gl::Context *context, Buffer *bufferIn)
        {
            mBuffer.set(context, bufferIn);
        }
    
        // Skips ref counting for better inlined performance.
        ANGLE_INLINE void assignBuffer(Buffer *bufferIn) { mBuffer.assign(bufferIn); }
    
        void onContainerBindingChanged(const Context *context, int incr) const;
    
        const AttributesMask &getBoundAttributesMask() const { return mBoundAttributesMask; }
    
        void setBoundAttribute(size_t index) { mBoundAttributesMask.set(index); }
    
        void resetBoundAttribute(size_t index) { mBoundAttributesMask.reset(index); }
    
      private:
        GLuint mStride;
        GLuint mDivisor;
        GLintptr mOffset;
    
        BindingPointer<Buffer> mBuffer;
    
        // Mapping from this binding to all of the attributes that are using this binding.
        AttributesMask mBoundAttributesMask;
    };
    
    //
    // 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 updateCachedElementLimit(const VertexBinding &binding);
        GLint64 getCachedElementLimit() const { return mCachedElementLimit; }
    
        bool enabled;  // For glEnable/DisableVertexAttribArray
        VertexAttribType type;
        GLuint size;
        bool normalized;
        bool pureInteger;
    
        const void *pointer;
        GLuint relativeOffset;
    
        GLuint vertexAttribArrayStride;  // ONLY for queries of VERTEX_ATTRIB_ARRAY_STRIDE
        GLuint bindingIndex;
    
        // Special value for the cached element limit on the integer overflow case.
        static constexpr GLint64 kIntegerOverflow = std::numeric_limits<GLint64>::min();
    
      private:
        // This is kept in sync by the VertexArray. It is used to optimize draw call validation.
        GLint64 mCachedElementLimit;
    };
    
    ANGLE_INLINE size_t ComputeVertexAttributeTypeSize(const VertexAttribute &attrib)
    {
        switch (attrib.type)
        {
            case VertexAttribType::Byte:
                return attrib.size * sizeof(GLbyte);
            case VertexAttribType::UnsignedByte:
                return attrib.size * sizeof(GLubyte);
            case VertexAttribType::Short:
                return attrib.size * sizeof(GLshort);
            case VertexAttribType::UnsignedShort:
                return attrib.size * sizeof(GLushort);
            case VertexAttribType::Int:
                return attrib.size * sizeof(GLint);
            case VertexAttribType::UnsignedInt:
                return attrib.size * sizeof(GLuint);
            case VertexAttribType::Float:
                return attrib.size * sizeof(GLfloat);
            case VertexAttribType::HalfFloat:
                return attrib.size * sizeof(GLhalf);
            case VertexAttribType::Fixed:
                return attrib.size * sizeof(GLfixed);
            case VertexAttribType::Int2101010:
                // Packed attribute types don't scale by their component size.
                return 4;
            case VertexAttribType::UnsignedInt2101010:
                // Packed attribute types don't scale by their component size.
                return 4;
            default:
                UNREACHABLE();
                return 0;
        }
    }
    
    // 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);
    
    struct VertexAttribCurrentValueData
    {
        union
        {
            GLfloat FloatValues[4];
            GLint IntValues[4];
            GLuint UnsignedIntValues[4];
        } Values;
        VertexAttribType 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.inc"
    
    #endif  // LIBANGLE_VERTEXATTRIBUTE_H_