blob: 06618d554c3d9a2502d85d2002684784e6580df3 [file] [log] [blame]
Geoff Lang125deab2013-08-09 13:34:16 -04001//
2// Copyright (c) 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
7// angletypes.h : Defines a variety of structures and enum types that are used throughout libGLESv2
8
9#include "libGLESv2/angletypes.h"
Jamie Madill3078d0f2014-02-04 16:04:06 -050010#include "libGLESv2/ProgramBinary.h"
11#include "libGLESv2/VertexAttribute.h"
Geoff Lang125deab2013-08-09 13:34:16 -040012
13namespace gl
14{
15
Brandon Jonesa328d562014-07-01 13:52:40 -070016SamplerState::SamplerState()
17 : minFilter(GL_NEAREST_MIPMAP_LINEAR),
18 magFilter(GL_LINEAR),
19 wrapS(GL_REPEAT),
20 wrapT(GL_REPEAT),
21 wrapR(GL_REPEAT),
22 maxAnisotropy(1.0f),
23 baseLevel(0),
24 maxLevel(1000),
25 minLod(-1000.0f),
26 maxLod(1000.0f),
27 compareMode(GL_NONE),
28 compareFunc(GL_LEQUAL),
29 swizzleRed(GL_RED),
30 swizzleGreen(GL_GREEN),
31 swizzleBlue(GL_BLUE),
32 swizzleAlpha(GL_ALPHA)
33{}
34
Nicolas Capens76b258f2014-04-03 10:59:42 -040035bool SamplerState::swizzleRequired() const
36{
37 return swizzleRed != GL_RED || swizzleGreen != GL_GREEN ||
38 swizzleBlue != GL_BLUE || swizzleAlpha != GL_ALPHA;
39}
40
Geoff Lang125deab2013-08-09 13:34:16 -040041static void MinMax(int a, int b, int *minimum, int *maximum)
42{
43 if (a < b)
44 {
45 *minimum = a;
46 *maximum = b;
47 }
48 else
49 {
50 *minimum = b;
51 *maximum = a;
52 }
53}
54
55bool ClipRectangle(const Rectangle &source, const Rectangle &clip, Rectangle *intersection)
56{
57 int minSourceX, maxSourceX, minSourceY, maxSourceY;
58 MinMax(source.x, source.x + source.width, &minSourceX, &maxSourceX);
59 MinMax(source.y, source.y + source.height, &minSourceY, &maxSourceY);
60
61 int minClipX, maxClipX, minClipY, maxClipY;
62 MinMax(clip.x, clip.x + clip.width, &minClipX, &maxClipX);
63 MinMax(clip.y, clip.y + clip.height, &minClipY, &maxClipY);
64
65 if (minSourceX >= maxClipX || maxSourceX <= minClipX || minSourceY >= maxClipY || maxSourceY <= minClipY)
66 {
67 if (intersection)
68 {
69 intersection->x = minSourceX;
70 intersection->y = maxSourceY;
71 intersection->width = maxSourceX - minSourceX;
72 intersection->height = maxSourceY - minSourceY;
73 }
74
75 return false;
76 }
77 else
78 {
79 if (intersection)
80 {
81 intersection->x = std::max(minSourceX, minClipX);
82 intersection->y = std::max(minSourceY, minClipY);
83 intersection->width = std::min(maxSourceX, maxClipX) - std::max(minSourceX, minClipX);
84 intersection->height = std::min(maxSourceY, maxClipY) - std::max(minSourceY, minClipY);
85 }
86
87 return true;
88 }
89}
90
Jamie Madill3078d0f2014-02-04 16:04:06 -050091VertexFormat::VertexFormat()
92 : mType(GL_NONE),
93 mNormalized(GL_FALSE),
94 mComponents(0),
95 mPureInteger(false)
96{}
97
98VertexFormat::VertexFormat(GLenum type, GLboolean normalized, GLuint components, bool pureInteger)
99 : mType(type),
100 mNormalized(normalized),
101 mComponents(components),
102 mPureInteger(pureInteger)
103{
104 // Float data can not be normalized, so ignore the user setting
105 if (mType == GL_FLOAT || mType == GL_HALF_FLOAT || mType == GL_FIXED)
106 {
107 mNormalized = GL_FALSE;
108 }
109}
110
Brandon Jones5bf98292014-06-06 17:19:38 -0700111VertexFormat::VertexFormat(const VertexAttribute &attrib)
112 : mType(attrib.type),
113 mNormalized(attrib.normalized ? GL_TRUE : GL_FALSE),
114 mComponents(attrib.size),
115 mPureInteger(attrib.pureInteger)
Jamie Madill3078d0f2014-02-04 16:04:06 -0500116{
117 // Ensure we aren't initializing a vertex format which should be using
118 // the current-value type
Brandon Jones5bf98292014-06-06 17:19:38 -0700119 ASSERT(attrib.enabled);
Jamie Madill3078d0f2014-02-04 16:04:06 -0500120
121 // Float data can not be normalized, so ignore the user setting
122 if (mType == GL_FLOAT || mType == GL_HALF_FLOAT || mType == GL_FIXED)
123 {
124 mNormalized = GL_FALSE;
125 }
126}
127
Brandon Jones5bf98292014-06-06 17:19:38 -0700128VertexFormat::VertexFormat(const VertexAttribute &attrib, GLenum currentValueType)
129 : mType(attrib.type),
130 mNormalized(attrib.normalized ? GL_TRUE : GL_FALSE),
131 mComponents(attrib.size),
132 mPureInteger(attrib.pureInteger)
Jamie Madill3078d0f2014-02-04 16:04:06 -0500133{
Brandon Jones5bf98292014-06-06 17:19:38 -0700134 if (!attrib.enabled)
Jamie Madill3078d0f2014-02-04 16:04:06 -0500135 {
136 mType = currentValueType;
137 mNormalized = GL_FALSE;
138 mComponents = 4;
139 mPureInteger = (currentValueType != GL_FLOAT);
140 }
141
142 // Float data can not be normalized, so ignore the user setting
143 if (mType == GL_FLOAT || mType == GL_HALF_FLOAT || mType == GL_FIXED)
144 {
145 mNormalized = GL_FALSE;
146 }
147}
148
149void VertexFormat::GetInputLayout(VertexFormat *inputLayout,
150 ProgramBinary *programBinary,
151 const VertexAttribute *attributes,
152 const gl::VertexAttribCurrentValueData *currentValues)
153{
154 for (unsigned int attributeIndex = 0; attributeIndex < MAX_VERTEX_ATTRIBS; attributeIndex++)
155 {
156 int semanticIndex = programBinary->getSemanticIndex(attributeIndex);
157
158 if (semanticIndex != -1)
159 {
160 inputLayout[semanticIndex] = VertexFormat(attributes[attributeIndex], currentValues[attributeIndex].Type);
161 }
162 }
163}
164
165bool VertexFormat::operator==(const VertexFormat &other) const
166{
167 return (mType == other.mType &&
168 mComponents == other.mComponents &&
169 mNormalized == other.mNormalized &&
170 mPureInteger == other.mPureInteger );
171}
172
173bool VertexFormat::operator!=(const VertexFormat &other) const
174{
175 return !(*this == other);
176}
177
178bool VertexFormat::operator<(const VertexFormat& other) const
179{
180 if (mType != other.mType)
181 {
182 return mType < other.mType;
183 }
184 if (mNormalized != other.mNormalized)
185 {
186 return mNormalized < other.mNormalized;
187 }
188 if (mComponents != other.mComponents)
189 {
190 return mComponents < other.mComponents;
191 }
192 return mPureInteger < other.mPureInteger;
193}
194
Geoff Lang125deab2013-08-09 13:34:16 -0400195}