blob: dcc6216921f1dea202eed9e9e50fbc33ecf3c762 [file] [log] [blame]
Alex Vakulenkoe4eec202017-01-27 14:41:04 -08001#include "include/private/dvr/graphics/timer_query.h"
2
3#include <GLES2/gl2ext.h>
4#include <base/logging.h>
5
6namespace android {
7namespace dvr {
8
9TimerQuery::TimerQuery() {}
10
11TimerQuery::~TimerQuery() { Delete(); }
12
13void TimerQuery::Init() { glGenQueriesEXT(1, &query_); }
14
15void TimerQuery::Delete() {
16 if (query_) {
17 glDeleteQueriesEXT(1, &query_);
18 query_ = 0;
19 }
20}
21
22void TimerQuery::Begin() {
23 if (query_ == 0) {
24 Init();
25 }
26 glBeginQueryEXT(GL_TIME_ELAPSED_EXT, query_);
27}
28
29void TimerQuery::End() { glEndQueryEXT(GL_TIME_ELAPSED_EXT); }
30
31double TimerQuery::GetTimeInMS() {
32 GLuint64 elapsed_time = 0;
33 glGetQueryObjectui64vEXT(query_, GL_QUERY_RESULT, &elapsed_time);
34 return static_cast<double>(elapsed_time) / 1000000.0;
35}
36
37SyncTimerQuery::SyncTimerQuery() { timer_.Begin(); }
38
39double SyncTimerQuery::FlushAndGetTimeInMS() {
40 if (timer_.query_ == 0) {
41 LOG(ERROR) << "Error: Only call FlushAndGetTimeInMS() once.";
42 return 0.0;
43 }
44 timer_.End();
45 glFlush();
46 GLint done = 0;
47 while (!done) {
48 glGetQueryObjectivEXT(timer_.query_, GL_QUERY_RESULT_AVAILABLE, &done);
49 }
50
51 GLint disjoint_occurred = 0;
52 glGetIntegerv(GL_GPU_DISJOINT_EXT, &disjoint_occurred);
53 if (disjoint_occurred) {
54 LOG(ERROR) << "Disjoint occurred.";
55 timer_.Delete();
56 return 0.0;
57 }
58
59 double elapsed_time = timer_.GetTimeInMS();
60 timer_.Delete();
61 return elapsed_time;
62}
63
64} // namespace dvr
65} // namespace android