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