diff options
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/VertexAttribute.cpp')
-rw-r--r-- | src/3rdparty/angle/src/libANGLE/VertexAttribute.cpp | 122 |
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 |