| Index: gpu/command_buffer/tests/gl_readback_unittests.cc
|
| diff --git a/gpu/command_buffer/tests/gl_readback_unittests.cc b/gpu/command_buffer/tests/gl_readback_unittests.cc
|
| deleted file mode 100644
|
| index 7f812204fe9bf93c985914acf3c0325fce105d72..0000000000000000000000000000000000000000
|
| --- a/gpu/command_buffer/tests/gl_readback_unittests.cc
|
| +++ /dev/null
|
| @@ -1,322 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include <GLES2/gl2.h>
|
| -#include <GLES2/gl2ext.h>
|
| -#include <GLES2/gl2extchromium.h>
|
| -
|
| -#include <cmath>
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/bind.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/run_loop.h"
|
| -#include "gpu/command_buffer/tests/gl_manager.h"
|
| -#include "gpu/command_buffer/tests/gl_test_utils.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace gpu {
|
| -
|
| -class GLReadbackTest : public testing::Test {
|
| - protected:
|
| - virtual void SetUp() {
|
| - gl_.Initialize(GLManager::Options());
|
| - }
|
| -
|
| - virtual void TearDown() {
|
| - gl_.Destroy();
|
| - }
|
| -
|
| - static void WaitForQueryCallback(int q, base::Closure cb) {
|
| - unsigned int done = 0;
|
| - glGetQueryObjectuivEXT(q, GL_QUERY_RESULT_AVAILABLE_EXT, &done);
|
| - if (done) {
|
| - cb.Run();
|
| - } else {
|
| - base::MessageLoop::current()->PostDelayedTask(
|
| - FROM_HERE,
|
| - base::Bind(&WaitForQueryCallback, q, cb),
|
| - base::TimeDelta::FromMilliseconds(3));
|
| - }
|
| - }
|
| -
|
| - void WaitForQuery(int q) {
|
| - base::RunLoop run_loop;
|
| - WaitForQueryCallback(q, run_loop.QuitClosure());
|
| - run_loop.Run();
|
| - }
|
| -
|
| - GLManager gl_;
|
| -};
|
| -
|
| -
|
| -TEST_F(GLReadbackTest, ReadPixelsWithPBOAndQuery) {
|
| - const GLint kBytesPerPixel = 4;
|
| - const GLint kWidth = 2;
|
| - const GLint kHeight = 2;
|
| -
|
| - GLuint b, q;
|
| - glClearColor(0.0, 0.0, 1.0, 1.0);
|
| - glClear(GL_COLOR_BUFFER_BIT);
|
| - glGenBuffers(1, &b);
|
| - glGenQueriesEXT(1, &q);
|
| - glBindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, b);
|
| - glBufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM,
|
| - kWidth * kHeight * kBytesPerPixel,
|
| - NULL,
|
| - GL_STREAM_READ);
|
| - glBeginQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, q);
|
| - glReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
| - glEndQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM);
|
| - glFlush();
|
| - WaitForQuery(q);
|
| -
|
| - // TODO(hubbe): Check that glMapBufferCHROMIUM does not block here.
|
| - unsigned char *data = static_cast<unsigned char *>(
|
| - glMapBufferCHROMIUM(
|
| - GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM,
|
| - GL_READ_ONLY));
|
| - EXPECT_TRUE(data);
|
| - EXPECT_EQ(data[0], 0); // red
|
| - EXPECT_EQ(data[1], 0); // green
|
| - EXPECT_EQ(data[2], 255); // blue
|
| - glUnmapBufferCHROMIUM(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM);
|
| - glBindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0);
|
| - glDeleteBuffers(1, &b);
|
| - glDeleteQueriesEXT(1, &q);
|
| - GLTestHelper::CheckGLError("no errors", __LINE__);
|
| -}
|
| -
|
| -static float HalfToFloat32(uint16 value) {
|
| - int32 s = (value >> 15) & 0x00000001;
|
| - int32 e = (value >> 10) & 0x0000001f;
|
| - int32 m = value & 0x000003ff;
|
| -
|
| - if (e == 0) {
|
| - if (m == 0) {
|
| - uint32 result = s << 31;
|
| - return bit_cast<float>(result);
|
| - } else {
|
| - while (!(m & 0x00000400)) {
|
| - m <<= 1;
|
| - e -= 1;
|
| - }
|
| -
|
| - e += 1;
|
| - m &= ~0x00000400;
|
| - }
|
| - } else if (e == 31) {
|
| - if (m == 0) {
|
| - uint32 result = (s << 31) | 0x7f800000;
|
| - return bit_cast<float>(result);
|
| - } else {
|
| - uint32 result = (s << 31) | 0x7f800000 | (m << 13);
|
| - return bit_cast<float>(result);
|
| - }
|
| - }
|
| -
|
| - e = e + (127 - 15);
|
| - m = m << 13;
|
| -
|
| - uint32 result = (s << 31) | (e << 23) | m;
|
| - return bit_cast<float>(result);
|
| -}
|
| -
|
| -static GLuint CompileShader(GLenum type, const char *data) {
|
| - const char *shaderStrings[1] = { data };
|
| -
|
| - GLuint shader = glCreateShader(type);
|
| - glShaderSource(shader, 1, shaderStrings, NULL);
|
| - glCompileShader(shader);
|
| -
|
| - GLint compile_status = 0;
|
| - glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);
|
| - if (compile_status != GL_TRUE) {
|
| - glDeleteShader(shader);
|
| - shader = 0;
|
| - }
|
| -
|
| - return shader;
|
| -}
|
| -
|
| -TEST_F(GLReadbackTest, ReadPixelsFloat) {
|
| - const GLsizei kTextureSize = 4;
|
| - const GLfloat kDrawColor[4] = { -10.9f, 0.5f, 10.5f, 100.12f };
|
| - const GLfloat kEpsilon = 0.01f;
|
| -
|
| - struct TestFormat {
|
| - GLint format;
|
| - GLint type;
|
| - uint32 comp_count;
|
| - };
|
| - TestFormat test_formats[4];
|
| - size_t test_count = 0;
|
| - const char *extensions = reinterpret_cast<const char*>(
|
| - glGetString(GL_EXTENSIONS));
|
| - if (strstr(extensions, "GL_OES_texture_half_float") != NULL) {
|
| - TestFormat rgb16f = { GL_RGB, GL_HALF_FLOAT_OES, 3 };
|
| - test_formats[test_count++] = rgb16f;
|
| -
|
| - TestFormat rgba16f = { GL_RGBA, GL_HALF_FLOAT_OES, 4 };
|
| - test_formats[test_count++] = rgba16f;
|
| - }
|
| - if (strstr(extensions, "GL_OES_texture_float") != NULL) {
|
| - TestFormat rgb32f = { GL_RGB, GL_FLOAT, 3 };
|
| - test_formats[test_count++] = rgb32f;
|
| -
|
| - TestFormat rgba32f = { GL_RGBA, GL_FLOAT, 4 };
|
| - test_formats[test_count++] = rgba32f;
|
| - }
|
| -
|
| - const char *vs_source =
|
| - "precision mediump float;\n"
|
| - "attribute vec4 a_position;\n"
|
| - "void main() {\n"
|
| - " gl_Position = a_position;\n"
|
| - "}\n";
|
| -
|
| - GLuint vertex_shader = CompileShader(GL_VERTEX_SHADER, vs_source);
|
| - ASSERT_NE(vertex_shader, GLuint(0));
|
| -
|
| - const char *fs_source =
|
| - "precision mediump float;\n"
|
| - "uniform vec4 u_color;\n"
|
| - "void main() {\n"
|
| - " gl_FragColor = u_color;\n"
|
| - "}\n";
|
| -
|
| - GLuint fragment_shader = CompileShader(GL_FRAGMENT_SHADER, fs_source);
|
| - ASSERT_NE(fragment_shader, GLuint(0));
|
| -
|
| - GLuint program = glCreateProgram();
|
| - glAttachShader(program, vertex_shader);
|
| - glDeleteShader(vertex_shader);
|
| - glAttachShader(program, fragment_shader);
|
| - glDeleteShader(fragment_shader);
|
| - glLinkProgram(program);
|
| -
|
| - GLint link_status = 0;
|
| - glGetProgramiv(program, GL_LINK_STATUS, &link_status);
|
| - if (link_status != GL_TRUE) {
|
| - glDeleteProgram(program);
|
| - program = 0;
|
| - }
|
| - ASSERT_NE(program, GLuint(0));
|
| -
|
| - EXPECT_EQ(glGetError(), GLenum(GL_NO_ERROR));
|
| -
|
| - float quad_vertices[] = {
|
| - -1.0, -1.0,
|
| - 1.0, -1.0,
|
| - 1.0, 1.0,
|
| - -1.0, 1.0
|
| - };
|
| -
|
| - GLuint vertex_buffer;
|
| - glGenBuffers(1, &vertex_buffer);
|
| - glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
| - glBufferData(
|
| - GL_ARRAY_BUFFER, sizeof(quad_vertices),
|
| - reinterpret_cast<void*>(quad_vertices), GL_STATIC_DRAW);
|
| -
|
| - GLint position_location = glGetAttribLocation(program, "a_position");
|
| - glVertexAttribPointer(
|
| - position_location, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), NULL);
|
| - glEnableVertexAttribArray(position_location);
|
| -
|
| - glUseProgram(program);
|
| - glUniform4fv(glGetUniformLocation(program, "u_color"), 1, kDrawColor);
|
| -
|
| - EXPECT_EQ(glGetError(), GLenum(GL_NO_ERROR));
|
| -
|
| - for (size_t ii = 0; ii < test_count; ++ii) {
|
| - GLuint texture_id = 0;
|
| - glGenTextures(1, &texture_id);
|
| - glBindTexture(GL_TEXTURE_2D, texture_id);
|
| - glTexImage2D(
|
| - GL_TEXTURE_2D, 0, test_formats[ii].format, kTextureSize, kTextureSize,
|
| - 0, test_formats[ii].format, test_formats[ii].type, NULL);
|
| -
|
| - GLuint framebuffer = 0;
|
| - glGenFramebuffers(1, &framebuffer);
|
| - glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
|
| - glFramebufferTexture2D(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_id, 0);
|
| -
|
| - EXPECT_EQ(glGetError(), GLenum(GL_NO_ERROR));
|
| -
|
| - // Make sure this floating point framebuffer is supported
|
| - if (glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) {
|
| - // Check if this implementation supports reading floats back from this
|
| - // framebuffer
|
| - GLint read_format = 0;
|
| - glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &read_format);
|
| - GLint read_type = 0;
|
| - glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &read_type);
|
| -
|
| - EXPECT_EQ(glGetError(), GLenum(GL_NO_ERROR));
|
| -
|
| - if ((read_format == GL_RGB || read_format == GL_RGBA) &&
|
| - read_type == test_formats[ii].type) {
|
| - glClear(GL_COLOR_BUFFER_BIT);
|
| - glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
| -
|
| - uint32 read_comp_count = 0;
|
| - switch (read_format) {
|
| - case GL_RGB:
|
| - read_comp_count = 3;
|
| - break;
|
| - case GL_RGBA:
|
| - read_comp_count = 4;
|
| - break;
|
| - }
|
| -
|
| - switch (read_type) {
|
| - case GL_HALF_FLOAT_OES: {
|
| - scoped_ptr<GLushort[]> buf(
|
| - new GLushort[kTextureSize * kTextureSize * read_comp_count]);
|
| - glReadPixels(
|
| - 0, 0, kTextureSize, kTextureSize, read_format, read_type,
|
| - buf.get());
|
| - EXPECT_EQ(glGetError(), GLenum(GL_NO_ERROR));
|
| - for (uint32 jj = 0; jj < kTextureSize * kTextureSize; ++jj) {
|
| - for (uint32 kk = 0; kk < test_formats[ii].comp_count; ++kk) {
|
| - EXPECT_LE(
|
| - std::abs(HalfToFloat32(buf[jj * read_comp_count + kk]) -
|
| - kDrawColor[kk]),
|
| - std::abs(kDrawColor[kk] * kEpsilon));
|
| - }
|
| - }
|
| - break;
|
| - }
|
| - case GL_FLOAT: {
|
| - scoped_ptr<GLfloat[]> buf(
|
| - new GLfloat[kTextureSize * kTextureSize * read_comp_count]);
|
| - glReadPixels(
|
| - 0, 0, kTextureSize, kTextureSize, read_format, read_type,
|
| - buf.get());
|
| - EXPECT_EQ(glGetError(), GLenum(GL_NO_ERROR));
|
| - for (uint32 jj = 0; jj < kTextureSize * kTextureSize; ++jj) {
|
| - for (uint32 kk = 0; kk < test_formats[ii].comp_count; ++kk) {
|
| - EXPECT_LE(
|
| - std::abs(buf[jj * read_comp_count + kk] - kDrawColor[kk]),
|
| - std::abs(kDrawColor[kk] * kEpsilon));
|
| - }
|
| - }
|
| - break;
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| - glDeleteFramebuffers(1, &framebuffer);
|
| - glDeleteTextures(1, &texture_id);
|
| - }
|
| -
|
| - glDeleteBuffers(1, &vertex_buffer);
|
| - glDeleteProgram(program);
|
| -}
|
| -
|
| -} // namespace gpu
|
|
|