blob: 3559add1337f056ce5a996c6b163ad7b2ca6092b [file] [log] [blame]
Geoff Langf11dbdb2013-10-23 14:37:58 -04001#include "ANGLETest.h"
2
3class ReadPixelsTest : public ANGLETest
4{
5protected:
6 ReadPixelsTest()
7 {
Jamie Madill8a7bed82014-05-01 14:51:07 -04008 setClientVersion(3);
Geoff Langf11dbdb2013-10-23 14:37:58 -04009 setWindowWidth(32);
10 setWindowHeight(32);
11 setConfigRedBits(8);
12 setConfigGreenBits(8);
13 setConfigBlueBits(8);
14 setConfigAlphaBits(8);
15 }
Jamie Madill8a7bed82014-05-01 14:51:07 -040016
17 virtual void SetUp()
18 {
19 ANGLETest::SetUp();
20
21 glGenBuffers(1, &mPBO);
22 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
23 glBufferData(GL_PIXEL_PACK_BUFFER, 4 * getWindowWidth() * getWindowHeight(), NULL, GL_STATIC_DRAW);
24 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
25
26 const char *vertexShaderSrc = SHADER_SOURCE
27 (
28 attribute vec4 aTest;
29 attribute vec2 aPosition;
30 varying vec4 vTest;
31
32 void main()
33 {
34 vTest = aTest;
35 gl_Position = vec4(aPosition, 0.0, 1.0);
36 gl_PointSize = 1.0;
37 }
38 );
39
40 const char *fragmentShaderSrc = SHADER_SOURCE
41 (
42 precision mediump float;
43 varying vec4 vTest;
44
45 void main()
46 {
47 gl_FragColor = vTest;
48 }
49 );
50
51 mProgram = compileProgram(vertexShaderSrc, fragmentShaderSrc);
52
53 glGenTextures(1, &mTexture);
54 glBindTexture(GL_TEXTURE_2D, mTexture);
55 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 4, 1);
56
57 glGenFramebuffers(1, &mFBO);
58 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
59 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
60 glBindFramebuffer(GL_FRAMEBUFFER, 0);
61
62 glGenBuffers(1, &mPositionVBO);
63 glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO);
64 glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_DYNAMIC_DRAW);
65 glBindBuffer(GL_ARRAY_BUFFER, 0);
66
67 ASSERT_GL_NO_ERROR();
68 }
69
70 virtual void TearDown()
71 {
72 ANGLETest::TearDown();
73
74 glDeleteBuffers(1, &mPBO);
75 glDeleteProgram(mProgram);
76 glDeleteTextures(1, &mTexture);
77 glDeleteFramebuffers(1, &mFBO);
78 }
79
80 GLuint mPBO;
81 GLuint mProgram;
82 GLuint mTexture;
83 GLuint mFBO;
84 GLuint mPositionVBO;
Geoff Langf11dbdb2013-10-23 14:37:58 -040085};
86
87TEST_F(ReadPixelsTest, out_of_bounds)
88{
89 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
90 glClear(GL_COLOR_BUFFER_BIT);
91 EXPECT_GL_NO_ERROR();
92
93 GLsizei pixelsWidth = 32;
94 GLsizei pixelsHeight = 32;
Jamie Madill1eb5bd72014-03-28 10:43:39 -040095 GLint offset = 16;
96 std::vector<GLubyte> pixels((pixelsWidth + offset) * (pixelsHeight + offset) * 4);
Geoff Langf11dbdb2013-10-23 14:37:58 -040097
Jamie Madill1eb5bd72014-03-28 10:43:39 -040098 glReadPixels(-offset, -offset, pixelsWidth + offset, pixelsHeight + offset, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data());
Geoff Langf11dbdb2013-10-23 14:37:58 -040099 EXPECT_GL_NO_ERROR();
100
101 for (int y = pixelsHeight / 2; y < pixelsHeight; y++)
102 {
103 for (int x = pixelsWidth / 2; x < pixelsWidth; x++)
104 {
Jamie Madill1eb5bd72014-03-28 10:43:39 -0400105 const GLubyte* pixel = pixels.data() + ((y * (pixelsWidth + offset) + x) * 4);
106 unsigned int r = static_cast<unsigned int>(pixel[0]);
107 unsigned int g = static_cast<unsigned int>(pixel[1]);
108 unsigned int b = static_cast<unsigned int>(pixel[2]);
109 unsigned int a = static_cast<unsigned int>(pixel[3]);
Geoff Langf11dbdb2013-10-23 14:37:58 -0400110
111 // Expect that all pixels which fell within the framebuffer are red
Jamie Madill1eb5bd72014-03-28 10:43:39 -0400112 EXPECT_EQ(255, r);
113 EXPECT_EQ(0, g);
114 EXPECT_EQ(0, b);
115 EXPECT_EQ(255, a);
Geoff Langf11dbdb2013-10-23 14:37:58 -0400116 }
117 }
118}
Jamie Madill8a7bed82014-05-01 14:51:07 -0400119
120TEST_F(ReadPixelsTest, pbo_with_other_target)
121{
122 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
123 glClear(GL_COLOR_BUFFER_BIT);
124 EXPECT_GL_NO_ERROR();
125
126 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
127 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
128
129 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
130 glBindBuffer(GL_ARRAY_BUFFER, mPBO);
131
132 GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
133 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
134 EXPECT_GL_NO_ERROR();
135
136 EXPECT_EQ(255, dataPtr[0]);
137 EXPECT_EQ(0, dataPtr[1]);
138 EXPECT_EQ(0, dataPtr[2]);
139 EXPECT_EQ(255, dataPtr[3]);
140
141 glUnmapBuffer(GL_ARRAY_BUFFER);
142 EXPECT_GL_NO_ERROR();
143}