blob: a6547e8e533fbf731b9f6a45eb675dce06cc8c7d [file] [log] [blame]
Shannon Woods6b6fd542014-05-06 17:09:19 -04001#include "ANGLETest.h"
2
3class PBOExtensionTest : public ANGLETest
4{
5protected:
6 PBOExtensionTest()
7 {
8 setClientVersion(2);
9 setWindowWidth(32);
10 setWindowHeight(32);
11 setConfigRedBits(8);
12 setConfigGreenBits(8);
13 setConfigBlueBits(8);
14 setConfigAlphaBits(8);
15 }
16
17 virtual void SetUp()
18 {
19 ANGLETest::SetUp();
20
21 if (extensionEnabled("NV_pixel_buffer_object"))
22 {
23 glGenBuffers(1, &mPBO);
24 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
25 glBufferData(GL_PIXEL_PACK_BUFFER, 4 * getWindowWidth() * getWindowHeight(), NULL, GL_STATIC_DRAW);
26 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
27
28 const char *vertexShaderSrc = SHADER_SOURCE
29 (
30 attribute vec4 aTest;
31 attribute vec2 aPosition;
32 varying vec4 vTest;
33
34 void main()
35 {
36 vTest = aTest;
37 gl_Position = vec4(aPosition, 0.0, 1.0);
38 gl_PointSize = 1.0;
39 }
40 );
41
42 const char *fragmentShaderSrc = SHADER_SOURCE
43 (
44 precision mediump float;
45 varying vec4 vTest;
46
47 void main()
48 {
49 gl_FragColor = vTest;
50 }
51 );
52
53 mProgram = compileProgram(vertexShaderSrc, fragmentShaderSrc);
54
55 glGenBuffers(1, &mPositionVBO);
56 glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO);
57 glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_DYNAMIC_DRAW);
58 glBindBuffer(GL_ARRAY_BUFFER, 0);
59 }
60 ASSERT_GL_NO_ERROR();
61 }
62
63 virtual void TearDown()
64 {
65 ANGLETest::TearDown();
66
67 glDeleteBuffers(1, &mPBO);
68 glDeleteProgram(mProgram);
69 }
70
71 GLuint mPBO;
72 GLuint mProgram;
73 GLuint mPositionVBO;
74};
75
Jamie Madillb759a742014-07-17 10:40:49 -040076TEST_F(PBOExtensionTest, PBOWithOtherTarget)
Shannon Woods6b6fd542014-05-06 17:09:19 -040077{
78 if (extensionEnabled("NV_pixel_buffer_object"))
79 {
80 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
81 glClear(GL_COLOR_BUFFER_BIT);
82 EXPECT_GL_NO_ERROR();
83
84 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
85 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
86
87 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
88 glBindBuffer(GL_ARRAY_BUFFER, mPBO);
89
90 GLvoid *mappedPtr = glMapBufferRangeEXT(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
91 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
92 EXPECT_GL_NO_ERROR();
93
94 EXPECT_EQ(255, dataPtr[0]);
95 EXPECT_EQ(0, dataPtr[1]);
96 EXPECT_EQ(0, dataPtr[2]);
97 EXPECT_EQ(255, dataPtr[3]);
98
99 glUnmapBufferOES(GL_ARRAY_BUFFER);
100 }
101 EXPECT_GL_NO_ERROR();
102}
103
Jamie Madillb759a742014-07-17 10:40:49 -0400104TEST_F(PBOExtensionTest, PBOWithExistingData)
Shannon Woods6b6fd542014-05-06 17:09:19 -0400105{
106 if (extensionEnabled("NV_pixel_buffer_object"))
107 {
108 // Clear backbuffer to red
109 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
110 glClear(GL_COLOR_BUFFER_BIT);
111 EXPECT_GL_NO_ERROR();
112
113 // Read 16x16 region from red backbuffer to PBO
114 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
115 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
116
117 // Clear backbuffer to green
118 glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
119 glClear(GL_COLOR_BUFFER_BIT);
120 EXPECT_GL_NO_ERROR();
121
122 // Read 16x16 region from green backbuffer to PBO at offset 16
123 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, reinterpret_cast<GLvoid*>(16));
124 GLvoid * mappedPtr = glMapBufferRangeEXT(GL_PIXEL_PACK_BUFFER, 0, 32, GL_MAP_READ_BIT);
125 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
126 EXPECT_GL_NO_ERROR();
127
128 // Test pixel 0 is red (existing data)
129 EXPECT_EQ(255, dataPtr[0]);
130 EXPECT_EQ(0, dataPtr[1]);
131 EXPECT_EQ(0, dataPtr[2]);
132 EXPECT_EQ(255, dataPtr[3]);
133
134 // Test pixel 16 is green (new data)
135 EXPECT_EQ(0, dataPtr[16 * 4 + 0]);
136 EXPECT_EQ(255, dataPtr[16 * 4 + 1]);
137 EXPECT_EQ(0, dataPtr[16 * 4 + 2]);
138 EXPECT_EQ(255, dataPtr[16 * 4 + 3]);
139
140 glUnmapBufferOES(GL_PIXEL_PACK_BUFFER);
141 }
142 EXPECT_GL_NO_ERROR();
143}