1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
8*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #include "media/pixel.inc"
11*8975f5c5SAndroid Build Coastguard Worker
12*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Worker class DXT1CompressedTextureTest : public ANGLETest<>
15*8975f5c5SAndroid Build Coastguard Worker {
16*8975f5c5SAndroid Build Coastguard Worker protected:
DXT1CompressedTextureTest()17*8975f5c5SAndroid Build Coastguard Worker DXT1CompressedTextureTest()
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(512);
20*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(512);
21*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
22*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
23*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
24*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
25*8975f5c5SAndroid Build Coastguard Worker }
26*8975f5c5SAndroid Build Coastguard Worker
testSetUp()27*8975f5c5SAndroid Build Coastguard Worker void testSetUp() override
28*8975f5c5SAndroid Build Coastguard Worker {
29*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(precision highp float;
30*8975f5c5SAndroid Build Coastguard Worker attribute vec4 position;
31*8975f5c5SAndroid Build Coastguard Worker varying vec2 texcoord;
32*8975f5c5SAndroid Build Coastguard Worker
33*8975f5c5SAndroid Build Coastguard Worker void main()
34*8975f5c5SAndroid Build Coastguard Worker {
35*8975f5c5SAndroid Build Coastguard Worker gl_Position = position;
36*8975f5c5SAndroid Build Coastguard Worker texcoord = (position.xy * 0.5) + 0.5;
37*8975f5c5SAndroid Build Coastguard Worker texcoord.y = 1.0 - texcoord.y;
38*8975f5c5SAndroid Build Coastguard Worker })";
39*8975f5c5SAndroid Build Coastguard Worker
40*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(precision highp float;
41*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex;
42*8975f5c5SAndroid Build Coastguard Worker varying vec2 texcoord;
43*8975f5c5SAndroid Build Coastguard Worker
44*8975f5c5SAndroid Build Coastguard Worker void main()
45*8975f5c5SAndroid Build Coastguard Worker {
46*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = texture2D(tex, texcoord);
47*8975f5c5SAndroid Build Coastguard Worker })";
48*8975f5c5SAndroid Build Coastguard Worker
49*8975f5c5SAndroid Build Coastguard Worker mTextureProgram = CompileProgram(kVS, kFS);
50*8975f5c5SAndroid Build Coastguard Worker if (mTextureProgram == 0)
51*8975f5c5SAndroid Build Coastguard Worker {
52*8975f5c5SAndroid Build Coastguard Worker FAIL() << "shader compilation failed.";
53*8975f5c5SAndroid Build Coastguard Worker }
54*8975f5c5SAndroid Build Coastguard Worker
55*8975f5c5SAndroid Build Coastguard Worker mTextureUniformLocation = glGetUniformLocation(mTextureProgram, "tex");
56*8975f5c5SAndroid Build Coastguard Worker
57*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
58*8975f5c5SAndroid Build Coastguard Worker }
59*8975f5c5SAndroid Build Coastguard Worker
testTearDown()60*8975f5c5SAndroid Build Coastguard Worker void testTearDown() override { glDeleteProgram(mTextureProgram); }
61*8975f5c5SAndroid Build Coastguard Worker
62*8975f5c5SAndroid Build Coastguard Worker GLuint mTextureProgram;
63*8975f5c5SAndroid Build Coastguard Worker GLint mTextureUniformLocation;
64*8975f5c5SAndroid Build Coastguard Worker };
65*8975f5c5SAndroid Build Coastguard Worker
TEST_P(DXT1CompressedTextureTest,CompressedTexImage)66*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTest, CompressedTexImage)
67*8975f5c5SAndroid Build Coastguard Worker {
68*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
69*8975f5c5SAndroid Build Coastguard Worker
70*8975f5c5SAndroid Build Coastguard Worker GLuint texture;
71*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &texture);
72*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
73*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
74*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
75*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
76*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
77*8975f5c5SAndroid Build Coastguard Worker
78*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
79*8975f5c5SAndroid Build Coastguard Worker pixel_0_height, 0, pixel_0_size, pixel_0_data);
80*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_width,
81*8975f5c5SAndroid Build Coastguard Worker pixel_1_height, 0, pixel_1_size, pixel_1_data);
82*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 2, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_width,
83*8975f5c5SAndroid Build Coastguard Worker pixel_2_height, 0, pixel_2_size, pixel_2_data);
84*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 3, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_width,
85*8975f5c5SAndroid Build Coastguard Worker pixel_3_height, 0, pixel_3_size, pixel_3_data);
86*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_width,
87*8975f5c5SAndroid Build Coastguard Worker pixel_4_height, 0, pixel_4_size, pixel_4_data);
88*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 5, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_width,
89*8975f5c5SAndroid Build Coastguard Worker pixel_5_height, 0, pixel_5_size, pixel_5_data);
90*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 6, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_width,
91*8975f5c5SAndroid Build Coastguard Worker pixel_6_height, 0, pixel_6_size, pixel_6_data);
92*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 7, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_width,
93*8975f5c5SAndroid Build Coastguard Worker pixel_7_height, 0, pixel_7_size, pixel_7_data);
94*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 8, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_width,
95*8975f5c5SAndroid Build Coastguard Worker pixel_8_height, 0, pixel_8_size, pixel_8_data);
96*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 9, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_width,
97*8975f5c5SAndroid Build Coastguard Worker pixel_9_height, 0, pixel_9_size, pixel_9_data);
98*8975f5c5SAndroid Build Coastguard Worker
99*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
100*8975f5c5SAndroid Build Coastguard Worker
101*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mTextureProgram);
102*8975f5c5SAndroid Build Coastguard Worker glUniform1i(mTextureUniformLocation, 0);
103*8975f5c5SAndroid Build Coastguard Worker
104*8975f5c5SAndroid Build Coastguard Worker drawQuad(mTextureProgram, "position", 0.5f);
105*8975f5c5SAndroid Build Coastguard Worker
106*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
107*8975f5c5SAndroid Build Coastguard Worker
108*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &texture);
109*8975f5c5SAndroid Build Coastguard Worker
110*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
111*8975f5c5SAndroid Build Coastguard Worker }
112*8975f5c5SAndroid Build Coastguard Worker
113*8975f5c5SAndroid Build Coastguard Worker // Verify that DXT1 RGB textures have 1.0 alpha when sampled
TEST_P(DXT1CompressedTextureTest,DXT1Alpha)114*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTest, DXT1Alpha)
115*8975f5c5SAndroid Build Coastguard Worker {
116*8975f5c5SAndroid Build Coastguard Worker auto test = [&](const std::string &extName, GLenum format) {
117*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled(extName));
118*8975f5c5SAndroid Build Coastguard Worker
119*8975f5c5SAndroid Build Coastguard Worker // On platforms without native support for DXT1 RGB or texture swizzling (such as D3D or
120*8975f5c5SAndroid Build Coastguard Worker // some Metal configurations), this test is allowed to succeed with transparent black
121*8975f5c5SAndroid Build Coastguard Worker // instead of opaque black.
122*8975f5c5SAndroid Build Coastguard Worker const bool opaque = !IsD3D() && !(IsMetal() && !IsMetalTextureSwizzleAvailable());
123*8975f5c5SAndroid Build Coastguard Worker
124*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
125*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
126*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
127*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
128*8975f5c5SAndroid Build Coastguard Worker
129*8975f5c5SAndroid Build Coastguard Worker // Image using pixels with the code for transparent black:
130*8975f5c5SAndroid Build Coastguard Worker // "BLACK, if color0 <= color1 and code(x,y) == 3"
131*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t CompressedImageDXT1[] = {0, 0, 0, 0, 255, 255, 255, 255};
132*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 0, format, 4, 4, 0, sizeof(CompressedImageDXT1),
133*8975f5c5SAndroid Build Coastguard Worker CompressedImageDXT1);
134*8975f5c5SAndroid Build Coastguard Worker
135*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
136*8975f5c5SAndroid Build Coastguard Worker
137*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mTextureProgram);
138*8975f5c5SAndroid Build Coastguard Worker glUniform1i(mTextureUniformLocation, 0);
139*8975f5c5SAndroid Build Coastguard Worker
140*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kDrawSize = 4;
141*8975f5c5SAndroid Build Coastguard Worker // The image is one 4x4 block, make the viewport only 4x4.
142*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kDrawSize, kDrawSize);
143*8975f5c5SAndroid Build Coastguard Worker
144*8975f5c5SAndroid Build Coastguard Worker drawQuad(mTextureProgram, "position", 0.5f);
145*8975f5c5SAndroid Build Coastguard Worker
146*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
147*8975f5c5SAndroid Build Coastguard Worker
148*8975f5c5SAndroid Build Coastguard Worker for (GLint y = 0; y < kDrawSize; y++)
149*8975f5c5SAndroid Build Coastguard Worker {
150*8975f5c5SAndroid Build Coastguard Worker for (GLint x = 0; x < kDrawSize; x++)
151*8975f5c5SAndroid Build Coastguard Worker {
152*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(x, y, 0, 0, 0, opaque ? 255 : 0)
153*8975f5c5SAndroid Build Coastguard Worker << "at (" << x << ", " << y << ") for " << extName;
154*8975f5c5SAndroid Build Coastguard Worker }
155*8975f5c5SAndroid Build Coastguard Worker }
156*8975f5c5SAndroid Build Coastguard Worker };
157*8975f5c5SAndroid Build Coastguard Worker
158*8975f5c5SAndroid Build Coastguard Worker test("GL_EXT_texture_compression_dxt1", GL_COMPRESSED_RGB_S3TC_DXT1_EXT);
159*8975f5c5SAndroid Build Coastguard Worker test("GL_EXT_texture_compression_s3tc_srgb", GL_COMPRESSED_SRGB_S3TC_DXT1_EXT);
160*8975f5c5SAndroid Build Coastguard Worker }
161*8975f5c5SAndroid Build Coastguard Worker
TEST_P(DXT1CompressedTextureTest,CompressedTexStorage)162*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTest, CompressedTexStorage)
163*8975f5c5SAndroid Build Coastguard Worker {
164*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
165*8975f5c5SAndroid Build Coastguard Worker
166*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
167*8975f5c5SAndroid Build Coastguard Worker (!IsGLExtensionEnabled("GL_EXT_texture_storage") ||
168*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_OES_rgb8_rgba8")));
169*8975f5c5SAndroid Build Coastguard Worker
170*8975f5c5SAndroid Build Coastguard Worker GLuint texture;
171*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &texture);
172*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
173*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
174*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
175*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
176*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
177*8975f5c5SAndroid Build Coastguard Worker
178*8975f5c5SAndroid Build Coastguard Worker if (getClientMajorVersion() < 3)
179*8975f5c5SAndroid Build Coastguard Worker {
180*8975f5c5SAndroid Build Coastguard Worker glTexStorage2DEXT(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
181*8975f5c5SAndroid Build Coastguard Worker pixel_0_width, pixel_0_height);
182*8975f5c5SAndroid Build Coastguard Worker }
183*8975f5c5SAndroid Build Coastguard Worker else
184*8975f5c5SAndroid Build Coastguard Worker {
185*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
186*8975f5c5SAndroid Build Coastguard Worker pixel_0_height);
187*8975f5c5SAndroid Build Coastguard Worker }
188*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
189*8975f5c5SAndroid Build Coastguard Worker
190*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pixel_0_width, pixel_0_height,
191*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_size, pixel_0_data);
192*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, pixel_1_width, pixel_1_height,
193*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_size, pixel_1_data);
194*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, pixel_2_width, pixel_2_height,
195*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_size, pixel_2_data);
196*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 3, 0, 0, pixel_3_width, pixel_3_height,
197*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_size, pixel_3_data);
198*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 4, 0, 0, pixel_4_width, pixel_4_height,
199*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_size, pixel_4_data);
200*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 5, 0, 0, pixel_5_width, pixel_5_height,
201*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_size, pixel_5_data);
202*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 6, 0, 0, pixel_6_width, pixel_6_height,
203*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_size, pixel_6_data);
204*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 7, 0, 0, pixel_7_width, pixel_7_height,
205*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_size, pixel_7_data);
206*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 8, 0, 0, pixel_8_width, pixel_8_height,
207*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_size, pixel_8_data);
208*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 9, 0, 0, pixel_9_width, pixel_9_height,
209*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_size, pixel_9_data);
210*8975f5c5SAndroid Build Coastguard Worker
211*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
212*8975f5c5SAndroid Build Coastguard Worker
213*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mTextureProgram);
214*8975f5c5SAndroid Build Coastguard Worker glUniform1i(mTextureUniformLocation, 0);
215*8975f5c5SAndroid Build Coastguard Worker
216*8975f5c5SAndroid Build Coastguard Worker drawQuad(mTextureProgram, "position", 0.5f);
217*8975f5c5SAndroid Build Coastguard Worker
218*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
219*8975f5c5SAndroid Build Coastguard Worker
220*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &texture);
221*8975f5c5SAndroid Build Coastguard Worker
222*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
223*8975f5c5SAndroid Build Coastguard Worker }
224*8975f5c5SAndroid Build Coastguard Worker
225*8975f5c5SAndroid Build Coastguard Worker // Test validation of non block sizes, width 672 and height 114 and multiple mip levels
TEST_P(DXT1CompressedTextureTest,NonBlockSizesMipLevels)226*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTest, NonBlockSizesMipLevels)
227*8975f5c5SAndroid Build Coastguard Worker {
228*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
229*8975f5c5SAndroid Build Coastguard Worker
230*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
231*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
232*8975f5c5SAndroid Build Coastguard Worker
233*8975f5c5SAndroid Build Coastguard Worker constexpr GLuint kWidth = 674;
234*8975f5c5SAndroid Build Coastguard Worker constexpr GLuint kHeight = 114;
235*8975f5c5SAndroid Build Coastguard Worker
236*8975f5c5SAndroid Build Coastguard Worker // From EXT_texture_compression_s3tc specifications:
237*8975f5c5SAndroid Build Coastguard Worker // When an S3TC image with a width of <w>, height of <h>, and block size of
238*8975f5c5SAndroid Build Coastguard Worker // <blocksize> (8 or 16 bytes) is decoded, the corresponding image size (in
239*8975f5c5SAndroid Build Coastguard Worker // bytes) is:
240*8975f5c5SAndroid Build Coastguard Worker // ceil(<w>/4) * ceil(<h>/4) * blocksize.
241*8975f5c5SAndroid Build Coastguard Worker constexpr GLuint kImageSize = ((kWidth + 3) / 4) * ((kHeight + 3) / 4) * 8;
242*8975f5c5SAndroid Build Coastguard Worker
243*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, kWidth, kHeight, 0,
244*8975f5c5SAndroid Build Coastguard Worker kImageSize, nullptr);
245*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
246*8975f5c5SAndroid Build Coastguard Worker
247*8975f5c5SAndroid Build Coastguard Worker constexpr GLuint kImageSize1 = ((kWidth / 2 + 3) / 4) * ((kHeight / 2 + 3) / 4) * 8;
248*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, kWidth / 2,
249*8975f5c5SAndroid Build Coastguard Worker kHeight / 2, 0, kImageSize1, nullptr);
250*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
251*8975f5c5SAndroid Build Coastguard Worker
252*8975f5c5SAndroid Build Coastguard Worker constexpr GLuint kImageSize2 = ((kWidth / 4 + 3) / 4) * ((kHeight / 4 + 3) / 4) * 8;
253*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, kWidth / 4,
254*8975f5c5SAndroid Build Coastguard Worker kHeight / 4, 0, kImageSize2, nullptr);
255*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
256*8975f5c5SAndroid Build Coastguard Worker }
257*8975f5c5SAndroid Build Coastguard Worker
258*8975f5c5SAndroid Build Coastguard Worker // Test validation of glCompressedTexSubImage2D with DXT formats
TEST_P(DXT1CompressedTextureTest,CompressedTexSubImageValidation)259*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTest, CompressedTexSubImageValidation)
260*8975f5c5SAndroid Build Coastguard Worker {
261*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
262*8975f5c5SAndroid Build Coastguard Worker
263*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
264*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
265*8975f5c5SAndroid Build Coastguard Worker
266*8975f5c5SAndroid Build Coastguard Worker // Size mip 0 to a large size
267*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
268*8975f5c5SAndroid Build Coastguard Worker pixel_0_height, 0, pixel_0_size, nullptr);
269*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
270*8975f5c5SAndroid Build Coastguard Worker
271*8975f5c5SAndroid Build Coastguard Worker // Set a sub image with an offset that isn't a multiple of the block size
272*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 1, 3, pixel_1_width, pixel_1_height,
273*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_size, pixel_1_data);
274*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_OPERATION);
275*8975f5c5SAndroid Build Coastguard Worker
276*8975f5c5SAndroid Build Coastguard Worker // Set a sub image with a negative offset
277*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, -1, 0, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8,
278*8975f5c5SAndroid Build Coastguard Worker pixel_1_data);
279*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_VALUE);
280*8975f5c5SAndroid Build Coastguard Worker
281*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, -1, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8,
282*8975f5c5SAndroid Build Coastguard Worker pixel_1_data);
283*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_VALUE);
284*8975f5c5SAndroid Build Coastguard Worker }
285*8975f5c5SAndroid Build Coastguard Worker
286*8975f5c5SAndroid Build Coastguard Worker // Test that it's not possible to call CopyTexSubImage2D on a compressed texture
TEST_P(DXT1CompressedTextureTest,CopyTexSubImage2DDisallowed)287*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTest, CopyTexSubImage2DDisallowed)
288*8975f5c5SAndroid Build Coastguard Worker {
289*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
290*8975f5c5SAndroid Build Coastguard Worker
291*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
292*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
293*8975f5c5SAndroid Build Coastguard Worker
294*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
295*8975f5c5SAndroid Build Coastguard Worker pixel_0_height, 0, pixel_0_size, nullptr);
296*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
297*8975f5c5SAndroid Build Coastguard Worker
298*8975f5c5SAndroid Build Coastguard Worker glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 4, 4);
299*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_OPERATION);
300*8975f5c5SAndroid Build Coastguard Worker }
301*8975f5c5SAndroid Build Coastguard Worker
TEST_P(DXT1CompressedTextureTest,PBOCompressedTexStorage)302*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTest, PBOCompressedTexStorage)
303*8975f5c5SAndroid Build Coastguard Worker {
304*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
305*8975f5c5SAndroid Build Coastguard Worker
306*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
307*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
308*8975f5c5SAndroid Build Coastguard Worker
309*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
310*8975f5c5SAndroid Build Coastguard Worker (!IsGLExtensionEnabled("GL_EXT_texture_storage") ||
311*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_OES_rgb8_rgba8")));
312*8975f5c5SAndroid Build Coastguard Worker
313*8975f5c5SAndroid Build Coastguard Worker GLuint texture;
314*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &texture);
315*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
316*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
317*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
318*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
319*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
320*8975f5c5SAndroid Build Coastguard Worker
321*8975f5c5SAndroid Build Coastguard Worker if (getClientMajorVersion() < 3)
322*8975f5c5SAndroid Build Coastguard Worker {
323*8975f5c5SAndroid Build Coastguard Worker glTexStorage2DEXT(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
324*8975f5c5SAndroid Build Coastguard Worker pixel_0_width, pixel_0_height);
325*8975f5c5SAndroid Build Coastguard Worker }
326*8975f5c5SAndroid Build Coastguard Worker else
327*8975f5c5SAndroid Build Coastguard Worker {
328*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
329*8975f5c5SAndroid Build Coastguard Worker pixel_0_height);
330*8975f5c5SAndroid Build Coastguard Worker }
331*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
332*8975f5c5SAndroid Build Coastguard Worker
333*8975f5c5SAndroid Build Coastguard Worker GLuint buffer;
334*8975f5c5SAndroid Build Coastguard Worker glGenBuffers(1, &buffer);
335*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
336*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_PIXEL_UNPACK_BUFFER, pixel_0_size, nullptr, GL_STREAM_DRAW);
337*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
338*8975f5c5SAndroid Build Coastguard Worker
339*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_0_size, pixel_0_data);
340*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pixel_0_width, pixel_0_height,
341*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_size, nullptr);
342*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_1_size, pixel_1_data);
343*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, pixel_1_width, pixel_1_height,
344*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_size, nullptr);
345*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_2_size, pixel_2_data);
346*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, pixel_2_width, pixel_2_height,
347*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_size, nullptr);
348*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_3_size, pixel_3_data);
349*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 3, 0, 0, pixel_3_width, pixel_3_height,
350*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_size, nullptr);
351*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_4_size, pixel_4_data);
352*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 4, 0, 0, pixel_4_width, pixel_4_height,
353*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_size, nullptr);
354*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_5_size, pixel_5_data);
355*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 5, 0, 0, pixel_5_width, pixel_5_height,
356*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_size, nullptr);
357*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_6_size, pixel_6_data);
358*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 6, 0, 0, pixel_6_width, pixel_6_height,
359*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_size, nullptr);
360*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_7_size, pixel_7_data);
361*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 7, 0, 0, pixel_7_width, pixel_7_height,
362*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_size, nullptr);
363*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_8_size, pixel_8_data);
364*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 8, 0, 0, pixel_8_width, pixel_8_height,
365*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_size, nullptr);
366*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_9_size, pixel_9_data);
367*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 9, 0, 0, pixel_9_width, pixel_9_height,
368*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_size, nullptr);
369*8975f5c5SAndroid Build Coastguard Worker
370*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
371*8975f5c5SAndroid Build Coastguard Worker
372*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mTextureProgram);
373*8975f5c5SAndroid Build Coastguard Worker glUniform1i(mTextureUniformLocation, 0);
374*8975f5c5SAndroid Build Coastguard Worker
375*8975f5c5SAndroid Build Coastguard Worker drawQuad(mTextureProgram, "position", 0.5f);
376*8975f5c5SAndroid Build Coastguard Worker
377*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
378*8975f5c5SAndroid Build Coastguard Worker
379*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &texture);
380*8975f5c5SAndroid Build Coastguard Worker
381*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
382*8975f5c5SAndroid Build Coastguard Worker }
383*8975f5c5SAndroid Build Coastguard Worker
384*8975f5c5SAndroid Build Coastguard Worker class DXT1CompressedTextureTestES3 : public DXT1CompressedTextureTest
385*8975f5c5SAndroid Build Coastguard Worker {};
386*8975f5c5SAndroid Build Coastguard Worker
TEST_P(DXT1CompressedTextureTestES3,PBOCompressedTexImage)387*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTestES3, PBOCompressedTexImage)
388*8975f5c5SAndroid Build Coastguard Worker {
389*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
390*8975f5c5SAndroid Build Coastguard Worker
391*8975f5c5SAndroid Build Coastguard Worker GLuint texture;
392*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &texture);
393*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
394*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
395*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
396*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
397*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
398*8975f5c5SAndroid Build Coastguard Worker
399*8975f5c5SAndroid Build Coastguard Worker GLuint buffer;
400*8975f5c5SAndroid Build Coastguard Worker glGenBuffers(1, &buffer);
401*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
402*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_PIXEL_UNPACK_BUFFER, pixel_0_size, nullptr, GL_STREAM_DRAW);
403*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
404*8975f5c5SAndroid Build Coastguard Worker
405*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_0_size, pixel_0_data);
406*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
407*8975f5c5SAndroid Build Coastguard Worker pixel_0_height, 0, pixel_0_size, nullptr);
408*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_1_size, pixel_1_data);
409*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_width,
410*8975f5c5SAndroid Build Coastguard Worker pixel_1_height, 0, pixel_1_size, nullptr);
411*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_2_size, pixel_2_data);
412*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 2, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_width,
413*8975f5c5SAndroid Build Coastguard Worker pixel_2_height, 0, pixel_2_size, nullptr);
414*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_3_size, pixel_3_data);
415*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 3, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_width,
416*8975f5c5SAndroid Build Coastguard Worker pixel_3_height, 0, pixel_3_size, nullptr);
417*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_4_size, pixel_4_data);
418*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_width,
419*8975f5c5SAndroid Build Coastguard Worker pixel_4_height, 0, pixel_4_size, nullptr);
420*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_5_size, pixel_5_data);
421*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 5, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_width,
422*8975f5c5SAndroid Build Coastguard Worker pixel_5_height, 0, pixel_5_size, nullptr);
423*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_6_size, pixel_6_data);
424*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 6, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_width,
425*8975f5c5SAndroid Build Coastguard Worker pixel_6_height, 0, pixel_6_size, nullptr);
426*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_7_size, pixel_7_data);
427*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 7, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_width,
428*8975f5c5SAndroid Build Coastguard Worker pixel_7_height, 0, pixel_7_size, nullptr);
429*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_8_size, pixel_8_data);
430*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 8, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_width,
431*8975f5c5SAndroid Build Coastguard Worker pixel_8_height, 0, pixel_8_size, nullptr);
432*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_9_size, pixel_9_data);
433*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 9, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_width,
434*8975f5c5SAndroid Build Coastguard Worker pixel_9_height, 0, pixel_9_size, nullptr);
435*8975f5c5SAndroid Build Coastguard Worker
436*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
437*8975f5c5SAndroid Build Coastguard Worker
438*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mTextureProgram);
439*8975f5c5SAndroid Build Coastguard Worker glUniform1i(mTextureUniformLocation, 0);
440*8975f5c5SAndroid Build Coastguard Worker
441*8975f5c5SAndroid Build Coastguard Worker drawQuad(mTextureProgram, "position", 0.5f);
442*8975f5c5SAndroid Build Coastguard Worker
443*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
444*8975f5c5SAndroid Build Coastguard Worker
445*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &buffer);
446*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &texture);
447*8975f5c5SAndroid Build Coastguard Worker
448*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
449*8975f5c5SAndroid Build Coastguard Worker }
450*8975f5c5SAndroid Build Coastguard Worker
451*8975f5c5SAndroid Build Coastguard Worker // Test validation of glCompressedTexSubImage3D with DXT formats
TEST_P(DXT1CompressedTextureTestES3,CompressedTexSubImageValidation)452*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTestES3, CompressedTexSubImageValidation)
453*8975f5c5SAndroid Build Coastguard Worker {
454*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
455*8975f5c5SAndroid Build Coastguard Worker
456*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
457*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
458*8975f5c5SAndroid Build Coastguard Worker
459*8975f5c5SAndroid Build Coastguard Worker // Size mip 0 to a large size
460*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
461*8975f5c5SAndroid Build Coastguard Worker pixel_0_height, 1, 0, pixel_0_size, nullptr);
462*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
463*8975f5c5SAndroid Build Coastguard Worker
464*8975f5c5SAndroid Build Coastguard Worker // Set a sub image with a negative offset
465*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -1, 0, 0, 4, 4, 1,
466*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, pixel_1_data);
467*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_VALUE);
468*8975f5c5SAndroid Build Coastguard Worker
469*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, -1, 0, 4, 4, 1,
470*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, pixel_1_data);
471*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_VALUE);
472*8975f5c5SAndroid Build Coastguard Worker
473*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, -1, 4, 4, 1,
474*8975f5c5SAndroid Build Coastguard Worker GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, pixel_1_data);
475*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_VALUE);
476*8975f5c5SAndroid Build Coastguard Worker }
477*8975f5c5SAndroid Build Coastguard Worker
478*8975f5c5SAndroid Build Coastguard Worker // Test validation of glCompressedTexSubImage3D with per-slice data uploads
TEST_P(DXT1CompressedTextureTestES3,CompressedTexSubImage3DValidationPerSlice)479*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTestES3, CompressedTexSubImage3DValidationPerSlice)
480*8975f5c5SAndroid Build Coastguard Worker {
481*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
482*8975f5c5SAndroid Build Coastguard Worker
483*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
484*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
485*8975f5c5SAndroid Build Coastguard Worker const GLenum format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
486*8975f5c5SAndroid Build Coastguard Worker
487*8975f5c5SAndroid Build Coastguard Worker // 8x8x2, 4x4x2, 2x2x2, 1x1x2
488*8975f5c5SAndroid Build Coastguard Worker glTexStorage3D(GL_TEXTURE_2D_ARRAY, 4, format, 8, 8, 2);
489*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
490*8975f5c5SAndroid Build Coastguard Worker
491*8975f5c5SAndroid Build Coastguard Worker uint8_t data[32] = {};
492*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 8, 8, 1, format, 32, data);
493*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
494*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 1, 8, 8, 1, format, 32, data);
495*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
496*8975f5c5SAndroid Build Coastguard Worker
497*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 1, 0, 0, 0, 4, 4, 1, format, 8, data);
498*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
499*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 1, 0, 0, 1, 4, 4, 1, format, 8, data);
500*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
501*8975f5c5SAndroid Build Coastguard Worker
502*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 2, 0, 0, 0, 2, 2, 1, format, 8, data);
503*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
504*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 2, 0, 0, 1, 2, 2, 1, format, 8, data);
505*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
506*8975f5c5SAndroid Build Coastguard Worker
507*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 3, 0, 0, 0, 1, 1, 1, format, 8, data);
508*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
509*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 3, 0, 0, 1, 1, 1, 1, format, 8, data);
510*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
511*8975f5c5SAndroid Build Coastguard Worker }
512*8975f5c5SAndroid Build Coastguard Worker
513*8975f5c5SAndroid Build Coastguard Worker // Test validation of glCompressedTexSubImage3D with combined per-level data uploads
TEST_P(DXT1CompressedTextureTestES3,CompressedTexSubImage3DValidationPerLevel)514*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTestES3, CompressedTexSubImage3DValidationPerLevel)
515*8975f5c5SAndroid Build Coastguard Worker {
516*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
517*8975f5c5SAndroid Build Coastguard Worker
518*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
519*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
520*8975f5c5SAndroid Build Coastguard Worker const GLenum format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
521*8975f5c5SAndroid Build Coastguard Worker
522*8975f5c5SAndroid Build Coastguard Worker // 8x8x2, 4x4x2, 2x2x2, 1x1x2
523*8975f5c5SAndroid Build Coastguard Worker glTexStorage3D(GL_TEXTURE_2D_ARRAY, 4, format, 8, 8, 2);
524*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
525*8975f5c5SAndroid Build Coastguard Worker
526*8975f5c5SAndroid Build Coastguard Worker uint8_t data[64] = {};
527*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 8, 8, 2, format, 64, data);
528*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
529*8975f5c5SAndroid Build Coastguard Worker
530*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 1, 0, 0, 0, 4, 4, 2, format, 16, data);
531*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
532*8975f5c5SAndroid Build Coastguard Worker
533*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 2, 0, 0, 0, 2, 2, 2, format, 16, data);
534*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
535*8975f5c5SAndroid Build Coastguard Worker
536*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 3, 0, 0, 0, 1, 1, 2, format, 16, data);
537*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
538*8975f5c5SAndroid Build Coastguard Worker }
539*8975f5c5SAndroid Build Coastguard Worker
540*8975f5c5SAndroid Build Coastguard Worker // Test validation of glCompressedTexSubImage3D with DXT formats
TEST_P(DXT1CompressedTextureTestES3,CopyTexSubImage3DDisallowed)541*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTestES3, CopyTexSubImage3DDisallowed)
542*8975f5c5SAndroid Build Coastguard Worker {
543*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
544*8975f5c5SAndroid Build Coastguard Worker
545*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
546*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
547*8975f5c5SAndroid Build Coastguard Worker
548*8975f5c5SAndroid Build Coastguard Worker GLsizei depth = 4;
549*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
550*8975f5c5SAndroid Build Coastguard Worker pixel_0_height, depth, 0, pixel_0_size * depth, nullptr);
551*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
552*8975f5c5SAndroid Build Coastguard Worker
553*8975f5c5SAndroid Build Coastguard Worker glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, 0, 4, 4);
554*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_OPERATION);
555*8975f5c5SAndroid Build Coastguard Worker }
556*8975f5c5SAndroid Build Coastguard Worker
557*8975f5c5SAndroid Build Coastguard Worker class DXT1CompressedTextureTestWebGL2 : public DXT1CompressedTextureTest
558*8975f5c5SAndroid Build Coastguard Worker {
559*8975f5c5SAndroid Build Coastguard Worker protected:
DXT1CompressedTextureTestWebGL2()560*8975f5c5SAndroid Build Coastguard Worker DXT1CompressedTextureTestWebGL2()
561*8975f5c5SAndroid Build Coastguard Worker {
562*8975f5c5SAndroid Build Coastguard Worker setWebGLCompatibilityEnabled(true);
563*8975f5c5SAndroid Build Coastguard Worker setRobustResourceInit(true);
564*8975f5c5SAndroid Build Coastguard Worker }
565*8975f5c5SAndroid Build Coastguard Worker };
566*8975f5c5SAndroid Build Coastguard Worker
567*8975f5c5SAndroid Build Coastguard Worker // Regression test for https://crbug.com/1289428
TEST_P(DXT1CompressedTextureTestWebGL2,InitializeTextureContents)568*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTestWebGL2, InitializeTextureContents)
569*8975f5c5SAndroid Build Coastguard Worker {
570*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
571*8975f5c5SAndroid Build Coastguard Worker
572*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mTextureProgram);
573*8975f5c5SAndroid Build Coastguard Worker glUniform1i(mTextureUniformLocation, 0);
574*8975f5c5SAndroid Build Coastguard Worker
575*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 1, 1);
576*8975f5c5SAndroid Build Coastguard Worker
577*8975f5c5SAndroid Build Coastguard Worker const std::array<uint8_t, 8> kGreen = {0xE0, 0x07, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00};
578*8975f5c5SAndroid Build Coastguard Worker
579*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
580*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
581*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
582*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
583*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
584*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
585*8975f5c5SAndroid Build Coastguard Worker
586*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4);
587*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
588*8975f5c5SAndroid Build Coastguard Worker
589*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
590*8975f5c5SAndroid Build Coastguard Worker drawQuad(mTextureProgram, "position", 0.5f, 1.0f, true);
591*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
592*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::black);
593*8975f5c5SAndroid Build Coastguard Worker
594*8975f5c5SAndroid Build Coastguard Worker glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8,
595*8975f5c5SAndroid Build Coastguard Worker kGreen.data());
596*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
597*8975f5c5SAndroid Build Coastguard Worker
598*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
599*8975f5c5SAndroid Build Coastguard Worker drawQuad(mTextureProgram, "position", 0.5f, 1.0f, true);
600*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
601*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::green);
602*8975f5c5SAndroid Build Coastguard Worker }
603*8975f5c5SAndroid Build Coastguard Worker
604*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(DXT1CompressedTextureTest);
605*8975f5c5SAndroid Build Coastguard Worker
606*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DXT1CompressedTextureTestES3);
607*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3_AND(DXT1CompressedTextureTestES3,
608*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().enable(angle::Feature::ForceRobustResourceInit));
609*8975f5c5SAndroid Build Coastguard Worker
610*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(DXT1CompressedTextureTestWebGL2);
611