Index: apps/moterm/gl_helper_test_app.cc |
diff --git a/apps/moterm/gl_helper_test_app.cc b/apps/moterm/gl_helper_test_app.cc |
deleted file mode 100644 |
index 7147f6d536ceadbee2d38a75b5cc1aabda520949..0000000000000000000000000000000000000000 |
--- a/apps/moterm/gl_helper_test_app.cc |
+++ /dev/null |
@@ -1,279 +0,0 @@ |
-// 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/interfaces/geometry.mojom.h" |
-#include "mojo/services/gpu/interfaces/context_provider.mojom.h" |
-#include "mojo/services/native_viewport/interfaces/native_viewport.mojom.h" |
-#include "mojo/services/surfaces/interfaces/display.mojom.h" |
-#include "mojo/services/surfaces/interfaces/quads.mojom.h" |
-#include "mojo/services/surfaces/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::SkXfermode::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, |
- false, 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); |
-} |