• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "ANGLETest.h"
2 
3 #include <vector>
4 
5 class SwizzleTest : public ANGLETest
6 {
7 protected:
SwizzleTest()8     SwizzleTest()
9     {
10         setWindowWidth(128);
11         setWindowHeight(128);
12         setConfigRedBits(8);
13         setConfigGreenBits(8);
14         setConfigBlueBits(8);
15         setConfigAlphaBits(8);
16         setClientVersion(3);
17 
18         GLenum swizzles[] =
19         {
20             GL_RED,
21             GL_GREEN,
22             GL_BLUE,
23             GL_ALPHA,
24             GL_ZERO,
25             GL_ONE,
26         };
27 
28         for (int r = 0; r < 6; r++)
29         {
30             for (int g = 0; g < 6; g++)
31             {
32                 for (int b = 0; b < 6; b++)
33                 {
34                     for (int a = 0; a < 6; a++)
35                     {
36                         swizzlePermutation permutation;
37                         permutation.swizzleRed = swizzles[r];
38                         permutation.swizzleGreen = swizzles[g];
39                         permutation.swizzleBlue = swizzles[b];
40                         permutation.swizzleAlpha = swizzles[a];
41                         mPermutations.push_back(permutation);
42                     }
43                 }
44             }
45         }
46     }
47 
SetUp()48     virtual void SetUp()
49     {
50         ANGLETest::SetUp();
51 
52         const std::string vertexShaderSource = SHADER_SOURCE
53         (
54             precision highp float;
55             attribute vec4 position;
56             varying vec2 texcoord;
57 
58             void main()
59             {
60                 gl_Position = position;
61                 texcoord = (position.xy * 0.5) + 0.5;
62             }
63         );
64 
65         const std::string fragmentShaderSource = SHADER_SOURCE
66         (
67             precision highp float;
68             uniform sampler2D tex;
69             varying vec2 texcoord;
70 
71             void main()
72             {
73                 gl_FragColor = texture2D(tex, texcoord);
74             }
75         );
76 
77         mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
78         if (mProgram == 0)
79         {
80             FAIL() << "shader compilation failed.";
81         }
82 
83         mTextureUniformLocation = glGetUniformLocation(mProgram, "tex");
84 
85         glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
86     }
87 
TearDown()88     virtual void TearDown()
89     {
90         glDeleteProgram(mProgram);
91         glDeleteTextures(1, &mTexture);
92 
93         ANGLETest::TearDown();
94     }
95 
96     template <typename T>
init2DTexture(GLenum internalFormat,GLenum dataFormat,GLenum dataType,const T * data)97     void init2DTexture(GLenum internalFormat, GLenum dataFormat, GLenum dataType, const T* data)
98     {
99         glGenTextures(1, &mTexture);
100         glBindTexture(GL_TEXTURE_2D, mTexture);
101         glTexStorage2D(GL_TEXTURE_2D, 1, internalFormat, 1, 1);
102         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, dataFormat, dataType, data);
103 
104         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
105         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
106     }
107 
init2DCompressedTexture(GLenum internalFormat,GLsizei width,GLsizei height,GLsizei dataSize,const GLubyte * data)108     void init2DCompressedTexture(GLenum internalFormat, GLsizei width, GLsizei height, GLsizei dataSize, const GLubyte* data)
109     {
110         glGenTextures(1, &mTexture);
111         glBindTexture(GL_TEXTURE_2D, mTexture);
112         glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, width, height, 0, dataSize, data);
113 
114         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
115         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
116     }
117 
getExpectedValue(GLenum swizzle,GLubyte unswizzled[4])118     GLubyte getExpectedValue(GLenum swizzle, GLubyte unswizzled[4])
119     {
120         switch (swizzle)
121         {
122           case GL_RED:   return unswizzled[0];
123           case GL_GREEN: return unswizzled[1];
124           case GL_BLUE:  return unswizzled[2];
125           case GL_ALPHA: return unswizzled[3];
126           case GL_ZERO:  return 0;
127           case GL_ONE:   return 255;
128           default:       return 0;
129         }
130     }
131 
runTest2D()132     void runTest2D()
133     {
134         glUseProgram(mProgram);
135         glBindTexture(GL_TEXTURE_2D, mTexture);
136         glUniform1i(mTextureUniformLocation, 0);
137 
138         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
139         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_GREEN);
140         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_BLUE);
141         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
142 
143         glClear(GL_COLOR_BUFFER_BIT);
144         drawQuad(mProgram, "position", 0.5f);
145 
146         GLubyte unswizzled[4];
147         glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &unswizzled);
148 
149         for (size_t i = 0; i < mPermutations.size(); i++)
150         {
151             const swizzlePermutation& permutation = mPermutations[i];
152 
153             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, permutation.swizzleRed);
154             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, permutation.swizzleGreen);
155             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, permutation.swizzleBlue);
156             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, permutation.swizzleAlpha);
157 
158             glClear(GL_COLOR_BUFFER_BIT);
159             drawQuad(mProgram, "position", 0.5f);
160 
161             EXPECT_PIXEL_EQ(0, 0,
162                             getExpectedValue(permutation.swizzleRed, unswizzled),
163                             getExpectedValue(permutation.swizzleGreen, unswizzled),
164                             getExpectedValue(permutation.swizzleBlue, unswizzled),
165                             getExpectedValue(permutation.swizzleAlpha, unswizzled));
166         }
167     }
168 
169     GLuint mProgram;
170     GLint mTextureUniformLocation;
171 
172     GLuint mTexture;
173 
174     struct swizzlePermutation
175     {
176         GLenum swizzleRed;
177         GLenum swizzleGreen;
178         GLenum swizzleBlue;
179         GLenum swizzleAlpha;
180     };
181     std::vector<swizzlePermutation> mPermutations;
182 };
183 
TEST_F(SwizzleTest,RGBA8_2D)184 TEST_F(SwizzleTest, RGBA8_2D)
185 {
186     GLubyte data[] = { 1, 64, 128, 200 };
187     init2DTexture(GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, data);
188     runTest2D();
189 }
190 
TEST_F(SwizzleTest,RGB8_2D)191 TEST_F(SwizzleTest, RGB8_2D)
192 {
193     GLubyte data[] = { 77, 66, 55 };
194     init2DTexture(GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE, data);
195     runTest2D();
196 }
197 
TEST_F(SwizzleTest,RG8_2D)198 TEST_F(SwizzleTest, RG8_2D)
199 {
200     GLubyte data[] = { 11, 99 };
201     init2DTexture(GL_RG8, GL_RG, GL_UNSIGNED_BYTE, data);
202     runTest2D();
203 }
204 
TEST_F(SwizzleTest,R8_2D)205 TEST_F(SwizzleTest, R8_2D)
206 {
207     GLubyte data[] = { 2 };
208     init2DTexture<GLubyte>(GL_R8, GL_RED, GL_UNSIGNED_BYTE, data);
209     runTest2D();
210 }
211 
TEST_F(SwizzleTest,RGBA32F_2D)212 TEST_F(SwizzleTest, RGBA32F_2D)
213 {
214     GLfloat data[] = { 0.25f, 0.5f, 0.75f, 0.8f };
215     init2DTexture(GL_RGBA32F, GL_RGBA, GL_FLOAT, data);
216     runTest2D();
217 }
218 
TEST_F(SwizzleTest,RGB32F_2D)219 TEST_F(SwizzleTest, RGB32F_2D)
220 {
221     GLfloat data[] = { 0.1f, 0.2f, 0.3f };
222     init2DTexture(GL_RGB32F, GL_RGB, GL_FLOAT, data);
223     runTest2D();
224 }
225 
TEST_F(SwizzleTest,RG32F_2D)226 TEST_F(SwizzleTest, RG32F_2D)
227 {
228     GLfloat data[] = { 0.9f, 0.1f  };
229     init2DTexture(GL_RG32F, GL_RG, GL_FLOAT, data);
230     runTest2D();
231 }
232 
TEST_F(SwizzleTest,R32F_2D)233 TEST_F(SwizzleTest, R32F_2D)
234 {
235     GLfloat data[] = { 0.5f };
236     init2DTexture(GL_R32F, GL_RED, GL_FLOAT, data);
237     runTest2D();
238 }
239 
TEST_F(SwizzleTest,D32F_2D)240 TEST_F(SwizzleTest, D32F_2D)
241 {
242     GLfloat data[] = { 0.5f };
243     init2DTexture(GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT, data);
244     runTest2D();
245 }
246 
TEST_F(SwizzleTest,D16_2D)247 TEST_F(SwizzleTest, D16_2D)
248 {
249     GLushort data[] = { 0xFF };
250     init2DTexture(GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, data);
251     runTest2D();
252 }
253 
TEST_F(SwizzleTest,D24_2D)254 TEST_F(SwizzleTest, D24_2D)
255 {
256     GLuint data[] = { 0xFFFF };
257     init2DTexture(GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, data);
258     runTest2D();
259 }
260 
261 #include "media/pixel.inl"
262 
TEST_F(SwizzleTest,CompressedDXT_2D)263 TEST_F(SwizzleTest, CompressedDXT_2D)
264 {
265     init2DCompressedTexture(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height, pixel_0_size, pixel_0_data);
266     runTest2D();
267 }
268