Index: gpu/command_buffer/service/gpu_tracer_unittest.cc |
diff --git a/gpu/command_buffer/service/gpu_tracer_unittest.cc b/gpu/command_buffer/service/gpu_tracer_unittest.cc |
index 8de31fade1a32f6fcb392d8d93860865106124da..9a27a99a4ab39d5ae17380167bbab81483b37375 100644 |
--- a/gpu/command_buffer/service/gpu_tracer_unittest.cc |
+++ b/gpu/command_buffer/service/gpu_tracer_unittest.cc |
@@ -2,9 +2,6 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include <map> |
-#include <set> |
- |
#include "base/bind.h" |
#include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" |
#include "gpu/command_buffer/service/gpu_service_test.h" |
@@ -12,17 +9,16 @@ |
#include "testing/gtest/include/gtest/gtest.h" |
#include "ui/gl/gl_mock.h" |
#include "ui/gl/gpu_timing.h" |
+#include "ui/gl/gpu_timing_fake.h" |
namespace gpu { |
namespace gles2 { |
namespace { |
using ::testing::_; |
-using ::testing::AtLeast; |
using ::testing::AtMost; |
using ::testing::Exactly; |
using ::testing::Invoke; |
-using ::testing::NotNull; |
using ::testing::Return; |
int64 g_fakeCPUTime = 0; |
@@ -50,107 +46,6 @@ class MockOutputter : public Outputter { |
~MockOutputter() {} |
}; |
-class GlFakeQueries { |
- public: |
- GlFakeQueries() {} |
- |
- void Reset() { |
- current_time_ = 0; |
- next_query_id_ = 23; |
- alloced_queries_.clear(); |
- query_timestamp_.clear(); |
- } |
- |
- void SetCurrentGLTime(GLint64 current_time) { current_time_ = current_time; } |
- void SetDisjoint() { disjointed_ = true; } |
- |
- void GenQueries(GLsizei n, GLuint* ids) { |
- for (GLsizei i = 0; i < n; i++) { |
- ids[i] = next_query_id_++; |
- alloced_queries_.insert(ids[i]); |
- } |
- } |
- |
- void DeleteQueries(GLsizei n, const GLuint* ids) { |
- for (GLsizei i = 0; i < n; i++) { |
- alloced_queries_.erase(ids[i]); |
- query_timestamp_.erase(ids[i]); |
- } |
- } |
- |
- void GetQueryObjectiv(GLuint id, GLenum pname, GLint* params) { |
- switch (pname) { |
- case GL_QUERY_RESULT_AVAILABLE: { |
- std::map<GLuint, GLint64>::iterator it = query_timestamp_.find(id); |
- if (it != query_timestamp_.end() && it->second <= current_time_) |
- *params = 1; |
- else |
- *params = 0; |
- break; |
- } |
- default: |
- FAIL() << "Invalid variable passed to GetQueryObjectiv: " << pname; |
- } |
- } |
- |
- void QueryCounter(GLuint id, GLenum target) { |
- switch (target) { |
- case GL_TIMESTAMP: |
- ASSERT_TRUE(alloced_queries_.find(id) != alloced_queries_.end()); |
- query_timestamp_[id] = current_time_; |
- break; |
- default: |
- FAIL() << "Invalid variable passed to QueryCounter: " << target; |
- } |
- } |
- |
- void GetInteger64v(GLenum pname, GLint64 * data) { |
- switch (pname) { |
- case GL_TIMESTAMP: |
- *data = current_time_; |
- break; |
- default: |
- FAIL() << "Invalid variable passed to GetInteger64v: " << pname; |
- } |
- } |
- |
- void GetQueryObjectui64v(GLuint id, GLenum pname, GLuint64* params) { |
- switch (pname) { |
- case GL_QUERY_RESULT: |
- ASSERT_TRUE(query_timestamp_.find(id) != query_timestamp_.end()); |
- *params = query_timestamp_.find(id)->second; |
- break; |
- default: |
- FAIL() << "Invalid variable passed to GetQueryObjectui64v: " << pname; |
- } |
- } |
- |
- void GetIntegerv(GLenum pname, GLint* params) { |
- switch (pname) { |
- case GL_GPU_DISJOINT_EXT: |
- *params = static_cast<GLint>(disjointed_); |
- disjointed_ = false; |
- break; |
- default: |
- FAIL() << "Invalid variable passed to GetIntegerv: " << pname; |
- } |
- } |
- |
- void Finish() { |
- } |
- |
- GLenum GetError() { |
- return GL_NO_ERROR; |
- } |
- |
- protected: |
- bool disjointed_ = false; |
- GLint64 current_time_ = 0; |
- GLuint next_query_id_ = 0; |
- std::set<GLuint> alloced_queries_; |
- std::map<GLuint, GLint64> query_timestamp_; |
-}; |
- |
class GPUTracerTester : public GPUTracer { |
public: |
explicit GPUTracerTester(gles2::GLES2Decoder* decoder) |
@@ -215,13 +110,11 @@ class BaseGpuTest : public GpuServiceTest { |
GpuServiceTest::SetUpWithGLVersion(gl_version, extensions); |
// Disjoint check should only be called by kTracerTypeDisjointTimer type. |
- if (GetTimerType() == gfx::GPUTiming::kTimerTypeDisjoint) { |
- EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(AtLeast(1)) |
- .WillRepeatedly( |
- Invoke(&gl_fake_queries_, &GlFakeQueries::GetIntegerv)); |
- } else { |
- EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(Exactly(0)); |
- } |
+ if (GetTimerType() == gfx::GPUTiming::kTimerTypeDisjoint) |
+ gl_fake_queries_.ExpectDisjointCalls(*gl_); |
+ else |
+ gl_fake_queries_.ExpectNoDisjointCalls(*gl_); |
+ |
gpu_timing_client_ = GetGLContext()->CreateGPUTimingClient(); |
gpu_timing_client_->SetCpuTimeForTesting(base::Bind(&FakeCpuTime)); |
gl_fake_queries_.Reset(); |
@@ -238,34 +131,10 @@ class BaseGpuTest : public GpuServiceTest { |
} |
void ExpectTraceQueryMocks() { |
- if (gpu_timing_client_->IsAvailable() && |
- gpu_timing_client_->IsTimerOffsetAvailable()) { |
+ if (gpu_timing_client_->IsAvailable()) { |
// Delegate query APIs used by GPUTrace to a GlFakeQueries |
- EXPECT_CALL(*gl_, GenQueries(2, NotNull())).Times(AtLeast(1)) |
- .WillRepeatedly( |
- Invoke(&gl_fake_queries_, &GlFakeQueries::GenQueries)); |
- |
- EXPECT_CALL(*gl_, GetQueryObjectiv(_, GL_QUERY_RESULT_AVAILABLE, |
- NotNull())) |
- .WillRepeatedly( |
- Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectiv)); |
- |
- EXPECT_CALL(*gl_, GetInteger64v(GL_TIMESTAMP, _)) |
- .WillRepeatedly( |
- Invoke(&gl_fake_queries_, &GlFakeQueries::GetInteger64v)); |
- |
- EXPECT_CALL(*gl_, QueryCounter(_, GL_TIMESTAMP)).Times(AtLeast(2)) |
- .WillRepeatedly( |
- Invoke(&gl_fake_queries_, &GlFakeQueries::QueryCounter)); |
- |
- EXPECT_CALL(*gl_, GetQueryObjectui64v(_, GL_QUERY_RESULT, NotNull())) |
- .WillRepeatedly( |
- Invoke(&gl_fake_queries_, |
- &GlFakeQueries::GetQueryObjectui64v)); |
- |
- EXPECT_CALL(*gl_, DeleteQueries(2, NotNull())).Times(AtLeast(1)) |
- .WillRepeatedly( |
- Invoke(&gl_fake_queries_, &GlFakeQueries::DeleteQueries)); |
+ const bool elapsed = (GetTimerType() == gfx::GPUTiming::kTimerTypeEXT); |
+ gl_fake_queries_.ExpectGPUTimerQuery(*gl_, elapsed); |
} |
} |
@@ -282,9 +151,12 @@ class BaseGpuTest : public GpuServiceTest { |
const std::string& category, |
const std::string& name, int64 expect_start_time, |
int64 expect_end_time, |
+ bool trace_service, |
bool trace_device) { |
- EXPECT_CALL(*outputter, |
- TraceServiceEnd(source, category, name)); |
+ if (trace_service) { |
+ EXPECT_CALL(*outputter, |
+ TraceServiceEnd(source, category, name)); |
+ } |
if (trace_device) { |
EXPECT_CALL(*outputter, |
@@ -299,35 +171,34 @@ class BaseGpuTest : public GpuServiceTest { |
} |
void ExpectOutputterMocks(MockOutputter* outputter, |
+ bool tracing_service, |
bool tracing_device, |
GpuTracerSource source, |
const std::string& category, |
const std::string& name, int64 expect_start_time, |
int64 expect_end_time) { |
- ExpectOutputterBeginMocks(outputter, source, category, name); |
- bool valid_timer = tracing_device && |
- gpu_timing_client_->IsAvailable() && |
- gpu_timing_client_->IsTimerOffsetAvailable(); |
+ if (tracing_service) |
+ ExpectOutputterBeginMocks(outputter, source, category, name); |
+ const bool valid_timer = tracing_device && |
+ gpu_timing_client_->IsAvailable() && |
+ GetTimerType() != gfx::GPUTiming::kTimerTypeEXT; |
ExpectOutputterEndMocks(outputter, source, category, name, |
- expect_start_time, expect_end_time, valid_timer); |
+ expect_start_time, expect_end_time, |
+ tracing_service, valid_timer); |
} |
void ExpectTracerOffsetQueryMocks() { |
if (GetTimerType() != gfx::GPUTiming::kTimerTypeARB) { |
- EXPECT_CALL(*gl_, GetInteger64v(GL_TIMESTAMP, NotNull())) |
- .Times(Exactly(0)); |
+ gl_fake_queries_.ExpectNoOffsetCalculationQuery(*gl_); |
} else { |
- EXPECT_CALL(*gl_, GetInteger64v(GL_TIMESTAMP, NotNull())) |
- .Times(AtMost(1)) |
- .WillRepeatedly( |
- Invoke(&gl_fake_queries_, &GlFakeQueries::GetInteger64v)); |
+ gl_fake_queries_.ExpectOffsetCalculationQuery(*gl_); |
} |
} |
gfx::GPUTiming::TimerType GetTimerType() { return test_timer_type_; } |
gfx::GPUTiming::TimerType test_timer_type_; |
- GlFakeQueries gl_fake_queries_; |
+ gfx::GPUTimingFake gl_fake_queries_; |
scoped_refptr<gfx::GPUTimingClient> gpu_timing_client_; |
scoped_refptr<MockOutputter> outputter_ref_; |
@@ -353,10 +224,9 @@ class BaseGpuTraceTest : public BaseGpuTest { |
const int64 expect_end_time = |
(end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time; |
- if (tracing_service) |
- ExpectOutputterMocks(outputter_ref_.get(), tracing_device, tracer_source, |
- category_name, trace_name, |
- expect_start_time, expect_end_time); |
+ ExpectOutputterMocks(outputter_ref_.get(), tracing_service, tracing_device, |
+ tracer_source, category_name, trace_name, |
+ expect_start_time, expect_end_time); |
if (tracing_device) |
ExpectTraceQueryMocks(); |
@@ -380,11 +250,13 @@ class BaseGpuTraceTest : public BaseGpuTest { |
// Shouldn't be available until the queries complete |
gl_fake_queries_.SetCurrentGLTime(end_timestamp - |
base::Time::kNanosecondsPerMicrosecond); |
+ g_fakeCPUTime = expect_end_time - 1; |
if (tracing_device) |
EXPECT_FALSE(trace->IsAvailable()); |
// Now it should be available |
gl_fake_queries_.SetCurrentGLTime(end_timestamp); |
+ g_fakeCPUTime = expect_end_time; |
EXPECT_TRUE(trace->IsAvailable()); |
// Proces should output expected Trace results to MockOutputter |
@@ -464,10 +336,7 @@ class BaseGpuTracerTest : public BaseGpuTest { |
void DoTracerMarkersTest() { |
ExpectTracerOffsetQueryMocks(); |
- |
- EXPECT_CALL(*gl_, GetError()).Times(AtLeast(0)) |
- .WillRepeatedly( |
- Invoke(&gl_fake_queries_, &GlFakeQueries::GetError)); |
+ gl_fake_queries_.ExpectGetErrorCalls(*gl_); |
const std::string category_name("trace_category"); |
const std::string trace_name("trace_test"); |
@@ -512,7 +381,6 @@ class BaseGpuTracerTest : public BaseGpuTest { |
source_category, source_trace_name); |
ASSERT_TRUE(tracer.Begin(source_category, source_trace_name, source)); |
} |
- |
for (int i = 0; i < NUM_TRACER_SOURCES; ++i) { |
// Set times so each source has a different time. |
gl_fake_queries_.SetCurrentGLTime( |
@@ -525,33 +393,27 @@ class BaseGpuTracerTest : public BaseGpuTest { |
std::string source_category = category_name + num_char; |
std::string source_trace_name = trace_name + num_char; |
- bool valid_timer = gpu_timing_client_->IsAvailable() && |
- gpu_timing_client_->IsTimerOffsetAvailable(); |
+ const bool valid_timer = gpu_timing_client_->IsAvailable() && |
+ GetTimerType() != gfx::GPUTiming::kTimerTypeEXT; |
const GpuTracerSource source = static_cast<GpuTracerSource>(i); |
ExpectOutputterEndMocks(outputter_ref_.get(), source, source_category, |
source_trace_name, expect_start_time + i, |
- expect_end_time + i, valid_timer); |
- |
+ expect_end_time + i, true, valid_timer); |
// Check if the current category/name are correct for this source. |
ASSERT_EQ(source_category, tracer.CurrentCategory(source)); |
ASSERT_EQ(source_trace_name, tracer.CurrentName(source)); |
ASSERT_TRUE(tracer.End(source)); |
} |
- |
ASSERT_TRUE(tracer.EndDecoding()); |
- |
outputter_ref_ = NULL; |
} |
void DoDisjointTest() { |
// Cause a disjoint in a middle of a trace and expect no output calls. |
ExpectTracerOffsetQueryMocks(); |
- |
- EXPECT_CALL(*gl_, GetError()).Times(AtLeast(0)) |
- .WillRepeatedly( |
- Invoke(&gl_fake_queries_, &GlFakeQueries::GetError)); |
+ gl_fake_queries_.ExpectGetErrorCalls(*gl_); |
const GpuTracerSource tracer_source = kTraceGroupMarker; |
const std::string category_name("trace_category"); |
@@ -589,7 +451,7 @@ class BaseGpuTracerTest : public BaseGpuTest { |
// Create GPUTimingClient to make sure disjoint value is correct. This |
// should not interfere with the tracer's disjoint value. |
- scoped_refptr<gfx::GPUTimingClient> disjoint_client = |
+ scoped_refptr<gfx::GPUTimingClient> disjoint_client = |
GetGLContext()->CreateGPUTimingClient(); |
// We assert here based on the disjoint_client because if disjoints are not |
@@ -600,7 +462,7 @@ class BaseGpuTracerTest : public BaseGpuTest { |
ExpectOutputterEndMocks(outputter_ref_.get(), tracer_source, |
category_name, trace_name, |
- expect_start_time, expect_end_time, false); |
+ expect_start_time, expect_end_time, true, false); |
ASSERT_TRUE(tracer.End(source)); |
ASSERT_TRUE(tracer.EndDecoding()); |