xref: /aosp_15_r20/external/angle/src/tests/gl_tests/ReadPixelsTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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 // ReadPixelsTest:
7*8975f5c5SAndroid Build Coastguard Worker //   Tests calls related to glReadPixels.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include <array>
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "util/random_utils.h"
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker namespace
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker class ReadPixelsTest : public ANGLETest<>
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker   protected:
ReadPixelsTest()25*8975f5c5SAndroid Build Coastguard Worker     ReadPixelsTest()
26*8975f5c5SAndroid Build Coastguard Worker     {
27*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(32);
28*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(32);
29*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
30*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
31*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
32*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
33*8975f5c5SAndroid Build Coastguard Worker     }
34*8975f5c5SAndroid Build Coastguard Worker };
35*8975f5c5SAndroid Build Coastguard Worker 
36*8975f5c5SAndroid Build Coastguard Worker // Test out of bounds framebuffer reads.
TEST_P(ReadPixelsTest,OutOfBounds)37*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTest, OutOfBounds)
38*8975f5c5SAndroid Build Coastguard Worker {
39*8975f5c5SAndroid Build Coastguard Worker     // TODO: re-enable once root cause of http://anglebug.com/42260408 is fixed
40*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAndroid() && IsAdreno() && IsOpenGLES());
41*8975f5c5SAndroid Build Coastguard Worker 
42*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
43*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
44*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
45*8975f5c5SAndroid Build Coastguard Worker 
46*8975f5c5SAndroid Build Coastguard Worker     GLsizei pixelsWidth  = 32;
47*8975f5c5SAndroid Build Coastguard Worker     GLsizei pixelsHeight = 32;
48*8975f5c5SAndroid Build Coastguard Worker     GLint offset         = 16;
49*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixels((pixelsWidth + offset) * (pixelsHeight + offset));
50*8975f5c5SAndroid Build Coastguard Worker 
51*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(-offset, -offset, pixelsWidth + offset, pixelsHeight + offset, GL_RGBA,
52*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, &pixels[0]);
53*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
54*8975f5c5SAndroid Build Coastguard Worker 
55*8975f5c5SAndroid Build Coastguard Worker     // Expect that all pixels which fell within the framebuffer are red
56*8975f5c5SAndroid Build Coastguard Worker     for (int y = pixelsHeight / 2; y < pixelsHeight; y++)
57*8975f5c5SAndroid Build Coastguard Worker     {
58*8975f5c5SAndroid Build Coastguard Worker         for (int x = pixelsWidth / 2; x < pixelsWidth; x++)
59*8975f5c5SAndroid Build Coastguard Worker         {
60*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(GLColor::red, pixels[y * (pixelsWidth + offset) + x]);
61*8975f5c5SAndroid Build Coastguard Worker         }
62*8975f5c5SAndroid Build Coastguard Worker     }
63*8975f5c5SAndroid Build Coastguard Worker }
64*8975f5c5SAndroid Build Coastguard Worker 
65*8975f5c5SAndroid Build Coastguard Worker class ReadPixelsPBONVTest : public ReadPixelsTest
66*8975f5c5SAndroid Build Coastguard Worker {
67*8975f5c5SAndroid Build Coastguard Worker   protected:
ReadPixelsPBONVTest()68*8975f5c5SAndroid Build Coastguard Worker     ReadPixelsPBONVTest() : mPBO(0), mTexture(0), mFBO(0) {}
69*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()70*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
71*8975f5c5SAndroid Build Coastguard Worker     {
72*8975f5c5SAndroid Build Coastguard Worker         glGenBuffers(1, &mPBO);
73*8975f5c5SAndroid Build Coastguard Worker         glGenFramebuffers(1, &mFBO);
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker         reset(4 * getWindowWidth() * getWindowHeight(), 4, 4);
76*8975f5c5SAndroid Build Coastguard Worker     }
77*8975f5c5SAndroid Build Coastguard Worker 
reset(GLuint bufferSize,GLuint fboWidth,GLuint fboHeight)78*8975f5c5SAndroid Build Coastguard Worker     virtual void reset(GLuint bufferSize, GLuint fboWidth, GLuint fboHeight)
79*8975f5c5SAndroid Build Coastguard Worker     {
80*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!hasPBOExts());
81*8975f5c5SAndroid Build Coastguard Worker 
82*8975f5c5SAndroid Build Coastguard Worker         mPBOBufferSize = bufferSize;
83*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
84*8975f5c5SAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_PACK_BUFFER, mPBOBufferSize, nullptr, GL_STATIC_DRAW);
85*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
86*8975f5c5SAndroid Build Coastguard Worker 
87*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTexture);
88*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTexture);
89*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture);
90*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, fboWidth, fboHeight);
91*8975f5c5SAndroid Build Coastguard Worker         mFBOWidth  = fboWidth;
92*8975f5c5SAndroid Build Coastguard Worker         mFBOHeight = fboHeight;
93*8975f5c5SAndroid Build Coastguard Worker 
94*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
95*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
96*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
99*8975f5c5SAndroid Build Coastguard Worker     }
100*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()101*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
102*8975f5c5SAndroid Build Coastguard Worker     {
103*8975f5c5SAndroid Build Coastguard Worker         glDeleteBuffers(1, &mPBO);
104*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTexture);
105*8975f5c5SAndroid Build Coastguard Worker         glDeleteFramebuffers(1, &mFBO);
106*8975f5c5SAndroid Build Coastguard Worker     }
107*8975f5c5SAndroid Build Coastguard Worker 
hasPBOExts() const108*8975f5c5SAndroid Build Coastguard Worker     bool hasPBOExts() const
109*8975f5c5SAndroid Build Coastguard Worker     {
110*8975f5c5SAndroid Build Coastguard Worker         return IsGLExtensionEnabled("GL_NV_pixel_buffer_object") &&
111*8975f5c5SAndroid Build Coastguard Worker                IsGLExtensionEnabled("GL_EXT_texture_storage");
112*8975f5c5SAndroid Build Coastguard Worker     }
113*8975f5c5SAndroid Build Coastguard Worker 
114*8975f5c5SAndroid Build Coastguard Worker     GLuint mPBO           = 0;
115*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture       = 0;
116*8975f5c5SAndroid Build Coastguard Worker     GLuint mFBO           = 0;
117*8975f5c5SAndroid Build Coastguard Worker     GLuint mFBOWidth      = 0;
118*8975f5c5SAndroid Build Coastguard Worker     GLuint mFBOHeight     = 0;
119*8975f5c5SAndroid Build Coastguard Worker     GLuint mPBOBufferSize = 0;
120*8975f5c5SAndroid Build Coastguard Worker };
121*8975f5c5SAndroid Build Coastguard Worker 
122*8975f5c5SAndroid Build Coastguard Worker // Test basic usage of PBOs.
TEST_P(ReadPixelsPBONVTest,Basic)123*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBONVTest, Basic)
124*8975f5c5SAndroid Build Coastguard Worker {
125*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasPBOExts() || !IsGLExtensionEnabled("GL_EXT_map_buffer_range") ||
126*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_OES_mapbuffer"));
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263593
129*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsWindows() && IsDesktopOpenGL());
130*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263926
131*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
134*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
135*8975f5c5SAndroid Build Coastguard Worker     // Clear last pixel to green
136*8975f5c5SAndroid Build Coastguard Worker     glScissor(15, 15, 1, 1);
137*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
138*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
139*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
140*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
143*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
144*8975f5c5SAndroid Build Coastguard Worker 
145*8975f5c5SAndroid Build Coastguard Worker     void *mappedPtr = glMapBufferRangeEXT(GL_PIXEL_PACK_BUFFER, 0, mPBOBufferSize, GL_MAP_READ_BIT);
146*8975f5c5SAndroid Build Coastguard Worker     GLColor *dataColor = static_cast<GLColor *>(mappedPtr);
147*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
148*8975f5c5SAndroid Build Coastguard Worker 
149*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::red, dataColor[0]);
150*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::red, dataColor[16 * 16 - 2]);
151*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::green, dataColor[16 * 16 - 1]);
152*8975f5c5SAndroid Build Coastguard Worker 
153*8975f5c5SAndroid Build Coastguard Worker     glUnmapBufferOES(GL_PIXEL_PACK_BUFFER);
154*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
155*8975f5c5SAndroid Build Coastguard Worker }
156*8975f5c5SAndroid Build Coastguard Worker 
157*8975f5c5SAndroid Build Coastguard Worker // Test that calling SubData preserves PBO data.
TEST_P(ReadPixelsPBONVTest,SubDataPreservesContents)158*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBONVTest, SubDataPreservesContents)
159*8975f5c5SAndroid Build Coastguard Worker {
160*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasPBOExts() || !IsGLExtensionEnabled("GL_EXT_map_buffer_range") ||
161*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_OES_mapbuffer"));
162*8975f5c5SAndroid Build Coastguard Worker 
163*8975f5c5SAndroid Build Coastguard Worker     // anglebug.com/40096466
164*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsNVIDIA() && IsDesktopOpenGL());
165*8975f5c5SAndroid Build Coastguard Worker 
166*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
167*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
168*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
169*8975f5c5SAndroid Build Coastguard Worker 
170*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
171*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
172*8975f5c5SAndroid Build Coastguard Worker 
173*8975f5c5SAndroid Build Coastguard Worker     unsigned char data[4] = {1, 2, 3, 4};
174*8975f5c5SAndroid Build Coastguard Worker 
175*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
176*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, mPBO);
177*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_ARRAY_BUFFER, 0, 4, data);
178*8975f5c5SAndroid Build Coastguard Worker 
179*8975f5c5SAndroid Build Coastguard Worker     void *mappedPtr    = glMapBufferRangeEXT(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
180*8975f5c5SAndroid Build Coastguard Worker     GLColor *dataColor = static_cast<GLColor *>(mappedPtr);
181*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
182*8975f5c5SAndroid Build Coastguard Worker 
183*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor(1, 2, 3, 4), dataColor[0]);
184*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::red, dataColor[1]);
185*8975f5c5SAndroid Build Coastguard Worker 
186*8975f5c5SAndroid Build Coastguard Worker     glUnmapBufferOES(GL_ARRAY_BUFFER);
187*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
188*8975f5c5SAndroid Build Coastguard Worker }
189*8975f5c5SAndroid Build Coastguard Worker 
190*8975f5c5SAndroid Build Coastguard Worker // Test that calling ReadPixels with GL_DYNAMIC_DRAW buffer works
TEST_P(ReadPixelsPBONVTest,DynamicPBO)191*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBONVTest, DynamicPBO)
192*8975f5c5SAndroid Build Coastguard Worker {
193*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasPBOExts() || !IsGLExtensionEnabled("GL_EXT_map_buffer_range") ||
194*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_OES_mapbuffer"));
195*8975f5c5SAndroid Build Coastguard Worker 
196*8975f5c5SAndroid Build Coastguard Worker     // anglebug.com/40096466
197*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsNVIDIA() && IsDesktopOpenGL());
198*8975f5c5SAndroid Build Coastguard Worker 
199*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
200*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_PACK_BUFFER, 4 * getWindowWidth() * getWindowHeight(), nullptr,
201*8975f5c5SAndroid Build Coastguard Worker                  GL_DYNAMIC_DRAW);
202*8975f5c5SAndroid Build Coastguard Worker 
203*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
204*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
205*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
206*8975f5c5SAndroid Build Coastguard Worker 
207*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
208*8975f5c5SAndroid Build Coastguard Worker 
209*8975f5c5SAndroid Build Coastguard Worker     unsigned char data[4] = {1, 2, 3, 4};
210*8975f5c5SAndroid Build Coastguard Worker 
211*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
212*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, mPBO);
213*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_ARRAY_BUFFER, 0, 4, data);
214*8975f5c5SAndroid Build Coastguard Worker 
215*8975f5c5SAndroid Build Coastguard Worker     void *mappedPtr    = glMapBufferRangeEXT(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
216*8975f5c5SAndroid Build Coastguard Worker     GLColor *dataColor = static_cast<GLColor *>(mappedPtr);
217*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
218*8975f5c5SAndroid Build Coastguard Worker 
219*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor(1, 2, 3, 4), dataColor[0]);
220*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::red, dataColor[1]);
221*8975f5c5SAndroid Build Coastguard Worker 
222*8975f5c5SAndroid Build Coastguard Worker     glUnmapBufferOES(GL_ARRAY_BUFFER);
223*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
224*8975f5c5SAndroid Build Coastguard Worker }
225*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ReadPixelsPBONVTest,ReadFromFBO)226*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBONVTest, ReadFromFBO)
227*8975f5c5SAndroid Build Coastguard Worker {
228*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasPBOExts() || !IsGLExtensionEnabled("GL_EXT_map_buffer_range") ||
229*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_OES_mapbuffer"));
230*8975f5c5SAndroid Build Coastguard Worker 
231*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
232*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, mFBOWidth, mFBOHeight);
233*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
234*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
235*8975f5c5SAndroid Build Coastguard Worker     // Clear last pixel to green
236*8975f5c5SAndroid Build Coastguard Worker     glScissor(mFBOWidth - 1, mFBOHeight - 1, 1, 1);
237*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
238*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
239*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
240*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
241*8975f5c5SAndroid Build Coastguard Worker 
242*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
243*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, mFBOWidth, mFBOHeight, GL_RGBA, GL_UNSIGNED_BYTE, 0);
244*8975f5c5SAndroid Build Coastguard Worker 
245*8975f5c5SAndroid Build Coastguard Worker     void *mappedPtr =
246*8975f5c5SAndroid Build Coastguard Worker         glMapBufferRangeEXT(GL_PIXEL_PACK_BUFFER, 0, 4 * mFBOWidth * mFBOHeight, GL_MAP_READ_BIT);
247*8975f5c5SAndroid Build Coastguard Worker     GLColor *dataColor = static_cast<GLColor *>(mappedPtr);
248*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
249*8975f5c5SAndroid Build Coastguard Worker 
250*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::red, dataColor[0]);
251*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::red, dataColor[mFBOWidth * mFBOHeight - 2]);
252*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::green, dataColor[mFBOWidth * mFBOHeight - 1]);
253*8975f5c5SAndroid Build Coastguard Worker 
254*8975f5c5SAndroid Build Coastguard Worker     glUnmapBufferOES(GL_PIXEL_PACK_BUFFER);
255*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
256*8975f5c5SAndroid Build Coastguard Worker }
257*8975f5c5SAndroid Build Coastguard Worker 
258*8975f5c5SAndroid Build Coastguard Worker // Test calling ReadPixels with a non-zero "data" param into a PBO
TEST_P(ReadPixelsPBONVTest,ReadFromFBOWithDataOffset)259*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBONVTest, ReadFromFBOWithDataOffset)
260*8975f5c5SAndroid Build Coastguard Worker {
261*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasPBOExts() || !IsGLExtensionEnabled("GL_EXT_map_buffer_range") ||
262*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_OES_mapbuffer"));
263*8975f5c5SAndroid Build Coastguard Worker 
264*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
265*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, mFBOWidth, mFBOHeight);
266*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
267*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
268*8975f5c5SAndroid Build Coastguard Worker     // Clear first pixel to green
269*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, 1, 1);
270*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
271*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
272*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
273*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
274*8975f5c5SAndroid Build Coastguard Worker 
275*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
276*8975f5c5SAndroid Build Coastguard Worker 
277*8975f5c5SAndroid Build Coastguard Worker     // Read (height - 1) rows offset by width * 4.
278*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, mFBOWidth, mFBOHeight - 1, GL_RGBA, GL_UNSIGNED_BYTE,
279*8975f5c5SAndroid Build Coastguard Worker                  reinterpret_cast<void *>(mFBOWidth * static_cast<uintptr_t>(4)));
280*8975f5c5SAndroid Build Coastguard Worker 
281*8975f5c5SAndroid Build Coastguard Worker     void *mappedPtr =
282*8975f5c5SAndroid Build Coastguard Worker         glMapBufferRangeEXT(GL_PIXEL_PACK_BUFFER, 0, 4 * mFBOWidth * mFBOHeight, GL_MAP_READ_BIT);
283*8975f5c5SAndroid Build Coastguard Worker     GLColor *dataColor = static_cast<GLColor *>(mappedPtr);
284*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
285*8975f5c5SAndroid Build Coastguard Worker 
286*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::green, dataColor[mFBOWidth]);
287*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::red, dataColor[mFBOWidth + 1]);
288*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::red, dataColor[mFBOWidth * mFBOHeight - 1]);
289*8975f5c5SAndroid Build Coastguard Worker 
290*8975f5c5SAndroid Build Coastguard Worker     glUnmapBufferOES(GL_PIXEL_PACK_BUFFER);
291*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
292*8975f5c5SAndroid Build Coastguard Worker }
293*8975f5c5SAndroid Build Coastguard Worker 
294*8975f5c5SAndroid Build Coastguard Worker class ReadPixelsPBOTest : public ReadPixelsPBONVTest
295*8975f5c5SAndroid Build Coastguard Worker {
296*8975f5c5SAndroid Build Coastguard Worker   protected:
ReadPixelsPBOTest()297*8975f5c5SAndroid Build Coastguard Worker     ReadPixelsPBOTest() : ReadPixelsPBONVTest() {}
298*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()299*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
300*8975f5c5SAndroid Build Coastguard Worker     {
301*8975f5c5SAndroid Build Coastguard Worker         glGenBuffers(1, &mPBO);
302*8975f5c5SAndroid Build Coastguard Worker         glGenFramebuffers(1, &mFBO);
303*8975f5c5SAndroid Build Coastguard Worker 
304*8975f5c5SAndroid Build Coastguard Worker         reset(4 * getWindowWidth() * getWindowHeight(), 4, 1);
305*8975f5c5SAndroid Build Coastguard Worker     }
306*8975f5c5SAndroid Build Coastguard Worker 
reset(GLuint bufferSize,GLuint fboWidth,GLuint fboHeight)307*8975f5c5SAndroid Build Coastguard Worker     void reset(GLuint bufferSize, GLuint fboWidth, GLuint fboHeight) override
308*8975f5c5SAndroid Build Coastguard Worker     {
309*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
310*8975f5c5SAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_PACK_BUFFER, bufferSize, nullptr, GL_STATIC_DRAW);
311*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
312*8975f5c5SAndroid Build Coastguard Worker 
313*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTexture);
314*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTexture);
315*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture);
316*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, fboWidth, fboHeight);
317*8975f5c5SAndroid Build Coastguard Worker 
318*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
319*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
320*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
321*8975f5c5SAndroid Build Coastguard Worker 
322*8975f5c5SAndroid Build Coastguard Worker         mFBOWidth  = fboWidth;
323*8975f5c5SAndroid Build Coastguard Worker         mFBOHeight = fboHeight;
324*8975f5c5SAndroid Build Coastguard Worker 
325*8975f5c5SAndroid Build Coastguard Worker         mPBOBufferSize = bufferSize;
326*8975f5c5SAndroid Build Coastguard Worker 
327*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
328*8975f5c5SAndroid Build Coastguard Worker     }
329*8975f5c5SAndroid Build Coastguard Worker };
330*8975f5c5SAndroid Build Coastguard Worker 
331*8975f5c5SAndroid Build Coastguard Worker // Test basic usage of PBOs.
TEST_P(ReadPixelsPBOTest,Basic)332*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBOTest, Basic)
333*8975f5c5SAndroid Build Coastguard Worker {
334*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
335*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
336*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
337*8975f5c5SAndroid Build Coastguard Worker 
338*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
339*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
340*8975f5c5SAndroid Build Coastguard Worker 
341*8975f5c5SAndroid Build Coastguard Worker     void *mappedPtr    = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, 32, GL_MAP_READ_BIT);
342*8975f5c5SAndroid Build Coastguard Worker     GLColor *dataColor = static_cast<GLColor *>(mappedPtr);
343*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
344*8975f5c5SAndroid Build Coastguard Worker 
345*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::red, dataColor[0]);
346*8975f5c5SAndroid Build Coastguard Worker 
347*8975f5c5SAndroid Build Coastguard Worker     glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
348*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
349*8975f5c5SAndroid Build Coastguard Worker }
350*8975f5c5SAndroid Build Coastguard Worker 
351*8975f5c5SAndroid Build Coastguard Worker // Test copy to snorm
TEST_P(ReadPixelsPBOTest,Snorm)352*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBOTest, Snorm)
353*8975f5c5SAndroid Build Coastguard Worker {
354*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_render_snorm"));
355*8975f5c5SAndroid Build Coastguard Worker 
356*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 6;
357*8975f5c5SAndroid Build Coastguard Worker 
358*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
359*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
360*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_SNORM, kSize, kSize);
361*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
362*8975f5c5SAndroid Build Coastguard Worker 
363*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
364*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
365*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
366*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
367*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
368*8975f5c5SAndroid Build Coastguard Worker 
369*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
370*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
371*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, kSize / 2, kSize / 2);
372*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
373*8975f5c5SAndroid Build Coastguard Worker 
374*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
375*8975f5c5SAndroid Build Coastguard Worker     glScissor(kSize / 2, 0, kSize / 2, kSize / 2);
376*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
377*8975f5c5SAndroid Build Coastguard Worker 
378*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
379*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, kSize / 2, kSize / 2, kSize / 2);
380*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
381*8975f5c5SAndroid Build Coastguard Worker 
382*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
383*8975f5c5SAndroid Build Coastguard Worker     glScissor(kSize / 2, kSize / 2, kSize / 2, kSize / 2);
384*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
385*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
386*8975f5c5SAndroid Build Coastguard Worker 
387*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SCISSOR_TEST);
388*8975f5c5SAndroid Build Coastguard Worker 
389*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
390*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, kSize, kSize, GL_RGBA, GL_BYTE, 0);
391*8975f5c5SAndroid Build Coastguard Worker 
392*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> result(kSize * kSize);
393*8975f5c5SAndroid Build Coastguard Worker     void *mappedPtr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, kSize * kSize * 4, GL_MAP_READ_BIT);
394*8975f5c5SAndroid Build Coastguard Worker     memcpy(result.data(), mappedPtr, kSize * kSize * 4);
395*8975f5c5SAndroid Build Coastguard Worker     glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
396*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
397*8975f5c5SAndroid Build Coastguard Worker 
398*8975f5c5SAndroid Build Coastguard Worker     auto verify = [&](const GLColor expect[4]) {
399*8975f5c5SAndroid Build Coastguard Worker         for (size_t i = 0; i < kSize; ++i)
400*8975f5c5SAndroid Build Coastguard Worker         {
401*8975f5c5SAndroid Build Coastguard Worker             for (size_t j = 0; j < kSize; ++j)
402*8975f5c5SAndroid Build Coastguard Worker             {
403*8975f5c5SAndroid Build Coastguard Worker                 uint32_t index = (i < kSize / 2 ? 0 : 1) << 1 | (j < kSize / 2 ? 0 : 1);
404*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_EQ(result[i * kSize + j], expect[index]) << i << " " << j;
405*8975f5c5SAndroid Build Coastguard Worker             }
406*8975f5c5SAndroid Build Coastguard Worker         }
407*8975f5c5SAndroid Build Coastguard Worker     };
408*8975f5c5SAndroid Build Coastguard Worker 
409*8975f5c5SAndroid Build Coastguard Worker     // The image should have the following colors
410*8975f5c5SAndroid Build Coastguard Worker     //
411*8975f5c5SAndroid Build Coastguard Worker     //     +---+---+
412*8975f5c5SAndroid Build Coastguard Worker     //     | R | G |
413*8975f5c5SAndroid Build Coastguard Worker     //     +---+---+
414*8975f5c5SAndroid Build Coastguard Worker     //     | B | Y |
415*8975f5c5SAndroid Build Coastguard Worker     //     +---+---+
416*8975f5c5SAndroid Build Coastguard Worker     //
417*8975f5c5SAndroid Build Coastguard Worker     const GLColor kColors[4] = {
418*8975f5c5SAndroid Build Coastguard Worker         GLColor(127, 0, 0, 127),
419*8975f5c5SAndroid Build Coastguard Worker         GLColor(0, 127, 0, 127),
420*8975f5c5SAndroid Build Coastguard Worker         GLColor(0, 0, 127, 127),
421*8975f5c5SAndroid Build Coastguard Worker         GLColor(127, 127, 0, 127),
422*8975f5c5SAndroid Build Coastguard Worker     };
423*8975f5c5SAndroid Build Coastguard Worker     verify(kColors);
424*8975f5c5SAndroid Build Coastguard Worker 
425*8975f5c5SAndroid Build Coastguard Worker     // Test again, but this time with reverse order
426*8975f5c5SAndroid Build Coastguard Worker     if (EnsureGLExtensionEnabled("GL_ANGLE_pack_reverse_row_order"))
427*8975f5c5SAndroid Build Coastguard Worker     {
428*8975f5c5SAndroid Build Coastguard Worker         glPixelStorei(GL_PACK_REVERSE_ROW_ORDER_ANGLE, GL_TRUE);
429*8975f5c5SAndroid Build Coastguard Worker         glReadPixels(0, 0, kSize, kSize, GL_RGBA, GL_BYTE, 0);
430*8975f5c5SAndroid Build Coastguard Worker 
431*8975f5c5SAndroid Build Coastguard Worker         mappedPtr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, kSize * kSize * 4, GL_MAP_READ_BIT);
432*8975f5c5SAndroid Build Coastguard Worker         memcpy(result.data(), mappedPtr, kSize * kSize * 4);
433*8975f5c5SAndroid Build Coastguard Worker         glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
434*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
435*8975f5c5SAndroid Build Coastguard Worker 
436*8975f5c5SAndroid Build Coastguard Worker         const GLColor kReversedColors[4] = {
437*8975f5c5SAndroid Build Coastguard Worker             GLColor(0, 0, 127, 127),
438*8975f5c5SAndroid Build Coastguard Worker             GLColor(127, 127, 0, 127),
439*8975f5c5SAndroid Build Coastguard Worker             GLColor(127, 0, 0, 127),
440*8975f5c5SAndroid Build Coastguard Worker             GLColor(0, 127, 0, 127),
441*8975f5c5SAndroid Build Coastguard Worker         };
442*8975f5c5SAndroid Build Coastguard Worker         verify(kReversedColors);
443*8975f5c5SAndroid Build Coastguard Worker     }
444*8975f5c5SAndroid Build Coastguard Worker }
445*8975f5c5SAndroid Build Coastguard Worker 
446*8975f5c5SAndroid Build Coastguard Worker // Test read pixel to PBO of an sRGB unorm renderbuffer
TEST_P(ReadPixelsPBOTest,SrgbUnorm)447*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBOTest, SrgbUnorm)
448*8975f5c5SAndroid Build Coastguard Worker {
449*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_pack_reverse_row_order"));
450*8975f5c5SAndroid Build Coastguard Worker 
451*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 1;
452*8975f5c5SAndroid Build Coastguard Worker     constexpr angle::GLColor clearColor(64, 0, 0, 255);
453*8975f5c5SAndroid Build Coastguard Worker     constexpr angle::GLColor encodedToSrgbColor(136, 0, 0, 255);
454*8975f5c5SAndroid Build Coastguard Worker 
455*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
456*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
457*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_SRGB8_ALPHA8, kSize, kSize);
458*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
459*8975f5c5SAndroid Build Coastguard Worker 
460*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
461*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
462*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
463*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
464*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
465*8975f5c5SAndroid Build Coastguard Worker 
466*8975f5c5SAndroid Build Coastguard Worker     glClearColor(clearColor[0] / 255.0f, 0.0f, 0.0f, 1.0f);
467*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
468*8975f5c5SAndroid Build Coastguard Worker 
469*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
470*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_PACK_REVERSE_ROW_ORDER_ANGLE, GL_TRUE);
471*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, kSize, kSize, GL_RGBA, GL_UNSIGNED_BYTE, 0);
472*8975f5c5SAndroid Build Coastguard Worker 
473*8975f5c5SAndroid Build Coastguard Worker     GLColor result;
474*8975f5c5SAndroid Build Coastguard Worker     void *mappedPtr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, kSize * kSize * 4, GL_MAP_READ_BIT);
475*8975f5c5SAndroid Build Coastguard Worker     memcpy(result.data(), mappedPtr, kSize * kSize * 4);
476*8975f5c5SAndroid Build Coastguard Worker     glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
477*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
478*8975f5c5SAndroid Build Coastguard Worker 
479*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NEAR(result[0], encodedToSrgbColor[0], 1);
480*8975f5c5SAndroid Build Coastguard Worker }
481*8975f5c5SAndroid Build Coastguard Worker 
482*8975f5c5SAndroid Build Coastguard Worker // Test an error is generated when the PBO is too small.
TEST_P(ReadPixelsPBOTest,PBOTooSmall)483*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBOTest, PBOTooSmall)
484*8975f5c5SAndroid Build Coastguard Worker {
485*8975f5c5SAndroid Build Coastguard Worker     reset(4 * 16 * 16 - 1, 16, 16);
486*8975f5c5SAndroid Build Coastguard Worker 
487*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
488*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
489*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
490*8975f5c5SAndroid Build Coastguard Worker 
491*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
492*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
493*8975f5c5SAndroid Build Coastguard Worker 
494*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
495*8975f5c5SAndroid Build Coastguard Worker }
496*8975f5c5SAndroid Build Coastguard Worker 
497*8975f5c5SAndroid Build Coastguard Worker // Test an error is generated when the PBO is mapped.
TEST_P(ReadPixelsPBOTest,PBOMapped)498*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBOTest, PBOMapped)
499*8975f5c5SAndroid Build Coastguard Worker {
500*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
501*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
502*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
503*8975f5c5SAndroid Build Coastguard Worker 
504*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
505*8975f5c5SAndroid Build Coastguard Worker     glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, 32, GL_MAP_READ_BIT);
506*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
507*8975f5c5SAndroid Build Coastguard Worker 
508*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
509*8975f5c5SAndroid Build Coastguard Worker }
510*8975f5c5SAndroid Build Coastguard Worker 
511*8975f5c5SAndroid Build Coastguard Worker // Test that binding a PBO to ARRAY_BUFFER works as expected.
TEST_P(ReadPixelsPBOTest,ArrayBufferTarget)512*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBOTest, ArrayBufferTarget)
513*8975f5c5SAndroid Build Coastguard Worker {
514*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
515*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
516*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
517*8975f5c5SAndroid Build Coastguard Worker 
518*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
519*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
520*8975f5c5SAndroid Build Coastguard Worker 
521*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
522*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, mPBO);
523*8975f5c5SAndroid Build Coastguard Worker 
524*8975f5c5SAndroid Build Coastguard Worker     void *mappedPtr    = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
525*8975f5c5SAndroid Build Coastguard Worker     GLColor *dataColor = static_cast<GLColor *>(mappedPtr);
526*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
527*8975f5c5SAndroid Build Coastguard Worker 
528*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::red, dataColor[0]);
529*8975f5c5SAndroid Build Coastguard Worker 
530*8975f5c5SAndroid Build Coastguard Worker     glUnmapBuffer(GL_ARRAY_BUFFER);
531*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
532*8975f5c5SAndroid Build Coastguard Worker }
533*8975f5c5SAndroid Build Coastguard Worker 
534*8975f5c5SAndroid Build Coastguard Worker // Test that using a PBO does not overwrite existing data.
TEST_P(ReadPixelsPBOTest,ExistingDataPreserved)535*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBOTest, ExistingDataPreserved)
536*8975f5c5SAndroid Build Coastguard Worker {
537*8975f5c5SAndroid Build Coastguard Worker     // Clear backbuffer to red
538*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
539*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
540*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
541*8975f5c5SAndroid Build Coastguard Worker 
542*8975f5c5SAndroid Build Coastguard Worker     // Read 16x16 region from red backbuffer to PBO
543*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
544*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
545*8975f5c5SAndroid Build Coastguard Worker 
546*8975f5c5SAndroid Build Coastguard Worker     // Clear backbuffer to green
547*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
548*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
549*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
550*8975f5c5SAndroid Build Coastguard Worker 
551*8975f5c5SAndroid Build Coastguard Worker     // Read 16x16 region from green backbuffer to PBO at offset 16
552*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, reinterpret_cast<void *>(16));
553*8975f5c5SAndroid Build Coastguard Worker     void *mappedPtr =
554*8975f5c5SAndroid Build Coastguard Worker         glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, 17 * sizeof(GLColor), GL_MAP_READ_BIT);
555*8975f5c5SAndroid Build Coastguard Worker     GLColor *dataColor = static_cast<GLColor *>(mappedPtr);
556*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
557*8975f5c5SAndroid Build Coastguard Worker 
558*8975f5c5SAndroid Build Coastguard Worker     // Test pixel 0 is red (existing data)
559*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::red, dataColor[0]);
560*8975f5c5SAndroid Build Coastguard Worker 
561*8975f5c5SAndroid Build Coastguard Worker     // Test pixel 16 is green (new data)
562*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::green, dataColor[16]);
563*8975f5c5SAndroid Build Coastguard Worker 
564*8975f5c5SAndroid Build Coastguard Worker     glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
565*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
566*8975f5c5SAndroid Build Coastguard Worker }
567*8975f5c5SAndroid Build Coastguard Worker 
568*8975f5c5SAndroid Build Coastguard Worker // Test that calling SubData preserves PBO data.
TEST_P(ReadPixelsPBOTest,SubDataPreservesContents)569*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBOTest, SubDataPreservesContents)
570*8975f5c5SAndroid Build Coastguard Worker {
571*8975f5c5SAndroid Build Coastguard Worker     // anglebug.com/40096466
572*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsNVIDIA() && IsDesktopOpenGL());
573*8975f5c5SAndroid Build Coastguard Worker 
574*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
575*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
576*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
577*8975f5c5SAndroid Build Coastguard Worker 
578*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
579*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
580*8975f5c5SAndroid Build Coastguard Worker 
581*8975f5c5SAndroid Build Coastguard Worker     unsigned char data[4] = {1, 2, 3, 4};
582*8975f5c5SAndroid Build Coastguard Worker 
583*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
584*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, mPBO);
585*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_ARRAY_BUFFER, 0, 4, data);
586*8975f5c5SAndroid Build Coastguard Worker 
587*8975f5c5SAndroid Build Coastguard Worker     void *mappedPtr    = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
588*8975f5c5SAndroid Build Coastguard Worker     GLColor *dataColor = static_cast<GLColor *>(mappedPtr);
589*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
590*8975f5c5SAndroid Build Coastguard Worker 
591*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor(1, 2, 3, 4), dataColor[0]);
592*8975f5c5SAndroid Build Coastguard Worker 
593*8975f5c5SAndroid Build Coastguard Worker     glUnmapBuffer(GL_ARRAY_BUFFER);
594*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
595*8975f5c5SAndroid Build Coastguard Worker }
596*8975f5c5SAndroid Build Coastguard Worker 
597*8975f5c5SAndroid Build Coastguard Worker // Same as the prior test, but with an offset.
TEST_P(ReadPixelsPBOTest,SubDataOffsetPreservesContents)598*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBOTest, SubDataOffsetPreservesContents)
599*8975f5c5SAndroid Build Coastguard Worker {
600*8975f5c5SAndroid Build Coastguard Worker     // anglebug.com/42260410
601*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsNexus5X() && IsAdreno() && IsOpenGLES());
602*8975f5c5SAndroid Build Coastguard Worker     // anglebug.com/40096466
603*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsNVIDIA() && IsDesktopOpenGL());
604*8975f5c5SAndroid Build Coastguard Worker 
605*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
606*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
607*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
608*8975f5c5SAndroid Build Coastguard Worker 
609*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
610*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
611*8975f5c5SAndroid Build Coastguard Worker 
612*8975f5c5SAndroid Build Coastguard Worker     unsigned char data[4] = {1, 2, 3, 4};
613*8975f5c5SAndroid Build Coastguard Worker 
614*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
615*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, mPBO);
616*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_ARRAY_BUFFER, 16, 4, data);
617*8975f5c5SAndroid Build Coastguard Worker 
618*8975f5c5SAndroid Build Coastguard Worker     void *mappedPtr    = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
619*8975f5c5SAndroid Build Coastguard Worker     GLColor *dataColor = static_cast<GLColor *>(mappedPtr);
620*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
621*8975f5c5SAndroid Build Coastguard Worker 
622*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::red, dataColor[0]);
623*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor(1, 2, 3, 4), dataColor[4]);
624*8975f5c5SAndroid Build Coastguard Worker 
625*8975f5c5SAndroid Build Coastguard Worker     glUnmapBuffer(GL_ARRAY_BUFFER);
626*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
627*8975f5c5SAndroid Build Coastguard Worker }
628*8975f5c5SAndroid Build Coastguard Worker 
629*8975f5c5SAndroid Build Coastguard Worker // Test that uploading data to buffer that's in use then writing to it as PBO works.
TEST_P(ReadPixelsPBOTest,UseAsUBOThenUpdateThenReadFromFBO)630*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBOTest, UseAsUBOThenUpdateThenReadFromFBO)
631*8975f5c5SAndroid Build Coastguard Worker {
632*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
633*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, mFBOWidth, mFBOHeight);
634*8975f5c5SAndroid Build Coastguard Worker 
635*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLColor, 4> kInitialData = {GLColor::red, GLColor::red, GLColor::red,
636*8975f5c5SAndroid Build Coastguard Worker                                                  GLColor::red};
637*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLColor, 4> kUpdateData  = {GLColor::white, GLColor::white, GLColor::white,
638*8975f5c5SAndroid Build Coastguard Worker                                                  GLColor::white};
639*8975f5c5SAndroid Build Coastguard Worker 
640*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
641*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_UNIFORM_BUFFER, buffer);
642*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_UNIFORM_BUFFER, sizeof(kInitialData), kInitialData.data(), GL_DYNAMIC_COPY);
643*8975f5c5SAndroid Build Coastguard Worker     glBindBufferBase(GL_UNIFORM_BUFFER, 0, buffer);
644*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
645*8975f5c5SAndroid Build Coastguard Worker 
646*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVerifyUBO[] = R"(#version 300 es
647*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
648*8975f5c5SAndroid Build Coastguard Worker uniform block {
649*8975f5c5SAndroid Build Coastguard Worker     uvec4 data;
650*8975f5c5SAndroid Build Coastguard Worker } ubo;
651*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
652*8975f5c5SAndroid Build Coastguard Worker void main()
653*8975f5c5SAndroid Build Coastguard Worker {
654*8975f5c5SAndroid Build Coastguard Worker     if (all(equal(ubo.data, uvec4(0xFF0000FFu))))
655*8975f5c5SAndroid Build Coastguard Worker         colorOut = vec4(0, 1.0, 0, 1.0);
656*8975f5c5SAndroid Build Coastguard Worker     else
657*8975f5c5SAndroid Build Coastguard Worker         colorOut = vec4(1.0, 0, 0, 1.0);
658*8975f5c5SAndroid Build Coastguard Worker })";
659*8975f5c5SAndroid Build Coastguard Worker 
660*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(verifyUbo, essl3_shaders::vs::Simple(), kVerifyUBO);
661*8975f5c5SAndroid Build Coastguard Worker     drawQuad(verifyUbo, essl3_shaders::PositionAttrib(), 0.5);
662*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
663*8975f5c5SAndroid Build Coastguard Worker 
664*8975f5c5SAndroid Build Coastguard Worker     // Update buffer data
665*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(kInitialData), kUpdateData.data());
666*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
667*8975f5c5SAndroid Build Coastguard Worker 
668*8975f5c5SAndroid Build Coastguard Worker     // Clear first pixel to blue
669*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
670*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, 1, 1);
671*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
672*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
673*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
674*8975f5c5SAndroid Build Coastguard Worker 
675*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, buffer);
676*8975f5c5SAndroid Build Coastguard Worker 
677*8975f5c5SAndroid Build Coastguard Worker     // Read the framebuffer pixels
678*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, mFBOWidth, mFBOHeight, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
679*8975f5c5SAndroid Build Coastguard Worker 
680*8975f5c5SAndroid Build Coastguard Worker     void *mappedPtr =
681*8975f5c5SAndroid Build Coastguard Worker         glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, sizeof(kInitialData), GL_MAP_READ_BIT);
682*8975f5c5SAndroid Build Coastguard Worker     GLColor *dataColor = static_cast<GLColor *>(mappedPtr);
683*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
684*8975f5c5SAndroid Build Coastguard Worker 
685*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::blue, dataColor[0]);
686*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::green, dataColor[1]);
687*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::green, dataColor[2]);
688*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor::green, dataColor[3]);
689*8975f5c5SAndroid Build Coastguard Worker 
690*8975f5c5SAndroid Build Coastguard Worker     glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
691*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
692*8975f5c5SAndroid Build Coastguard Worker 
693*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
694*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
695*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::green);
696*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(2, 0, GLColor::green);
697*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(3, 0, GLColor::green);
698*8975f5c5SAndroid Build Coastguard Worker }
699*8975f5c5SAndroid Build Coastguard Worker 
700*8975f5c5SAndroid Build Coastguard Worker // Test PBO readback with row length smaller than area width.
TEST_P(ReadPixelsPBOTest,SmallRowLength)701*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBOTest, SmallRowLength)
702*8975f5c5SAndroid Build Coastguard Worker {
703*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 2;
704*8975f5c5SAndroid Build Coastguard Worker     reset(kSize * kSize * 4, kSize, kSize);
705*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texData(kSize * kSize);
706*8975f5c5SAndroid Build Coastguard Worker     texData[0] = GLColor::red;
707*8975f5c5SAndroid Build Coastguard Worker     texData[1] = GLColor::green;
708*8975f5c5SAndroid Build Coastguard Worker     texData[2] = GLColor::blue;
709*8975f5c5SAndroid Build Coastguard Worker     texData[3] = GLColor::white;
710*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kSize, kSize, GL_RGBA, GL_UNSIGNED_BYTE,
711*8975f5c5SAndroid Build Coastguard Worker                     texData.data());
712*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
713*8975f5c5SAndroid Build Coastguard Worker 
714*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
715*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
716*8975f5c5SAndroid Build Coastguard Worker 
717*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
718*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> bufData(kSize * kSize, GLColor::black);
719*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_PACK_BUFFER, mPBOBufferSize, bufData.data(), GL_STATIC_DRAW);
720*8975f5c5SAndroid Build Coastguard Worker 
721*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_PACK_ROW_LENGTH, 1);
722*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, kSize, kSize, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
723*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
724*8975f5c5SAndroid Build Coastguard Worker 
725*8975f5c5SAndroid Build Coastguard Worker     void *mappedPtr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, mPBOBufferSize, GL_MAP_READ_BIT);
726*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, mappedPtr);
727*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
728*8975f5c5SAndroid Build Coastguard Worker 
729*8975f5c5SAndroid Build Coastguard Worker     // TODO(anglebug.com/354005999)
730*8975f5c5SAndroid Build Coastguard Worker     // Metal compute path may produce flaky results
731*8975f5c5SAndroid Build Coastguard Worker     // Suppressed until a fallback is implemented
732*8975f5c5SAndroid Build Coastguard Worker     if (!IsMetal())
733*8975f5c5SAndroid Build Coastguard Worker     {
734*8975f5c5SAndroid Build Coastguard Worker         GLColor *colorPtr = static_cast<GLColor *>(mappedPtr);
735*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(colorPtr[0], GLColor::red);
736*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(colorPtr[1], GLColor::blue);
737*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(colorPtr[2], GLColor::white);
738*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(colorPtr[3], GLColor::black);
739*8975f5c5SAndroid Build Coastguard Worker     }
740*8975f5c5SAndroid Build Coastguard Worker     ASSERT_TRUE(glUnmapBuffer(GL_PIXEL_PACK_BUFFER));
741*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
742*8975f5c5SAndroid Build Coastguard Worker }
743*8975f5c5SAndroid Build Coastguard Worker 
744*8975f5c5SAndroid Build Coastguard Worker class ReadPixelsPBODrawTest : public ReadPixelsPBOTest
745*8975f5c5SAndroid Build Coastguard Worker {
746*8975f5c5SAndroid Build Coastguard Worker   protected:
ReadPixelsPBODrawTest()747*8975f5c5SAndroid Build Coastguard Worker     ReadPixelsPBODrawTest() : mProgram(0), mPositionVBO(0) {}
748*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()749*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
750*8975f5c5SAndroid Build Coastguard Worker     {
751*8975f5c5SAndroid Build Coastguard Worker         ReadPixelsPBOTest::testSetUp();
752*8975f5c5SAndroid Build Coastguard Worker 
753*8975f5c5SAndroid Build Coastguard Worker         constexpr char kVS[] =
754*8975f5c5SAndroid Build Coastguard Worker             "attribute vec4 aTest; attribute vec2 aPosition; varying vec4 vTest;\n"
755*8975f5c5SAndroid Build Coastguard Worker             "void main()\n"
756*8975f5c5SAndroid Build Coastguard Worker             "{\n"
757*8975f5c5SAndroid Build Coastguard Worker             "    vTest        = aTest;\n"
758*8975f5c5SAndroid Build Coastguard Worker             "    gl_Position  = vec4(aPosition, 0.0, 1.0);\n"
759*8975f5c5SAndroid Build Coastguard Worker             "    gl_PointSize = 1.0;\n"
760*8975f5c5SAndroid Build Coastguard Worker             "}";
761*8975f5c5SAndroid Build Coastguard Worker 
762*8975f5c5SAndroid Build Coastguard Worker         constexpr char kFS[] =
763*8975f5c5SAndroid Build Coastguard Worker             "precision mediump float; varying vec4 vTest;\n"
764*8975f5c5SAndroid Build Coastguard Worker             "void main()\n"
765*8975f5c5SAndroid Build Coastguard Worker             "{\n"
766*8975f5c5SAndroid Build Coastguard Worker             "    gl_FragColor = vTest;\n"
767*8975f5c5SAndroid Build Coastguard Worker             "}";
768*8975f5c5SAndroid Build Coastguard Worker 
769*8975f5c5SAndroid Build Coastguard Worker         mProgram = CompileProgram(kVS, kFS);
770*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(0u, mProgram);
771*8975f5c5SAndroid Build Coastguard Worker 
772*8975f5c5SAndroid Build Coastguard Worker         glGenBuffers(1, &mPositionVBO);
773*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO);
774*8975f5c5SAndroid Build Coastguard Worker         glBufferData(GL_ARRAY_BUFFER, 128, nullptr, GL_DYNAMIC_DRAW);
775*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_ARRAY_BUFFER, 0);
776*8975f5c5SAndroid Build Coastguard Worker     }
777*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()778*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
779*8975f5c5SAndroid Build Coastguard Worker     {
780*8975f5c5SAndroid Build Coastguard Worker         glDeleteProgram(mProgram);
781*8975f5c5SAndroid Build Coastguard Worker         glDeleteBuffers(1, &mPositionVBO);
782*8975f5c5SAndroid Build Coastguard Worker         ReadPixelsPBOTest::testTearDown();
783*8975f5c5SAndroid Build Coastguard Worker     }
784*8975f5c5SAndroid Build Coastguard Worker 
785*8975f5c5SAndroid Build Coastguard Worker     GLuint mProgram;
786*8975f5c5SAndroid Build Coastguard Worker     GLuint mPositionVBO;
787*8975f5c5SAndroid Build Coastguard Worker };
788*8975f5c5SAndroid Build Coastguard Worker 
789*8975f5c5SAndroid Build Coastguard Worker // Test that we can draw with PBO data.
TEST_P(ReadPixelsPBODrawTest,DrawWithPBO)790*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBODrawTest, DrawWithPBO)
791*8975f5c5SAndroid Build Coastguard Worker {
792*8975f5c5SAndroid Build Coastguard Worker     GLColor color(1, 2, 3, 4);
793*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture);
794*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &color);
795*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
796*8975f5c5SAndroid Build Coastguard Worker 
797*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, mFBO);
798*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
799*8975f5c5SAndroid Build Coastguard Worker 
800*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
801*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
802*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
803*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
804*8975f5c5SAndroid Build Coastguard Worker 
805*8975f5c5SAndroid Build Coastguard Worker     float positionData[] = {0.5f, 0.5f};
806*8975f5c5SAndroid Build Coastguard Worker 
807*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
808*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, 1, 1);
809*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO);
810*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_ARRAY_BUFFER, 0, 1 * 2 * 4, positionData);
811*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
812*8975f5c5SAndroid Build Coastguard Worker 
813*8975f5c5SAndroid Build Coastguard Worker     GLint positionLocation = glGetAttribLocation(mProgram, "aPosition");
814*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(-1, positionLocation);
815*8975f5c5SAndroid Build Coastguard Worker 
816*8975f5c5SAndroid Build Coastguard Worker     GLint testLocation = glGetAttribLocation(mProgram, "aTest");
817*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(-1, testLocation);
818*8975f5c5SAndroid Build Coastguard Worker 
819*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, 0);
820*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(positionLocation);
821*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
822*8975f5c5SAndroid Build Coastguard Worker 
823*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, mPBO);
824*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(testLocation, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, 0);
825*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(testLocation);
826*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
827*8975f5c5SAndroid Build Coastguard Worker 
828*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_POINTS, 0, 1);
829*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
830*8975f5c5SAndroid Build Coastguard Worker 
831*8975f5c5SAndroid Build Coastguard Worker     color = GLColor(0, 0, 0, 0);
832*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &color);
833*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
834*8975f5c5SAndroid Build Coastguard Worker 
835*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(GLColor(1, 2, 3, 4), color);
836*8975f5c5SAndroid Build Coastguard Worker }
837*8975f5c5SAndroid Build Coastguard Worker 
838*8975f5c5SAndroid Build Coastguard Worker // Test that we can correctly update a buffer bound to the vertex stage with PBO.
TEST_P(ReadPixelsPBODrawTest,UpdateVertexArrayWithPixelPack)839*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsPBODrawTest, UpdateVertexArrayWithPixelPack)
840*8975f5c5SAndroid Build Coastguard Worker {
841*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
842*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, 1, 1);
843*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
844*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
845*8975f5c5SAndroid Build Coastguard Worker 
846*8975f5c5SAndroid Build Coastguard Worker     // First draw with pre-defined data.
847*8975f5c5SAndroid Build Coastguard Worker     std::array<float, 2> positionData = {0.5f, 0.5f};
848*8975f5c5SAndroid Build Coastguard Worker 
849*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO);
850*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_ARRAY_BUFFER, 0, positionData.size() * sizeof(positionData[0]),
851*8975f5c5SAndroid Build Coastguard Worker                     positionData.data());
852*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
853*8975f5c5SAndroid Build Coastguard Worker 
854*8975f5c5SAndroid Build Coastguard Worker     GLint positionLocation = glGetAttribLocation(mProgram, "aPosition");
855*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(-1, positionLocation);
856*8975f5c5SAndroid Build Coastguard Worker 
857*8975f5c5SAndroid Build Coastguard Worker     GLint testLocation = glGetAttribLocation(mProgram, "aTest");
858*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(-1, testLocation);
859*8975f5c5SAndroid Build Coastguard Worker 
860*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, 0);
861*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(positionLocation);
862*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
863*8975f5c5SAndroid Build Coastguard Worker 
864*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, mPBO);
865*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLColor), &GLColor::red);
866*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(testLocation, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, 0);
867*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(testLocation);
868*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
869*8975f5c5SAndroid Build Coastguard Worker 
870*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_POINTS, 0, 1);
871*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
872*8975f5c5SAndroid Build Coastguard Worker 
873*8975f5c5SAndroid Build Coastguard Worker     // Update the buffer bound to the VAO with a PBO.
874*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture);
875*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
876*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
877*8975f5c5SAndroid Build Coastguard Worker 
878*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
879*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
880*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
881*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
882*8975f5c5SAndroid Build Coastguard Worker 
883*8975f5c5SAndroid Build Coastguard Worker     // Draw again and verify the VAO has the updated data.
884*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_POINTS, 0, 1);
885*8975f5c5SAndroid Build Coastguard Worker 
886*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
887*8975f5c5SAndroid Build Coastguard Worker }
888*8975f5c5SAndroid Build Coastguard Worker 
889*8975f5c5SAndroid Build Coastguard Worker class ReadPixelsTextureNorm16PBOTest : public ReadPixelsTest
890*8975f5c5SAndroid Build Coastguard Worker {
891*8975f5c5SAndroid Build Coastguard Worker   protected:
testSetUp()892*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
893*8975f5c5SAndroid Build Coastguard Worker     {
894*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
895*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTex);
896*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTex, 0);
897*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
898*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
899*8975f5c5SAndroid Build Coastguard Worker     }
900*8975f5c5SAndroid Build Coastguard Worker 
901*8975f5c5SAndroid Build Coastguard Worker     template <typename T>
test(GLenum format,GLenum internalFormat,GLenum readFormat)902*8975f5c5SAndroid Build Coastguard Worker     void test(GLenum format, GLenum internalFormat, GLenum readFormat)
903*8975f5c5SAndroid Build Coastguard Worker     {
904*8975f5c5SAndroid Build Coastguard Worker         const bool isSigned = std::is_same<T, GLshort>::value;
905*8975f5c5SAndroid Build Coastguard Worker         const GLenum type   = isSigned ? GL_SHORT : GL_UNSIGNED_SHORT;
906*8975f5c5SAndroid Build Coastguard Worker 
907*8975f5c5SAndroid Build Coastguard Worker         T data[4] = {};
908*8975f5c5SAndroid Build Coastguard Worker         data[0]   = isSigned ? -32767 : 32767;
909*8975f5c5SAndroid Build Coastguard Worker         data[1]   = isSigned ? -16383 : 16383;
910*8975f5c5SAndroid Build Coastguard Worker         data[2]   = isSigned ? -8191 : 8191;
911*8975f5c5SAndroid Build Coastguard Worker         data[3]   = isSigned ? -4095 : 4095;
912*8975f5c5SAndroid Build Coastguard Worker 
913*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 1, 1, 0, format, type, data);
914*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
915*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
916*8975f5c5SAndroid Build Coastguard Worker 
917*8975f5c5SAndroid Build Coastguard Worker         bool supportedCombination = true;
918*8975f5c5SAndroid Build Coastguard Worker         if (readFormat != GL_RGBA)
919*8975f5c5SAndroid Build Coastguard Worker         {
920*8975f5c5SAndroid Build Coastguard Worker             GLenum implementationFormat, implementationType;
921*8975f5c5SAndroid Build Coastguard Worker             glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT,
922*8975f5c5SAndroid Build Coastguard Worker                           reinterpret_cast<GLint *>(&implementationFormat));
923*8975f5c5SAndroid Build Coastguard Worker             glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE,
924*8975f5c5SAndroid Build Coastguard Worker                           reinterpret_cast<GLint *>(&implementationType));
925*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_NO_ERROR();
926*8975f5c5SAndroid Build Coastguard Worker 
927*8975f5c5SAndroid Build Coastguard Worker             supportedCombination = implementationFormat == readFormat && implementationType == type;
928*8975f5c5SAndroid Build Coastguard Worker         }
929*8975f5c5SAndroid Build Coastguard Worker 
930*8975f5c5SAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_PACK_BUFFER, 12, nullptr, GL_STATIC_COPY);
931*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
932*8975f5c5SAndroid Build Coastguard Worker 
933*8975f5c5SAndroid Build Coastguard Worker         // Use non-zero offset for better code coverage
934*8975f5c5SAndroid Build Coastguard Worker         constexpr GLint offset = 4;
935*8975f5c5SAndroid Build Coastguard Worker         glReadPixels(0, 0, 1, 1, readFormat, type, reinterpret_cast<void *>(offset));
936*8975f5c5SAndroid Build Coastguard Worker         if (supportedCombination)
937*8975f5c5SAndroid Build Coastguard Worker         {
938*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_NO_ERROR();
939*8975f5c5SAndroid Build Coastguard Worker         }
940*8975f5c5SAndroid Build Coastguard Worker         else
941*8975f5c5SAndroid Build Coastguard Worker         {
942*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_ERROR(GL_INVALID_OPERATION);
943*8975f5c5SAndroid Build Coastguard Worker             ANGLE_SKIP_TEST_IF(!supportedCombination);
944*8975f5c5SAndroid Build Coastguard Worker         }
945*8975f5c5SAndroid Build Coastguard Worker 
946*8975f5c5SAndroid Build Coastguard Worker         T *dataRead =
947*8975f5c5SAndroid Build Coastguard Worker             static_cast<T *>(glMapBufferRange(GL_PIXEL_PACK_BUFFER, offset, 8, GL_MAP_READ_BIT));
948*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
949*8975f5c5SAndroid Build Coastguard Worker 
950*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(dataRead[0], data[0]);
951*8975f5c5SAndroid Build Coastguard Worker         if (readFormat == GL_RGBA || readFormat == GL_RG)
952*8975f5c5SAndroid Build Coastguard Worker         {
953*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(dataRead[1], format != GL_RED ? data[1] : 0);
954*8975f5c5SAndroid Build Coastguard Worker         }
955*8975f5c5SAndroid Build Coastguard Worker         if (readFormat == GL_RGBA)
956*8975f5c5SAndroid Build Coastguard Worker         {
957*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(dataRead[2], format == GL_RGBA ? data[2] : 0);
958*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(dataRead[3], format == GL_RGBA ? data[3] : (isSigned ? 32767 : 65535));
959*8975f5c5SAndroid Build Coastguard Worker         }
960*8975f5c5SAndroid Build Coastguard Worker         glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
961*8975f5c5SAndroid Build Coastguard Worker     }
962*8975f5c5SAndroid Build Coastguard Worker 
testUnsigned(GLenum format,GLenum internalFormat,GLenum readFormat)963*8975f5c5SAndroid Build Coastguard Worker     void testUnsigned(GLenum format, GLenum internalFormat, GLenum readFormat)
964*8975f5c5SAndroid Build Coastguard Worker     {
965*8975f5c5SAndroid Build Coastguard Worker         ASSERT(internalFormat == GL_RGBA16_EXT || internalFormat == GL_RG16_EXT ||
966*8975f5c5SAndroid Build Coastguard Worker                internalFormat == GL_R16_EXT);
967*8975f5c5SAndroid Build Coastguard Worker         test<GLushort>(format, internalFormat, readFormat);
968*8975f5c5SAndroid Build Coastguard Worker     }
969*8975f5c5SAndroid Build Coastguard Worker 
testSigned(GLenum format,GLenum internalFormat,GLenum readFormat)970*8975f5c5SAndroid Build Coastguard Worker     void testSigned(GLenum format, GLenum internalFormat, GLenum readFormat)
971*8975f5c5SAndroid Build Coastguard Worker     {
972*8975f5c5SAndroid Build Coastguard Worker         ASSERT(internalFormat == GL_RGBA16_SNORM_EXT || internalFormat == GL_RG16_SNORM_EXT ||
973*8975f5c5SAndroid Build Coastguard Worker                internalFormat == GL_R16_SNORM_EXT);
974*8975f5c5SAndroid Build Coastguard Worker         test<GLshort>(format, internalFormat, readFormat);
975*8975f5c5SAndroid Build Coastguard Worker     }
976*8975f5c5SAndroid Build Coastguard Worker 
977*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer mFBO;
978*8975f5c5SAndroid Build Coastguard Worker     GLTexture mTex;
979*8975f5c5SAndroid Build Coastguard Worker     GLBuffer mPBO;
980*8975f5c5SAndroid Build Coastguard Worker };
981*8975f5c5SAndroid Build Coastguard Worker 
982*8975f5c5SAndroid Build Coastguard Worker // Test PBO RGBA readback for RGBA16 color buffer.
TEST_P(ReadPixelsTextureNorm16PBOTest,RGBA16_RGBA)983*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureNorm16PBOTest, RGBA16_RGBA)
984*8975f5c5SAndroid Build Coastguard Worker {
985*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
986*8975f5c5SAndroid Build Coastguard Worker     testUnsigned(GL_RGBA, GL_RGBA16_EXT, GL_RGBA);
987*8975f5c5SAndroid Build Coastguard Worker }
988*8975f5c5SAndroid Build Coastguard Worker 
989*8975f5c5SAndroid Build Coastguard Worker // Test PBO RGBA readback for RG16 color buffer.
TEST_P(ReadPixelsTextureNorm16PBOTest,RG16_RGBA)990*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureNorm16PBOTest, RG16_RGBA)
991*8975f5c5SAndroid Build Coastguard Worker {
992*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
993*8975f5c5SAndroid Build Coastguard Worker     testUnsigned(GL_RG, GL_RG16_EXT, GL_RGBA);
994*8975f5c5SAndroid Build Coastguard Worker }
995*8975f5c5SAndroid Build Coastguard Worker 
996*8975f5c5SAndroid Build Coastguard Worker // Test PBO RG readback for RG16 color buffer.
TEST_P(ReadPixelsTextureNorm16PBOTest,RG16_RG)997*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureNorm16PBOTest, RG16_RG)
998*8975f5c5SAndroid Build Coastguard Worker {
999*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
1000*8975f5c5SAndroid Build Coastguard Worker     testUnsigned(GL_RG, GL_RG16_EXT, GL_RG);
1001*8975f5c5SAndroid Build Coastguard Worker }
1002*8975f5c5SAndroid Build Coastguard Worker 
1003*8975f5c5SAndroid Build Coastguard Worker // Test PBO RGBA readback for R16 color buffer.
TEST_P(ReadPixelsTextureNorm16PBOTest,R16_RGBA)1004*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureNorm16PBOTest, R16_RGBA)
1005*8975f5c5SAndroid Build Coastguard Worker {
1006*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
1007*8975f5c5SAndroid Build Coastguard Worker     testUnsigned(GL_RED, GL_R16_EXT, GL_RGBA);
1008*8975f5c5SAndroid Build Coastguard Worker }
1009*8975f5c5SAndroid Build Coastguard Worker 
1010*8975f5c5SAndroid Build Coastguard Worker // Test PBO RED readback for R16 color buffer.
TEST_P(ReadPixelsTextureNorm16PBOTest,R16_RED)1011*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureNorm16PBOTest, R16_RED)
1012*8975f5c5SAndroid Build Coastguard Worker {
1013*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
1014*8975f5c5SAndroid Build Coastguard Worker     testUnsigned(GL_RED, GL_R16_EXT, GL_RED);
1015*8975f5c5SAndroid Build Coastguard Worker }
1016*8975f5c5SAndroid Build Coastguard Worker 
1017*8975f5c5SAndroid Build Coastguard Worker // Test PBO RGBA readback for RGBA16_SNORM color buffer.
TEST_P(ReadPixelsTextureNorm16PBOTest,RGBA16_SNORM_RGBA)1018*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureNorm16PBOTest, RGBA16_SNORM_RGBA)
1019*8975f5c5SAndroid Build Coastguard Worker {
1020*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_render_snorm"));
1021*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
1022*8975f5c5SAndroid Build Coastguard Worker     testSigned(GL_RGBA, GL_RGBA16_SNORM_EXT, GL_RGBA);
1023*8975f5c5SAndroid Build Coastguard Worker }
1024*8975f5c5SAndroid Build Coastguard Worker 
1025*8975f5c5SAndroid Build Coastguard Worker // Test PBO RGBA readback for RG16_SNORM color buffer.
TEST_P(ReadPixelsTextureNorm16PBOTest,RG16_SNORM_RGBA)1026*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureNorm16PBOTest, RG16_SNORM_RGBA)
1027*8975f5c5SAndroid Build Coastguard Worker {
1028*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_render_snorm"));
1029*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
1030*8975f5c5SAndroid Build Coastguard Worker     testSigned(GL_RG, GL_RG16_SNORM_EXT, GL_RGBA);
1031*8975f5c5SAndroid Build Coastguard Worker }
1032*8975f5c5SAndroid Build Coastguard Worker 
1033*8975f5c5SAndroid Build Coastguard Worker // Test PBO RG readback for RG16_SNORM color buffer.
TEST_P(ReadPixelsTextureNorm16PBOTest,RG16_SNORM_RG)1034*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureNorm16PBOTest, RG16_SNORM_RG)
1035*8975f5c5SAndroid Build Coastguard Worker {
1036*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_render_snorm"));
1037*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
1038*8975f5c5SAndroid Build Coastguard Worker     testSigned(GL_RG, GL_RG16_SNORM_EXT, GL_RG);
1039*8975f5c5SAndroid Build Coastguard Worker }
1040*8975f5c5SAndroid Build Coastguard Worker 
1041*8975f5c5SAndroid Build Coastguard Worker // Test PBO RGBA readback for R16_SNORM color buffer.
TEST_P(ReadPixelsTextureNorm16PBOTest,R16_SNORM_RGBA)1042*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureNorm16PBOTest, R16_SNORM_RGBA)
1043*8975f5c5SAndroid Build Coastguard Worker {
1044*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_render_snorm"));
1045*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
1046*8975f5c5SAndroid Build Coastguard Worker     testSigned(GL_RED, GL_R16_SNORM_EXT, GL_RGBA);
1047*8975f5c5SAndroid Build Coastguard Worker }
1048*8975f5c5SAndroid Build Coastguard Worker 
1049*8975f5c5SAndroid Build Coastguard Worker // Test PBO RED readback for R16_SNORM color buffer.
TEST_P(ReadPixelsTextureNorm16PBOTest,R16_SNORM_RED)1050*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureNorm16PBOTest, R16_SNORM_RED)
1051*8975f5c5SAndroid Build Coastguard Worker {
1052*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_render_snorm"));
1053*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
1054*8975f5c5SAndroid Build Coastguard Worker     testSigned(GL_RED, GL_R16_SNORM_EXT, GL_RED);
1055*8975f5c5SAndroid Build Coastguard Worker }
1056*8975f5c5SAndroid Build Coastguard Worker 
1057*8975f5c5SAndroid Build Coastguard Worker class ReadPixelsMultisampleTest : public ReadPixelsTest
1058*8975f5c5SAndroid Build Coastguard Worker {
1059*8975f5c5SAndroid Build Coastguard Worker   protected:
ReadPixelsMultisampleTest()1060*8975f5c5SAndroid Build Coastguard Worker     ReadPixelsMultisampleTest() : mFBO(0), mRBO(0), mPBO(0)
1061*8975f5c5SAndroid Build Coastguard Worker     {
1062*8975f5c5SAndroid Build Coastguard Worker         setSamples(4);
1063*8975f5c5SAndroid Build Coastguard Worker         setMultisampleEnabled(true);
1064*8975f5c5SAndroid Build Coastguard Worker     }
1065*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()1066*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
1067*8975f5c5SAndroid Build Coastguard Worker     {
1068*8975f5c5SAndroid Build Coastguard Worker         glGenFramebuffers(1, &mFBO);
1069*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
1070*8975f5c5SAndroid Build Coastguard Worker 
1071*8975f5c5SAndroid Build Coastguard Worker         glGenRenderbuffers(1, &mRBO);
1072*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, mRBO);
1073*8975f5c5SAndroid Build Coastguard Worker 
1074*8975f5c5SAndroid Build Coastguard Worker         glGenBuffers(1, &mPBO);
1075*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
1076*8975f5c5SAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_PACK_BUFFER, 4 * getWindowWidth() * getWindowHeight(), nullptr,
1077*8975f5c5SAndroid Build Coastguard Worker                      GL_STATIC_DRAW);
1078*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
1079*8975f5c5SAndroid Build Coastguard Worker 
1080*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1081*8975f5c5SAndroid Build Coastguard Worker     }
1082*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()1083*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
1084*8975f5c5SAndroid Build Coastguard Worker     {
1085*8975f5c5SAndroid Build Coastguard Worker         glDeleteFramebuffers(1, &mFBO);
1086*8975f5c5SAndroid Build Coastguard Worker         glDeleteRenderbuffers(1, &mRBO);
1087*8975f5c5SAndroid Build Coastguard Worker         glDeleteBuffers(1, &mPBO);
1088*8975f5c5SAndroid Build Coastguard Worker     }
1089*8975f5c5SAndroid Build Coastguard Worker 
1090*8975f5c5SAndroid Build Coastguard Worker     GLuint mFBO;
1091*8975f5c5SAndroid Build Coastguard Worker     GLuint mRBO;
1092*8975f5c5SAndroid Build Coastguard Worker     GLuint mPBO;
1093*8975f5c5SAndroid Build Coastguard Worker };
1094*8975f5c5SAndroid Build Coastguard Worker 
1095*8975f5c5SAndroid Build Coastguard Worker // Test ReadPixels from a multisampled framebuffer.
TEST_P(ReadPixelsMultisampleTest,BasicClear)1096*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsMultisampleTest, BasicClear)
1097*8975f5c5SAndroid Build Coastguard Worker {
1098*8975f5c5SAndroid Build Coastguard Worker     if (getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_ANGLE_framebuffer_multisample"))
1099*8975f5c5SAndroid Build Coastguard Worker     {
1100*8975f5c5SAndroid Build Coastguard Worker         std::cout
1101*8975f5c5SAndroid Build Coastguard Worker             << "Test skipped because ES3 or GL_ANGLE_framebuffer_multisample is not available."
1102*8975f5c5SAndroid Build Coastguard Worker             << std::endl;
1103*8975f5c5SAndroid Build Coastguard Worker         return;
1104*8975f5c5SAndroid Build Coastguard Worker     }
1105*8975f5c5SAndroid Build Coastguard Worker 
1106*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_ANGLE_framebuffer_multisample"))
1107*8975f5c5SAndroid Build Coastguard Worker     {
1108*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 2, GL_RGBA8, 4, 4);
1109*8975f5c5SAndroid Build Coastguard Worker     }
1110*8975f5c5SAndroid Build Coastguard Worker     else
1111*8975f5c5SAndroid Build Coastguard Worker     {
1112*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_RGBA8, 4, 4);
1113*8975f5c5SAndroid Build Coastguard Worker     }
1114*8975f5c5SAndroid Build Coastguard Worker 
1115*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mRBO);
1116*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1117*8975f5c5SAndroid Build Coastguard Worker 
1118*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
1119*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1120*8975f5c5SAndroid Build Coastguard Worker 
1121*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
1122*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1123*8975f5c5SAndroid Build Coastguard Worker 
1124*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 1, 1, GL_RGBA8, GL_UNSIGNED_BYTE, nullptr);
1125*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1126*8975f5c5SAndroid Build Coastguard Worker }
1127*8975f5c5SAndroid Build Coastguard Worker 
1128*8975f5c5SAndroid Build Coastguard Worker // Test ReadPixels from a multisampled swapchain.
TEST_P(ReadPixelsMultisampleTest,DefaultFramebuffer)1129*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsMultisampleTest, DefaultFramebuffer)
1130*8975f5c5SAndroid Build Coastguard Worker {
1131*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
1132*8975f5c5SAndroid Build Coastguard Worker 
1133*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
1134*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1135*8975f5c5SAndroid Build Coastguard Worker 
1136*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth(), getWindowHeight(), GLColor::red);
1137*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1138*8975f5c5SAndroid Build Coastguard Worker }
1139*8975f5c5SAndroid Build Coastguard Worker 
1140*8975f5c5SAndroid Build Coastguard Worker // Test ReadPixels from a multisampled swapchain into a PBO.
TEST_P(ReadPixelsMultisampleTest,DefaultFramebufferPBO)1141*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsMultisampleTest, DefaultFramebufferPBO)
1142*8975f5c5SAndroid Build Coastguard Worker {
1143*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
1144*8975f5c5SAndroid Build Coastguard Worker 
1145*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
1146*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1147*8975f5c5SAndroid Build Coastguard Worker 
1148*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
1149*8975f5c5SAndroid Build Coastguard Worker 
1150*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth();
1151*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight();
1152*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1153*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1154*8975f5c5SAndroid Build Coastguard Worker 
1155*8975f5c5SAndroid Build Coastguard Worker     const std::vector<angle::GLColor> expectedColor(w * h, GLColor::red);
1156*8975f5c5SAndroid Build Coastguard Worker     std::vector<angle::GLColor> actualColor(w * h);
1157*8975f5c5SAndroid Build Coastguard Worker     const void *mapPointer =
1158*8975f5c5SAndroid Build Coastguard Worker         glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, sizeof(angle::GLColor) * w * h, GL_MAP_READ_BIT);
1159*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, mapPointer);
1160*8975f5c5SAndroid Build Coastguard Worker     memcpy(actualColor.data(), mapPointer, sizeof(angle::GLColor) * w * h);
1161*8975f5c5SAndroid Build Coastguard Worker     glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
1162*8975f5c5SAndroid Build Coastguard Worker 
1163*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(expectedColor, actualColor);
1164*8975f5c5SAndroid Build Coastguard Worker }
1165*8975f5c5SAndroid Build Coastguard Worker 
1166*8975f5c5SAndroid Build Coastguard Worker class ReadPixelsTextureTest : public ANGLETest<>
1167*8975f5c5SAndroid Build Coastguard Worker {
1168*8975f5c5SAndroid Build Coastguard Worker   public:
ReadPixelsTextureTest()1169*8975f5c5SAndroid Build Coastguard Worker     ReadPixelsTextureTest() : mFBO(0), mTextureRGBA(0), mTextureBGRA(0)
1170*8975f5c5SAndroid Build Coastguard Worker     {
1171*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(32);
1172*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(32);
1173*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
1174*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
1175*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
1176*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
1177*8975f5c5SAndroid Build Coastguard Worker     }
1178*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()1179*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
1180*8975f5c5SAndroid Build Coastguard Worker     {
1181*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTextureRGBA);
1182*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTextureBGRA);
1183*8975f5c5SAndroid Build Coastguard Worker         glGenFramebuffers(1, &mFBO);
1184*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
1185*8975f5c5SAndroid Build Coastguard Worker     }
1186*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()1187*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
1188*8975f5c5SAndroid Build Coastguard Worker     {
1189*8975f5c5SAndroid Build Coastguard Worker         glDeleteFramebuffers(1, &mFBO);
1190*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTextureRGBA);
1191*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTextureBGRA);
1192*8975f5c5SAndroid Build Coastguard Worker     }
1193*8975f5c5SAndroid Build Coastguard Worker 
initTextureRGBA(GLenum textureTarget,GLint levels,GLint attachmentLevel,GLint attachmentLayer)1194*8975f5c5SAndroid Build Coastguard Worker     void initTextureRGBA(GLenum textureTarget,
1195*8975f5c5SAndroid Build Coastguard Worker                          GLint levels,
1196*8975f5c5SAndroid Build Coastguard Worker                          GLint attachmentLevel,
1197*8975f5c5SAndroid Build Coastguard Worker                          GLint attachmentLayer)
1198*8975f5c5SAndroid Build Coastguard Worker     {
1199*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(textureTarget, mTextureRGBA);
1200*8975f5c5SAndroid Build Coastguard Worker         glTexStorage3D(textureTarget, levels, GL_RGBA8, kSize, kSize, kSize);
1201*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTextureRGBA,
1202*8975f5c5SAndroid Build Coastguard Worker                                   attachmentLevel, attachmentLayer);
1203*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1204*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1205*8975f5c5SAndroid Build Coastguard Worker         initializeTextureData(textureTarget, levels, GL_RGBA);
1206*8975f5c5SAndroid Build Coastguard Worker     }
1207*8975f5c5SAndroid Build Coastguard Worker 
initTextureBGRA(GLenum textureTarget,GLint levels,GLint attachmentLevel,GLint attachmentLayer)1208*8975f5c5SAndroid Build Coastguard Worker     void initTextureBGRA(GLenum textureTarget,
1209*8975f5c5SAndroid Build Coastguard Worker                          GLint levels,
1210*8975f5c5SAndroid Build Coastguard Worker                          GLint attachmentLevel,
1211*8975f5c5SAndroid Build Coastguard Worker                          GLint attachmentLayer)
1212*8975f5c5SAndroid Build Coastguard Worker     {
1213*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(textureTarget, mTextureBGRA);
1214*8975f5c5SAndroid Build Coastguard Worker         for (GLint level = 0; level < levels; ++level)
1215*8975f5c5SAndroid Build Coastguard Worker         {
1216*8975f5c5SAndroid Build Coastguard Worker             glTexImage3D(textureTarget, level, GL_BGRA_EXT, kSize >> level, kSize >> level,
1217*8975f5c5SAndroid Build Coastguard Worker                          textureTarget == GL_TEXTURE_3D ? kSize >> level : kSize, 0, GL_BGRA_EXT,
1218*8975f5c5SAndroid Build Coastguard Worker                          GL_UNSIGNED_BYTE, nullptr);
1219*8975f5c5SAndroid Build Coastguard Worker         }
1220*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(textureTarget, GL_TEXTURE_BASE_LEVEL, 0);
1221*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(textureTarget, GL_TEXTURE_MAX_LEVEL, levels - 1);
1222*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTextureBGRA,
1223*8975f5c5SAndroid Build Coastguard Worker                                   attachmentLevel, attachmentLayer);
1224*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1225*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1226*8975f5c5SAndroid Build Coastguard Worker         initializeTextureData(textureTarget, levels, GL_BGRA_EXT);
1227*8975f5c5SAndroid Build Coastguard Worker     }
1228*8975f5c5SAndroid Build Coastguard Worker 
testRead(GLenum textureTarget,GLint levels,GLint attachmentLevel,GLint attachmentLayer)1229*8975f5c5SAndroid Build Coastguard Worker     void testRead(GLenum textureTarget, GLint levels, GLint attachmentLevel, GLint attachmentLayer)
1230*8975f5c5SAndroid Build Coastguard Worker     {
1231*8975f5c5SAndroid Build Coastguard Worker         initTextureRGBA(textureTarget, levels, attachmentLevel, attachmentLayer);
1232*8975f5c5SAndroid Build Coastguard Worker         verifyColor(attachmentLevel, attachmentLayer);
1233*8975f5c5SAndroid Build Coastguard Worker 
1234*8975f5c5SAndroid Build Coastguard Worker         // Skip BGRA test on GL/Nvidia, leading to internal incomplete framebuffer error.
1235*8975f5c5SAndroid Build Coastguard Worker         // http://anglebug.com/42266676
1236*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(IsNVIDIA() && IsOpenGL());
1237*8975f5c5SAndroid Build Coastguard Worker 
1238*8975f5c5SAndroid Build Coastguard Worker         if (IsGLExtensionEnabled("GL_EXT_texture_format_BGRA8888"))
1239*8975f5c5SAndroid Build Coastguard Worker         {
1240*8975f5c5SAndroid Build Coastguard Worker             initTextureBGRA(textureTarget, levels, attachmentLevel, attachmentLayer);
1241*8975f5c5SAndroid Build Coastguard Worker             verifyColor(attachmentLevel, attachmentLayer);
1242*8975f5c5SAndroid Build Coastguard Worker         }
1243*8975f5c5SAndroid Build Coastguard Worker     }
1244*8975f5c5SAndroid Build Coastguard Worker 
initPBO()1245*8975f5c5SAndroid Build Coastguard Worker     void initPBO()
1246*8975f5c5SAndroid Build Coastguard Worker     {
1247*8975f5c5SAndroid Build Coastguard Worker         // Create a buffer big enough to hold mip 0 + allow some offset during readback.
1248*8975f5c5SAndroid Build Coastguard Worker         glGenBuffers(1, &mBuffer);
1249*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_PACK_BUFFER, mBuffer);
1250*8975f5c5SAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_PACK_BUFFER, sizeof(angle::GLColor) * 16 * 2, nullptr,
1251*8975f5c5SAndroid Build Coastguard Worker                      GL_STREAM_COPY);
1252*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1253*8975f5c5SAndroid Build Coastguard Worker     }
1254*8975f5c5SAndroid Build Coastguard Worker 
testPBORead(GLenum textureTarget,GLint levels,GLint attachmentLevel,GLint attachmentLayer)1255*8975f5c5SAndroid Build Coastguard Worker     void testPBORead(GLenum textureTarget,
1256*8975f5c5SAndroid Build Coastguard Worker                      GLint levels,
1257*8975f5c5SAndroid Build Coastguard Worker                      GLint attachmentLevel,
1258*8975f5c5SAndroid Build Coastguard Worker                      GLint attachmentLayer)
1259*8975f5c5SAndroid Build Coastguard Worker     {
1260*8975f5c5SAndroid Build Coastguard Worker         initPBO();
1261*8975f5c5SAndroid Build Coastguard Worker         initTextureRGBA(textureTarget, levels, attachmentLevel, attachmentLayer);
1262*8975f5c5SAndroid Build Coastguard Worker         verifyPBO(attachmentLevel, attachmentLayer);
1263*8975f5c5SAndroid Build Coastguard Worker 
1264*8975f5c5SAndroid Build Coastguard Worker         // Skip BGRA test on GL/Nvidia, leading to internal incomplete framebuffer error.
1265*8975f5c5SAndroid Build Coastguard Worker         // http://anglebug.com/42266676
1266*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(IsNVIDIA() && IsOpenGL());
1267*8975f5c5SAndroid Build Coastguard Worker 
1268*8975f5c5SAndroid Build Coastguard Worker         if (IsGLExtensionEnabled("GL_EXT_texture_format_BGRA8888"))
1269*8975f5c5SAndroid Build Coastguard Worker         {
1270*8975f5c5SAndroid Build Coastguard Worker             initTextureBGRA(textureTarget, levels, attachmentLevel, attachmentLayer);
1271*8975f5c5SAndroid Build Coastguard Worker             verifyPBO(attachmentLevel, attachmentLayer);
1272*8975f5c5SAndroid Build Coastguard Worker         }
1273*8975f5c5SAndroid Build Coastguard Worker     }
1274*8975f5c5SAndroid Build Coastguard Worker 
1275*8975f5c5SAndroid Build Coastguard Worker     // Give each {level,layer} pair a (probably) unique color via random.
getColorValue(GLint level,GLint layer)1276*8975f5c5SAndroid Build Coastguard Worker     GLuint getColorValue(GLint level, GLint layer)
1277*8975f5c5SAndroid Build Coastguard Worker     {
1278*8975f5c5SAndroid Build Coastguard Worker         mRNG.reseed(level + layer * 32);
1279*8975f5c5SAndroid Build Coastguard Worker         return mRNG.randomUInt();
1280*8975f5c5SAndroid Build Coastguard Worker     }
1281*8975f5c5SAndroid Build Coastguard Worker 
verifyColor(GLint level,GLint layer)1282*8975f5c5SAndroid Build Coastguard Worker     void verifyColor(GLint level, GLint layer)
1283*8975f5c5SAndroid Build Coastguard Worker     {
1284*8975f5c5SAndroid Build Coastguard Worker         const angle::GLColor colorValue(getColorValue(level, layer));
1285*8975f5c5SAndroid Build Coastguard Worker         const GLint size = kSize >> level;
1286*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, size, size, colorValue);
1287*8975f5c5SAndroid Build Coastguard Worker     }
1288*8975f5c5SAndroid Build Coastguard Worker 
verifyPBO(GLint level,GLint layer)1289*8975f5c5SAndroid Build Coastguard Worker     void verifyPBO(GLint level, GLint layer)
1290*8975f5c5SAndroid Build Coastguard Worker     {
1291*8975f5c5SAndroid Build Coastguard Worker         const GLint size     = kSize >> level;
1292*8975f5c5SAndroid Build Coastguard Worker         const GLsizei offset = kSize * (level + layer);
1293*8975f5c5SAndroid Build Coastguard Worker         glReadPixels(0, 0, size, size, GL_RGBA, GL_UNSIGNED_BYTE, reinterpret_cast<void *>(offset));
1294*8975f5c5SAndroid Build Coastguard Worker 
1295*8975f5c5SAndroid Build Coastguard Worker         const std::vector<angle::GLColor> expectedColor(size * size, getColorValue(level, layer));
1296*8975f5c5SAndroid Build Coastguard Worker         std::vector<angle::GLColor> actualColor(size * size);
1297*8975f5c5SAndroid Build Coastguard Worker 
1298*8975f5c5SAndroid Build Coastguard Worker         void *mapPointer = glMapBufferRange(GL_PIXEL_PACK_BUFFER, offset,
1299*8975f5c5SAndroid Build Coastguard Worker                                             sizeof(angle::GLColor) * size * size, GL_MAP_READ_BIT);
1300*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(nullptr, mapPointer);
1301*8975f5c5SAndroid Build Coastguard Worker         memcpy(actualColor.data(), mapPointer, sizeof(angle::GLColor) * size * size);
1302*8975f5c5SAndroid Build Coastguard Worker         glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
1303*8975f5c5SAndroid Build Coastguard Worker 
1304*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1305*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(expectedColor, actualColor);
1306*8975f5c5SAndroid Build Coastguard Worker     }
1307*8975f5c5SAndroid Build Coastguard Worker 
initializeTextureData(GLenum textureTarget,GLint levels,GLenum format)1308*8975f5c5SAndroid Build Coastguard Worker     void initializeTextureData(GLenum textureTarget, GLint levels, GLenum format)
1309*8975f5c5SAndroid Build Coastguard Worker     {
1310*8975f5c5SAndroid Build Coastguard Worker         for (GLint level = 0; level < levels; ++level)
1311*8975f5c5SAndroid Build Coastguard Worker         {
1312*8975f5c5SAndroid Build Coastguard Worker             GLint mipSize = kSize >> level;
1313*8975f5c5SAndroid Build Coastguard Worker             GLint layers  = (textureTarget == GL_TEXTURE_3D ? mipSize : kSize);
1314*8975f5c5SAndroid Build Coastguard Worker 
1315*8975f5c5SAndroid Build Coastguard Worker             size_t layerSize = mipSize * mipSize;
1316*8975f5c5SAndroid Build Coastguard Worker             std::vector<GLuint> textureData(layers * layerSize);
1317*8975f5c5SAndroid Build Coastguard Worker 
1318*8975f5c5SAndroid Build Coastguard Worker             for (GLint layer = 0; layer < layers; ++layer)
1319*8975f5c5SAndroid Build Coastguard Worker             {
1320*8975f5c5SAndroid Build Coastguard Worker                 GLuint colorValue = getColorValue(level, layer);
1321*8975f5c5SAndroid Build Coastguard Worker                 size_t offset     = (layer * layerSize);
1322*8975f5c5SAndroid Build Coastguard Worker 
1323*8975f5c5SAndroid Build Coastguard Worker                 if (format == GL_BGRA_EXT)
1324*8975f5c5SAndroid Build Coastguard Worker                 {
1325*8975f5c5SAndroid Build Coastguard Worker                     const GLuint rb = colorValue & 0x00FF00FF;
1326*8975f5c5SAndroid Build Coastguard Worker                     const GLuint br = (rb & 0xFF) << 16 | rb >> 16;
1327*8975f5c5SAndroid Build Coastguard Worker                     const GLuint ga = colorValue & 0xFF00FF00;
1328*8975f5c5SAndroid Build Coastguard Worker                     colorValue      = ga | br;
1329*8975f5c5SAndroid Build Coastguard Worker                 }
1330*8975f5c5SAndroid Build Coastguard Worker 
1331*8975f5c5SAndroid Build Coastguard Worker                 std::fill(textureData.begin() + offset, textureData.begin() + offset + layerSize,
1332*8975f5c5SAndroid Build Coastguard Worker                           colorValue);
1333*8975f5c5SAndroid Build Coastguard Worker             }
1334*8975f5c5SAndroid Build Coastguard Worker 
1335*8975f5c5SAndroid Build Coastguard Worker             glTexSubImage3D(textureTarget, level, 0, 0, 0, mipSize, mipSize, layers, format,
1336*8975f5c5SAndroid Build Coastguard Worker                             GL_UNSIGNED_BYTE, textureData.data());
1337*8975f5c5SAndroid Build Coastguard Worker         }
1338*8975f5c5SAndroid Build Coastguard Worker     }
1339*8975f5c5SAndroid Build Coastguard Worker 
1340*8975f5c5SAndroid Build Coastguard Worker     static constexpr GLint kSize = 4;
1341*8975f5c5SAndroid Build Coastguard Worker 
1342*8975f5c5SAndroid Build Coastguard Worker     angle::RNG mRNG;
1343*8975f5c5SAndroid Build Coastguard Worker     GLuint mFBO;
1344*8975f5c5SAndroid Build Coastguard Worker     GLuint mTextureRGBA;
1345*8975f5c5SAndroid Build Coastguard Worker     GLuint mTextureBGRA;
1346*8975f5c5SAndroid Build Coastguard Worker     GLuint mBuffer;
1347*8975f5c5SAndroid Build Coastguard Worker };
1348*8975f5c5SAndroid Build Coastguard Worker 
1349*8975f5c5SAndroid Build Coastguard Worker // Test 3D attachment readback.
TEST_P(ReadPixelsTextureTest,BasicAttachment3D)1350*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureTest, BasicAttachment3D)
1351*8975f5c5SAndroid Build Coastguard Worker {
1352*8975f5c5SAndroid Build Coastguard Worker     testRead(GL_TEXTURE_3D, 1, 0, 0);
1353*8975f5c5SAndroid Build Coastguard Worker }
1354*8975f5c5SAndroid Build Coastguard Worker 
1355*8975f5c5SAndroid Build Coastguard Worker // Test 3D attachment readback, non-zero mip.
TEST_P(ReadPixelsTextureTest,MipAttachment3D)1356*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureTest, MipAttachment3D)
1357*8975f5c5SAndroid Build Coastguard Worker {
1358*8975f5c5SAndroid Build Coastguard Worker     testRead(GL_TEXTURE_3D, 2, 1, 0);
1359*8975f5c5SAndroid Build Coastguard Worker }
1360*8975f5c5SAndroid Build Coastguard Worker 
1361*8975f5c5SAndroid Build Coastguard Worker // Test 3D attachment readback, non-zero layer.
TEST_P(ReadPixelsTextureTest,LayerAttachment3D)1362*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureTest, LayerAttachment3D)
1363*8975f5c5SAndroid Build Coastguard Worker {
1364*8975f5c5SAndroid Build Coastguard Worker     testRead(GL_TEXTURE_3D, 1, 0, 1);
1365*8975f5c5SAndroid Build Coastguard Worker }
1366*8975f5c5SAndroid Build Coastguard Worker 
1367*8975f5c5SAndroid Build Coastguard Worker // Test 3D attachment readback, non-zero mip and layer.
TEST_P(ReadPixelsTextureTest,MipLayerAttachment3D)1368*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureTest, MipLayerAttachment3D)
1369*8975f5c5SAndroid Build Coastguard Worker {
1370*8975f5c5SAndroid Build Coastguard Worker     testRead(GL_TEXTURE_3D, 2, 1, 1);
1371*8975f5c5SAndroid Build Coastguard Worker }
1372*8975f5c5SAndroid Build Coastguard Worker 
1373*8975f5c5SAndroid Build Coastguard Worker // Test 2D array attachment readback.
TEST_P(ReadPixelsTextureTest,BasicAttachment2DArray)1374*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureTest, BasicAttachment2DArray)
1375*8975f5c5SAndroid Build Coastguard Worker {
1376*8975f5c5SAndroid Build Coastguard Worker     testRead(GL_TEXTURE_2D_ARRAY, 1, 0, 0);
1377*8975f5c5SAndroid Build Coastguard Worker }
1378*8975f5c5SAndroid Build Coastguard Worker 
1379*8975f5c5SAndroid Build Coastguard Worker // Test 3D attachment readback, non-zero mip.
TEST_P(ReadPixelsTextureTest,MipAttachment2DArray)1380*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureTest, MipAttachment2DArray)
1381*8975f5c5SAndroid Build Coastguard Worker {
1382*8975f5c5SAndroid Build Coastguard Worker     testRead(GL_TEXTURE_2D_ARRAY, 2, 1, 0);
1383*8975f5c5SAndroid Build Coastguard Worker }
1384*8975f5c5SAndroid Build Coastguard Worker 
1385*8975f5c5SAndroid Build Coastguard Worker // Test 3D attachment readback, non-zero layer.
TEST_P(ReadPixelsTextureTest,LayerAttachment2DArray)1386*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureTest, LayerAttachment2DArray)
1387*8975f5c5SAndroid Build Coastguard Worker {
1388*8975f5c5SAndroid Build Coastguard Worker     testRead(GL_TEXTURE_2D_ARRAY, 1, 0, 1);
1389*8975f5c5SAndroid Build Coastguard Worker }
1390*8975f5c5SAndroid Build Coastguard Worker 
1391*8975f5c5SAndroid Build Coastguard Worker // Test 3D attachment readback, non-zero mip and layer.
TEST_P(ReadPixelsTextureTest,MipLayerAttachment2DArray)1392*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureTest, MipLayerAttachment2DArray)
1393*8975f5c5SAndroid Build Coastguard Worker {
1394*8975f5c5SAndroid Build Coastguard Worker     testRead(GL_TEXTURE_2D_ARRAY, 2, 1, 1);
1395*8975f5c5SAndroid Build Coastguard Worker }
1396*8975f5c5SAndroid Build Coastguard Worker 
1397*8975f5c5SAndroid Build Coastguard Worker // Test 3D attachment PBO readback.
TEST_P(ReadPixelsTextureTest,BasicAttachment3DPBO)1398*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureTest, BasicAttachment3DPBO)
1399*8975f5c5SAndroid Build Coastguard Worker {
1400*8975f5c5SAndroid Build Coastguard Worker     testPBORead(GL_TEXTURE_3D, 1, 0, 0);
1401*8975f5c5SAndroid Build Coastguard Worker }
1402*8975f5c5SAndroid Build Coastguard Worker 
1403*8975f5c5SAndroid Build Coastguard Worker // Test 3D attachment readback, non-zero mip.
TEST_P(ReadPixelsTextureTest,MipAttachment3DPBO)1404*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureTest, MipAttachment3DPBO)
1405*8975f5c5SAndroid Build Coastguard Worker {
1406*8975f5c5SAndroid Build Coastguard Worker     testPBORead(GL_TEXTURE_3D, 2, 1, 0);
1407*8975f5c5SAndroid Build Coastguard Worker }
1408*8975f5c5SAndroid Build Coastguard Worker 
1409*8975f5c5SAndroid Build Coastguard Worker // Test 3D attachment readback, non-zero layer.
TEST_P(ReadPixelsTextureTest,LayerAttachment3DPBO)1410*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureTest, LayerAttachment3DPBO)
1411*8975f5c5SAndroid Build Coastguard Worker {
1412*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40644770
1413*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsIntelUHD630Mobile() && IsDesktopOpenGL());
1414*8975f5c5SAndroid Build Coastguard Worker 
1415*8975f5c5SAndroid Build Coastguard Worker     testPBORead(GL_TEXTURE_3D, 1, 0, 1);
1416*8975f5c5SAndroid Build Coastguard Worker }
1417*8975f5c5SAndroid Build Coastguard Worker 
1418*8975f5c5SAndroid Build Coastguard Worker // Test 3D attachment readback, non-zero mip and layer.
TEST_P(ReadPixelsTextureTest,MipLayerAttachment3DPBO)1419*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureTest, MipLayerAttachment3DPBO)
1420*8975f5c5SAndroid Build Coastguard Worker {
1421*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40644770
1422*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsIntelUHD630Mobile() && IsDesktopOpenGL());
1423*8975f5c5SAndroid Build Coastguard Worker 
1424*8975f5c5SAndroid Build Coastguard Worker     testPBORead(GL_TEXTURE_3D, 2, 1, 1);
1425*8975f5c5SAndroid Build Coastguard Worker }
1426*8975f5c5SAndroid Build Coastguard Worker 
1427*8975f5c5SAndroid Build Coastguard Worker // Test 2D array attachment readback.
TEST_P(ReadPixelsTextureTest,BasicAttachment2DArrayPBO)1428*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureTest, BasicAttachment2DArrayPBO)
1429*8975f5c5SAndroid Build Coastguard Worker {
1430*8975f5c5SAndroid Build Coastguard Worker     testPBORead(GL_TEXTURE_2D_ARRAY, 1, 0, 0);
1431*8975f5c5SAndroid Build Coastguard Worker }
1432*8975f5c5SAndroid Build Coastguard Worker 
1433*8975f5c5SAndroid Build Coastguard Worker // Test 3D attachment readback, non-zero mip.
TEST_P(ReadPixelsTextureTest,MipAttachment2DArrayPBO)1434*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureTest, MipAttachment2DArrayPBO)
1435*8975f5c5SAndroid Build Coastguard Worker {
1436*8975f5c5SAndroid Build Coastguard Worker     testPBORead(GL_TEXTURE_2D_ARRAY, 2, 1, 0);
1437*8975f5c5SAndroid Build Coastguard Worker }
1438*8975f5c5SAndroid Build Coastguard Worker 
1439*8975f5c5SAndroid Build Coastguard Worker // Test 3D attachment readback, non-zero layer.
TEST_P(ReadPixelsTextureTest,LayerAttachment2DArrayPBO)1440*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureTest, LayerAttachment2DArrayPBO)
1441*8975f5c5SAndroid Build Coastguard Worker {
1442*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40644770
1443*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsIntelUHD630Mobile() && IsDesktopOpenGL());
1444*8975f5c5SAndroid Build Coastguard Worker 
1445*8975f5c5SAndroid Build Coastguard Worker     testPBORead(GL_TEXTURE_2D_ARRAY, 1, 0, 1);
1446*8975f5c5SAndroid Build Coastguard Worker }
1447*8975f5c5SAndroid Build Coastguard Worker 
1448*8975f5c5SAndroid Build Coastguard Worker // Test 3D attachment readback, non-zero mip and layer.
TEST_P(ReadPixelsTextureTest,MipLayerAttachment2DArrayPBO)1449*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsTextureTest, MipLayerAttachment2DArrayPBO)
1450*8975f5c5SAndroid Build Coastguard Worker {
1451*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40644770
1452*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsIntelUHD630Mobile() && IsDesktopOpenGL());
1453*8975f5c5SAndroid Build Coastguard Worker 
1454*8975f5c5SAndroid Build Coastguard Worker     testPBORead(GL_TEXTURE_2D_ARRAY, 2, 1, 1);
1455*8975f5c5SAndroid Build Coastguard Worker }
1456*8975f5c5SAndroid Build Coastguard Worker 
1457*8975f5c5SAndroid Build Coastguard Worker // a test class to be used for error checking of glReadPixels
1458*8975f5c5SAndroid Build Coastguard Worker class ReadPixelsErrorTest : public ReadPixelsTest
1459*8975f5c5SAndroid Build Coastguard Worker {
1460*8975f5c5SAndroid Build Coastguard Worker   protected:
ReadPixelsErrorTest()1461*8975f5c5SAndroid Build Coastguard Worker     ReadPixelsErrorTest() : mTexture(0), mFBO(0) {}
1462*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()1463*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
1464*8975f5c5SAndroid Build Coastguard Worker     {
1465*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTexture);
1466*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture);
1467*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 4, 1);
1468*8975f5c5SAndroid Build Coastguard Worker 
1469*8975f5c5SAndroid Build Coastguard Worker         glGenFramebuffers(1, &mFBO);
1470*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
1471*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
1472*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
1473*8975f5c5SAndroid Build Coastguard Worker 
1474*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1475*8975f5c5SAndroid Build Coastguard Worker     }
1476*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()1477*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
1478*8975f5c5SAndroid Build Coastguard Worker     {
1479*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTexture);
1480*8975f5c5SAndroid Build Coastguard Worker         glDeleteFramebuffers(1, &mFBO);
1481*8975f5c5SAndroid Build Coastguard Worker     }
1482*8975f5c5SAndroid Build Coastguard Worker 
testUnsupportedTypeConversions(std::vector<GLenum> internalFormats,std::vector<GLenum> unsupportedTypes)1483*8975f5c5SAndroid Build Coastguard Worker     void testUnsupportedTypeConversions(std::vector<GLenum> internalFormats,
1484*8975f5c5SAndroid Build Coastguard Worker                                         std::vector<GLenum> unsupportedTypes)
1485*8975f5c5SAndroid Build Coastguard Worker     {
1486*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
1487*8975f5c5SAndroid Build Coastguard Worker         for (GLenum internalFormat : internalFormats)
1488*8975f5c5SAndroid Build Coastguard Worker         {
1489*8975f5c5SAndroid Build Coastguard Worker             GLRenderbuffer rbo;
1490*8975f5c5SAndroid Build Coastguard Worker             glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1491*8975f5c5SAndroid Build Coastguard Worker             glRenderbufferStorage(GL_RENDERBUFFER, internalFormat, 1, 1);
1492*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_NO_ERROR();
1493*8975f5c5SAndroid Build Coastguard Worker 
1494*8975f5c5SAndroid Build Coastguard Worker             glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1495*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1496*8975f5c5SAndroid Build Coastguard Worker 
1497*8975f5c5SAndroid Build Coastguard Worker             GLenum implementationFormat, implementationType;
1498*8975f5c5SAndroid Build Coastguard Worker             glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT,
1499*8975f5c5SAndroid Build Coastguard Worker                           reinterpret_cast<GLint *>(&implementationFormat));
1500*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_NO_ERROR();
1501*8975f5c5SAndroid Build Coastguard Worker             glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE,
1502*8975f5c5SAndroid Build Coastguard Worker                           reinterpret_cast<GLint *>(&implementationType));
1503*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_NO_ERROR();
1504*8975f5c5SAndroid Build Coastguard Worker 
1505*8975f5c5SAndroid Build Coastguard Worker             for (GLenum type : unsupportedTypes)
1506*8975f5c5SAndroid Build Coastguard Worker             {
1507*8975f5c5SAndroid Build Coastguard Worker                 uint8_t pixel[8] = {};
1508*8975f5c5SAndroid Build Coastguard Worker                 if (implementationFormat != GL_RGBA || implementationType != type)
1509*8975f5c5SAndroid Build Coastguard Worker                 {
1510*8975f5c5SAndroid Build Coastguard Worker                     glReadPixels(0, 0, 1, 1, GL_RGBA, type, pixel);
1511*8975f5c5SAndroid Build Coastguard Worker                     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1512*8975f5c5SAndroid Build Coastguard Worker                 }
1513*8975f5c5SAndroid Build Coastguard Worker             }
1514*8975f5c5SAndroid Build Coastguard Worker         }
1515*8975f5c5SAndroid Build Coastguard Worker     }
1516*8975f5c5SAndroid Build Coastguard Worker 
1517*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture;
1518*8975f5c5SAndroid Build Coastguard Worker     GLuint mFBO;
1519*8975f5c5SAndroid Build Coastguard Worker };
1520*8975f5c5SAndroid Build Coastguard Worker 
1521*8975f5c5SAndroid Build Coastguard Worker //  The test verifies that glReadPixels generates a GL_INVALID_OPERATION error
1522*8975f5c5SAndroid Build Coastguard Worker //  when the read buffer is GL_NONE.
1523*8975f5c5SAndroid Build Coastguard Worker //  Reference: GLES 3.0.4, Section 4.3.2 Reading Pixels
TEST_P(ReadPixelsErrorTest,ReadBufferIsNone)1524*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsErrorTest, ReadBufferIsNone)
1525*8975f5c5SAndroid Build Coastguard Worker {
1526*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
1527*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_NONE);
1528*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> pixels(4);
1529*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1530*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data());
1531*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1532*8975f5c5SAndroid Build Coastguard Worker }
1533*8975f5c5SAndroid Build Coastguard Worker 
1534*8975f5c5SAndroid Build Coastguard Worker // The test verifies that glReadPixels generates a GL_INVALID_OPERATION
1535*8975f5c5SAndroid Build Coastguard Worker // error when reading signed 8-bit color buffers using incompatible types.
TEST_P(ReadPixelsErrorTest,ColorBufferSnorm8)1536*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsErrorTest, ColorBufferSnorm8)
1537*8975f5c5SAndroid Build Coastguard Worker {
1538*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_render_snorm"));
1539*8975f5c5SAndroid Build Coastguard Worker 
1540*8975f5c5SAndroid Build Coastguard Worker     testUnsupportedTypeConversions({GL_R8_SNORM, GL_RG8_SNORM, GL_RGBA8_SNORM},
1541*8975f5c5SAndroid Build Coastguard Worker                                    {GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT});
1542*8975f5c5SAndroid Build Coastguard Worker }
1543*8975f5c5SAndroid Build Coastguard Worker 
1544*8975f5c5SAndroid Build Coastguard Worker // The test verifies that glReadPixels generates a GL_INVALID_OPERATION
1545*8975f5c5SAndroid Build Coastguard Worker // error when reading signed 16-bit color buffers using incompatible types.
TEST_P(ReadPixelsErrorTest,ColorBufferSnorm16)1546*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsErrorTest, ColorBufferSnorm16)
1547*8975f5c5SAndroid Build Coastguard Worker {
1548*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_render_snorm"));
1549*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
1550*8975f5c5SAndroid Build Coastguard Worker 
1551*8975f5c5SAndroid Build Coastguard Worker     testUnsupportedTypeConversions({GL_R16_SNORM_EXT, GL_RG16_SNORM_EXT, GL_RGBA16_SNORM_EXT},
1552*8975f5c5SAndroid Build Coastguard Worker                                    {GL_BYTE, GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT});
1553*8975f5c5SAndroid Build Coastguard Worker }
1554*8975f5c5SAndroid Build Coastguard Worker 
1555*8975f5c5SAndroid Build Coastguard Worker // a test class to be used for error checking of glReadPixels with WebGLCompatibility
1556*8975f5c5SAndroid Build Coastguard Worker class ReadPixelsWebGLErrorTest : public ReadPixelsTest
1557*8975f5c5SAndroid Build Coastguard Worker {
1558*8975f5c5SAndroid Build Coastguard Worker   protected:
ReadPixelsWebGLErrorTest()1559*8975f5c5SAndroid Build Coastguard Worker     ReadPixelsWebGLErrorTest() : mTexture(0), mFBO(0) { setWebGLCompatibilityEnabled(true); }
1560*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()1561*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
1562*8975f5c5SAndroid Build Coastguard Worker     {
1563*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTexture);
1564*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture);
1565*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 4, 1);
1566*8975f5c5SAndroid Build Coastguard Worker 
1567*8975f5c5SAndroid Build Coastguard Worker         glGenFramebuffers(1, &mFBO);
1568*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
1569*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
1570*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1571*8975f5c5SAndroid Build Coastguard Worker 
1572*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1573*8975f5c5SAndroid Build Coastguard Worker     }
1574*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()1575*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
1576*8975f5c5SAndroid Build Coastguard Worker     {
1577*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTexture);
1578*8975f5c5SAndroid Build Coastguard Worker         glDeleteFramebuffers(1, &mFBO);
1579*8975f5c5SAndroid Build Coastguard Worker     }
1580*8975f5c5SAndroid Build Coastguard Worker 
1581*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture;
1582*8975f5c5SAndroid Build Coastguard Worker     GLuint mFBO;
1583*8975f5c5SAndroid Build Coastguard Worker };
1584*8975f5c5SAndroid Build Coastguard Worker 
1585*8975f5c5SAndroid Build Coastguard Worker // Test that WebGL context readpixels generates an error when reading GL_UNSIGNED_INT_24_8 type.
TEST_P(ReadPixelsWebGLErrorTest,TypeIsUnsignedInt24_8)1586*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsWebGLErrorTest, TypeIsUnsignedInt24_8)
1587*8975f5c5SAndroid Build Coastguard Worker {
1588*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
1589*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
1590*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT0);
1591*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLuint> pixels(4);
1592*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1593*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_INT_24_8, pixels.data());
1594*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
1595*8975f5c5SAndroid Build Coastguard Worker }
1596*8975f5c5SAndroid Build Coastguard Worker 
1597*8975f5c5SAndroid Build Coastguard Worker // Test that WebGL context readpixels generates an error when reading GL_DEPTH_COMPONENT format.
TEST_P(ReadPixelsWebGLErrorTest,FormatIsDepthComponent)1598*8975f5c5SAndroid Build Coastguard Worker TEST_P(ReadPixelsWebGLErrorTest, FormatIsDepthComponent)
1599*8975f5c5SAndroid Build Coastguard Worker {
1600*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
1601*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
1602*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT0);
1603*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> pixels(4);
1604*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1605*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 1, 1, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, pixels.data());
1606*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
1607*8975f5c5SAndroid Build Coastguard Worker }
1608*8975f5c5SAndroid Build Coastguard Worker 
1609*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
1610*8975f5c5SAndroid Build Coastguard Worker 
1611*8975f5c5SAndroid Build Coastguard Worker // Use this to select which configurations (e.g. which renderer, which GLES major version) these
1612*8975f5c5SAndroid Build Coastguard Worker // tests should be run against.
1613*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(ReadPixelsTest);
1614*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(ReadPixelsPBONVTest);
1615*8975f5c5SAndroid Build Coastguard Worker 
1616*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ReadPixelsPBOTest);
1617*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(ReadPixelsPBOTest);
1618*8975f5c5SAndroid Build Coastguard Worker 
1619*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ReadPixelsPBODrawTest);
1620*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3_AND(ReadPixelsPBODrawTest,
1621*8975f5c5SAndroid Build Coastguard Worker                                ES3_VULKAN().enable(Feature::ForceFallbackFormat));
1622*8975f5c5SAndroid Build Coastguard Worker 
1623*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ReadPixelsTextureNorm16PBOTest);
1624*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(ReadPixelsTextureNorm16PBOTest);
1625*8975f5c5SAndroid Build Coastguard Worker 
1626*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ReadPixelsMultisampleTest);
1627*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(ReadPixelsMultisampleTest);
1628*8975f5c5SAndroid Build Coastguard Worker 
1629*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ReadPixelsTextureTest);
1630*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(ReadPixelsTextureTest);
1631*8975f5c5SAndroid Build Coastguard Worker 
1632*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ReadPixelsErrorTest);
1633*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(ReadPixelsErrorTest);
1634*8975f5c5SAndroid Build Coastguard Worker 
1635*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ReadPixelsWebGLErrorTest);
1636*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(ReadPixelsWebGLErrorTest);
1637