diff options
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/VertexArray.h')
-rw-r--r-- | src/3rdparty/angle/src/libANGLE/VertexArray.h | 83 |
1 files changed, 71 insertions, 12 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/VertexArray.h b/src/3rdparty/angle/src/libANGLE/VertexArray.h index 5c79b9953d..6bc267d399 100644 --- a/src/3rdparty/angle/src/libANGLE/VertexArray.h +++ b/src/3rdparty/angle/src/libANGLE/VertexArray.h @@ -15,12 +15,15 @@ #include "libANGLE/RefCountObject.h" #include "libANGLE/Constants.h" +#include "libANGLE/Debug.h" +#include "libANGLE/State.h" #include "libANGLE/VertexAttribute.h" #include <vector> namespace rx { +class ImplFactory; class VertexArrayImpl; } @@ -28,37 +31,93 @@ namespace gl { class Buffer; -class VertexArray +class VertexArray final : public LabeledObject { public: - VertexArray(rx::VertexArrayImpl *impl, GLuint id, size_t maxAttribs); + VertexArray(rx::ImplFactory *factory, GLuint id, size_t maxAttribs); ~VertexArray(); GLuint id() const; - const VertexAttribute& getVertexAttribute(size_t attributeIndex) const; - const std::vector<VertexAttribute> &getVertexAttributes() const; + void setLabel(const std::string &label) override; + const std::string &getLabel() const override; + + const VertexAttribute &getVertexAttribute(size_t attributeIndex) const; void detachBuffer(GLuint bufferName); - void setVertexAttribDivisor(GLuint index, GLuint divisor); - void enableAttribute(unsigned int attributeIndex, bool enabledState); - void setAttributeState(unsigned int attributeIndex, gl::Buffer *boundBuffer, GLint size, GLenum type, + void setVertexAttribDivisor(size_t index, GLuint divisor); + void enableAttribute(size_t attributeIndex, bool enabledState); + void setAttributeState(size_t attributeIndex, gl::Buffer *boundBuffer, GLint size, GLenum type, bool normalized, bool pureInteger, GLsizei stride, const void *pointer); - Buffer *getElementArrayBuffer() const { return mElementArrayBuffer.get(); } void setElementArrayBuffer(Buffer *buffer); - GLuint getElementArrayBufferId() const { return mElementArrayBuffer.id(); } - size_t getMaxAttribs() const { return mVertexAttributes.size(); } + + const BindingPointer<Buffer> &getElementArrayBuffer() const { return mData.getElementArrayBuffer(); } + size_t getMaxAttribs() const { return mData.getVertexAttributes().size(); } + const std::vector<VertexAttribute> &getVertexAttributes() const { return mData.getVertexAttributes(); } rx::VertexArrayImpl *getImplementation() { return mVertexArray; } const rx::VertexArrayImpl *getImplementation() const { return mVertexArray; } + size_t getMaxEnabledAttribute() const { return mData.getMaxEnabledAttribute(); } + + class Data final : public angle::NonCopyable + { + public: + explicit Data(size_t maxAttribs); + ~Data(); + + const std::string &getLabel() const { return mLabel; } + + const BindingPointer<Buffer> &getElementArrayBuffer() const { return mElementArrayBuffer; } + size_t getMaxAttribs() const { return mVertexAttributes.size(); } + size_t getMaxEnabledAttribute() const { return mMaxEnabledAttribute; } + const std::vector<VertexAttribute> &getVertexAttributes() const { return mVertexAttributes; } + const VertexAttribute &getVertexAttribute(size_t index) const + { + return mVertexAttributes[index]; + } + + private: + friend class VertexArray; + std::string mLabel; + std::vector<VertexAttribute> mVertexAttributes; + BindingPointer<Buffer> mElementArrayBuffer; + size_t mMaxEnabledAttribute; + }; + + enum DirtyBitType + { + DIRTY_BIT_ELEMENT_ARRAY_BUFFER, + + // Reserve bits for enabled flags + DIRTY_BIT_ATTRIB_0_ENABLED, + DIRTY_BIT_ATTRIB_MAX_ENABLED = DIRTY_BIT_ATTRIB_0_ENABLED + gl::MAX_VERTEX_ATTRIBS, + + // Reserve bits for attrib pointers + DIRTY_BIT_ATTRIB_0_POINTER = DIRTY_BIT_ATTRIB_MAX_ENABLED, + DIRTY_BIT_ATTRIB_MAX_POINTER = DIRTY_BIT_ATTRIB_0_POINTER + gl::MAX_VERTEX_ATTRIBS, + + // Reserve bits for divisors + DIRTY_BIT_ATTRIB_0_DIVISOR = DIRTY_BIT_ATTRIB_MAX_POINTER, + DIRTY_BIT_ATTRIB_MAX_DIVISOR = DIRTY_BIT_ATTRIB_0_DIVISOR + gl::MAX_VERTEX_ATTRIBS, + + DIRTY_BIT_UNKNOWN = DIRTY_BIT_ATTRIB_MAX_DIVISOR, + DIRTY_BIT_MAX = DIRTY_BIT_UNKNOWN, + }; + + typedef std::bitset<DIRTY_BIT_MAX> DirtyBits; + + void syncImplState(); + bool hasAnyDirtyBit() const { return mDirtyBits.any(); } + private: GLuint mId; rx::VertexArrayImpl *mVertexArray; - std::vector<VertexAttribute> mVertexAttributes; - BindingPointer<Buffer> mElementArrayBuffer; + + Data mData; + DirtyBits mDirtyBits; }; } |