blob: 47f6576aca56d7f56de80dfe16e21482f0f5fd9e [file] [log] [blame]
Jamie Madillfa05f602015-05-07 13:47:11 -04001//
2// Copyright 2015 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
Geoff Lang7ff01042013-10-18 16:15:39 -04007#include "ANGLETest.h"
8
9#include <array>
10
Jamie Madillfa05f602015-05-07 13:47:11 -040011using namespace angle;
Austin Kinross18b931d2014-09-29 12:58:31 -070012
Jamie Madillfa05f602015-05-07 13:47:11 -040013namespace
14{
15
Geoff Lang7ff01042013-10-18 16:15:39 -040016class UnpackAlignmentTest : public ANGLETest
17{
Jamie Madillfa05f602015-05-07 13:47:11 -040018 protected:
19 UnpackAlignmentTest()
Geoff Lang7ff01042013-10-18 16:15:39 -040020 {
21 setWindowWidth(128);
22 setWindowHeight(128);
Geoff Langefc551f2013-10-31 10:20:28 -040023 setConfigRedBits(8);
24 setConfigGreenBits(8);
25 setConfigBlueBits(8);
26 setConfigAlphaBits(8);
27 setConfigDepthBits(24);
Geoff Lang7ff01042013-10-18 16:15:39 -040028
29 mProgram = 0;
30 }
31
Jamie Madillfa05f602015-05-07 13:47:11 -040032 void SetUp() override
Geoff Lang7ff01042013-10-18 16:15:39 -040033 {
34 ANGLETest::SetUp();
35
36 const std::string vertexShaderSource = SHADER_SOURCE
37 (
38 precision highp float;
39 attribute vec4 position;
40
41 void main()
42 {
43 gl_Position = position;
44 }
45 );
46
47 const std::string fragmentShaderSource = SHADER_SOURCE
48 (
49 uniform sampler2D tex;
50
51 void main()
52 {
53 gl_FragColor = texture2D(tex, vec2(0.0, 1.0));
54 }
55 );
56
Jamie Madill5599c8f2014-08-26 13:16:39 -040057 mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
Geoff Lang7ff01042013-10-18 16:15:39 -040058 if (mProgram == 0)
59 {
60 FAIL() << "shader compilation failed.";
61 }
62 }
63
Jamie Madillfa05f602015-05-07 13:47:11 -040064 void TearDown() override
Geoff Lang7ff01042013-10-18 16:15:39 -040065 {
66 glDeleteProgram(mProgram);
67
68 ANGLETest::TearDown();
69 }
70
71 void getPixelSize(GLenum format, GLenum type, unsigned int* size)
72 {
73 switch (type)
74 {
75 case GL_UNSIGNED_SHORT_5_5_5_1:
76 case GL_UNSIGNED_SHORT_5_6_5:
77 case GL_UNSIGNED_SHORT_4_4_4_4:
78 *size = sizeof(GLushort);
79 break;
80
81 case GL_UNSIGNED_BYTE:
82 {
83 unsigned int compCount = 0;
84 switch (format)
85 {
86 case GL_RGBA: compCount = 4; break;
87 case GL_RGB: compCount = 3; break;
88 case GL_LUMINANCE_ALPHA: compCount = 2; break;
89 case GL_LUMINANCE: compCount = 1; break;
90 case GL_ALPHA: compCount = 1; break;
Austin Kinrossc8ef69d2015-03-18 16:43:22 -070091 default: FAIL() << "unknown pixel format.";
Geoff Lang7ff01042013-10-18 16:15:39 -040092 }
93 *size = sizeof(GLubyte) * compCount;
94 }
95 break;
96 default:
97 FAIL() << "unknown pixel type.";
98 }
99 }
100
101 bool formatHasRGB(GLenum format)
102 {
103 return (format != GL_ALPHA);
104 }
105
106 void testAlignment(int alignment, unsigned int offset, GLenum format, GLenum type)
107 {
108 static const unsigned int width = 7;
109 static const unsigned int height = 2;
110
111 glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
112
113 GLint readbackAlignment;
114 glGetIntegerv(GL_UNPACK_ALIGNMENT, &readbackAlignment);
115 EXPECT_EQ(alignment, readbackAlignment);
116
117 std::array<GLubyte, 1024> buf;
118 std::fill(buf.begin(), buf.end(), 0);
119
120 unsigned int pixelSize;
121 getPixelSize(format, type, &pixelSize);
122 for (unsigned int i = 0; i < pixelSize; i++)
123 {
124 buf[offset+i] = 0xFF;
125 }
126
127 GLuint tex;
128 glGenTextures(1, &tex);
129 glBindTexture(GL_TEXTURE_2D, tex);
130
131 glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, type, &buf[0]);
132 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
133 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
134 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
135
136 drawQuad(mProgram, "position", 0.5f);
137
138 GLubyte expectedRGB = formatHasRGB(format) ? 255 : 0;
139 EXPECT_PIXEL_EQ(0, 0, expectedRGB, expectedRGB, expectedRGB, 255);
140
141 glDeleteTextures(1, &tex);
142 }
143
144 GLuint mProgram;
145};
146
Jamie Madillfa05f602015-05-07 13:47:11 -0400147TEST_P(UnpackAlignmentTest, DefaultAlignment)
Geoff Lang7ff01042013-10-18 16:15:39 -0400148{
149 GLint defaultAlignment;
150 glGetIntegerv(GL_UNPACK_ALIGNMENT, &defaultAlignment);
151 EXPECT_EQ(defaultAlignment, 4);
152}
153
154
Jamie Madillfa05f602015-05-07 13:47:11 -0400155TEST_P(UnpackAlignmentTest, Alignment1RGBAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400156{
157 testAlignment(1, 7 * 4, GL_RGBA, GL_UNSIGNED_BYTE);
158}
159
Jamie Madillfa05f602015-05-07 13:47:11 -0400160TEST_P(UnpackAlignmentTest, Alignment1RGBUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400161{
162 testAlignment(1, 7 * 3, GL_RGB, GL_UNSIGNED_BYTE);
163}
164
Jamie Madillfa05f602015-05-07 13:47:11 -0400165TEST_P(UnpackAlignmentTest, Alignment1RGBAUShort4444)
Geoff Lang7ff01042013-10-18 16:15:39 -0400166{
167 testAlignment(1, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);
168}
169
Jamie Madillfa05f602015-05-07 13:47:11 -0400170TEST_P(UnpackAlignmentTest, Alignment1RGBAUShort5551)
Geoff Lang7ff01042013-10-18 16:15:39 -0400171{
172 testAlignment(1, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
173}
174
Jamie Madillfa05f602015-05-07 13:47:11 -0400175TEST_P(UnpackAlignmentTest, Alignment1RGBAUShort565)
Geoff Lang7ff01042013-10-18 16:15:39 -0400176{
177 testAlignment(1, 7 * 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
178}
179
Jamie Madillfa05f602015-05-07 13:47:11 -0400180TEST_P(UnpackAlignmentTest, Alignment1LAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400181{
182 testAlignment(1, 7 * 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
183}
184
Jamie Madillfa05f602015-05-07 13:47:11 -0400185TEST_P(UnpackAlignmentTest, Alignment1LUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400186{
187 testAlignment(1, 7, GL_LUMINANCE, GL_UNSIGNED_BYTE);
188}
189
Jamie Madillfa05f602015-05-07 13:47:11 -0400190TEST_P(UnpackAlignmentTest, Alignment1AUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400191{
192 testAlignment(1, 7, GL_ALPHA, GL_UNSIGNED_BYTE);
193}
194
195
Jamie Madillfa05f602015-05-07 13:47:11 -0400196TEST_P(UnpackAlignmentTest, Alignment2RGBAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400197{
198 testAlignment(2, 7 * 4, GL_RGBA, GL_UNSIGNED_BYTE);
199}
200
Jamie Madillfa05f602015-05-07 13:47:11 -0400201TEST_P(UnpackAlignmentTest, Alignment2RGBUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400202{
203 testAlignment(2, 7 * 3 + 1, GL_RGB, GL_UNSIGNED_BYTE);
204}
205
Jamie Madillfa05f602015-05-07 13:47:11 -0400206TEST_P(UnpackAlignmentTest, Alignment2RGBAUShort4444)
Geoff Lang7ff01042013-10-18 16:15:39 -0400207{
208 testAlignment(2, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);
209}
210
Jamie Madillfa05f602015-05-07 13:47:11 -0400211TEST_P(UnpackAlignmentTest, Alignment2RGBAUShort5551)
Geoff Lang7ff01042013-10-18 16:15:39 -0400212{
213 testAlignment(2, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
214}
215
Jamie Madillfa05f602015-05-07 13:47:11 -0400216TEST_P(UnpackAlignmentTest, Alignment2RGBAUShort565)
Geoff Lang7ff01042013-10-18 16:15:39 -0400217{
218 testAlignment(2, 7 * 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
219}
220
Jamie Madillfa05f602015-05-07 13:47:11 -0400221TEST_P(UnpackAlignmentTest, Alignment2LAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400222{
223 testAlignment(2, 7 * 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
224}
225
Jamie Madillfa05f602015-05-07 13:47:11 -0400226TEST_P(UnpackAlignmentTest, Alignment2LAByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400227{
228 testAlignment(2, 7 + 1, GL_LUMINANCE, GL_UNSIGNED_BYTE);
229}
230
Jamie Madillfa05f602015-05-07 13:47:11 -0400231TEST_P(UnpackAlignmentTest, Alignment2AUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400232{
233 testAlignment(2, 7 + 1, GL_ALPHA, GL_UNSIGNED_BYTE);
234}
235
236
Jamie Madillfa05f602015-05-07 13:47:11 -0400237TEST_P(UnpackAlignmentTest, Alignment4RGBAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400238{
239 testAlignment(4, 7 * 4, GL_RGBA, GL_UNSIGNED_BYTE);
240}
241
Jamie Madillfa05f602015-05-07 13:47:11 -0400242TEST_P(UnpackAlignmentTest, Alignment4RGBUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400243{
244 testAlignment(4, 7 * 3 + 3, GL_RGB, GL_UNSIGNED_BYTE);
245}
246
Jamie Madillfa05f602015-05-07 13:47:11 -0400247TEST_P(UnpackAlignmentTest, Alignment4RGBAUShort4444)
Geoff Lang7ff01042013-10-18 16:15:39 -0400248{
249 testAlignment(4, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);
250}
251
Jamie Madillfa05f602015-05-07 13:47:11 -0400252TEST_P(UnpackAlignmentTest, Alignment4RGBAUShort5551)
Geoff Lang7ff01042013-10-18 16:15:39 -0400253{
254 testAlignment(4, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
255}
256
Jamie Madillfa05f602015-05-07 13:47:11 -0400257TEST_P(UnpackAlignmentTest, Alignment4RGBAUShort565)
Geoff Lang7ff01042013-10-18 16:15:39 -0400258{
259 testAlignment(4, 7 * 2 + 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
260}
261
Jamie Madillfa05f602015-05-07 13:47:11 -0400262TEST_P(UnpackAlignmentTest, Alignment4LAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400263{
264 testAlignment(4, 7 * 2 + 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
265}
266
Jamie Madillfa05f602015-05-07 13:47:11 -0400267TEST_P(UnpackAlignmentTest, Alignment4LUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400268{
269 testAlignment(4, 7 + 1, GL_LUMINANCE, GL_UNSIGNED_BYTE);
270}
271
Jamie Madillfa05f602015-05-07 13:47:11 -0400272TEST_P(UnpackAlignmentTest, Alignment4AUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400273{
274 testAlignment(4, 7 + 1, GL_ALPHA, GL_UNSIGNED_BYTE);
275}
276
277
Jamie Madillfa05f602015-05-07 13:47:11 -0400278TEST_P(UnpackAlignmentTest, Alignment8RGBAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400279{
280 testAlignment(8, 7 * 4 + 4, GL_RGBA, GL_UNSIGNED_BYTE);
281}
282
Jamie Madillfa05f602015-05-07 13:47:11 -0400283TEST_P(UnpackAlignmentTest, Alignment8RGBUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400284{
285 testAlignment(8, 7 * 3 + 3, GL_RGB, GL_UNSIGNED_BYTE);
286}
287
Jamie Madillfa05f602015-05-07 13:47:11 -0400288TEST_P(UnpackAlignmentTest, Alignment8RGBAUShort4444)
Geoff Lang7ff01042013-10-18 16:15:39 -0400289{
290 testAlignment(8, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);
291}
292
Jamie Madillfa05f602015-05-07 13:47:11 -0400293TEST_P(UnpackAlignmentTest, Alignment8RGBAUShort5551)
Geoff Lang7ff01042013-10-18 16:15:39 -0400294{
295 testAlignment(8, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
296}
297
Jamie Madillfa05f602015-05-07 13:47:11 -0400298TEST_P(UnpackAlignmentTest, Alignment8RGBAUShort565)
Geoff Lang7ff01042013-10-18 16:15:39 -0400299{
300 testAlignment(8, 7 * 2 + 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
301}
302
Jamie Madillfa05f602015-05-07 13:47:11 -0400303TEST_P(UnpackAlignmentTest, Alignment8LAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400304{
305 testAlignment(8, 7 * 2 + 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
306}
307
Jamie Madillfa05f602015-05-07 13:47:11 -0400308TEST_P(UnpackAlignmentTest, Alignment8LUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400309{
310 testAlignment(8, 7 + 1, GL_LUMINANCE, GL_UNSIGNED_BYTE);
311}
312
Jamie Madillfa05f602015-05-07 13:47:11 -0400313TEST_P(UnpackAlignmentTest, Alignment8AUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400314{
315 testAlignment(8, 7 + 1, GL_ALPHA, GL_UNSIGNED_BYTE);
316}
Jamie Madillfa05f602015-05-07 13:47:11 -0400317
318// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
319INSTANTIATE_TEST_CASE_P(
320 ANGLE, UnpackAlignmentTest,
321 testing::Values(ES2_D3D9(), ES2_D3D11(), ES2_OPENGL(), ES3_OPENGL()));
322
323} // namespace