3 // Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
4 typedef ::testing::Types<TFT<Gles::Two, Rend::D3D11>, TFT<Gles::Two, Rend::D3D9>> TestFixtureTypes;
5 TYPED_TEST_CASE(PBOExtensionTest, TestFixtureTypes);
8 class PBOExtensionTest : public ANGLETest
11 PBOExtensionTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetRequestedRenderer())
16 setConfigGreenBits(8);
18 setConfigAlphaBits(8);
25 if (extensionEnabled("NV_pixel_buffer_object"))
27 glGenBuffers(1, &mPBO);
28 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
29 glBufferData(GL_PIXEL_PACK_BUFFER, 4 * getWindowWidth() * getWindowHeight(), NULL, GL_STATIC_DRAW);
30 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
32 const char *vertexShaderSrc = SHADER_SOURCE
35 attribute vec2 aPosition;
41 gl_Position = vec4(aPosition, 0.0, 1.0);
46 const char *fragmentShaderSrc = SHADER_SOURCE
48 precision mediump float;
57 mProgram = CompileProgram(vertexShaderSrc, fragmentShaderSrc);
59 glGenBuffers(1, &mPositionVBO);
60 glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO);
61 glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_DYNAMIC_DRAW);
62 glBindBuffer(GL_ARRAY_BUFFER, 0);
67 virtual void TearDown()
69 ANGLETest::TearDown();
71 glDeleteBuffers(1, &mPBO);
72 glDeleteProgram(mProgram);
80 TYPED_TEST(PBOExtensionTest, PBOWithOtherTarget)
82 if (extensionEnabled("NV_pixel_buffer_object"))
84 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
85 glClear(GL_COLOR_BUFFER_BIT);
88 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
89 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
91 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
92 glBindBuffer(GL_ARRAY_BUFFER, mPBO);
94 GLvoid *mappedPtr = glMapBufferRangeEXT(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
95 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
98 EXPECT_EQ(255, dataPtr[0]);
99 EXPECT_EQ(0, dataPtr[1]);
100 EXPECT_EQ(0, dataPtr[2]);
101 EXPECT_EQ(255, dataPtr[3]);
103 glUnmapBufferOES(GL_ARRAY_BUFFER);
105 EXPECT_GL_NO_ERROR();
108 TYPED_TEST(PBOExtensionTest, PBOWithExistingData)
110 if (extensionEnabled("NV_pixel_buffer_object"))
112 // Clear backbuffer to red
113 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
114 glClear(GL_COLOR_BUFFER_BIT);
115 EXPECT_GL_NO_ERROR();
117 // Read 16x16 region from red backbuffer to PBO
118 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
119 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
121 // Clear backbuffer to green
122 glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
123 glClear(GL_COLOR_BUFFER_BIT);
124 EXPECT_GL_NO_ERROR();
126 // Read 16x16 region from green backbuffer to PBO at offset 16
127 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, reinterpret_cast<GLvoid*>(16));
128 GLvoid * mappedPtr = glMapBufferRangeEXT(GL_PIXEL_PACK_BUFFER, 0, 32, GL_MAP_READ_BIT);
129 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
130 EXPECT_GL_NO_ERROR();
132 // Test pixel 0 is red (existing data)
133 EXPECT_EQ(255, dataPtr[0]);
134 EXPECT_EQ(0, dataPtr[1]);
135 EXPECT_EQ(0, dataPtr[2]);
136 EXPECT_EQ(255, dataPtr[3]);
138 // Test pixel 16 is green (new data)
139 EXPECT_EQ(0, dataPtr[16 * 4 + 0]);
140 EXPECT_EQ(255, dataPtr[16 * 4 + 1]);
141 EXPECT_EQ(0, dataPtr[16 * 4 + 2]);
142 EXPECT_EQ(255, dataPtr[16 * 4 + 3]);
144 glUnmapBufferOES(GL_PIXEL_PACK_BUFFER);
146 EXPECT_GL_NO_ERROR();