summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libANGLE/VertexArray.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/VertexArray.h')
-rw-r--r--src/3rdparty/angle/src/libANGLE/VertexArray.h188
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_