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 3 // found in the LICENSE file. 4 5 #include <GLES2/gl2.h> 6 #include <GLES2/gl2ext.h> 7 #include <GLES2/gl2extchromium.h> 8 9 #include "base/bind.h" 10 #include "base/message_loop/message_loop.h" 11 #include "base/run_loop.h" 12 #include "gpu/command_buffer/tests/gl_manager.h" 13 #include "gpu/command_buffer/tests/gl_test_utils.h" 14 #include "testing/gmock/include/gmock/gmock.h" 15 #include "testing/gtest/include/gtest/gtest.h" 16 17 namespace gpu { 18 19 class GLReadbackTest : public testing::Test { 20 protected: 21 virtual void SetUp() { 22 gl_.Initialize(GLManager::Options()); 23 } 24 25 virtual void TearDown() { 26 gl_.Destroy(); 27 } 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 48 GLManager gl_; 49 }; 50 51 52 TEST_F(GLReadbackTest, ReadPixelsWithPBOAndQuery) { 53 const GLint kBytesPerPixel = 4; 54 const GLint kWidth = 2; 55 const GLint kHeight = 2; 56 57 GLuint b, q; 58 glClearColor(0.0, 0.0, 1.0, 1.0); 59 glClear(GL_COLOR_BUFFER_BIT); 60 glGenBuffers(1, &b); 61 glGenQueriesEXT(1, &q); 62 glBindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, b); 63 glBufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 64 kWidth * kHeight * kBytesPerPixel, 65 NULL, 66 GL_STREAM_READ); 67 glBeginQueryEXT(GL_ASYNC_READ_PIXELS_COMPLETED_CHROMIUM, q); 68 glReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, 0); 69 glEndQueryEXT(GL_ASYNC_READ_PIXELS_COMPLETED_CHROMIUM); 70 glFlush(); 71 WaitForQuery(q); 72 73 // TODO(hubbe): Check that glMapBufferCHROMIUM does not block here. 74 unsigned char *data = static_cast<unsigned char *>( 75 glMapBufferCHROMIUM( 76 GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 77 GL_READ_ONLY)); 78 EXPECT_TRUE(data); 79 EXPECT_EQ(data[0], 0); // red 80 EXPECT_EQ(data[1], 0); // green 81 EXPECT_EQ(data[2], 255); // blue 82 glUnmapBufferCHROMIUM(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM); 83 glBindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0); 84 glDeleteBuffers(1, &b); 85 glDeleteQueriesEXT(1, &q); 86 GLTestHelper::CheckGLError("no errors", __LINE__); 87 } 88 89 } // namespace gpu 90