Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / tests / angle_tests / PBOExtensionTest.cpp
1 #include "ANGLETest.h"
2
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);
6
7 template<typename T>
8 class PBOExtensionTest : public ANGLETest
9 {
10 protected:
11     PBOExtensionTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetRequestedRenderer())
12     {
13         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
57             mProgram = CompileProgram(vertexShaderSrc, fragmentShaderSrc);
58
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
80 TYPED_TEST(PBOExtensionTest, PBOWithOtherTarget)
81 {
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
108 TYPED_TEST(PBOExtensionTest, PBOWithExistingData)
109 {
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 }