diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
commit | 2aa4a82499d4becd2284cdb482213d541b8804dd (patch) | |
tree | b80bf8bf13c3766139fbacc530efd0dd9d54394c /gfx/angle/checkout/src/libANGLE/VertexAttribute.h | |
parent | Initial commit. (diff) | |
download | firefox-upstream.tar.xz firefox-upstream.zip |
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'gfx/angle/checkout/src/libANGLE/VertexAttribute.h')
-rw-r--r-- | gfx/angle/checkout/src/libANGLE/VertexAttribute.h | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/gfx/angle/checkout/src/libANGLE/VertexAttribute.h b/gfx/angle/checkout/src/libANGLE/VertexAttribute.h new file mode 100644 index 0000000000..b695a7cc7c --- /dev/null +++ b/gfx/angle/checkout/src/libANGLE/VertexAttribute.h @@ -0,0 +1,139 @@ +// +// 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" +#include "libANGLE/renderer/Format.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 + const angle::Format *format; + + 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) +{ + ASSERT(attrib.format); + return attrib.format->pixelBytes; +} + +// 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_ |