// Copyright 2014 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 "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 {

class GLStreamDrawTest : public testing::Test {
 protected:
  static const int kSize = 4;

  virtual void SetUp() {
    GLManager::Options options;
    options.size = gfx::Size(kSize, kSize);
    gl_.Initialize(options);
  }

  virtual void TearDown() {
    gl_.Destroy();
  }

  GLManager gl_;
};

namespace {

GLuint SetupProgram() {
  static const char* v_shader_str = SHADER(
      attribute vec4 a_position;
      attribute vec4 a_color;
      varying vec4 v_color;
      void main()
      {
         gl_Position = a_position;
         v_color = a_color;
      }
   );

  static const char* f_shader_str = SHADER(
      precision mediump float;
      varying vec4 v_color;
      void main()
      {
        gl_FragColor = v_color;
      }
  );

  GLuint program = GLTestHelper::LoadProgram(v_shader_str, f_shader_str);
  glUseProgram(program);
  return program;
}

}  // anonymous namespace.

TEST_F(GLStreamDrawTest, Basic) {
  static GLfloat float_red[4] = { 1.0f, 0.0f, 0.0f, 1.0f, };
  static GLfloat float_green[4] = { 0.0f, 1.0f, 0.0f, 1.0f, };
  static uint8 expected_red[4] =  {255, 0, 0, 255, };
  static uint8 expected_green[4] =  {0, 255, 0, 255, };

  GLuint program = SetupProgram();
  GLuint position_loc = glGetAttribLocation(program, "a_position");
  GLuint color_loc = glGetAttribLocation(program, "a_color");
  GLTestHelper::SetupUnitQuad(position_loc);
  GLTestHelper::SetupColorsForUnitQuad(color_loc, float_red, GL_STREAM_DRAW);
  glDrawArrays(GL_TRIANGLES, 0, 6);
  EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kSize, kSize, 0, expected_red));
  GLTestHelper::SetupColorsForUnitQuad(color_loc, float_green, GL_STATIC_DRAW);
  glDrawArrays(GL_TRIANGLES, 0, 6);
  EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kSize, kSize, 0, expected_green));

  GLTestHelper::CheckGLError("no errors", __LINE__);
}

// http://crbug.com/281565
#if !defined(OS_ANDROID)
TEST_F(GLStreamDrawTest, DrawElements) {
  static GLfloat float_red[4] = { 1.0f, 0.0f, 0.0f, 1.0f, };
  static GLfloat float_green[4] = { 0.0f, 1.0f, 0.0f, 1.0f, };
  static uint8 expected_red[4] =  {255, 0, 0, 255, };
  static uint8 expected_green[4] =  {0, 255, 0, 255, };

  GLuint program = SetupProgram();
  GLuint position_loc = glGetAttribLocation(program, "a_position");
  GLuint color_loc = glGetAttribLocation(program, "a_color");
  GLTestHelper::SetupUnitQuad(position_loc);
  GLTestHelper::SetupColorsForUnitQuad(color_loc, float_red, GL_STREAM_DRAW);

  GLuint index_buffer = 0;
  glGenBuffers(1, &index_buffer);
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer);
  static GLubyte indices[] = { 0, 1, 2, 3, 4, 5, };
  glBufferData(
      GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STREAM_DRAW);
  glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, NULL);
  EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kSize, kSize, 0, expected_red));
  GLTestHelper::SetupColorsForUnitQuad(color_loc, float_green, GL_STATIC_DRAW);

  glBufferData(
      GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
  glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, NULL);
  EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kSize, kSize, 0, expected_green));

  GLTestHelper::CheckGLError("no errors", __LINE__);
}
#endif

TEST_F(GLStreamDrawTest, VertexArrayObjects) {
  if (!GLTestHelper::HasExtension("GL_OES_vertex_array_object")) {
    return;
  }

  static GLfloat float_red[4] = { 1.0f, 0.0f, 0.0f, 1.0f, };
  static GLfloat float_green[4] = { 0.0f, 1.0f, 0.0f, 1.0f, };
  static uint8 expected_red[4] =  {255, 0, 0, 255, };
  static uint8 expected_green[4] =  {0, 255, 0, 255, };

  GLuint program = SetupProgram();
  GLuint position_loc = glGetAttribLocation(program, "a_position");
  GLuint color_loc = glGetAttribLocation(program, "a_color");

  GLuint vaos[2];
  glGenVertexArraysOES(2, vaos);

  glBindVertexArrayOES(vaos[0]);
  GLuint position_buffer = GLTestHelper::SetupUnitQuad(position_loc);
  GLTestHelper::SetupColorsForUnitQuad(color_loc, float_red, GL_STREAM_DRAW);

  glBindVertexArrayOES(vaos[1]);
  glBindBuffer(GL_ARRAY_BUFFER, position_buffer);
  glEnableVertexAttribArray(position_loc);
  glVertexAttribPointer(position_loc, 2, GL_FLOAT, GL_FALSE, 0, 0);
  GLTestHelper::SetupColorsForUnitQuad(color_loc, float_green, GL_STATIC_DRAW);

  for (int ii = 0; ii < 2; ++ii) {
    glBindVertexArrayOES(vaos[0]);
    glDrawArrays(GL_TRIANGLES, 0, 6);
    EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kSize, kSize, 0, expected_red));

    glBindVertexArrayOES(vaos[1]);
    glDrawArrays(GL_TRIANGLES, 0, 6);
    EXPECT_TRUE(
        GLTestHelper::CheckPixels(0, 0, kSize, kSize, 0, expected_green));
  }

  GLTestHelper::CheckGLError("no errors", __LINE__);
}

}  // namespace gpu

