summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libANGLE/VertexAttribute.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/VertexAttribute.cpp')
-rw-r--r--src/3rdparty/angle/src/libANGLE/VertexAttribute.cpp122
1 files changed, 105 insertions, 17 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/VertexAttribute.cpp b/src/3rdparty/angle/src/libANGLE/VertexAttribute.cpp
index 13d78fd13c..20f7452fa5 100644
--- a/src/3rdparty/angle/src/libANGLE/VertexAttribute.cpp
+++ b/src/3rdparty/angle/src/libANGLE/VertexAttribute.cpp
@@ -3,7 +3,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
-// Implementation of the state class for mananging GLES 3 Vertex Array Objects.
+// Implementation of the state classes for mananging GLES 3.1 Vertex Array Objects.
//
#include "libANGLE/VertexAttribute.h"
@@ -11,16 +11,74 @@
namespace gl
{
-VertexAttribute::VertexAttribute()
+// [OpenGL ES 3.1] (November 3, 2016) Section 20 Page 361
+// Table 20.2: Vertex Array Object State
+VertexBinding::VertexBinding() : mStride(16u), mDivisor(0), mOffset(0)
+{
+}
+
+VertexBinding::VertexBinding(VertexBinding &&binding)
+{
+ *this = std::move(binding);
+}
+
+VertexBinding::~VertexBinding()
+{
+}
+
+VertexBinding &VertexBinding::operator=(VertexBinding &&binding)
+{
+ if (this != &binding)
+ {
+ mStride = binding.mStride;
+ mDivisor = binding.mDivisor;
+ mOffset = binding.mOffset;
+ std::swap(binding.mBuffer, mBuffer);
+ }
+ return *this;
+}
+
+VertexAttribute::VertexAttribute(GLuint bindingIndex)
: enabled(false),
type(GL_FLOAT),
- size(4),
+ size(4u),
normalized(false),
pureInteger(false),
- stride(0),
- pointer(NULL),
- divisor(0)
+ pointer(nullptr),
+ relativeOffset(0),
+ vertexAttribArrayStride(0),
+ bindingIndex(bindingIndex)
+{
+}
+
+VertexAttribute::VertexAttribute(VertexAttribute &&attrib)
+ : enabled(attrib.enabled),
+ type(attrib.type),
+ size(attrib.size),
+ normalized(attrib.normalized),
+ pureInteger(attrib.pureInteger),
+ pointer(attrib.pointer),
+ relativeOffset(attrib.relativeOffset),
+ vertexAttribArrayStride(attrib.vertexAttribArrayStride),
+ bindingIndex(attrib.bindingIndex)
+{
+}
+
+VertexAttribute &VertexAttribute::operator=(VertexAttribute &&attrib)
{
+ if (this != &attrib)
+ {
+ enabled = attrib.enabled;
+ type = attrib.type;
+ size = attrib.size;
+ normalized = attrib.normalized;
+ pureInteger = attrib.pureInteger;
+ pointer = attrib.pointer;
+ relativeOffset = attrib.relativeOffset;
+ vertexAttribArrayStride = attrib.vertexAttribArrayStride;
+ bindingIndex = attrib.bindingIndex;
+ }
+ return *this;
}
size_t ComputeVertexAttributeTypeSize(const VertexAttribute& attrib)
@@ -43,32 +101,62 @@ size_t ComputeVertexAttributeTypeSize(const VertexAttribute& attrib)
}
}
-size_t ComputeVertexAttributeStride(const VertexAttribute& attrib)
+size_t ComputeVertexAttributeStride(const VertexAttribute &attrib, const VertexBinding &binding)
{
- if (!attrib.enabled)
- {
- return 16;
- }
- return attrib.stride ? attrib.stride : ComputeVertexAttributeTypeSize(attrib);
+ // In ES 3.1, VertexAttribPointer will store the type size in the binding stride.
+ // Hence, rendering always uses the binding's stride.
+ return attrib.enabled ? binding.getStride() : 16u;
+}
+
+// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
+GLintptr ComputeVertexAttributeOffset(const VertexAttribute &attrib, const VertexBinding &binding)
+{
+ return attrib.relativeOffset + binding.getOffset();
}
-size_t ComputeVertexAttributeElementCount(const VertexAttribute &attrib,
- size_t drawCount,
- size_t instanceCount)
+size_t ComputeVertexBindingElementCount(GLuint divisor, size_t drawCount, size_t instanceCount)
{
// For instanced rendering, we draw "instanceDrawCount" sets of "vertexDrawCount" vertices.
//
// A vertex attribute with a positive divisor loads one instanced vertex for every set of
// non-instanced vertices, and the instanced vertex index advances once every "mDivisor"
// instances.
- if (instanceCount > 0 && attrib.divisor > 0)
+ if (instanceCount > 0 && divisor > 0)
{
// When instanceDrawCount is not a multiple attrib.divisor, the division must round up.
// For instance, with 5 non-instanced vertices and a divisor equal to 3, we need 2 instanced
// vertices.
- return (instanceCount + attrib.divisor - 1u) / attrib.divisor;
+ return (instanceCount + divisor - 1u) / divisor;
}
return drawCount;
}
+
+GLenum GetVertexAttributeBaseType(const VertexAttribute &attrib)
+{
+ if (attrib.pureInteger)
+ {
+ switch (attrib.type)
+ {
+ case GL_BYTE:
+ case GL_SHORT:
+ case GL_INT:
+ return GL_INT;
+
+ case GL_UNSIGNED_BYTE:
+ case GL_UNSIGNED_SHORT:
+ case GL_UNSIGNED_INT:
+ return GL_UNSIGNED_INT;
+
+ default:
+ UNREACHABLE();
+ return GL_NONE;
+ }
+ }
+ else
+ {
+ return GL_FLOAT;
+ }
}
+
+} // namespace gl