Home | History | Annotate | Download | only in tests
      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