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)
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(DepthTextureTest, RenderTo) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GLTestHelper::HasExtension("GL_CHROMIUM_depth_texture")) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool have_depth_stencil = GLTestHelper::HasExtension(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "GL_OES_packed_depth_stencil");
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* v_shader_str = SHADER(
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      attribute vec4 v_position;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void main()
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         gl_Position = v_position;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* f_shader_str = SHADER(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      precision mediump float;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uniform sampler2D u_texture;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uniform vec2 u_resolution;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void main()
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        vec2 texcoord = gl_FragCoord.xy / u_resolution;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_FragColor = texture2D(u_texture, texcoord);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint program = GLTestHelper::LoadProgram(v_shader_str, f_shader_str);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint position_loc = glGetAttribLocation(program, "v_position");
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint resolution_loc = glGetUniformLocation(program, "u_resolution");
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupUnitQuad(position_loc);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Depth test needs to be on for the depth buffer to be updated.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glEnable(GL_DEPTH_TEST);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // create an fbo
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint fbo = 0;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGenFramebuffers(1, &fbo);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // create a depth texture.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint color_texture = 0;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint depth_texture = 0;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGenTextures(1, &color_texture);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindTexture(GL_TEXTURE_2D, color_texture);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glTexImage2D(
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, kResolution, kResolution,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glFramebufferTexture2D(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color_texture, 0);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGenTextures(1, &depth_texture);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindTexture(GL_TEXTURE_2D, depth_texture);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glFramebufferTexture2D(
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_texture, 0);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glUseProgram(program);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glUniform2f(resolution_loc, kResolution, kResolution);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType format_types[] = {
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT },
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { GL_DEPTH_COMPONENT, GL_UNSIGNED_INT },
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES },
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < arraysize(format_types); ++ii) {
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const FormatType& format_type = format_types[ii];
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GLenum format = format_type.format;
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GLenum type = format_type.type;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (format == GL_DEPTH_STENCIL_OES && !have_depth_stencil) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glBindTexture(GL_TEXTURE_2D, depth_texture);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glTexImage2D(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_TEXTURE_2D, 0, format, kResolution, kResolution,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0, format, type, NULL);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), status)
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        << "iteration: " << ii;
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (status != GL_FRAMEBUFFER_COMPLETE) {
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      continue;
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!GLTestHelper::CheckGLError("no errors after setup", __LINE__)) {
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      continue;
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Disconnect the texture so we'll render with the default texture.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glBindTexture(GL_TEXTURE_2D, 0);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Render to the fbo.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glDrawArrays(GL_TRIANGLES, 0, 6);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!GLTestHelper::CheckGLError("no errors after depth draw", __LINE__)) {
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      continue;
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Render with the depth texture.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glBindFramebuffer(GL_FRAMEBUFFER, 0);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glBindTexture(GL_TEXTURE_2D, depth_texture);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glDrawArrays(GL_TRIANGLES, 0, 6);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!GLTestHelper::CheckGLError("no errors after texture draw", __LINE__)) {
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      continue;
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8 actual_pixels[kResolution * kResolution * 4] = { 0, };
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glReadPixels(
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0, 0, kResolution, kResolution, GL_RGBA, GL_UNSIGNED_BYTE,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        actual_pixels);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!GLTestHelper::CheckGLError("no errors after readpixels", __LINE__)) {
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      continue;
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Check that each pixel's red value is less than the previous pixel in
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // either direction. Basically verify we have a gradient. No assumption is
1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // made about the other channels green, blue and alpha since, according to
1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // the GL_CHROMIUM_depth_texture spec, they have undefined values for
1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // depth textures.
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int bad_count = 0;  // used to not spam the log with too many messages.
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (GLint yy = 0; bad_count < 16 && yy < kResolution; ++yy) {
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      for (GLint xx = 0; bad_count < 16 && xx < kResolution; ++xx) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const uint8* actual = &actual_pixels[(yy * kResolution + xx) * 4];
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const uint8* left = actual - 4;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const uint8* down = actual - kResolution * 4;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // NOTE: Qualcomm on Nexus 4 the right most column has the same
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // values as the next to right most column. (bad interpolator?)
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (xx > 0 && xx < kResolution - 1) {
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          EXPECT_GT(actual[0], left[0])
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              << "pixel at " << xx << ", " << yy
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              << " actual[0] =" << static_cast<unsigned>(actual[0])
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              << " left[0] =" << static_cast<unsigned>(left[0])
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              << " actual =" << reinterpret_cast<const void*>(actual)
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              << " left =" << reinterpret_cast<const void*>(left);
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          bad_count += (actual[0] > left[0] ? 0 : 1);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (yy > 0 && yy < kResolution - 1) {
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          EXPECT_GT(actual[0], down[0]) << "pixel at " << xx << ", " << yy;
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          bad_count += (actual[0] > down[0] ? 0 : 1);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that bottom left corner is vastly different thatn top right.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_GT(
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        actual_pixels[(kResolution * kResolution - 1) * 4] - actual_pixels[0],
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0xC0);
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GLTestHelper::CheckGLError("no errors after everything", __LINE__);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
240