diff options
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/VertexArray.h')
-rw-r--r-- | src/3rdparty/angle/src/libANGLE/VertexArray.h | 188 |
1 files changed, 134 insertions, 54 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/VertexArray.h b/src/3rdparty/angle/src/libANGLE/VertexArray.h index 6bc267d399..f82ec789f0 100644 --- a/src/3rdparty/angle/src/libANGLE/VertexArray.h +++ b/src/3rdparty/angle/src/libANGLE/VertexArray.h @@ -23,68 +23,131 @@ namespace rx { -class ImplFactory; +class GLImplFactory; class VertexArrayImpl; -} +} // namespace rx namespace gl { class Buffer; -class VertexArray final : public LabeledObject +class VertexArrayState final : angle::NonCopyable { public: - VertexArray(rx::ImplFactory *factory, GLuint id, size_t maxAttribs); - ~VertexArray(); + VertexArrayState(size_t maxAttribs, size_t maxBindings); + ~VertexArrayState(); - GLuint id() const; + const std::string &getLabel() const { return mLabel; } - void setLabel(const std::string &label) override; - const std::string &getLabel() const override; + const BindingPointer<Buffer> &getElementArrayBuffer() const { return mElementArrayBuffer; } + size_t getMaxAttribs() const { return mVertexAttributes.size(); } + size_t getMaxBindings() const { return mVertexBindings.size(); } + size_t getMaxEnabledAttribute() const { return mMaxEnabledAttribute; } + const std::vector<VertexAttribute> &getVertexAttributes() const { return mVertexAttributes; } + const VertexAttribute &getVertexAttribute(size_t attribIndex) const + { + return mVertexAttributes[attribIndex]; + } + const std::vector<VertexBinding> &getVertexBindings() const { return mVertexBindings; } + const VertexBinding &getVertexBinding(size_t bindingIndex) const + { + return mVertexBindings[bindingIndex]; + } + const VertexBinding &getBindingFromAttribIndex(size_t attribIndex) const + { + return mVertexBindings[mVertexAttributes[attribIndex].bindingIndex]; + } + size_t getBindingIndexFromAttribIndex(size_t attribIndex) const + { + return mVertexAttributes[attribIndex].bindingIndex; + } - const VertexAttribute &getVertexAttribute(size_t attributeIndex) const; + private: + friend class VertexArray; + std::string mLabel; + std::vector<VertexAttribute> mVertexAttributes; + BindingPointer<Buffer> mElementArrayBuffer; + std::vector<VertexBinding> mVertexBindings; + size_t mMaxEnabledAttribute; +}; - void detachBuffer(GLuint bufferName); - 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); +class VertexArray final : public LabeledObject +{ + public: + VertexArray(rx::GLImplFactory *factory, GLuint id, size_t maxAttribs, size_t maxAttribBindings); - void setElementArrayBuffer(Buffer *buffer); + void onDestroy(const Context *context); - 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(); } + GLuint id() const; - rx::VertexArrayImpl *getImplementation() { return mVertexArray; } - const rx::VertexArrayImpl *getImplementation() const { return mVertexArray; } + void setLabel(const std::string &label) override; + const std::string &getLabel() const override; - size_t getMaxEnabledAttribute() const { return mData.getMaxEnabledAttribute(); } + const VertexBinding &getVertexBinding(size_t bindingIndex) const; + const VertexAttribute &getVertexAttribute(size_t attribIndex) const; + const VertexBinding &getBindingFromAttribIndex(size_t attribIndex) const + { + return mState.getBindingFromAttribIndex(attribIndex); + } + + void detachBuffer(const Context *context, GLuint bufferName); + void setVertexAttribDivisor(const Context *context, size_t index, GLuint divisor); + void enableAttribute(size_t attribIndex, bool enabledState); + void setVertexAttribPointer(const Context *context, + size_t attribIndex, + Buffer *boundBuffer, + GLint size, + GLenum type, + bool normalized, + bool pureInteger, + GLsizei stride, + const void *pointer); + void setVertexAttribFormat(size_t attribIndex, + GLint size, + GLenum type, + bool normalized, + bool pureInteger, + GLuint relativeOffset); + void bindVertexBuffer(const Context *context, + size_t bindingIndex, + Buffer *boundBuffer, + GLintptr offset, + GLsizei stride); + void setVertexAttribBinding(const Context *context, size_t attribIndex, GLuint bindingIndex); + void setVertexBindingDivisor(size_t bindingIndex, GLuint divisor); + void setVertexAttribFormatImpl(size_t attribIndex, + GLint size, + GLenum type, + bool normalized, + bool pureInteger, + GLuint relativeOffset); + void bindVertexBufferImpl(const Context *context, + size_t bindingIndex, + Buffer *boundBuffer, + GLintptr offset, + GLsizei stride); + + void setElementArrayBuffer(const Context *context, Buffer *buffer); + + const BindingPointer<Buffer> &getElementArrayBuffer() const + { + return mState.getElementArrayBuffer(); + } + size_t getMaxAttribs() const { return mState.getMaxAttribs(); } + size_t getMaxBindings() const { return mState.getMaxBindings(); } - class Data final : public angle::NonCopyable + const std::vector<VertexAttribute> &getVertexAttributes() const { - 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; - }; + return mState.getVertexAttributes(); + } + const std::vector<VertexBinding> &getVertexBindings() const + { + return mState.getVertexBindings(); + } + + rx::VertexArrayImpl *getImplementation() const { return mVertexArray; } + + size_t getMaxEnabledAttribute() const { return mState.getMaxEnabledAttribute(); } enum DirtyBitType { @@ -98,28 +161,45 @@ class VertexArray final : public LabeledObject 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, + // Reserve bits for changes to VertexAttribFormat + DIRTY_BIT_ATTRIB_0_FORMAT = DIRTY_BIT_ATTRIB_MAX_POINTER, + DIRTY_BIT_ATTRIB_MAX_FORMAT = DIRTY_BIT_ATTRIB_0_FORMAT + gl::MAX_VERTEX_ATTRIBS, + + // Reserve bits for changes to VertexAttribBinding + DIRTY_BIT_ATTRIB_0_BINDING = DIRTY_BIT_ATTRIB_MAX_FORMAT, + DIRTY_BIT_ATTRIB_MAX_BINDING = DIRTY_BIT_ATTRIB_0_BINDING + gl::MAX_VERTEX_ATTRIBS, + + // Reserve bits for changes to BindVertexBuffer + DIRTY_BIT_BINDING_0_BUFFER = DIRTY_BIT_ATTRIB_MAX_BINDING, + DIRTY_BIT_BINDING_MAX_BUFFER = DIRTY_BIT_BINDING_0_BUFFER + gl::MAX_VERTEX_ATTRIB_BINDINGS, - DIRTY_BIT_UNKNOWN = DIRTY_BIT_ATTRIB_MAX_DIVISOR, + // Reserve bits for binding divisors + DIRTY_BIT_BINDING_0_DIVISOR = DIRTY_BIT_BINDING_MAX_BUFFER, + DIRTY_BIT_BINDING_MAX_DIVISOR = + DIRTY_BIT_BINDING_0_DIVISOR + gl::MAX_VERTEX_ATTRIB_BINDINGS, + + DIRTY_BIT_UNKNOWN = DIRTY_BIT_BINDING_MAX_DIVISOR, DIRTY_BIT_MAX = DIRTY_BIT_UNKNOWN, }; - typedef std::bitset<DIRTY_BIT_MAX> DirtyBits; + using DirtyBits = angle::BitSet<DIRTY_BIT_MAX>; + + static size_t GetVertexIndexFromDirtyBit(size_t dirtyBit); - void syncImplState(); + void syncState(const Context *context); bool hasAnyDirtyBit() const { return mDirtyBits.any(); } private: - GLuint mId; + ~VertexArray() override; - rx::VertexArrayImpl *mVertexArray; + GLuint mId; - Data mData; + VertexArrayState mState; DirtyBits mDirtyBits; + + rx::VertexArrayImpl *mVertexArray; }; -} +} // namespace gl #endif // LIBANGLE_VERTEXARRAY_H_ |