diff options
author | dyen <dyen@chromium.org> | 2015-06-09 18:39:43 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-06-10 01:40:06 +0000 |
commit | 26bd4c4dd55f61976b2ce58bacb7c82d60df7c5b (patch) | |
tree | 82ac5797679ac30824f81928ba91cf4bf72d4fcd /gpu | |
parent | e92ab037dbaab094d7b2253d63fd60cd48e9f9dc (diff) | |
download | chromium_src-26bd4c4dd55f61976b2ce58bacb7c82d60df7c5b.zip chromium_src-26bd4c4dd55f61976b2ce58bacb7c82d60df7c5b.tar.gz chromium_src-26bd4c4dd55f61976b2ce58bacb7c82d60df7c5b.tar.bz2 |
Unit tests have been created for the GPUTiming.
We have traditionally tested all of the GPUTiming functionalities within
GPUTracer since GPUTracer utilizes GPUTiming extensively. With the
introduction of gl_unittests as well as GPUTiming getting more
complicated it makes sense to have GPUTiming specific unit tests. This
CL is the first step in moving towards that direction, simply moving
all of the GPUTiming GL queries into a fake query class which can
handle the query expectations.
R=sievers@chromium.org, vmiura@chromium.org
BUG=453965, 345227
Review URL: https://codereview.chromium.org/1162203006
Cr-Commit-Position: refs/heads/master@{#333642}
Diffstat (limited to 'gpu')
-rw-r--r-- | gpu/command_buffer/service/gpu_tracer_unittest.cc | 212 |
1 files changed, 37 insertions, 175 deletions
diff --git a/gpu/command_buffer/service/gpu_tracer_unittest.cc b/gpu/command_buffer/service/gpu_tracer_unittest.cc index 8de31fa..9a27a99 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()); |