// Copyright 2011 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 "cc/output/geometry_binding.h"

#include "cc/output/gl_renderer.h"  // For the GLC() macro.
#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
#include "third_party/khronos/GLES2/gl2.h"
#include "ui/gfx/rect_f.h"

namespace cc {

GeometryBinding::GeometryBinding(blink::WebGraphicsContext3D* context,
                                 const gfx::RectF& quad_vertex_rect)
    : context_(context),
      quad_vertices_vbo_(0),
      quad_elements_vbo_(0) {
  struct Vertex {
    float a_position[3];
    float a_texCoord[2];
    // Index of the vertex, divide by 4 to have the matrix for this quad.
    float a_index;
  };
  struct Quad {
    Vertex v0, v1, v2, v3;
  };
  struct QuadIndex {
    uint16 data[6];
  };

  COMPILE_ASSERT(
      sizeof(Quad) == 24 * sizeof(float),  // NOLINT(runtime/sizeof)
      struct_is_densely_packed);
  COMPILE_ASSERT(
      sizeof(QuadIndex) == 6 * sizeof(uint16_t),  // NOLINT(runtime/sizeof)
      struct_is_densely_packed);

  Quad quad_list[8];
  QuadIndex quad_index_list[8];
  for (int i = 0; i < 8; i++) {
    Vertex v0 = { { quad_vertex_rect.x(), quad_vertex_rect.bottom(), 0.0f, },
                  { 0.0f, 1.0f, },
                  i * 4.0f + 0.0f };
    Vertex v1 = { { quad_vertex_rect.x(), quad_vertex_rect.y(), 0.0f, },
                  { 0.0f, 0.0f, },
                  i * 4.0f + 1.0f };
    Vertex v2 = { { quad_vertex_rect.right(), quad_vertex_rect.y(), 0.0f, },
                  { 1.0f, .0f, },
                  i * 4.0f + 2.0f };
    Vertex v3 = { { quad_vertex_rect.right(),
                    quad_vertex_rect.bottom(),
                    0.0f, },
                  { 1.0f, 1.0f, },
                  i * 4.0f + 3.0f };
    Quad x = { v0, v1, v2, v3 };
    quad_list[i] = x;
    QuadIndex y = { { static_cast<uint16>(0 + 4 * i),
                      static_cast<uint16>(1 + 4 * i),
                      static_cast<uint16>(2 + 4 * i),
                      static_cast<uint16>(3 + 4 * i),
                      static_cast<uint16>(0 + 4 * i),
                      static_cast<uint16>(2 + 4 * i) } };
    quad_index_list[i] = y;
  }

  GLC(context_, quad_vertices_vbo_ = context_->createBuffer());
  GLC(context_, quad_elements_vbo_ = context_->createBuffer());
  GLC(context_, context_->bindBuffer(GL_ARRAY_BUFFER, quad_vertices_vbo_));
  GLC(context_,
      context_->bufferData(
          GL_ARRAY_BUFFER, sizeof(quad_list), quad_list, GL_STATIC_DRAW));
  GLC(context_,
      context_->bindBuffer(GL_ELEMENT_ARRAY_BUFFER, quad_elements_vbo_));
  GLC(context_,
      context_->bufferData(GL_ELEMENT_ARRAY_BUFFER,
                           sizeof(quad_index_list),
                           quad_index_list,
                           GL_STATIC_DRAW));
}

GeometryBinding::~GeometryBinding() {
  GLC(context_, context_->deleteBuffer(quad_vertices_vbo_));
  GLC(context_, context_->deleteBuffer(quad_elements_vbo_));
}

void GeometryBinding::PrepareForDraw() {
  GLC(context_,
      context_->bindBuffer(GL_ELEMENT_ARRAY_BUFFER, quad_elements_vbo_));

  GLC(context_, context_->bindBuffer(GL_ARRAY_BUFFER, quad_vertices_vbo_));
  GLC(context_,
      context_->vertexAttribPointer(
          PositionAttribLocation(),
          3,
          GL_FLOAT,
          false,
          6 * sizeof(float),  // NOLINT(runtime/sizeof)
          0));
  GLC(context_,
      context_->vertexAttribPointer(
          TexCoordAttribLocation(),
          2,
          GL_FLOAT,
          false,
          6 * sizeof(float),  // NOLINT(runtime/sizeof)
          3 * sizeof(float)));  // NOLINT(runtime/sizeof)
  GLC(context_,
      context_->vertexAttribPointer(
          TriangleIndexAttribLocation(),
          1,
          GL_FLOAT,
          false,
          6 * sizeof(float),  // NOLINT(runtime/sizeof)
          5 * sizeof(float)));  // NOLINT(runtime/sizeof)
  GLC(context_, context_->enableVertexAttribArray(PositionAttribLocation()));
  GLC(context_, context_->enableVertexAttribArray(TexCoordAttribLocation()));
  GLC(context_,
      context_->enableVertexAttribArray(TriangleIndexAttribLocation()));
}

}  // namespace cc
