Edit

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

Branch :

  • Show log

    Commit

  • Author : Shao
    Date : 2017-03-31 15:13:21
    Hash : df682a8e
    Message : ES31: Refactor syncState in VertexArrayGL This patch intends to solve several design issues by refactoring the process of syncState in VertexArrayGL before implementing ES3.1 feature Vertex Attrib Binding on the OpenGL back-end. 1. Use nullptr as the flag of using client memory pointer 2. Simplify comparisons in updateAttribPointer. 3. Put all code related to mFunctions->vertexAttrib*Pointer() into an individual function 4. Remove redundant mStateManager->bindVertexArray() in all update* functioins and only call it once in syncState(). BUG=angleproject:1593 Change-Id: I8f68534bb9291a601b9b77954d7281e5171c2b55 Reviewed-on: https://chromium-review.googlesource.com/465378 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"
    
    namespace gl
    {
    class VertexArray;
    
    //
    // Implementation of Generic Vertex Attribute Bindings for ES3.1
    //
    struct VertexBinding final : private angle::NonCopyable
    {
        VertexBinding();
        explicit VertexBinding(VertexBinding &&binding);
        VertexBinding &operator=(VertexBinding &&binding);
    
        GLuint stride;
        GLuint divisor;
        GLintptr offset;
    
        BindingPointer<Buffer> buffer;
    };
    
    //
    // Implementation of Generic Vertex Attributes for ES3.1
    //
    struct VertexAttribute final : private angle::NonCopyable
    {
        explicit VertexAttribute(GLuint bindingIndex);
        explicit VertexAttribute(VertexAttribute &&attrib);
        VertexAttribute &operator=(VertexAttribute &&attrib);
    
        bool enabled;  // For glEnable/DisableVertexAttribArray
        GLenum type;
        GLuint size;
        bool normalized;
        bool pureInteger;
    
        const void *pointer;
        GLintptr relativeOffset;
    
        GLuint vertexAttribArrayStride;  // ONLY for queries of VERTEX_ATTRIB_ARRAY_STRIDE
        GLuint bindingIndex;
    };
    
    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(const VertexBinding &binding,
                                            size_t drawCount,
                                            size_t instanceCount);
    
    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_