blob: 70789216a397633788364cf1750042e253b62570 [file] [log] [blame]
// 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.
#ifndef UI_GL_GPU_TIMING_FAKE_H_
#define UI_GL_GPU_TIMING_FAKE_H_
#include <stdint.h>
#include <map>
#include <set>
#include "ui/gl/gl_bindings.h"
namespace gl {
class MockGLInterface;
class GPUTimingFake {
public:
GPUTimingFake();
~GPUTimingFake();
void Reset();
// Used to set the current GPU time queries will return.
static int64_t GetFakeCPUTime(); // Useful for binding for Fake CPU time.
void SetCurrentCPUTime(int64_t current_time);
void SetCurrentGLTime(GLint64 current_time);
void SetCPUGLOffset(int64_t offset);
// Used to signal a disjoint occurred for disjoint timer queries.
void SetDisjoint();
// GPUTimer fake queries which can be called multiple times.
void ExpectGetErrorCalls(MockGLInterface& gl);
void ExpectDisjointCalls(MockGLInterface& gl);
void ExpectNoDisjointCalls(MockGLInterface& gl);
// GPUTimer fake queries which can only be called once per setup.
void ExpectGPUTimeStampQuery(MockGLInterface& gl, bool elapsed_query);
void ExpectGPUTimerQuery(MockGLInterface& gl, bool elapsed_query);
void ExpectOffsetCalculationQuery(MockGLInterface& gl);
void ExpectNoOffsetCalculationQuery(MockGLInterface& gl);
// Fake GL Functions.
void FakeGLGenQueries(GLsizei n, GLuint* ids);
void FakeGLDeleteQueries(GLsizei n, const GLuint* ids);
void FakeGLBeginQuery(GLenum target, GLuint id);
void FakeGLEndQuery(GLenum target);
void FakeGLGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params);
void FakeGLQueryCounter(GLuint id, GLenum target);
void FakeGLGetInteger64v(GLenum pname, GLint64 * data);
void FakeGLGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64* params);
void FakeGLGetIntegerv(GLenum pname, GLint* params);
GLenum FakeGLGetError();
protected:
bool disjointed_ = false;
static int64_t fake_cpu_time_;
GLint64 current_gl_time_ = 0;
int64_t gl_cpu_time_offset_ = 0;
GLuint next_query_id_ = 0;
std::set<GLuint> allocated_queries_;
struct QueryResult {
enum QueryResultType {
kQueryResultType_Invalid,
kQueryResultType_TimeStamp,
kQueryResultType_Elapsed
} type_ = kQueryResultType_Invalid;
GLint64 begin_time_ = 0;
GLint64 value_ = 0;
};
std::map<GLuint, QueryResult> query_results_;
struct ElapsedQuery {
bool active_ = false;
GLuint query_id_ = 0;
GLint64 begin_time_ = 0;
void Reset() {
active_ = false;
query_id_ = 0;
begin_time_ = 0;
}
};
ElapsedQuery current_elapsed_query_;
};
} // namespace gl
#endif // UI_GL_GPU_TIMING_FAKE_H_