/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "shadertoy_shader.h" #include "utils.h" #include <fstream> #include <sstream> #include <android/log.h> int g_framebuffer_width = 0; int g_framebuffer_height = 0; GLuint g_quad_vao = 0; ShadertoyShader shader; #define LOG_TAG "GPUStressTestActivity" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) double NowInMs() { timespec timeval; clock_gettime(CLOCK_REALTIME, &timeval); double time = 1000.0 * timeval.tv_sec + (double) timeval.tv_nsec / 1e6; return time; } GLuint CreateFullscreenQuad() { GLfloat quadVertices[] = { // Positions -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, }; // Setup screen VAO GLuint quadVAO, quadVBO; glGenVertexArrays(1, &quadVAO); glGenBuffers(1, &quadVBO); glBindVertexArray(quadVAO); glBindBuffer(GL_ARRAY_BUFFER, quadVBO); glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (GLvoid*)0); glBindVertexArray(0); return quadVAO; } void CreateShader() { extern std::string g_shader; shader.CreateShaderFromString(g_shader); } void Init(int width, int height) { GLint num_extensions = 0; glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions); for (GLint i = 0; i < num_extensions; ++i) { const char* extension = (char*)( glGetStringi(GL_EXTENSIONS, i)); } g_framebuffer_width = width; g_framebuffer_height = height; CreateShader(); g_quad_vao = CreateFullscreenQuad(); } void DrawFrame() { static double previous_time = 0; static float angle = 0.0f; static double elapsed_time_sum = 0; static double gpu_timer_elapsed_sum = 0; static double start_time = NowInMs(); // After how many frames to report the avg frame time. int kFrameReportInterval = 1; static int frame_count = 0; frame_count++; if (frame_count == kFrameReportInterval) { LOGI("%f\n", elapsed_time_sum / (double)kFrameReportInterval); frame_count = 0; elapsed_time_sum = 0; gpu_timer_elapsed_sum = 0; } double current_time = NowInMs(); double elapsed_time = current_time - previous_time; previous_time = current_time; elapsed_time_sum += elapsed_time; float global_time = (float)(NowInMs() - start_time); glViewport(0, 0, g_framebuffer_width, g_framebuffer_height); glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); float fov = 45; shader.PrepareForDraw(g_framebuffer_width, g_framebuffer_height, global_time, frame_count, (float)elapsed_time); glBindVertexArray(g_quad_vao); glDrawArrays(GL_TRIANGLES, 0, 6); } void Cleanup() { }