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 |