1 #include "ANGLETest.h" 2 3 #include <array> 4 5 class UnpackAlignmentTest : public ANGLETest 6 { 7 protected: 8 UnpackAlignmentTest() 9 { 10 setWindowWidth(128); 11 setWindowHeight(128); 12 setConfigRedBits(8); 13 setConfigGreenBits(8); 14 setConfigBlueBits(8); 15 setConfigAlphaBits(8); 16 setConfigDepthBits(24); 17 18 mProgram = 0; 19 } 20 21 virtual void SetUp() 22 { 23 ANGLETest::SetUp(); 24 25 const std::string vertexShaderSource = SHADER_SOURCE 26 ( 27 precision highp float; 28 attribute vec4 position; 29 30 void main() 31 { 32 gl_Position = position; 33 } 34 ); 35 36 const std::string fragmentShaderSource = SHADER_SOURCE 37 ( 38 uniform sampler2D tex; 39 40 void main() 41 { 42 gl_FragColor = texture2D(tex, vec2(0.0, 1.0)); 43 } 44 ); 45 46 mProgram = compileProgram(vertexShaderSource, fragmentShaderSource); 47 if (mProgram == 0) 48 { 49 FAIL() << "shader compilation failed."; 50 } 51 } 52 53 virtual void TearDown() 54 { 55 glDeleteProgram(mProgram); 56 57 ANGLETest::TearDown(); 58 } 59 60 void getPixelSize(GLenum format, GLenum type, unsigned int* size) 61 { 62 switch (type) 63 { 64 case GL_UNSIGNED_SHORT_5_5_5_1: 65 case GL_UNSIGNED_SHORT_5_6_5: 66 case GL_UNSIGNED_SHORT_4_4_4_4: 67 *size = sizeof(GLushort); 68 break; 69 70 case GL_UNSIGNED_BYTE: 71 { 72 unsigned int compCount = 0; 73 switch (format) 74 { 75 case GL_RGBA: compCount = 4; break; 76 case GL_RGB: compCount = 3; break; 77 case GL_LUMINANCE_ALPHA: compCount = 2; break; 78 case GL_LUMINANCE: compCount = 1; break; 79 case GL_ALPHA: compCount = 1; break; 80 FAIL() << "unknown pixel format."; 81 } 82 *size = sizeof(GLubyte) * compCount; 83 } 84 break; 85 default: 86 FAIL() << "unknown pixel type."; 87 } 88 } 89 90 bool formatHasRGB(GLenum format) 91 { 92 return (format != GL_ALPHA); 93 } 94 95 void testAlignment(int alignment, unsigned int offset, GLenum format, GLenum type) 96 { 97 static const unsigned int width = 7; 98 static const unsigned int height = 2; 99 100 glPixelStorei(GL_UNPACK_ALIGNMENT, alignment); 101 102 GLint readbackAlignment; 103 glGetIntegerv(GL_UNPACK_ALIGNMENT, &readbackAlignment); 104 EXPECT_EQ(alignment, readbackAlignment); 105 106 std::array<GLubyte, 1024> buf; 107 std::fill(buf.begin(), buf.end(), 0); 108 109 unsigned int pixelSize; 110 getPixelSize(format, type, &pixelSize); 111 for (unsigned int i = 0; i < pixelSize; i++) 112 { 113 buf[offset+i] = 0xFF; 114 } 115 116 GLuint tex; 117 glGenTextures(1, &tex); 118 glBindTexture(GL_TEXTURE_2D, tex); 119 120 glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, type, &buf[0]); 121 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 122 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 123 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 124 125 drawQuad(mProgram, "position", 0.5f); 126 127 GLubyte expectedRGB = formatHasRGB(format) ? 255 : 0; 128 EXPECT_PIXEL_EQ(0, 0, expectedRGB, expectedRGB, expectedRGB, 255); 129 130 glDeleteTextures(1, &tex); 131 } 132 133 GLuint mProgram; 134 }; 135 136 TEST_F(UnpackAlignmentTest, default_alignment) 137 { 138 GLint defaultAlignment; 139 glGetIntegerv(GL_UNPACK_ALIGNMENT, &defaultAlignment); 140 EXPECT_EQ(defaultAlignment, 4); 141 } 142 143 144 TEST_F(UnpackAlignmentTest, alignment_1_rgba_ubyte) 145 { 146 testAlignment(1, 7 * 4, GL_RGBA, GL_UNSIGNED_BYTE); 147 } 148 149 TEST_F(UnpackAlignmentTest, alignment_1_rgb_ubyte) 150 { 151 testAlignment(1, 7 * 3, GL_RGB, GL_UNSIGNED_BYTE); 152 } 153 154 TEST_F(UnpackAlignmentTest, alignment_1_rgba_ushort4444) 155 { 156 testAlignment(1, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4); 157 } 158 159 TEST_F(UnpackAlignmentTest, alignment_1_rgba_ushort5551) 160 { 161 testAlignment(1, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1); 162 } 163 164 TEST_F(UnpackAlignmentTest, alignment_1_rgb_ushort565) 165 { 166 testAlignment(1, 7 * 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5); 167 } 168 169 TEST_F(UnpackAlignmentTest, alignment_1_la_ubyte) 170 { 171 testAlignment(1, 7 * 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE); 172 } 173 174 TEST_F(UnpackAlignmentTest, alignment_1_l_ubyte) 175 { 176 testAlignment(1, 7, GL_LUMINANCE, GL_UNSIGNED_BYTE); 177 } 178 179 TEST_F(UnpackAlignmentTest, alignment_1_a_ubyte) 180 { 181 testAlignment(1, 7, GL_ALPHA, GL_UNSIGNED_BYTE); 182 } 183 184 185 TEST_F(UnpackAlignmentTest, alignment_2_rgba_ubyte) 186 { 187 testAlignment(2, 7 * 4, GL_RGBA, GL_UNSIGNED_BYTE); 188 } 189 190 TEST_F(UnpackAlignmentTest, alignment_2_rgb_ubyte) 191 { 192 testAlignment(2, 7 * 3 + 1, GL_RGB, GL_UNSIGNED_BYTE); 193 } 194 195 TEST_F(UnpackAlignmentTest, alignment_2_rgba_ushort4444) 196 { 197 testAlignment(2, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4); 198 } 199 200 TEST_F(UnpackAlignmentTest, alignment_2_rgba_ushort5551) 201 { 202 testAlignment(2, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1); 203 } 204 205 TEST_F(UnpackAlignmentTest, alignment_2_rgb_ushort565) 206 { 207 testAlignment(2, 7 * 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5); 208 } 209 210 TEST_F(UnpackAlignmentTest, alignment_2_la_ubyte) 211 { 212 testAlignment(2, 7 * 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE); 213 } 214 215 TEST_F(UnpackAlignmentTest, alignment_2_l_ubyte) 216 { 217 testAlignment(2, 7 + 1, GL_LUMINANCE, GL_UNSIGNED_BYTE); 218 } 219 220 TEST_F(UnpackAlignmentTest, alignment_2_a_ubyte) 221 { 222 testAlignment(2, 7 + 1, GL_ALPHA, GL_UNSIGNED_BYTE); 223 } 224 225 226 TEST_F(UnpackAlignmentTest, alignment_4_rgba_ubyte) 227 { 228 testAlignment(4, 7 * 4, GL_RGBA, GL_UNSIGNED_BYTE); 229 } 230 231 TEST_F(UnpackAlignmentTest, alignment_4_rgb_ubyte) 232 { 233 testAlignment(4, 7 * 3 + 3, GL_RGB, GL_UNSIGNED_BYTE); 234 } 235 236 TEST_F(UnpackAlignmentTest, alignment_4_rgba_ushort4444) 237 { 238 testAlignment(4, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4); 239 } 240 241 TEST_F(UnpackAlignmentTest, alignment_4_rgba_ushort5551) 242 { 243 testAlignment(4, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1); 244 } 245 246 TEST_F(UnpackAlignmentTest, alignment_4_rgb_ushort565) 247 { 248 testAlignment(4, 7 * 2 + 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5); 249 } 250 251 TEST_F(UnpackAlignmentTest, alignment_4_la_ubyte) 252 { 253 testAlignment(4, 7 * 2 + 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE); 254 } 255 256 TEST_F(UnpackAlignmentTest, alignment_4_l_ubyte) 257 { 258 testAlignment(4, 7 + 1, GL_LUMINANCE, GL_UNSIGNED_BYTE); 259 } 260 261 TEST_F(UnpackAlignmentTest, alignment_4_a_ubyte) 262 { 263 testAlignment(4, 7 + 1, GL_ALPHA, GL_UNSIGNED_BYTE); 264 } 265 266 267 TEST_F(UnpackAlignmentTest, alignment_8_rgba_ubyte) 268 { 269 testAlignment(8, 7 * 4 + 4, GL_RGBA, GL_UNSIGNED_BYTE); 270 } 271 272 TEST_F(UnpackAlignmentTest, alignment_8_rgb_ubyte) 273 { 274 testAlignment(8, 7 * 3 + 3, GL_RGB, GL_UNSIGNED_BYTE); 275 } 276 277 TEST_F(UnpackAlignmentTest, alignment_8_rgba_ushort4444) 278 { 279 testAlignment(8, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4); 280 } 281 282 TEST_F(UnpackAlignmentTest, alignment_8_rgba_ushort5551) 283 { 284 testAlignment(8, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1); 285 } 286 287 TEST_F(UnpackAlignmentTest, alignment_8_rgb_ushort565) 288 { 289 testAlignment(8, 7 * 2 + 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5); 290 } 291 292 TEST_F(UnpackAlignmentTest, alignment_8_la_ubyte) 293 { 294 testAlignment(8, 7 * 2 + 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE); 295 } 296 297 TEST_F(UnpackAlignmentTest, alignment_8_l_ubyte) 298 { 299 testAlignment(8, 7 + 1, GL_LUMINANCE, GL_UNSIGNED_BYTE); 300 } 301 302 TEST_F(UnpackAlignmentTest, alignment_8_a_ubyte) 303 { 304 testAlignment(8, 7 + 1, GL_ALPHA, GL_UNSIGNED_BYTE); 305 } 306