OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <GLES2/gl2.h> | 5 #include <GLES2/gl2.h> |
6 #include <GLES2/gl2ext.h> | 6 #include <GLES2/gl2ext.h> |
7 #include <GLES2/gl2extchromium.h> | 7 #include <GLES2/gl2extchromium.h> |
8 | 8 |
| 9 #include "base/bind.h" |
| 10 #include "base/message_loop/message_loop.h" |
| 11 #include "base/run_loop.h" |
9 #include "gpu/command_buffer/tests/gl_manager.h" | 12 #include "gpu/command_buffer/tests/gl_manager.h" |
10 #include "gpu/command_buffer/tests/gl_test_utils.h" | 13 #include "gpu/command_buffer/tests/gl_test_utils.h" |
11 #include "testing/gmock/include/gmock/gmock.h" | 14 #include "testing/gmock/include/gmock/gmock.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
13 | 16 |
14 namespace gpu { | 17 namespace gpu { |
15 | 18 |
16 class GLReadbackTest : public testing::Test { | 19 class GLReadbackTest : public testing::Test { |
17 protected: | 20 protected: |
18 virtual void SetUp() { | 21 virtual void SetUp() { |
19 gl_.Initialize(GLManager::Options()); | 22 gl_.Initialize(GLManager::Options()); |
20 } | 23 } |
21 | 24 |
22 virtual void TearDown() { | 25 virtual void TearDown() { |
23 gl_.Destroy(); | 26 gl_.Destroy(); |
24 } | 27 } |
25 | 28 |
| 29 static void WaitForQueryCallback(int q, base::Closure cb) { |
| 30 unsigned int done = 0; |
| 31 glGetQueryObjectuivEXT(q, GL_QUERY_RESULT_AVAILABLE_EXT, &done); |
| 32 if (done) { |
| 33 cb.Run(); |
| 34 } else { |
| 35 base::MessageLoop::current()->PostDelayedTask( |
| 36 FROM_HERE, |
| 37 base::Bind(&WaitForQueryCallback, q, cb), |
| 38 base::TimeDelta::FromMilliseconds(3)); |
| 39 } |
| 40 } |
| 41 |
| 42 void WaitForQuery(int q) { |
| 43 base::RunLoop run_loop; |
| 44 WaitForQueryCallback(q, run_loop.QuitClosure()); |
| 45 run_loop.Run(); |
| 46 } |
| 47 |
26 GLManager gl_; | 48 GLManager gl_; |
27 }; | 49 }; |
28 | 50 |
29 | 51 |
30 TEST_F(GLReadbackTest, ReadPixelsWithPBO) { | |
31 const GLint kBytesPerPixel = 4; | |
32 const GLint kWidth = 2; | |
33 const GLint kHeight = 2; | |
34 | |
35 GLuint b; | |
36 glClearColor(0.0, 0.0, 1.0, 1.0); | |
37 glClear(GL_COLOR_BUFFER_BIT); | |
38 glGenBuffers(1, &b); | |
39 glBindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, b); | |
40 glBufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, | |
41 kWidth * kHeight * kBytesPerPixel, | |
42 NULL, | |
43 GL_STREAM_READ); | |
44 glReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, 0); | |
45 unsigned char *data = static_cast<unsigned char *>( | |
46 glMapBufferCHROMIUM( | |
47 GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, | |
48 GL_READ_ONLY)); | |
49 EXPECT_TRUE(data); | |
50 EXPECT_EQ(data[0], 0); // red | |
51 EXPECT_EQ(data[1], 0); // green | |
52 EXPECT_EQ(data[2], 255); // blue | |
53 glUnmapBufferCHROMIUM(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM); | |
54 glBindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0); | |
55 glDeleteBuffers(1, &b); | |
56 GLTestHelper::CheckGLError("no errors", __LINE__); | |
57 } | |
58 | |
59 TEST_F(GLReadbackTest, ReadPixelsWithPBOAndQuery) { | 52 TEST_F(GLReadbackTest, ReadPixelsWithPBOAndQuery) { |
60 const GLint kBytesPerPixel = 4; | 53 const GLint kBytesPerPixel = 4; |
61 const GLint kWidth = 2; | 54 const GLint kWidth = 2; |
62 const GLint kHeight = 2; | 55 const GLint kHeight = 2; |
63 | 56 |
64 GLuint b, q; | 57 GLuint b, q; |
65 glClearColor(0.0, 0.0, 1.0, 1.0); | 58 glClearColor(0.0, 0.0, 1.0, 1.0); |
66 glClear(GL_COLOR_BUFFER_BIT); | 59 glClear(GL_COLOR_BUFFER_BIT); |
67 glGenBuffers(1, &b); | 60 glGenBuffers(1, &b); |
68 glGenQueriesEXT(1, &q); | 61 glGenQueriesEXT(1, &q); |
69 glBindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, b); | 62 glBindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, b); |
70 glBufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, | 63 glBufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, |
71 kWidth * kHeight * kBytesPerPixel, | 64 kWidth * kHeight * kBytesPerPixel, |
72 NULL, | 65 NULL, |
73 GL_STREAM_READ); | 66 GL_STREAM_READ); |
74 glBeginQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM, q); | 67 glBeginQueryEXT(GL_ASYNC_READ_PIXELS_COMPLETED_CHROMIUM, q); |
75 glReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, 0); | 68 glReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, 0); |
76 glEndQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM); | 69 glEndQueryEXT(GL_ASYNC_READ_PIXELS_COMPLETED_CHROMIUM); |
77 glFlush(); | 70 glFlush(); |
78 unsigned int done = 0; | 71 WaitForQuery(q); |
79 while (!done) { | |
80 glGetQueryObjectuivEXT(q, GL_QUERY_RESULT_AVAILABLE_EXT, &done); | |
81 } | |
82 | 72 |
83 // TODO(hubbe): Check that glMapBufferCHROMIUM does not block here. | 73 // TODO(hubbe): Check that glMapBufferCHROMIUM does not block here. |
84 unsigned char *data = static_cast<unsigned char *>( | 74 unsigned char *data = static_cast<unsigned char *>( |
85 glMapBufferCHROMIUM( | 75 glMapBufferCHROMIUM( |
86 GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, | 76 GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, |
87 GL_READ_ONLY)); | 77 GL_READ_ONLY)); |
88 EXPECT_TRUE(data); | 78 EXPECT_TRUE(data); |
89 EXPECT_EQ(data[0], 0); // red | 79 EXPECT_EQ(data[0], 0); // red |
90 EXPECT_EQ(data[1], 0); // green | 80 EXPECT_EQ(data[1], 0); // green |
91 EXPECT_EQ(data[2], 255); // blue | 81 EXPECT_EQ(data[2], 255); // blue |
92 glUnmapBufferCHROMIUM(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM); | 82 glUnmapBufferCHROMIUM(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM); |
93 glBindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0); | 83 glBindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0); |
94 glDeleteBuffers(1, &b); | 84 glDeleteBuffers(1, &b); |
95 glDeleteQueriesEXT(1, &q); | 85 glDeleteQueriesEXT(1, &q); |
96 GLTestHelper::CheckGLError("no errors", __LINE__); | 86 GLTestHelper::CheckGLError("no errors", __LINE__); |
97 } | 87 } |
98 | 88 |
99 } // namespace gpu | 89 } // namespace gpu |
OLD | NEW |