blob: 2a3f76bc6fa8c14d113716ae2ea359e63b78c453 [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
Corentin Wallezd3970de2015-05-14 11:07:48 -04007#include "test_utils/ANGLETest.h"
Geoff Lang7ff01042013-10-18 16:15:39 -04008
Jamie Madillfa05f602015-05-07 13:47:11 -04009using namespace angle;
Austin Kinross18b931d2014-09-29 12:58:31 -070010
Jamie Madillfa05f602015-05-07 13:47:11 -040011namespace
12{
13
Geoff Lang7ff01042013-10-18 16:15:39 -040014class UnpackAlignmentTest : public ANGLETest
15{
Jamie Madillfa05f602015-05-07 13:47:11 -040016 protected:
17 UnpackAlignmentTest()
Geoff Lang7ff01042013-10-18 16:15:39 -040018 {
19 setWindowWidth(128);
20 setWindowHeight(128);
Geoff Langefc551f2013-10-31 10:20:28 -040021 setConfigRedBits(8);
22 setConfigGreenBits(8);
23 setConfigBlueBits(8);
24 setConfigAlphaBits(8);
25 setConfigDepthBits(24);
Geoff Lang7ff01042013-10-18 16:15:39 -040026
27 mProgram = 0;
28 }
29
Jamie Madillfa05f602015-05-07 13:47:11 -040030 void SetUp() override
Geoff Lang7ff01042013-10-18 16:15:39 -040031 {
32 ANGLETest::SetUp();
33
34 const std::string vertexShaderSource = SHADER_SOURCE
35 (
36 precision highp float;
37 attribute vec4 position;
38
39 void main()
40 {
41 gl_Position = position;
42 }
43 );
44
45 const std::string fragmentShaderSource = SHADER_SOURCE
46 (
47 uniform sampler2D tex;
48
49 void main()
50 {
51 gl_FragColor = texture2D(tex, vec2(0.0, 1.0));
52 }
53 );
54
Jamie Madill5599c8f2014-08-26 13:16:39 -040055 mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
Geoff Lang7ff01042013-10-18 16:15:39 -040056 if (mProgram == 0)
57 {
58 FAIL() << "shader compilation failed.";
59 }
60 }
61
Jamie Madillfa05f602015-05-07 13:47:11 -040062 void TearDown() override
Geoff Lang7ff01042013-10-18 16:15:39 -040063 {
64 glDeleteProgram(mProgram);
65
66 ANGLETest::TearDown();
67 }
68
69 void getPixelSize(GLenum format, GLenum type, unsigned int* size)
70 {
71 switch (type)
72 {
73 case GL_UNSIGNED_SHORT_5_5_5_1:
74 case GL_UNSIGNED_SHORT_5_6_5:
75 case GL_UNSIGNED_SHORT_4_4_4_4:
76 *size = sizeof(GLushort);
77 break;
78
79 case GL_UNSIGNED_BYTE:
80 {
81 unsigned int compCount = 0;
82 switch (format)
83 {
84 case GL_RGBA: compCount = 4; break;
85 case GL_RGB: compCount = 3; break;
86 case GL_LUMINANCE_ALPHA: compCount = 2; break;
87 case GL_LUMINANCE: compCount = 1; break;
88 case GL_ALPHA: compCount = 1; break;
Austin Kinrossc8ef69d2015-03-18 16:43:22 -070089 default: FAIL() << "unknown pixel format.";
Geoff Lang7ff01042013-10-18 16:15:39 -040090 }
91 *size = sizeof(GLubyte) * compCount;
92 }
93 break;
94 default:
95 FAIL() << "unknown pixel type.";
96 }
97 }
98
99 bool formatHasRGB(GLenum format)
100 {
101 return (format != GL_ALPHA);
102 }
103
104 void testAlignment(int alignment, unsigned int offset, GLenum format, GLenum type)
105 {
106 static const unsigned int width = 7;
107 static const unsigned int height = 2;
108
109 glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
110
111 GLint readbackAlignment;
112 glGetIntegerv(GL_UNPACK_ALIGNMENT, &readbackAlignment);
113 EXPECT_EQ(alignment, readbackAlignment);
114
Corentin Wallezf0ca9a02015-09-14 11:53:10 -0700115 GLubyte buf[1024];
116 memset(buf, 0, sizeof(buf));
Geoff Lang7ff01042013-10-18 16:15:39 -0400117
118 unsigned int pixelSize;
119 getPixelSize(format, type, &pixelSize);
120 for (unsigned int i = 0; i < pixelSize; i++)
121 {
122 buf[offset+i] = 0xFF;
123 }
124
125 GLuint tex;
126 glGenTextures(1, &tex);
127 glBindTexture(GL_TEXTURE_2D, tex);
128
129 glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, type, &buf[0]);
130 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
131 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
132 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
133
134 drawQuad(mProgram, "position", 0.5f);
135
136 GLubyte expectedRGB = formatHasRGB(format) ? 255 : 0;
137 EXPECT_PIXEL_EQ(0, 0, expectedRGB, expectedRGB, expectedRGB, 255);
138
139 glDeleteTextures(1, &tex);
140 }
141
142 GLuint mProgram;
143};
144
Jamie Madillfa05f602015-05-07 13:47:11 -0400145TEST_P(UnpackAlignmentTest, DefaultAlignment)
Geoff Lang7ff01042013-10-18 16:15:39 -0400146{
147 GLint defaultAlignment;
148 glGetIntegerv(GL_UNPACK_ALIGNMENT, &defaultAlignment);
149 EXPECT_EQ(defaultAlignment, 4);
150}
151
152
Jamie Madillfa05f602015-05-07 13:47:11 -0400153TEST_P(UnpackAlignmentTest, Alignment1RGBAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400154{
155 testAlignment(1, 7 * 4, GL_RGBA, GL_UNSIGNED_BYTE);
156}
157
Jamie Madillfa05f602015-05-07 13:47:11 -0400158TEST_P(UnpackAlignmentTest, Alignment1RGBUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400159{
160 testAlignment(1, 7 * 3, GL_RGB, GL_UNSIGNED_BYTE);
161}
162
Jamie Madillfa05f602015-05-07 13:47:11 -0400163TEST_P(UnpackAlignmentTest, Alignment1RGBAUShort4444)
Geoff Lang7ff01042013-10-18 16:15:39 -0400164{
165 testAlignment(1, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);
166}
167
Jamie Madillfa05f602015-05-07 13:47:11 -0400168TEST_P(UnpackAlignmentTest, Alignment1RGBAUShort5551)
Geoff Lang7ff01042013-10-18 16:15:39 -0400169{
170 testAlignment(1, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
171}
172
Jamie Madillfa05f602015-05-07 13:47:11 -0400173TEST_P(UnpackAlignmentTest, Alignment1RGBAUShort565)
Geoff Lang7ff01042013-10-18 16:15:39 -0400174{
175 testAlignment(1, 7 * 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
176}
177
Jamie Madillfa05f602015-05-07 13:47:11 -0400178TEST_P(UnpackAlignmentTest, Alignment1LAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400179{
180 testAlignment(1, 7 * 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
181}
182
Jamie Madillfa05f602015-05-07 13:47:11 -0400183TEST_P(UnpackAlignmentTest, Alignment1LUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400184{
185 testAlignment(1, 7, GL_LUMINANCE, GL_UNSIGNED_BYTE);
186}
187
Jamie Madillfa05f602015-05-07 13:47:11 -0400188TEST_P(UnpackAlignmentTest, Alignment1AUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400189{
190 testAlignment(1, 7, GL_ALPHA, GL_UNSIGNED_BYTE);
191}
192
193
Jamie Madillfa05f602015-05-07 13:47:11 -0400194TEST_P(UnpackAlignmentTest, Alignment2RGBAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400195{
196 testAlignment(2, 7 * 4, GL_RGBA, GL_UNSIGNED_BYTE);
197}
198
Jamie Madillfa05f602015-05-07 13:47:11 -0400199TEST_P(UnpackAlignmentTest, Alignment2RGBUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400200{
201 testAlignment(2, 7 * 3 + 1, GL_RGB, GL_UNSIGNED_BYTE);
202}
203
Jamie Madillfa05f602015-05-07 13:47:11 -0400204TEST_P(UnpackAlignmentTest, Alignment2RGBAUShort4444)
Geoff Lang7ff01042013-10-18 16:15:39 -0400205{
206 testAlignment(2, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);
207}
208
Jamie Madillfa05f602015-05-07 13:47:11 -0400209TEST_P(UnpackAlignmentTest, Alignment2RGBAUShort5551)
Geoff Lang7ff01042013-10-18 16:15:39 -0400210{
211 testAlignment(2, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
212}
213
Jamie Madillfa05f602015-05-07 13:47:11 -0400214TEST_P(UnpackAlignmentTest, Alignment2RGBAUShort565)
Geoff Lang7ff01042013-10-18 16:15:39 -0400215{
216 testAlignment(2, 7 * 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
217}
218
Jamie Madillfa05f602015-05-07 13:47:11 -0400219TEST_P(UnpackAlignmentTest, Alignment2LAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400220{
221 testAlignment(2, 7 * 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
222}
223
Jamie Madillfa05f602015-05-07 13:47:11 -0400224TEST_P(UnpackAlignmentTest, Alignment2LAByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400225{
226 testAlignment(2, 7 + 1, GL_LUMINANCE, GL_UNSIGNED_BYTE);
227}
228
Jamie Madillfa05f602015-05-07 13:47:11 -0400229TEST_P(UnpackAlignmentTest, Alignment2AUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400230{
231 testAlignment(2, 7 + 1, GL_ALPHA, GL_UNSIGNED_BYTE);
232}
233
234
Jamie Madillfa05f602015-05-07 13:47:11 -0400235TEST_P(UnpackAlignmentTest, Alignment4RGBAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400236{
237 testAlignment(4, 7 * 4, GL_RGBA, GL_UNSIGNED_BYTE);
238}
239
Jamie Madillfa05f602015-05-07 13:47:11 -0400240TEST_P(UnpackAlignmentTest, Alignment4RGBUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400241{
242 testAlignment(4, 7 * 3 + 3, GL_RGB, GL_UNSIGNED_BYTE);
243}
244
Jamie Madillfa05f602015-05-07 13:47:11 -0400245TEST_P(UnpackAlignmentTest, Alignment4RGBAUShort4444)
Geoff Lang7ff01042013-10-18 16:15:39 -0400246{
247 testAlignment(4, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);
248}
249
Jamie Madillfa05f602015-05-07 13:47:11 -0400250TEST_P(UnpackAlignmentTest, Alignment4RGBAUShort5551)
Geoff Lang7ff01042013-10-18 16:15:39 -0400251{
252 testAlignment(4, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
253}
254
Jamie Madillfa05f602015-05-07 13:47:11 -0400255TEST_P(UnpackAlignmentTest, Alignment4RGBAUShort565)
Geoff Lang7ff01042013-10-18 16:15:39 -0400256{
257 testAlignment(4, 7 * 2 + 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
258}
259
Jamie Madillfa05f602015-05-07 13:47:11 -0400260TEST_P(UnpackAlignmentTest, Alignment4LAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400261{
262 testAlignment(4, 7 * 2 + 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
263}
264
Jamie Madillfa05f602015-05-07 13:47:11 -0400265TEST_P(UnpackAlignmentTest, Alignment4LUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400266{
267 testAlignment(4, 7 + 1, GL_LUMINANCE, GL_UNSIGNED_BYTE);
268}
269
Jamie Madillfa05f602015-05-07 13:47:11 -0400270TEST_P(UnpackAlignmentTest, Alignment4AUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400271{
272 testAlignment(4, 7 + 1, GL_ALPHA, GL_UNSIGNED_BYTE);
273}
274
275
Jamie Madillfa05f602015-05-07 13:47:11 -0400276TEST_P(UnpackAlignmentTest, Alignment8RGBAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400277{
278 testAlignment(8, 7 * 4 + 4, GL_RGBA, GL_UNSIGNED_BYTE);
279}
280
Jamie Madillfa05f602015-05-07 13:47:11 -0400281TEST_P(UnpackAlignmentTest, Alignment8RGBUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400282{
283 testAlignment(8, 7 * 3 + 3, GL_RGB, GL_UNSIGNED_BYTE);
284}
285
Jamie Madillfa05f602015-05-07 13:47:11 -0400286TEST_P(UnpackAlignmentTest, Alignment8RGBAUShort4444)
Geoff Lang7ff01042013-10-18 16:15:39 -0400287{
288 testAlignment(8, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);
289}
290
Jamie Madillfa05f602015-05-07 13:47:11 -0400291TEST_P(UnpackAlignmentTest, Alignment8RGBAUShort5551)
Geoff Lang7ff01042013-10-18 16:15:39 -0400292{
293 testAlignment(8, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
294}
295
Jamie Madillfa05f602015-05-07 13:47:11 -0400296TEST_P(UnpackAlignmentTest, Alignment8RGBAUShort565)
Geoff Lang7ff01042013-10-18 16:15:39 -0400297{
298 testAlignment(8, 7 * 2 + 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
299}
300
Jamie Madillfa05f602015-05-07 13:47:11 -0400301TEST_P(UnpackAlignmentTest, Alignment8LAUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400302{
303 testAlignment(8, 7 * 2 + 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
304}
305
Jamie Madillfa05f602015-05-07 13:47:11 -0400306TEST_P(UnpackAlignmentTest, Alignment8LUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400307{
308 testAlignment(8, 7 + 1, GL_LUMINANCE, GL_UNSIGNED_BYTE);
309}
310
Jamie Madillfa05f602015-05-07 13:47:11 -0400311TEST_P(UnpackAlignmentTest, Alignment8AUByte)
Geoff Lang7ff01042013-10-18 16:15:39 -0400312{
313 testAlignment(8, 7 + 1, GL_ALPHA, GL_UNSIGNED_BYTE);
314}
Jamie Madillfa05f602015-05-07 13:47:11 -0400315
316// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
Geoff Lange0cc2a42016-01-20 10:58:17 -0500317ANGLE_INSTANTIATE_TEST(UnpackAlignmentTest,
318 ES2_D3D9(),
319 ES2_D3D11(),
320 ES2_OPENGL(),
321 ES3_OPENGL(),
322 ES2_OPENGLES(),
323 ES3_OPENGLES());
Jamie Madillfa05f602015-05-07 13:47:11 -0400324
325} // namespace