1 //
2 // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 #include "test_utils/ANGLETest.h"
8 
9 using namespace angle;
10 
11 class PBOExtensionTest : public ANGLETest
12 {
13   protected:
PBOExtensionTest()14     PBOExtensionTest()
15     {
16         setWindowWidth(32);
17         setWindowHeight(32);
18         setConfigRedBits(8);
19         setConfigGreenBits(8);
20         setConfigBlueBits(8);
21         setConfigAlphaBits(8);
22     }
23 
SetUp()24     virtual void SetUp()
25     {
26         ANGLETest::SetUp();
27 
28         if (extensionEnabled("NV_pixel_buffer_object"))
29         {
30             glGenBuffers(1, &mPBO);
31             glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
32             glBufferData(GL_PIXEL_PACK_BUFFER, 4 * getWindowWidth() * getWindowHeight(), NULL, GL_STATIC_DRAW);
33             glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
34 
35             const char *vertexShaderSrc = SHADER_SOURCE
36             (
37                 attribute vec4 aTest;
38                 attribute vec2 aPosition;
39                 varying vec4 vTest;
40 
41                 void main()
42                 {
43                     vTest = aTest;
44                     gl_Position = vec4(aPosition, 0.0, 1.0);
45                     gl_PointSize = 1.0;
46                 }
47             );
48 
49             const char *fragmentShaderSrc = SHADER_SOURCE
50             (
51                 precision mediump float;
52                 varying vec4 vTest;
53 
54                 void main()
55                 {
56                     gl_FragColor = vTest;
57                 }
58             );
59 
60             mProgram = CompileProgram(vertexShaderSrc, fragmentShaderSrc);
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 
TearDown()70     virtual void TearDown()
71     {
72         ANGLETest::TearDown();
73 
74         glDeleteBuffers(1, &mPBO);
75         glDeleteProgram(mProgram);
76     }
77 
78     GLuint mPBO;
79     GLuint mProgram;
80     GLuint mPositionVBO;
81 };
82 
TEST_P(PBOExtensionTest,PBOWithOtherTarget)83 TEST_P(PBOExtensionTest, PBOWithOtherTarget)
84 {
85     if (extensionEnabled("NV_pixel_buffer_object"))
86     {
87         glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
88         glClear(GL_COLOR_BUFFER_BIT);
89         EXPECT_GL_NO_ERROR();
90 
91         glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
92         glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
93 
94         glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
95         glBindBuffer(GL_ARRAY_BUFFER, mPBO);
96 
97         GLvoid *mappedPtr = glMapBufferRangeEXT(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
98         unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
99         EXPECT_GL_NO_ERROR();
100 
101         EXPECT_EQ(255, dataPtr[0]);
102         EXPECT_EQ(0,   dataPtr[1]);
103         EXPECT_EQ(0,   dataPtr[2]);
104         EXPECT_EQ(255, dataPtr[3]);
105 
106         glUnmapBufferOES(GL_ARRAY_BUFFER);
107     }
108     EXPECT_GL_NO_ERROR();
109 }
110 
TEST_P(PBOExtensionTest,PBOWithExistingData)111 TEST_P(PBOExtensionTest, PBOWithExistingData)
112 {
113     if (extensionEnabled("NV_pixel_buffer_object"))
114     {
115         // Clear backbuffer to red
116         glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
117         glClear(GL_COLOR_BUFFER_BIT);
118         EXPECT_GL_NO_ERROR();
119 
120         // Read 16x16 region from red backbuffer to PBO
121         glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
122         glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
123 
124         // Clear backbuffer to green
125         glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
126         glClear(GL_COLOR_BUFFER_BIT);
127         EXPECT_GL_NO_ERROR();
128 
129         // Read 16x16 region from green backbuffer to PBO at offset 16
130         glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, reinterpret_cast<GLvoid*>(16));
131         GLvoid * mappedPtr = glMapBufferRangeEXT(GL_PIXEL_PACK_BUFFER, 0, 32, GL_MAP_READ_BIT);
132         unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
133         EXPECT_GL_NO_ERROR();
134 
135         // Test pixel 0 is red (existing data)
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         // Test pixel 16 is green (new data)
142         EXPECT_EQ(0, dataPtr[16 * 4 + 0]);
143         EXPECT_EQ(255, dataPtr[16 * 4 + 1]);
144         EXPECT_EQ(0, dataPtr[16 * 4 + 2]);
145         EXPECT_EQ(255, dataPtr[16 * 4 + 3]);
146 
147         glUnmapBufferOES(GL_PIXEL_PACK_BUFFER);
148     }
149     EXPECT_GL_NO_ERROR();
150 }
151 
152 // Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
153 ANGLE_INSTANTIATE_TEST(PBOExtensionTest, ES2_D3D11(), ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
154