blob: 8fe12669346e3f2a67df6d183079b1316b1d7e94 [file] [log] [blame]
Geoff Lang7ff01042013-10-18 16:15:39 -04001#include "ANGLETest.h"
2
3#include <array>
4
Austin Kinross18b931d2014-09-29 12:58:31 -07005// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
Geoff Lang0d3683c2014-10-23 11:08:16 -04006ANGLE_TYPED_TEST_CASE(UnpackAlignmentTest, ES2_D3D9, ES2_D3D11);
Austin Kinross18b931d2014-09-29 12:58:31 -07007
8template<typename T>
Geoff Lang7ff01042013-10-18 16:15:39 -04009class UnpackAlignmentTest : public ANGLETest
10{
11protected:
Geoff Lang0d3683c2014-10-23 11:08:16 -040012 UnpackAlignmentTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetPlatform())
Geoff Lang7ff01042013-10-18 16:15:39 -040013 {
14 setWindowWidth(128);
15 setWindowHeight(128);
Geoff Langefc551f2013-10-31 10:20:28 -040016 setConfigRedBits(8);
17 setConfigGreenBits(8);
18 setConfigBlueBits(8);
19 setConfigAlphaBits(8);
20 setConfigDepthBits(24);
Geoff Lang7ff01042013-10-18 16:15:39 -040021
22 mProgram = 0;
23 }
24
25 virtual void SetUp()
26 {
27 ANGLETest::SetUp();
28
29 const std::string vertexShaderSource = SHADER_SOURCE
30 (
31 precision highp float;
32 attribute vec4 position;
33
34 void main()
35 {
36 gl_Position = position;
37 }
38 );
39
40 const std::string fragmentShaderSource = SHADER_SOURCE
41 (
42 uniform sampler2D tex;
43
44 void main()
45 {
46 gl_FragColor = texture2D(tex, vec2(0.0, 1.0));
47 }
48 );
49
Jamie Madill5599c8f2014-08-26 13:16:39 -040050 mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
Geoff Lang7ff01042013-10-18 16:15:39 -040051 if (mProgram == 0)
52 {
53 FAIL() << "shader compilation failed.";
54 }
55 }
56
57 virtual void TearDown()
58 {
59 glDeleteProgram(mProgram);
60
61 ANGLETest::TearDown();
62 }
63
64 void getPixelSize(GLenum format, GLenum type, unsigned int* size)
65 {
66 switch (type)
67 {
68 case GL_UNSIGNED_SHORT_5_5_5_1:
69 case GL_UNSIGNED_SHORT_5_6_5:
70 case GL_UNSIGNED_SHORT_4_4_4_4:
71 *size = sizeof(GLushort);
72 break;
73
74 case GL_UNSIGNED_BYTE:
75 {
76 unsigned int compCount = 0;
77 switch (format)
78 {
79 case GL_RGBA: compCount = 4; break;
80 case GL_RGB: compCount = 3; break;
81 case GL_LUMINANCE_ALPHA: compCount = 2; break;
82 case GL_LUMINANCE: compCount = 1; break;
83 case GL_ALPHA: compCount = 1; break;
84 FAIL() << "unknown pixel format.";
85 }
86 *size = sizeof(GLubyte) * compCount;
87 }
88 break;
89 default:
90 FAIL() << "unknown pixel type.";
91 }
92 }
93
94 bool formatHasRGB(GLenum format)
95 {
96 return (format != GL_ALPHA);
97 }
98
99 void testAlignment(int alignment, unsigned int offset, GLenum format, GLenum type)
100 {
101 static const unsigned int width = 7;
102 static const unsigned int height = 2;
103
104 glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
105
106 GLint readbackAlignment;
107 glGetIntegerv(GL_UNPACK_ALIGNMENT, &readbackAlignment);
108 EXPECT_EQ(alignment, readbackAlignment);
109
110 std::array<GLubyte, 1024> buf;
111 std::fill(buf.begin(), buf.end(), 0);
112
113 unsigned int pixelSize;
114 getPixelSize(format, type, &pixelSize);
115 for (unsigned int i = 0; i < pixelSize; i++)
116 {
117 buf[offset+i] = 0xFF;
118 }
119
120 GLuint tex;
121 glGenTextures(1, &tex);
122 glBindTexture(GL_TEXTURE_2D, tex);
123
124 glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, type, &buf[0]);
125 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
126 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
127 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
128
129 drawQuad(mProgram, "position", 0.5f);
130
131 GLubyte expectedRGB = formatHasRGB(format) ? 255 : 0;
132 EXPECT_PIXEL_EQ(0, 0, expectedRGB, expectedRGB, expectedRGB, 255);
133
134 glDeleteTextures(1, &tex);
135 }
136
137 GLuint mProgram;
138};
139
Austin Kinross18b931d2014-09-29 12:58:31 -0700140TYPED_TEST(UnpackAlignmentTest, DefaultAlignment)
Geoff Lang7ff01042013-10-18 16:15:39 -0400141{
142 GLint defaultAlignment;
143 glGetIntegerv(GL_UNPACK_ALIGNMENT, &defaultAlignment);
144 EXPECT_EQ(defaultAlignment, 4);
145}
146
147
Austin Kinross18b931d2014-09-29 12:58:31 -0700148TYPED_TEST(UnpackAlignmentTest, Alignment1RGBAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400149{
150 testAlignment(1, 7 * 4, GL_RGBA, GL_UNSIGNED_BYTE);
151}
152
Austin Kinross18b931d2014-09-29 12:58:31 -0700153TYPED_TEST(UnpackAlignmentTest, Alignment1RGBUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400154{
155 testAlignment(1, 7 * 3, GL_RGB, GL_UNSIGNED_BYTE);
156}
157
Austin Kinross18b931d2014-09-29 12:58:31 -0700158TYPED_TEST(UnpackAlignmentTest, Alignment1RGBAUShort4444)
Geoff Lang7ff01042013-10-18 16:15:39 -0400159{
160 testAlignment(1, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);
161}
162
Austin Kinross18b931d2014-09-29 12:58:31 -0700163TYPED_TEST(UnpackAlignmentTest, Alignment1RGBAUShort5551)
Geoff Lang7ff01042013-10-18 16:15:39 -0400164{
165 testAlignment(1, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
166}
167
Austin Kinross18b931d2014-09-29 12:58:31 -0700168TYPED_TEST(UnpackAlignmentTest, Alignment1RGBAUShort565)
Geoff Lang7ff01042013-10-18 16:15:39 -0400169{
170 testAlignment(1, 7 * 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
171}
172
Austin Kinross18b931d2014-09-29 12:58:31 -0700173TYPED_TEST(UnpackAlignmentTest, Alignment1LAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400174{
175 testAlignment(1, 7 * 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
176}
177
Austin Kinross18b931d2014-09-29 12:58:31 -0700178TYPED_TEST(UnpackAlignmentTest, Alignment1LUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400179{
180 testAlignment(1, 7, GL_LUMINANCE, GL_UNSIGNED_BYTE);
181}
182
Austin Kinross18b931d2014-09-29 12:58:31 -0700183TYPED_TEST(UnpackAlignmentTest, Alignment1AUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400184{
185 testAlignment(1, 7, GL_ALPHA, GL_UNSIGNED_BYTE);
186}
187
188
Austin Kinross18b931d2014-09-29 12:58:31 -0700189TYPED_TEST(UnpackAlignmentTest, Alignment2RGBAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400190{
191 testAlignment(2, 7 * 4, GL_RGBA, GL_UNSIGNED_BYTE);
192}
193
Austin Kinross18b931d2014-09-29 12:58:31 -0700194TYPED_TEST(UnpackAlignmentTest, Alignment2RGBUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400195{
196 testAlignment(2, 7 * 3 + 1, GL_RGB, GL_UNSIGNED_BYTE);
197}
198
Austin Kinross18b931d2014-09-29 12:58:31 -0700199TYPED_TEST(UnpackAlignmentTest, Alignment2RGBAUShort4444)
Geoff Lang7ff01042013-10-18 16:15:39 -0400200{
201 testAlignment(2, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);
202}
203
Austin Kinross18b931d2014-09-29 12:58:31 -0700204TYPED_TEST(UnpackAlignmentTest, Alignment2RGBAUShort5551)
Geoff Lang7ff01042013-10-18 16:15:39 -0400205{
206 testAlignment(2, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
207}
208
Austin Kinross18b931d2014-09-29 12:58:31 -0700209TYPED_TEST(UnpackAlignmentTest, Alignment2RGBAUShort565)
Geoff Lang7ff01042013-10-18 16:15:39 -0400210{
211 testAlignment(2, 7 * 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
212}
213
Austin Kinross18b931d2014-09-29 12:58:31 -0700214TYPED_TEST(UnpackAlignmentTest, Alignment2LAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400215{
216 testAlignment(2, 7 * 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
217}
218
Austin Kinross18b931d2014-09-29 12:58:31 -0700219TYPED_TEST(UnpackAlignmentTest, Alignment2LAByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400220{
221 testAlignment(2, 7 + 1, GL_LUMINANCE, GL_UNSIGNED_BYTE);
222}
223
Austin Kinross18b931d2014-09-29 12:58:31 -0700224TYPED_TEST(UnpackAlignmentTest, Alignment2AUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400225{
226 testAlignment(2, 7 + 1, GL_ALPHA, GL_UNSIGNED_BYTE);
227}
228
229
Austin Kinross18b931d2014-09-29 12:58:31 -0700230TYPED_TEST(UnpackAlignmentTest, Alignment4RGBAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400231{
232 testAlignment(4, 7 * 4, GL_RGBA, GL_UNSIGNED_BYTE);
233}
234
Austin Kinross18b931d2014-09-29 12:58:31 -0700235TYPED_TEST(UnpackAlignmentTest, Alignment4RGBUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400236{
237 testAlignment(4, 7 * 3 + 3, GL_RGB, GL_UNSIGNED_BYTE);
238}
239
Austin Kinross18b931d2014-09-29 12:58:31 -0700240TYPED_TEST(UnpackAlignmentTest, Alignment4RGBAUShort4444)
Geoff Lang7ff01042013-10-18 16:15:39 -0400241{
242 testAlignment(4, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);
243}
244
Austin Kinross18b931d2014-09-29 12:58:31 -0700245TYPED_TEST(UnpackAlignmentTest, Alignment4RGBAUShort5551)
Geoff Lang7ff01042013-10-18 16:15:39 -0400246{
247 testAlignment(4, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
248}
249
Austin Kinross18b931d2014-09-29 12:58:31 -0700250TYPED_TEST(UnpackAlignmentTest, Alignment4RGBAUShort565)
Geoff Lang7ff01042013-10-18 16:15:39 -0400251{
252 testAlignment(4, 7 * 2 + 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
253}
254
Austin Kinross18b931d2014-09-29 12:58:31 -0700255TYPED_TEST(UnpackAlignmentTest, Alignment4LAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400256{
257 testAlignment(4, 7 * 2 + 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
258}
259
Austin Kinross18b931d2014-09-29 12:58:31 -0700260TYPED_TEST(UnpackAlignmentTest, Alignment4LUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400261{
262 testAlignment(4, 7 + 1, GL_LUMINANCE, GL_UNSIGNED_BYTE);
263}
264
Austin Kinross18b931d2014-09-29 12:58:31 -0700265TYPED_TEST(UnpackAlignmentTest, Alignment4AUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400266{
267 testAlignment(4, 7 + 1, GL_ALPHA, GL_UNSIGNED_BYTE);
268}
269
270
Austin Kinross18b931d2014-09-29 12:58:31 -0700271TYPED_TEST(UnpackAlignmentTest, Alignment8RGBAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400272{
273 testAlignment(8, 7 * 4 + 4, GL_RGBA, GL_UNSIGNED_BYTE);
274}
275
Austin Kinross18b931d2014-09-29 12:58:31 -0700276TYPED_TEST(UnpackAlignmentTest, Alignment8RGBUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400277{
278 testAlignment(8, 7 * 3 + 3, GL_RGB, GL_UNSIGNED_BYTE);
279}
280
Austin Kinross18b931d2014-09-29 12:58:31 -0700281TYPED_TEST(UnpackAlignmentTest, Alignment8RGBAUShort4444)
Geoff Lang7ff01042013-10-18 16:15:39 -0400282{
283 testAlignment(8, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);
284}
285
Austin Kinross18b931d2014-09-29 12:58:31 -0700286TYPED_TEST(UnpackAlignmentTest, Alignment8RGBAUShort5551)
Geoff Lang7ff01042013-10-18 16:15:39 -0400287{
288 testAlignment(8, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
289}
290
Austin Kinross18b931d2014-09-29 12:58:31 -0700291TYPED_TEST(UnpackAlignmentTest, Alignment8RGBAUShort565)
Geoff Lang7ff01042013-10-18 16:15:39 -0400292{
293 testAlignment(8, 7 * 2 + 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
294}
295
Austin Kinross18b931d2014-09-29 12:58:31 -0700296TYPED_TEST(UnpackAlignmentTest, Alignment8LAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400297{
298 testAlignment(8, 7 * 2 + 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
299}
300
Austin Kinross18b931d2014-09-29 12:58:31 -0700301TYPED_TEST(UnpackAlignmentTest, Alignment8LUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400302{
303 testAlignment(8, 7 + 1, GL_LUMINANCE, GL_UNSIGNED_BYTE);
304}
305
Austin Kinross18b931d2014-09-29 12:58:31 -0700306TYPED_TEST(UnpackAlignmentTest, Alignment8AUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400307{
308 testAlignment(8, 7 + 1, GL_ALPHA, GL_UNSIGNED_BYTE);
309}