1 /*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "shadertoy_shader.h"
18 #include "utils.h"
19
20 #include <fstream>
21 #include <sstream>
22 #include <android/log.h>
23
24 int g_framebuffer_width = 0;
25 int g_framebuffer_height = 0;
26 GLuint g_quad_vao = 0;
27
28 ShadertoyShader shader;
29
30 #define LOG_TAG "GPUStressTestActivity"
31 #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
32 #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
33
NowInMs()34 double NowInMs() {
35 timespec timeval;
36 clock_gettime(CLOCK_REALTIME, &timeval);
37 double time = 1000.0 * timeval.tv_sec + (double) timeval.tv_nsec / 1e6;
38 return time;
39 }
40
41
CreateFullscreenQuad()42 GLuint CreateFullscreenQuad() {
43 GLfloat quadVertices[] = {
44 // Positions
45 -1.0f, 1.0f,
46 -1.0f, -1.0f,
47 1.0f, -1.0f,
48
49 -1.0f, 1.0f,
50 1.0f, -1.0f,
51 1.0f, 1.0f,
52 };
53
54 // Setup screen VAO
55 GLuint quadVAO, quadVBO;
56 glGenVertexArrays(1, &quadVAO);
57 glGenBuffers(1, &quadVBO);
58 glBindVertexArray(quadVAO);
59 glBindBuffer(GL_ARRAY_BUFFER, quadVBO);
60 glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW);
61 glEnableVertexAttribArray(0);
62 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (GLvoid*)0);
63 glBindVertexArray(0);
64
65 return quadVAO;
66 }
67
CreateShader()68 void CreateShader() {
69 extern std::string g_shader;
70 shader.CreateShaderFromString(g_shader);
71 }
72
Init(int width,int height)73 void Init(int width, int height) {
74 GLint num_extensions = 0;
75 glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions);
76 for (GLint i = 0; i < num_extensions; ++i) {
77 const char* extension = (char*)(
78 glGetStringi(GL_EXTENSIONS, i));
79 }
80
81 g_framebuffer_width = width;
82 g_framebuffer_height = height;
83
84
85 CreateShader();
86 g_quad_vao = CreateFullscreenQuad();
87 }
88
DrawFrame()89 void DrawFrame() {
90 static double previous_time = 0;
91 static float angle = 0.0f;
92 static double elapsed_time_sum = 0;
93 static double gpu_timer_elapsed_sum = 0;
94 static double start_time = NowInMs();
95
96 // After how many frames to report the avg frame time.
97 int kFrameReportInterval = 1;
98 static int frame_count = 0;
99
100 frame_count++;
101 if (frame_count == kFrameReportInterval) {
102 LOGI("%f\n", elapsed_time_sum / (double)kFrameReportInterval);
103
104 frame_count = 0;
105 elapsed_time_sum = 0;
106 gpu_timer_elapsed_sum = 0;
107 }
108
109 double current_time = NowInMs();
110 double elapsed_time = current_time - previous_time;
111 previous_time = current_time;
112 elapsed_time_sum += elapsed_time;
113 float global_time = (float)(NowInMs() - start_time);
114
115 glViewport(0, 0, g_framebuffer_width, g_framebuffer_height);
116
117 glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
118 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
119
120 float fov = 45;
121
122 shader.PrepareForDraw(g_framebuffer_width, g_framebuffer_height, global_time, frame_count, (float)elapsed_time);
123
124 glBindVertexArray(g_quad_vao);
125
126 glDrawArrays(GL_TRIANGLES, 0, 6);
127 }
128
Cleanup()129 void Cleanup() {
130
131 }
132