gl_depth_texture_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GLES2/gl2.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GLES2/gl2ext.h>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/tests/gl_manager.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/tests/gl_test_utils.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SHADER(Src) #Src
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DepthTextureTest : public testing::Test {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLsizei kResolution = 64;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLManager::Options options;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options.size = gfx::Size(kResolution, kResolution);
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gl_.Initialize(options);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_.Destroy();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint SetupUnitQuad(GLint position_location);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLManager gl_;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLuint DepthTextureTest::SetupUnitQuad(GLint position_location) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint vbo = 0;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGenBuffers(1, &vbo);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindBuffer(GL_ARRAY_BUFFER, vbo);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static float vertices[] = {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1.0f,  1.0f,  1.0f,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     -1.0f,  1.0f,  0.0f,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     -1.0f, -1.0f, -1.0f,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1.0f,  1.0f,  1.0f,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     -1.0f, -1.0f, -1.0f,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1.0f, -1.0f,  0.0f,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glEnableVertexAttribArray(position_location);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glVertexAttribPointer(position_location, 3, GL_FLOAT, GL_FALSE, 0, 0);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return vbo;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FormatType {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum format;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum type;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // anonymous namespace
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// crbug.com/135229
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fails on Win Intel, Linux Intel.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if ((defined(OS_WIN) || defined(OS_LINUX)) && defined(NDEBUG))
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_RenderTo DISABLED_RenderTo
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_RenderTo RenderTo
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DepthTextureTest, MAYBE_RenderTo) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GLTestHelper::HasExtension("GL_CHROMIUM_depth_texture")) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool have_depth_stencil = GLTestHelper::HasExtension(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "GL_OES_packed_depth_stencil");
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* v_shader_str = SHADER(
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      attribute vec4 v_position;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void main()
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         gl_Position = v_position;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* f_shader_str = SHADER(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      precision mediump float;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uniform sampler2D u_texture;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uniform vec2 u_resolution;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void main()
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        vec2 texcoord = gl_FragCoord.xy / u_resolution;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_FragColor = texture2D(u_texture, texcoord);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint program = GLTestHelper::LoadProgram(v_shader_str, f_shader_str);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint position_loc = glGetAttribLocation(program, "v_position");
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint resolution_loc = glGetUniformLocation(program, "u_resolution");
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupUnitQuad(position_loc);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Depth test needs to be on for the depth buffer to be updated.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glEnable(GL_DEPTH_TEST);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // create an fbo
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint fbo = 0;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGenFramebuffers(1, &fbo);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // create a depth texture.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint color_texture = 0;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint depth_texture = 0;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGenTextures(1, &color_texture);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindTexture(GL_TEXTURE_2D, color_texture);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glTexImage2D(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, kResolution, kResolution,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glFramebufferTexture2D(
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color_texture, 0);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGenTextures(1, &depth_texture);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindTexture(GL_TEXTURE_2D, depth_texture);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glFramebufferTexture2D(
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_texture, 0);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glUseProgram(program);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glUniform2f(resolution_loc, kResolution, kResolution);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType format_types[] = {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, },
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, },
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES, },
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < arraysize(format_types); ++ii) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum format = format_types[ii].format;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum type = format_types[ii].type;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (format == GL_DEPTH_STENCIL_OES && !have_depth_stencil) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glBindTexture(GL_TEXTURE_2D, depth_texture);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glTexImage2D(
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_TEXTURE_2D, 0, format, kResolution, kResolution,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0, format, type, NULL);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLTestHelper::CheckGLError("no errors", __LINE__);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Disconnect the texture so we'll render with the default texture.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glBindTexture(GL_TEXTURE_2D, 0);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Render to the fbo.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glDrawArrays(GL_TRIANGLES, 0, 6);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Render with the depth texture.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glBindFramebuffer(GL_FRAMEBUFFER, 0);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glBindTexture(GL_TEXTURE_2D, depth_texture);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glDrawArrays(GL_TRIANGLES, 0, 6);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8 actual_pixels[kResolution * kResolution * 4] = { 0, };
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glReadPixels(
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0, 0, kResolution, kResolution, GL_RGBA, GL_UNSIGNED_BYTE,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        actual_pixels);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that each pixel's RGB are the same and that it's value is less
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // than the previous pixel in either direction. Basically verify we have a
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // gradient.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (GLint yy = 0; yy < kResolution; ++yy) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (GLint xx = 0; xx < kResolution; ++xx) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const uint8* actual = &actual_pixels[(yy * kResolution + xx) * 4];
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const uint8* left = actual - 4;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const uint8* down = actual - kResolution * 4;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(actual[0], actual[1]);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(actual[1], actual[2]);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (xx > 0) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          EXPECT_GT(actual[0], left[0]);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (yy > 0) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          EXPECT_GT(actual[0], down[0]);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_TRUE(actual[3] == actual[0] || actual[3] == 0xFF);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that bottom left corner is vastly different thatn top right.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_GT(
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        actual_pixels[(kResolution * kResolution - 1) * 4] - actual_pixels[0],
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0xC0);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLTestHelper::CheckGLError("no errors", __LINE__);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215