// // 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 &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_