// 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 #include #include #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 allocated_queries_; struct QueryResult { enum QueryResultType { kQueryResultType_Invalid, kQueryResultType_TimeStamp, kQueryResultType_Elapsed } type_ = kQueryResultType_Invalid; GLint64 begin_time_ = 0; GLint64 value_ = 0; }; std::map 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_