| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <map> | 5 #include <map> |
| 6 #include <set> | 6 #include <set> |
| 7 | 7 |
| 8 #include "gpu/command_buffer/service/gpu_service_test.h" | 8 #include "gpu/command_buffer/service/gpu_service_test.h" |
| 9 #include "gpu/command_buffer/service/gpu_tracer.h" | 9 #include "gpu/command_buffer/service/gpu_tracer.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 | 44 |
| 45 void Reset() { | 45 void Reset() { |
| 46 current_time_ = 0; | 46 current_time_ = 0; |
| 47 next_query_id_ = 23; | 47 next_query_id_ = 23; |
| 48 alloced_queries_.clear(); | 48 alloced_queries_.clear(); |
| 49 query_timestamp_.clear(); | 49 query_timestamp_.clear(); |
| 50 } | 50 } |
| 51 | 51 |
| 52 void SetCurrentGLTime(GLint64 current_time) { current_time_ = current_time; } | 52 void SetCurrentGLTime(GLint64 current_time) { current_time_ = current_time; } |
| 53 | 53 |
| 54 void GenQueries(GLsizei n, GLuint* ids) { | 54 void GenQueriesARB(GLsizei n, GLuint* ids) { |
| 55 for (GLsizei i = 0; i < n; i++) { | 55 for (GLsizei i = 0; i < n; i++) { |
| 56 ids[i] = next_query_id_++; | 56 ids[i] = next_query_id_++; |
| 57 alloced_queries_.insert(ids[i]); | 57 alloced_queries_.insert(ids[i]); |
| 58 } | 58 } |
| 59 } | 59 } |
| 60 | 60 |
| 61 void DeleteQueries(GLsizei n, const GLuint* ids) { | 61 void DeleteQueriesARB(GLsizei n, const GLuint* ids) { |
| 62 for (GLsizei i = 0; i < n; i++) { | 62 for (GLsizei i = 0; i < n; i++) { |
| 63 alloced_queries_.erase(ids[i]); | 63 alloced_queries_.erase(ids[i]); |
| 64 query_timestamp_.erase(ids[i]); | 64 query_timestamp_.erase(ids[i]); |
| 65 } | 65 } |
| 66 } | 66 } |
| 67 | 67 |
| 68 void GetQueryObjectiv(GLuint id, GLenum pname, GLint* params) { | 68 void GetQueryObjectiv(GLuint id, GLenum pname, GLint* params) { |
| 69 switch (pname) { | 69 switch (pname) { |
| 70 case GL_QUERY_RESULT_AVAILABLE: { | 70 case GL_QUERY_RESULT_AVAILABLE: { |
| 71 std::map<GLuint, GLint64>::iterator it = query_timestamp_.find(id); | 71 std::map<GLuint, GLint64>::iterator it = query_timestamp_.find(id); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 102 } | 102 } |
| 103 } | 103 } |
| 104 | 104 |
| 105 protected: | 105 protected: |
| 106 GLint64 current_time_; | 106 GLint64 current_time_; |
| 107 GLuint next_query_id_; | 107 GLuint next_query_id_; |
| 108 std::set<GLuint> alloced_queries_; | 108 std::set<GLuint> alloced_queries_; |
| 109 std::map<GLuint, GLint64> query_timestamp_; | 109 std::map<GLuint, GLint64> query_timestamp_; |
| 110 }; | 110 }; |
| 111 | 111 |
| 112 class GpuTracerTest : public GpuServiceTest { | 112 class BaseGpuTracerTest : public GpuServiceTest { |
| 113 public: | 113 public: |
| 114 GpuTracerTest() {} | 114 BaseGpuTracerTest() {} |
| 115 | 115 |
| 116 /////////////////////////////////////////////////////////////////////////// | 116 /////////////////////////////////////////////////////////////////////////// |
| 117 | 117 |
| 118 protected: | 118 void DoTraceTest() { |
| 119 virtual void SetUp() { | |
| 120 GpuServiceTest::SetUp(); | |
| 121 gl_fake_queries_.Reset(); | |
| 122 } | |
| 123 | |
| 124 virtual void TearDown() { | |
| 125 gl_.reset(); | |
| 126 gl_fake_queries_.Reset(); | |
| 127 GpuServiceTest::TearDown(); | |
| 128 } | |
| 129 | |
| 130 void SetupTimerQueryMocks() { | |
| 131 // Delegate query APIs used by GPUTrace to a GlFakeQueries | |
| 132 EXPECT_CALL(*gl_, GenQueries(_, NotNull())).Times(AtLeast(1)).WillOnce( | |
| 133 Invoke(&gl_fake_queries_, &GlFakeQueries::GenQueries)); | |
| 134 | |
| 135 EXPECT_CALL(*gl_, GetQueryObjectiv(_, GL_QUERY_RESULT_AVAILABLE, NotNull())) | |
| 136 .Times(AtLeast(2)) | |
| 137 .WillRepeatedly( | |
| 138 Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectiv)); | |
| 139 | |
| 140 EXPECT_CALL(*gl_, QueryCounter(_, GL_TIMESTAMP)) | |
| 141 .Times(AtLeast(2)) | |
| 142 .WillRepeatedly( | |
| 143 Invoke(&gl_fake_queries_, &GlFakeQueries::QueryCounter)); | |
| 144 | |
| 145 EXPECT_CALL(*gl_, GetQueryObjectui64v(_, GL_QUERY_RESULT, NotNull())) | |
| 146 .Times(AtLeast(2)) | |
| 147 .WillRepeatedly( | |
| 148 Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectui64v)); | |
| 149 | |
| 150 EXPECT_CALL(*gl_, DeleteQueries(2, NotNull())) | |
| 151 .Times(AtLeast(1)) | |
| 152 .WillRepeatedly( | |
| 153 Invoke(&gl_fake_queries_, &GlFakeQueries::DeleteQueries)); | |
| 154 } | |
| 155 | |
| 156 GlFakeQueries gl_fake_queries_; | |
| 157 }; | |
| 158 | |
| 159 TEST_F(GpuTracerTest, GPUTrace) { | |
| 160 // Test basic timer query functionality | |
| 161 { | |
| 162 MockOutputter* outputter = new MockOutputter(); | 119 MockOutputter* outputter = new MockOutputter(); |
| 163 scoped_refptr<Outputter> outputter_ref = outputter; | 120 scoped_refptr<Outputter> outputter_ref = outputter; |
| 164 | 121 |
| 165 SetupTimerQueryMocks(); | 122 SetupTimerQueryMocks(); |
| 166 | 123 |
| 167 // Expected results | 124 // Expected results |
| 168 const std::string trace_name("trace_test"); | 125 const std::string trace_name("trace_test"); |
| 169 const int64 offset_time = 3231; | 126 const int64 offset_time = 3231; |
| 170 const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond; | 127 const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond; |
| 171 const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond; | 128 const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond; |
| 172 const int64 expect_start_time = | 129 const int64 expect_start_time = |
| 173 (start_timestamp / base::Time::kNanosecondsPerMicrosecond) + | 130 (start_timestamp / base::Time::kNanosecondsPerMicrosecond) + |
| 174 offset_time; | 131 offset_time; |
| 175 const int64 expect_end_time = | 132 const int64 expect_end_time = |
| 176 (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time; | 133 (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time; |
| 177 | 134 |
| 178 // Expected Outputter::Trace call | 135 // Expected Outputter::Trace call |
| 179 EXPECT_CALL(*outputter, | 136 EXPECT_CALL(*outputter, |
| 180 Trace(trace_name, expect_start_time, expect_end_time)); | 137 Trace(trace_name, expect_start_time, expect_end_time)); |
| 181 | 138 |
| 182 scoped_refptr<GPUTrace> trace = | 139 scoped_refptr<GPUTrace> trace = |
| 183 new GPUTrace(outputter_ref, trace_name, offset_time); | 140 new GPUTrace(outputter_ref, trace_name, offset_time, |
| 141 GetTracerType()); |
| 184 | 142 |
| 185 gl_fake_queries_.SetCurrentGLTime(start_timestamp); | 143 gl_fake_queries_.SetCurrentGLTime(start_timestamp); |
| 186 trace->Start(); | 144 trace->Start(); |
| 187 | 145 |
| 188 // Shouldn't be available before End() call | 146 // Shouldn't be available before End() call |
| 189 gl_fake_queries_.SetCurrentGLTime(end_timestamp); | 147 gl_fake_queries_.SetCurrentGLTime(end_timestamp); |
| 190 EXPECT_FALSE(trace->IsAvailable()); | 148 EXPECT_FALSE(trace->IsAvailable()); |
| 191 | 149 |
| 192 trace->End(); | 150 trace->End(); |
| 193 | 151 |
| 194 // Shouldn't be available until the queries complete | 152 // Shouldn't be available until the queries complete |
| 195 gl_fake_queries_.SetCurrentGLTime(end_timestamp - | 153 gl_fake_queries_.SetCurrentGLTime(end_timestamp - |
| 196 base::Time::kNanosecondsPerMicrosecond); | 154 base::Time::kNanosecondsPerMicrosecond); |
| 197 EXPECT_FALSE(trace->IsAvailable()); | 155 EXPECT_FALSE(trace->IsAvailable()); |
| 198 | 156 |
| 199 // Now it should be available | 157 // Now it should be available |
| 200 gl_fake_queries_.SetCurrentGLTime(end_timestamp); | 158 gl_fake_queries_.SetCurrentGLTime(end_timestamp); |
| 201 EXPECT_TRUE(trace->IsAvailable()); | 159 EXPECT_TRUE(trace->IsAvailable()); |
| 202 | 160 |
| 203 // Proces should output expected Trace results to MockOutputter | 161 // Proces should output expected Trace results to MockOutputter |
| 204 trace->Process(); | 162 trace->Process(); |
| 205 } | 163 } |
| 164 |
| 165 protected: |
| 166 virtual void SetUp() { |
| 167 GpuServiceTest::SetUp(); |
| 168 gl_fake_queries_.Reset(); |
| 169 } |
| 170 |
| 171 virtual void TearDown() { |
| 172 gl_.reset(); |
| 173 gl_fake_queries_.Reset(); |
| 174 GpuServiceTest::TearDown(); |
| 175 } |
| 176 |
| 177 virtual void SetupTimerQueryMocks() { |
| 178 // Delegate query APIs used by GPUTrace to a GlFakeQueries |
| 179 EXPECT_CALL(*gl_, GenQueriesARB(_, NotNull())).Times(AtLeast(1)).WillOnce( |
| 180 Invoke(&gl_fake_queries_, &GlFakeQueries::GenQueriesARB)); |
| 181 |
| 182 EXPECT_CALL(*gl_, GetQueryObjectiv(_, GL_QUERY_RESULT_AVAILABLE, NotNull())) |
| 183 .Times(AtLeast(2)) |
| 184 .WillRepeatedly( |
| 185 Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectiv)); |
| 186 |
| 187 EXPECT_CALL(*gl_, QueryCounter(_, GL_TIMESTAMP)) |
| 188 .Times(AtLeast(2)) |
| 189 .WillRepeatedly( |
| 190 Invoke(&gl_fake_queries_, &GlFakeQueries::QueryCounter)); |
| 191 |
| 192 EXPECT_CALL(*gl_, GetQueryObjectui64v(_, GL_QUERY_RESULT, NotNull())) |
| 193 .Times(AtLeast(2)) |
| 194 .WillRepeatedly( |
| 195 Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectui64v)); |
| 196 |
| 197 EXPECT_CALL(*gl_, DeleteQueriesARB(2, NotNull())) |
| 198 .Times(AtLeast(1)) |
| 199 .WillRepeatedly( |
| 200 Invoke(&gl_fake_queries_, &GlFakeQueries::DeleteQueriesARB)); |
| 201 } |
| 202 |
| 203 virtual GpuTracerType GetTracerType() = 0; |
| 204 |
| 205 GlFakeQueries gl_fake_queries_; |
| 206 }; |
| 207 |
| 208 class GpuARBTimerTracerTest : public BaseGpuTracerTest { |
| 209 protected: |
| 210 virtual GpuTracerType GetTracerType() OVERRIDE { |
| 211 return kTracerTypeARBTimer; |
| 212 } |
| 213 }; |
| 214 |
| 215 class GpuDisjointTimerTracerTest : public BaseGpuTracerTest { |
| 216 protected: |
| 217 virtual GpuTracerType GetTracerType() OVERRIDE { |
| 218 return kTracerTypeDisjointTimer; |
| 219 } |
| 220 }; |
| 221 |
| 222 TEST_F(GpuARBTimerTracerTest, GPUTrace) { |
| 223 // Test basic timer query functionality |
| 224 { |
| 225 DoTraceTest(); |
| 226 } |
| 227 } |
| 228 |
| 229 TEST_F(GpuDisjointTimerTracerTest, GPUTrace) { |
| 230 // Test basic timer query functionality |
| 231 { |
| 232 DoTraceTest(); |
| 233 } |
| 206 } | 234 } |
| 207 | 235 |
| 208 } // namespace gles2 | 236 } // namespace gles2 |
| 209 } // namespace gpu | 237 } // namespace gpu |
| OLD | NEW |