| Index: gpu/command_buffer/tests/gl_oes_texture_half_float_unittest.cc
|
| diff --git a/gpu/command_buffer/tests/gl_oes_texture_half_float_unittest.cc b/gpu/command_buffer/tests/gl_oes_texture_half_float_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a5203a45dd559f3dcb5b2eadd30c413da2aca40b
|
| --- /dev/null
|
| +++ b/gpu/command_buffer/tests/gl_oes_texture_half_float_unittest.cc
|
| @@ -0,0 +1,130 @@
|
| +// 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.
|
| +
|
| +#ifndef GL_GLEXT_PROTOTYPES
|
| +#define GL_GLEXT_PROTOTYPES
|
| +#endif
|
| +
|
| +#include <GLES2/gl2.h>
|
| +#include <GLES2/gl2ext.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"
|
| +
|
| +#define SHADER(Src) #Src
|
| +
|
| +namespace gpu {
|
| +
|
| +static const char* v_shader_str = SHADER(
|
| + attribute vec4 a_position;
|
| + void main() {
|
| + gl_Position = a_position;
|
| + }
|
| +);
|
| +
|
| +static const char* f_shader_str = SHADER(
|
| + uniform sampler2D u_texture;
|
| + void main() {
|
| + gl_FragColor = texture2D(u_texture, vec2(0.5, 0.5)) *
|
| + vec4(4.0, 2.0, 0.5, 0.25);
|
| + }
|
| +);
|
| +
|
| +class GLOesTextureHalfFloatTest : public testing::Test {
|
| + protected:
|
| + virtual void SetUp() {
|
| + gl_.Initialize(GLManager::Options());
|
| +
|
| + glGenTextures(2, textures);
|
| + glActiveTexture(GL_TEXTURE0);
|
| + glBindTexture(GL_TEXTURE_2D, textures[1]);
|
| +
|
| + // Some drivers (NVidia/SGX) require texture settings to be a certain way or
|
| + // they won't report FRAMEBUFFER_COMPLETE.
|
| + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
| + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
| + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
| + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
| +
|
| + glGenFramebuffers(1, &fbo);
|
| + glBindFramebuffer(GL_FRAMEBUFFER, fbo);
|
| + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
| + textures[1], 0);
|
| + }
|
| +
|
| + virtual void TearDown() {
|
| + glDeleteTextures(2, textures);
|
| + glDeleteFramebuffers(1, &fbo);
|
| + gl_.Destroy();
|
| + }
|
| +
|
| + GLManager gl_;
|
| + GLuint textures[2];
|
| + GLuint fbo;
|
| +};
|
| +
|
| +TEST_F(GLOesTextureHalfFloatTest, TexImage2DAndTexSubImage2D) {
|
| + if (!GLTestHelper::HasExtension("GL_OES_texture_half_float")) {
|
| + return;
|
| + }
|
| +
|
| + // (0.25, 0.5, 2.0, 4.0)
|
| + static int16 pixels[1 * 4] = { 0x3400, 0x3800, 0x4000, 0x4400 };
|
| + glBindTexture(GL_TEXTURE_2D, textures[0]);
|
| +
|
| + GLenum formats[5] = { GL_RGBA, GL_RGB, GL_LUMINANCE_ALPHA,
|
| + GL_LUMINANCE, GL_ALPHA };
|
| + for (unsigned int i = 0; i < 5; i++) {
|
| + glTexImage2D(GL_TEXTURE_2D, 0, formats[i], 1, 1, 0, formats[i],
|
| + GL_HALF_FLOAT_OES, pixels);
|
| + EXPECT_TRUE(glGetError() == GL_NO_ERROR);
|
| + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, formats[i],
|
| + GL_HALF_FLOAT_OES, pixels);
|
| + EXPECT_TRUE(glGetError() == GL_NO_ERROR);
|
| + }
|
| +}
|
| +
|
| +TEST_F(GLOesTextureHalfFloatTest, OesTextureHalfFloatTest) {
|
| + if (!GLTestHelper::HasExtension("GL_OES_texture_half_float")) {
|
| + return;
|
| + }
|
| +
|
| + GLuint program = GLTestHelper::LoadProgram(v_shader_str, f_shader_str);
|
| + glUseProgram(program);
|
| + EXPECT_TRUE(glGetError() == GL_NO_ERROR);
|
| +
|
| + GLint position_loc = glGetAttribLocation(program, "a_position");
|
| + GLTestHelper::SetupUnitQuad(position_loc);
|
| + EXPECT_TRUE(glGetError() == GL_NO_ERROR);
|
| +
|
| + glBindTexture(GL_TEXTURE_2D, textures[1]);
|
| + glTexImage2D(
|
| + GL_TEXTURE_2D, 0, GL_RGBA, 4, 4,
|
| + 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
| + EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
|
| + glCheckFramebufferStatus(GL_FRAMEBUFFER));
|
| +
|
| + // (0.25, 0.5, 2.0, 4.0)
|
| + static int16 pixels[1 * 4] = { 0x3400, 0x3800, 0x4000, 0x4400 };
|
| + glBindTexture(GL_TEXTURE_2D, textures[0]);
|
| + glTexImage2D(
|
| + GL_TEXTURE_2D, 0, GL_RGBA, 1, 1,
|
| + 0, GL_RGBA, GL_HALF_FLOAT_OES, pixels);
|
| + glDrawArrays(GL_TRIANGLES, 0, 6);
|
| + // check pixels
|
| + uint8 expect_pixels[1 * 4] = { 255, 255, 255, 255 };
|
| + GLTestHelper::CheckPixels(0, 0, 4, 4, 0, expect_pixels);
|
| +
|
| + glTexSubImage2D(
|
| + GL_TEXTURE_2D, 0, 0, 0, 1, 1,
|
| + GL_RGBA, GL_HALF_FLOAT_OES, pixels);
|
| + glDrawArrays(GL_TRIANGLES, 0, 6);
|
| + // check pixels
|
| + GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expect_pixels);
|
| + EXPECT_TRUE(glGetError() == GL_NO_ERROR);
|
| +}
|
| +
|
| +} // namespace gpu
|
|
|