From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- gfx/angle/checkout/src/libANGLE/VertexAttribute.h | 139 ++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 gfx/angle/checkout/src/libANGLE/VertexAttribute.h (limited to 'gfx/angle/checkout/src/libANGLE/VertexAttribute.h') diff --git a/gfx/angle/checkout/src/libANGLE/VertexAttribute.h b/gfx/angle/checkout/src/libANGLE/VertexAttribute.h new file mode 100644 index 0000000000..dd89228d2a --- /dev/null +++ b/gfx/angle/checkout/src/libANGLE/VertexAttribute.h @@ -0,0 +1,139 @@ +// +// Copyright 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 &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 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::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_ -- cgit v1.2.3