Hash :
553590a5
Author :
Date :
2017-07-31T16:40:39
Modify attribute divisor for multiview instanced rendering If the ANGLE_multiview extension is used in a program, the number of geometry instances is the number of instances passed to glDraw*Instanced times the number of views in the program. The attribute divisor has to be multiplied by the number of views so that the correct attributes are gathered in the input assembly stage. BUG=angleproject:2062 TEST=angle_end2end_tests Change-Id: I960d6313c02e3eb83f7a07e72b9bcac072c736f4 Reviewed-on: https://chromium-review.googlesource.com/593953 Commit-Queue: Martin Radev <mradev@nvidia.com> Reviewed-by: Geoff Lang <geofflang@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
//
// 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"
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(VertexBinding &&binding);
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<Buffer> &getBuffer() const { return mBuffer; }
void setBuffer(const gl::Context *context, Buffer *bufferIn) { mBuffer.set(context, bufferIn); }
private:
GLuint mStride;
GLuint mDivisor;
GLintptr mOffset;
BindingPointer<Buffer> mBuffer;
};
//
// Implementation of Generic Vertex Attributes for ES3.1
//
struct VertexAttribute final : private angle::NonCopyable
{
explicit VertexAttribute(GLuint bindingIndex);
explicit VertexAttribute(VertexAttribute &&attrib);
VertexAttribute &operator=(VertexAttribute &&attrib);
bool enabled; // For glEnable/DisableVertexAttribArray
GLenum type;
GLuint size;
bool normalized;
bool pureInteger;
const void *pointer;
GLuint relativeOffset;
GLuint vertexAttribArrayStride; // ONLY for queries of VERTEX_ATTRIB_ARRAY_STRIDE
GLuint bindingIndex;
};
size_t ComputeVertexAttributeTypeSize(const VertexAttribute &attrib);
// 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);
GLenum GetVertexAttributeBaseType(const VertexAttribute &attrib);
struct VertexAttribCurrentValueData
{
union {
GLfloat FloatValues[4];
GLint IntValues[4];
GLuint UnsignedIntValues[4];
};
GLenum 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.inl"
#endif // LIBANGLE_VERTEXATTRIBUTE_H_