1//
2// Copyright 2013 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6// Helper structures about Generic Vertex Attribute.
7//
8
9#ifndef LIBANGLE_VERTEXATTRIBUTE_H_
10#define LIBANGLE_VERTEXATTRIBUTE_H_
11
12#include "libANGLE/Buffer.h"
13#include "libANGLE/angletypes.h"
14#include "libANGLE/renderer/Format.h"
15
16namespace gl
17{
18class VertexArray;
19
20//
21// Implementation of Generic Vertex Attribute Bindings for ES3.1. The members are intentionally made
22// private in order to hide implementation details.
23//
24class VertexBinding final : angle::NonCopyable
25{
26 public:
27 VertexBinding();
28 explicit VertexBinding(GLuint boundAttribute);
29 VertexBinding(VertexBinding &&binding);
30 ~VertexBinding();
31 VertexBinding &operator=(VertexBinding &&binding);
32
33 GLuint getStride() const { return mStride; }
34 void setStride(GLuint strideIn) { mStride = strideIn; }
35
36 GLuint getDivisor() const { return mDivisor; }
37 void setDivisor(GLuint divisorIn) { mDivisor = divisorIn; }
38
39 GLintptr getOffset() const { return mOffset; }
40 void setOffset(GLintptr offsetIn) { mOffset = offsetIn; }
41
42 const BindingPointer<Buffer> &getBuffer() const { return mBuffer; }
43
44 ANGLE_INLINE void setBuffer(const gl::Context *context, Buffer *bufferIn)
45 {
46 mBuffer.set(context, newObject: bufferIn);
47 }
48
49 // Skips ref counting for better inlined performance.
50 ANGLE_INLINE void assignBuffer(Buffer *bufferIn) { mBuffer.assign(object: bufferIn); }
51
52 void onContainerBindingChanged(const Context *context, int incr) const;
53
54 const AttributesMask &getBoundAttributesMask() const { return mBoundAttributesMask; }
55
56 void setBoundAttribute(size_t index) { mBoundAttributesMask.set(pos: index); }
57
58 void resetBoundAttribute(size_t index) { mBoundAttributesMask.reset(pos: index); }
59
60 private:
61 GLuint mStride;
62 GLuint mDivisor;
63 GLintptr mOffset;
64
65 BindingPointer<Buffer> mBuffer;
66
67 // Mapping from this binding to all of the attributes that are using this binding.
68 AttributesMask mBoundAttributesMask;
69};
70
71//
72// Implementation of Generic Vertex Attributes for ES3.1
73//
74struct VertexAttribute final : private angle::NonCopyable
75{
76 explicit VertexAttribute(GLuint bindingIndex);
77 VertexAttribute(VertexAttribute &&attrib);
78 VertexAttribute &operator=(VertexAttribute &&attrib);
79
80 // Called from VertexArray.
81 void updateCachedElementLimit(const VertexBinding &binding);
82 GLint64 getCachedElementLimit() const { return mCachedElementLimit; }
83
84 bool enabled; // For glEnable/DisableVertexAttribArray
85 const angle::Format *format;
86
87 const void *pointer;
88 GLuint relativeOffset;
89
90 GLuint vertexAttribArrayStride; // ONLY for queries of VERTEX_ATTRIB_ARRAY_STRIDE
91 GLuint bindingIndex;
92
93 // Special value for the cached element limit on the integer overflow case.
94 static constexpr GLint64 kIntegerOverflow = std::numeric_limits<GLint64>::min();
95
96 private:
97 // This is kept in sync by the VertexArray. It is used to optimize draw call validation.
98 GLint64 mCachedElementLimit;
99};
100
101ANGLE_INLINE size_t ComputeVertexAttributeTypeSize(const VertexAttribute &attrib)
102{
103 ASSERT(attrib.format);
104 return attrib.format->pixelBytes;
105}
106
107// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
108size_t ComputeVertexAttributeStride(const VertexAttribute &attrib, const VertexBinding &binding);
109
110// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
111GLintptr ComputeVertexAttributeOffset(const VertexAttribute &attrib, const VertexBinding &binding);
112
113size_t ComputeVertexBindingElementCount(GLuint divisor, size_t drawCount, size_t instanceCount);
114
115struct VertexAttribCurrentValueData
116{
117 union
118 {
119 GLfloat FloatValues[4];
120 GLint IntValues[4];
121 GLuint UnsignedIntValues[4];
122 } Values;
123 VertexAttribType Type;
124
125 VertexAttribCurrentValueData();
126
127 void setFloatValues(const GLfloat floatValues[4]);
128 void setIntValues(const GLint intValues[4]);
129 void setUnsignedIntValues(const GLuint unsignedIntValues[4]);
130};
131
132bool operator==(const VertexAttribCurrentValueData &a, const VertexAttribCurrentValueData &b);
133bool operator!=(const VertexAttribCurrentValueData &a, const VertexAttribCurrentValueData &b);
134
135} // namespace gl
136
137#include "VertexAttribute.inc"
138
139#endif // LIBANGLE_VERTEXATTRIBUTE_H_
140

source code of flutter_engine/third_party/angle/src/libANGLE/VertexAttribute.h