// Copyright 2015 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.

// This is a test application for gl_helper.*, which draws directly to a native
// viewport (without using the view manager).

#include <GLES2/gl2.h>
#include <math.h>

#include "apps/moterm/gl_helper.h"
#include "base/bind.h"
#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "mojo/application/application_runner_chromium.h"
#include "mojo/public/c/system/main.h"
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/services/geometry/public/interfaces/geometry.mojom.h"
#include "mojo/services/gpu/public/interfaces/context_provider.mojom.h"
#include "mojo/services/native_viewport/public/interfaces/native_viewport.mojom.h"
#include "mojo/services/surfaces/public/interfaces/display.mojom.h"
#include "mojo/services/surfaces/public/interfaces/quads.mojom.h"
#include "mojo/services/surfaces/public/interfaces/surfaces.mojom.h"

namespace {

GLuint LoadShader(GLenum type, const char* shader_source) {
  GLuint shader = glCreateShader(type);
  CHECK(shader);
  glShaderSource(shader, 1, &shader_source, nullptr);
  glCompileShader(shader);
  GLint compiled = 0;
  glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
  CHECK(compiled);
  return shader;
}

class GlHelperExampleApp : public mojo::ApplicationDelegate,
                           public GlHelper::Client {
 public:
  GlHelperExampleApp()
      : application_impl_(),
        program_(0),
        transform_location_(0),
        scale_location_(0),
        framebuffer_(0),
        vertex_buffer_(0),
        draw_number_(0) {}
  ~GlHelperExampleApp() override {}

 private:
  void OnViewportMetricsReceived(mojo::ViewportMetricsPtr metrics) {
    DVLOG(1) << "Viewport metrics received: size = " << metrics->size->width
             << "x" << metrics->size->height
             << ", device_pixel_ratio = " << metrics->device_pixel_ratio;

    if (metrics->size->width != viewport_size_.width ||
        metrics->size->height != viewport_size_.height) {
      viewport_size_ = *metrics->size;
      gl_helper_->SetSurfaceSize(viewport_size_);
    }

    native_viewport_->RequestMetrics(
        base::Bind(&GlHelperExampleApp::OnViewportMetricsReceived,
                   base::Unretained(this)));
  }

  void InitGlState() {
    static const char vertex_shader_source[] =
        "attribute vec4 position;                        \n"
        "uniform mat4 transform;                         \n"
        "uniform vec4 scale;                             \n"
        "void main() {                                   \n"
        "  gl_Position = (position * transform) * scale; \n"
        "}                                               \n";
    static const char fragment_shader_source[] =
        "precision mediump float;                   \n"
        "void main() {                              \n"
        "  gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); \n"
        "}                                          \n";
    static const float vertices[] = {
        0.f, 0.5f, -sqrtf(5.f) / 4.f, -0.25f, sqrtf(5.f) / 4.f, -0.25f};
    GLuint vertex_shader = LoadShader(GL_VERTEX_SHADER, vertex_shader_source);
    GLuint fragment_shader =
        LoadShader(GL_FRAGMENT_SHADER, fragment_shader_source);
    program_ = glCreateProgram();
    CHECK(program_);
    glAttachShader(program_, vertex_shader);
    glAttachShader(program_, fragment_shader);
    glBindAttribLocation(program_, kPositionLocation, "position");
    glLinkProgram(program_);
    glDeleteShader(vertex_shader);
    glDeleteShader(fragment_shader);
    GLint linked = 0;
    glGetProgramiv(program_, GL_LINK_STATUS, &linked);
    CHECK(linked);
    transform_location_ = glGetUniformLocation(program_, "transform");
    CHECK_NE(transform_location_, -1);
    scale_location_ = glGetUniformLocation(program_, "scale");
    CHECK_NE(scale_location_, -1);

    glGenFramebuffers(1, &framebuffer_);
    CHECK(framebuffer_);

    glGenBuffers(1, &vertex_buffer_);
    CHECK(vertex_buffer_);
    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glClearColor(0.f, 1.f, 0.f, 1.f);
  }

  void Draw() {
    DCHECK(gl_helper_);

    gl_helper_->StartFrame();

    if (!program_)
      InitGlState();

    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
                           gl_helper_->GetFrameTexture(), 0);
    glViewport(0, 0, viewport_size_.width, viewport_size_.height);

    glClear(GL_COLOR_BUFFER_BIT);

    glUseProgram(program_);

    float angle = static_cast<float>(draw_number_ % 360) * M_PI / 180;
    float transform[4][4] = {{cosf(angle), sinf(angle), 0.f, 0.f},
                             {-sinf(angle), cosf(angle), 0.f, 0.f},
                             {0.f, 0.f, 1.f, 0.f},
                             {0.f, 0.f, 0.f, 1.f}};
    glUniformMatrix4fv(transform_location_, 1, GL_FALSE, &transform[0][0]);
    if (viewport_size_.width >= viewport_size_.height) {
      glUniform4f(scale_location_, static_cast<float>(viewport_size_.height) /
                                       static_cast<float>(viewport_size_.width),
                  1.f, 1.f, 1.f);
    } else {
      glUniform4f(scale_location_, 1.f,
                  static_cast<float>(viewport_size_.width) /
                      static_cast<float>(viewport_size_.height),
                  1.f, 1.f);
    }

    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
    glVertexAttribPointer(kPositionLocation, 2, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(kPositionLocation);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    gl_helper_->EndFrame();

    draw_number_++;
  }

  void SubmitFrame() {
    DCHECK(surface_id_.local);
    DCHECK(surface_id_.id_namespace);

    mojo::FramePtr frame = mojo::Frame::New();
    frame->resources = mojo::Array<mojo::TransferableResourcePtr>::New(0);
    frame->passes = mojo::Array<mojo::PassPtr>::New(1);
    mojo::PassPtr pass = mojo::Pass::New();
    pass->id = 0;
    mojo::Rect viewport_rect;
    viewport_rect.width = viewport_size_.width;
    viewport_rect.height = viewport_size_.height;
    pass->output_rect = viewport_rect.Clone();
    pass->damage_rect = viewport_rect.Clone();
    mojo::Transform identity_transform;
    identity_transform.matrix = mojo::Array<float>::New(16);
    for (size_t i = 0; i < 4; i++) {
      for (size_t j = 0; j < 4; j++)
        identity_transform.matrix[4 * i + j] = (i == j);
    }
    pass->transform_to_root_target = identity_transform.Clone();
    pass->has_transparent_background = false;
    pass->quads = mojo::Array<mojo::QuadPtr>::New(1);
    mojo::QuadPtr quad = mojo::Quad::New();
    quad->material = mojo::MATERIAL_SURFACE_CONTENT;
    quad->rect = viewport_rect.Clone();
    quad->opaque_rect = viewport_rect.Clone();
    quad->visible_rect = viewport_rect.Clone();
    quad->needs_blending = false;
    quad->shared_quad_state_index = 0;
    mojo::SurfaceQuadStatePtr surface_quad_state =
        mojo::SurfaceQuadState::New();
    surface_quad_state->surface = surface_id_.Clone();
    quad->surface_quad_state = surface_quad_state.Pass();

    pass->quads[0] = quad.Pass();
    pass->shared_quad_states = mojo::Array<mojo::SharedQuadStatePtr>::New(1);
    mojo::SharedQuadStatePtr shared_quad_state = mojo::SharedQuadState::New();
    shared_quad_state->content_to_target_transform = identity_transform.Clone();
    shared_quad_state->content_bounds = viewport_size_.Clone();
    shared_quad_state->visible_content_rect = viewport_rect.Clone();
    shared_quad_state->clip_rect = viewport_rect.Clone();
    shared_quad_state->is_clipped = false;
    shared_quad_state->opacity = 1;
    shared_quad_state->blend_mode = mojo::SK_XFERMODE_kSrc_Mode;
    shared_quad_state->sorting_context_id = 0;
    pass->shared_quad_states[0] = shared_quad_state.Pass();
    frame->passes[0] = pass.Pass();

    DCHECK(display_);
    display_->SubmitFrame(frame.Pass(), mojo::Display::SubmitFrameCallback());
  }

  // |mojo::ApplicationDelegate|:
  void Initialize(mojo::ApplicationImpl* application_impl) override {
    DCHECK(!application_impl_);
    application_impl_ = application_impl;

    application_impl->ConnectToService("mojo:native_viewport_service",
                                       &native_viewport_);
    viewport_size_.width = 800;
    viewport_size_.height = 600;
    native_viewport_->Create(
        viewport_size_.Clone(), mojo::SurfaceConfiguration::New(),
        base::Bind(&GlHelperExampleApp::OnViewportMetricsReceived,
                   base::Unretained(this)));
    native_viewport_->Show();

    mojo::ContextProviderPtr context_provider;
    native_viewport_->GetContextProvider(GetProxy(&context_provider));

    mojo::DisplayFactoryPtr display_factory;
    application_impl_->ConnectToService("mojo:surfaces_service",
                                        &display_factory);
    display_factory->Create(context_provider.Pass(), nullptr,
                            GetProxy(&display_));

    gl_helper_.reset(new GlHelper(this, application_impl_->shell(), GL_RGBA,
                                  viewport_size_));
    Draw();
  }

  // |GlHelper::Client|:
  void OnSurfaceIdChanged(mojo::SurfaceIdPtr surface_id) override {
    surface_id_ = *surface_id;
    SubmitFrame();
  }

  void OnContextLost() override { CHECK(false) << "Oops, lost context."; }

  void OnFrameDisplayed(uint32_t frame_id) override { Draw(); }

  static const GLuint kPositionLocation = 0;

  mojo::ApplicationImpl* application_impl_;
  mojo::NativeViewportPtr native_viewport_;
  mojo::Size viewport_size_;
  mojo::DisplayPtr display_;
  scoped_ptr<GlHelper> gl_helper_;

  mojo::SurfaceId surface_id_;

  // GL-related state:
  GLuint program_;
  GLint transform_location_;
  GLint scale_location_;
  GLuint framebuffer_;
  GLuint vertex_buffer_;

  uint64_t draw_number_;

  DISALLOW_COPY_AND_ASSIGN(GlHelperExampleApp);
};

const GLuint GlHelperExampleApp::kPositionLocation;

}  // namespace

MojoResult MojoMain(MojoHandle application_request) {
  mojo::ApplicationRunnerChromium runner(new GlHelperExampleApp());
  return runner.Run(application_request);
}
