blob: 856771539c1c005d1ed83cd3294ef2d23377a78b [file] [log] [blame]
Shannon Woods6b6fd542014-05-06 17:09:19 -04001#include "ANGLETest.h"
2
Austin Kinross18b931d2014-09-29 12:58:31 -07003// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
4typedef ::testing::Types<TFT<Gles::Two, Rend::D3D11>, TFT<Gles::Two, Rend::D3D9>> TestFixtureTypes;
5TYPED_TEST_CASE(PBOExtensionTest, TestFixtureTypes);
6
7template<typename T>
Shannon Woods6b6fd542014-05-06 17:09:19 -04008class PBOExtensionTest : public ANGLETest
9{
10protected:
Austin Kinross18b931d2014-09-29 12:58:31 -070011 PBOExtensionTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetRequestedRenderer())
Shannon Woods6b6fd542014-05-06 17:09:19 -040012 {
Shannon Woods6b6fd542014-05-06 17:09:19 -040013 setWindowWidth(32);
14 setWindowHeight(32);
15 setConfigRedBits(8);
16 setConfigGreenBits(8);
17 setConfigBlueBits(8);
18 setConfigAlphaBits(8);
19 }
20
21 virtual void SetUp()
22 {
23 ANGLETest::SetUp();
24
25 if (extensionEnabled("NV_pixel_buffer_object"))
26 {
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);
31
32 const char *vertexShaderSrc = SHADER_SOURCE
33 (
34 attribute vec4 aTest;
35 attribute vec2 aPosition;
36 varying vec4 vTest;
37
38 void main()
39 {
40 vTest = aTest;
41 gl_Position = vec4(aPosition, 0.0, 1.0);
42 gl_PointSize = 1.0;
43 }
44 );
45
46 const char *fragmentShaderSrc = SHADER_SOURCE
47 (
48 precision mediump float;
49 varying vec4 vTest;
50
51 void main()
52 {
53 gl_FragColor = vTest;
54 }
55 );
56
Jamie Madill5599c8f2014-08-26 13:16:39 -040057 mProgram = CompileProgram(vertexShaderSrc, fragmentShaderSrc);
Shannon Woods6b6fd542014-05-06 17:09:19 -040058
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);
63 }
64 ASSERT_GL_NO_ERROR();
65 }
66
67 virtual void TearDown()
68 {
69 ANGLETest::TearDown();
70
71 glDeleteBuffers(1, &mPBO);
72 glDeleteProgram(mProgram);
73 }
74
75 GLuint mPBO;
76 GLuint mProgram;
77 GLuint mPositionVBO;
78};
79
Austin Kinross18b931d2014-09-29 12:58:31 -070080TYPED_TEST(PBOExtensionTest, PBOWithOtherTarget)
Shannon Woods6b6fd542014-05-06 17:09:19 -040081{
82 if (extensionEnabled("NV_pixel_buffer_object"))
83 {
84 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
85 glClear(GL_COLOR_BUFFER_BIT);
86 EXPECT_GL_NO_ERROR();
87
88 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
89 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
90
91 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
92 glBindBuffer(GL_ARRAY_BUFFER, mPBO);
93
94 GLvoid *mappedPtr = glMapBufferRangeEXT(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
95 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
96 EXPECT_GL_NO_ERROR();
97
98 EXPECT_EQ(255, dataPtr[0]);
99 EXPECT_EQ(0, dataPtr[1]);
100 EXPECT_EQ(0, dataPtr[2]);
101 EXPECT_EQ(255, dataPtr[3]);
102
103 glUnmapBufferOES(GL_ARRAY_BUFFER);
104 }
105 EXPECT_GL_NO_ERROR();
106}
107
Austin Kinross18b931d2014-09-29 12:58:31 -0700108TYPED_TEST(PBOExtensionTest, PBOWithExistingData)
Shannon Woods6b6fd542014-05-06 17:09:19 -0400109{
110 if (extensionEnabled("NV_pixel_buffer_object"))
111 {
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();
116
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);
120
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();
125
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();
131
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]);
137
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]);
143
144 glUnmapBufferOES(GL_PIXEL_PACK_BUFFER);
145 }
146 EXPECT_GL_NO_ERROR();
147}