// 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 <stdint.h>

#include "gpu/command_buffer/client/gles2_interface.h"
#include "ui/gfx/geometry/rect_f.h"

namespace cc {

void SetupGLContext(gpu::gles2::GLES2Interface* gl,
                    GLuint quad_elements_vbo,
                    GLuint quad_vertices_vbo) {
  gl->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, quad_elements_vbo);

  gl->BindBuffer(GL_ARRAY_BUFFER, quad_vertices_vbo);
  // OpenGL defines the last parameter to VertexAttribPointer as type
  // "const GLvoid*" even though it is actually an offset into the buffer
  // object's data store and not a pointer to the client's address space.
  const void* offsets[3] = {
      0,
      reinterpret_cast<const void*>(3 * sizeof(float)),
      reinterpret_cast<const void*>(5 * sizeof(float)),
  };

  gl->VertexAttribPointer(GeometryBinding::PositionAttribLocation(), 3,
                          GL_FLOAT, false, 6 * sizeof(float), offsets[0]);
  gl->VertexAttribPointer(GeometryBinding::TexCoordAttribLocation(), 2,
                          GL_FLOAT, false, 6 * sizeof(float), offsets[1]);
  gl->VertexAttribPointer(GeometryBinding::TriangleIndexAttribLocation(), 1,
                          GL_FLOAT, false, 6 * sizeof(float), offsets[2]);
  gl->EnableVertexAttribArray(GeometryBinding::PositionAttribLocation());
  gl->EnableVertexAttribArray(GeometryBinding::TexCoordAttribLocation());
  gl->EnableVertexAttribArray(GeometryBinding::TriangleIndexAttribLocation());
}

GeometryBindingQuad::GeometryBindingQuad() {
  v0 = {{0, 0, 0}, {0, 0}, 0};
  v1 = {{0, 0, 0}, {0, 0}, 0};
  v2 = {{0, 0, 0}, {0, 0}, 0};
  v3 = {{0, 0, 0}, {0, 0}, 0};
}

GeometryBindingQuad::GeometryBindingQuad(const GeometryBindingVertex& vert0,
                                         const GeometryBindingVertex& vert1,
                                         const GeometryBindingVertex& vert2,
                                         const GeometryBindingVertex& vert3) {
  v0 = vert0;
  v1 = vert1;
  v2 = vert2;
  v3 = vert3;
}

GeometryBindingQuadIndex::GeometryBindingQuadIndex() {
  memset(data, 0x0, sizeof(data));
}

GeometryBindingQuadIndex::GeometryBindingQuadIndex(uint16_t index0,
                                                   uint16_t index1,
                                                   uint16_t index2,
                                                   uint16_t index3,
                                                   uint16_t index4,
                                                   uint16_t index5) {
  data[0] = index0;
  data[1] = index1;
  data[2] = index2;
  data[3] = index3;
  data[4] = index4;
  data[5] = index5;
}

}  // namespace cc
