blob: 19934e7face5dcd43b1bcda57c904ada46440a82 (
plain)
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
|
//
// Copyright 2014 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.
//
// Implementation of the state class for mananging GLES 3 Vertex Array Objects.
//
#include "libANGLE/VertexAttribute.h"
namespace gl
{
VertexAttribute::VertexAttribute()
: enabled(false),
type(GL_FLOAT),
size(4),
normalized(false),
pureInteger(false),
stride(0),
pointer(NULL),
divisor(0)
{
}
bool operator==(const VertexAttribute &a, const VertexAttribute &b)
{
return a.enabled == b.enabled &&
a.type == b.type &&
a.size == b.size &&
a.normalized == b.normalized &&
a.pureInteger == b.pureInteger &&
a.stride == b.stride &&
a.pointer == b.pointer &&
a.buffer.get() == b.buffer.get() &&
a.divisor == b.divisor;
}
bool operator!=(const VertexAttribute &a, const VertexAttribute &b)
{
return !(a == b);
}
size_t ComputeVertexAttributeTypeSize(const VertexAttribute& attrib)
{
GLuint size = attrib.size;
switch (attrib.type)
{
case GL_BYTE: return size * sizeof(GLbyte);
case GL_UNSIGNED_BYTE: return size * sizeof(GLubyte);
case GL_SHORT: return size * sizeof(GLshort);
case GL_UNSIGNED_SHORT: return size * sizeof(GLushort);
case GL_INT: return size * sizeof(GLint);
case GL_UNSIGNED_INT: return size * sizeof(GLuint);
case GL_INT_2_10_10_10_REV: return 4;
case GL_UNSIGNED_INT_2_10_10_10_REV: return 4;
case GL_FIXED: return size * sizeof(GLfixed);
case GL_HALF_FLOAT: return size * sizeof(GLhalf);
case GL_FLOAT: return size * sizeof(GLfloat);
default: UNREACHABLE(); return size * sizeof(GLfloat);
}
}
size_t ComputeVertexAttributeStride(const VertexAttribute& attrib)
{
if (!attrib.enabled)
{
return 16;
}
return attrib.stride ? attrib.stride : ComputeVertexAttributeTypeSize(attrib);
}
}
|