OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "ui/gl/gpu_timing.h" |
| 6 |
5 #include <stdint.h> | 7 #include <stdint.h> |
6 | 8 |
| 9 #include <memory> |
| 10 |
7 #include "base/bind.h" | 11 #include "base/bind.h" |
8 #include "base/memory/scoped_ptr.h" | |
9 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
10 #include "ui/gl/gl_context_stub_with_extensions.h" | 13 #include "ui/gl/gl_context_stub_with_extensions.h" |
11 #include "ui/gl/gl_implementation.h" | 14 #include "ui/gl/gl_implementation.h" |
12 #include "ui/gl/gl_mock.h" | 15 #include "ui/gl/gl_mock.h" |
13 #include "ui/gl/gpu_preference.h" | 16 #include "ui/gl/gpu_preference.h" |
14 #include "ui/gl/gpu_timing.h" | |
15 #include "ui/gl/gpu_timing_fake.h" | 17 #include "ui/gl/gpu_timing_fake.h" |
16 #include "ui/gl/test/gl_surface_test_support.h" | 18 #include "ui/gl/test/gl_surface_test_support.h" |
17 | 19 |
18 namespace gfx { | 20 namespace gfx { |
19 | 21 |
20 using ::testing::Exactly; | 22 using ::testing::Exactly; |
21 using ::testing::NotNull; | 23 using ::testing::NotNull; |
22 using ::testing::DoAll; | 24 using ::testing::DoAll; |
23 using ::testing::Return; | 25 using ::testing::Return; |
24 using ::testing::SetArgPointee; | 26 using ::testing::SetArgPointee; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 if (!cpu_time_bounded_) { | 69 if (!cpu_time_bounded_) { |
68 client->SetCpuTimeForTesting(base::Bind(&GPUTimingFake::GetFakeCPUTime)); | 70 client->SetCpuTimeForTesting(base::Bind(&GPUTimingFake::GetFakeCPUTime)); |
69 cpu_time_bounded_ = true; | 71 cpu_time_bounded_ = true; |
70 } | 72 } |
71 return client; | 73 return client; |
72 } | 74 } |
73 | 75 |
74 protected: | 76 protected: |
75 bool setup_ = false; | 77 bool setup_ = false; |
76 bool cpu_time_bounded_ = false; | 78 bool cpu_time_bounded_ = false; |
77 scoped_ptr< ::testing::StrictMock<MockGLInterface> > gl_; | 79 std::unique_ptr<::testing::StrictMock<MockGLInterface>> gl_; |
78 scoped_refptr<GLContextStubWithExtensions> context_; | 80 scoped_refptr<GLContextStubWithExtensions> context_; |
79 GPUTimingFake gpu_timing_fake_queries_; | 81 GPUTimingFake gpu_timing_fake_queries_; |
80 }; | 82 }; |
81 | 83 |
82 TEST_F(GPUTimingTest, FakeTimerTest) { | 84 TEST_F(GPUTimingTest, FakeTimerTest) { |
83 scoped_refptr<GPUTimingClient> gpu_timing_client = CreateGPUTimingClient(); | 85 scoped_refptr<GPUTimingClient> gpu_timing_client = CreateGPUTimingClient(); |
84 | 86 |
85 // Tests that we can properly set fake cpu times. | 87 // Tests that we can properly set fake cpu times. |
86 gpu_timing_fake_queries_.SetCurrentCPUTime(123); | 88 gpu_timing_fake_queries_.SetCurrentCPUTime(123); |
87 EXPECT_EQ(123, gpu_timing_client->GetCurrentCPUTime()); | 89 EXPECT_EQ(123, gpu_timing_client->GetCurrentCPUTime()); |
(...skipping 16 matching lines...) Expand all Loading... |
104 | 106 |
105 EXPECT_TRUE(client1->IsForceTimeElapsedQuery()); | 107 EXPECT_TRUE(client1->IsForceTimeElapsedQuery()); |
106 | 108 |
107 scoped_refptr<GPUTimingClient> client2 = CreateGPUTimingClient(); | 109 scoped_refptr<GPUTimingClient> client2 = CreateGPUTimingClient(); |
108 EXPECT_TRUE(client2->IsForceTimeElapsedQuery()); | 110 EXPECT_TRUE(client2->IsForceTimeElapsedQuery()); |
109 } | 111 } |
110 | 112 |
111 TEST_F(GPUTimingTest, QueryTimeStampTest) { | 113 TEST_F(GPUTimingTest, QueryTimeStampTest) { |
112 SetupGLContext("3.2", "GL_ARB_timer_query"); | 114 SetupGLContext("3.2", "GL_ARB_timer_query"); |
113 scoped_refptr<GPUTimingClient> client = CreateGPUTimingClient(); | 115 scoped_refptr<GPUTimingClient> client = CreateGPUTimingClient(); |
114 scoped_ptr<GPUTimer> gpu_timer = client->CreateGPUTimer(false); | 116 std::unique_ptr<GPUTimer> gpu_timer = client->CreateGPUTimer(false); |
115 | 117 |
116 const int64_t begin_cpu_time = 1230; | 118 const int64_t begin_cpu_time = 1230; |
117 const int64_t begin_gl_time = 10 * base::Time::kNanosecondsPerMicrosecond; | 119 const int64_t begin_gl_time = 10 * base::Time::kNanosecondsPerMicrosecond; |
118 const int64_t cpu_gl_offset = | 120 const int64_t cpu_gl_offset = |
119 begin_gl_time / base::Time::kNanosecondsPerMicrosecond - begin_cpu_time; | 121 begin_gl_time / base::Time::kNanosecondsPerMicrosecond - begin_cpu_time; |
120 gpu_timing_fake_queries_.SetCPUGLOffset(cpu_gl_offset); | 122 gpu_timing_fake_queries_.SetCPUGLOffset(cpu_gl_offset); |
121 gpu_timing_fake_queries_.SetCurrentCPUTime(begin_cpu_time); | 123 gpu_timing_fake_queries_.SetCurrentCPUTime(begin_cpu_time); |
122 gpu_timing_fake_queries_.ExpectGPUTimeStampQuery(*gl_, false); | 124 gpu_timing_fake_queries_.ExpectGPUTimeStampQuery(*gl_, false); |
123 | 125 |
124 gpu_timer->QueryTimeStamp(); | 126 gpu_timer->QueryTimeStamp(); |
(...skipping 13 matching lines...) Expand all Loading... |
138 gpu_timer->GetStartEndTimestamps(&start, &end); | 140 gpu_timer->GetStartEndTimestamps(&start, &end); |
139 EXPECT_EQ(begin_cpu_time, start); | 141 EXPECT_EQ(begin_cpu_time, start); |
140 EXPECT_EQ(begin_cpu_time, end); | 142 EXPECT_EQ(begin_cpu_time, end); |
141 } | 143 } |
142 | 144 |
143 TEST_F(GPUTimingTest, QueryTimeStampUsingElapsedTest) { | 145 TEST_F(GPUTimingTest, QueryTimeStampUsingElapsedTest) { |
144 // Test timestamp queries using GL_EXT_timer_query which does not support | 146 // Test timestamp queries using GL_EXT_timer_query which does not support |
145 // timestamp queries. Internally we fall back to time elapsed queries. | 147 // timestamp queries. Internally we fall back to time elapsed queries. |
146 SetupGLContext("3.2", "GL_EXT_timer_query"); | 148 SetupGLContext("3.2", "GL_EXT_timer_query"); |
147 scoped_refptr<GPUTimingClient> client = CreateGPUTimingClient(); | 149 scoped_refptr<GPUTimingClient> client = CreateGPUTimingClient(); |
148 scoped_ptr<GPUTimer> gpu_timer = client->CreateGPUTimer(false); | 150 std::unique_ptr<GPUTimer> gpu_timer = client->CreateGPUTimer(false); |
149 ASSERT_TRUE(client->IsForceTimeElapsedQuery()); | 151 ASSERT_TRUE(client->IsForceTimeElapsedQuery()); |
150 | 152 |
151 const int64_t begin_cpu_time = 123; | 153 const int64_t begin_cpu_time = 123; |
152 const int64_t begin_gl_time = 10 * base::Time::kNanosecondsPerMicrosecond; | 154 const int64_t begin_gl_time = 10 * base::Time::kNanosecondsPerMicrosecond; |
153 const int64_t cpu_gl_offset = begin_gl_time - begin_cpu_time; | 155 const int64_t cpu_gl_offset = begin_gl_time - begin_cpu_time; |
154 gpu_timing_fake_queries_.SetCPUGLOffset(cpu_gl_offset); | 156 gpu_timing_fake_queries_.SetCPUGLOffset(cpu_gl_offset); |
155 gpu_timing_fake_queries_.SetCurrentCPUTime(begin_cpu_time); | 157 gpu_timing_fake_queries_.SetCurrentCPUTime(begin_cpu_time); |
156 gpu_timing_fake_queries_.ExpectGPUTimeStampQuery(*gl_, true); | 158 gpu_timing_fake_queries_.ExpectGPUTimeStampQuery(*gl_, true); |
157 | 159 |
158 gpu_timer->QueryTimeStamp(); | 160 gpu_timer->QueryTimeStamp(); |
159 | 161 |
160 gpu_timing_fake_queries_.SetCurrentCPUTime(begin_cpu_time - 1); | 162 gpu_timing_fake_queries_.SetCurrentCPUTime(begin_cpu_time - 1); |
161 EXPECT_FALSE(gpu_timer->IsAvailable()); | 163 EXPECT_FALSE(gpu_timer->IsAvailable()); |
162 | 164 |
163 gpu_timing_fake_queries_.SetCurrentCPUTime(begin_cpu_time + 1); | 165 gpu_timing_fake_queries_.SetCurrentCPUTime(begin_cpu_time + 1); |
164 EXPECT_TRUE(gpu_timer->IsAvailable()); | 166 EXPECT_TRUE(gpu_timer->IsAvailable()); |
165 EXPECT_EQ(0, gpu_timer->GetDeltaElapsed()); | 167 EXPECT_EQ(0, gpu_timer->GetDeltaElapsed()); |
166 | 168 |
167 int64_t start, end; | 169 int64_t start, end; |
168 gpu_timer->GetStartEndTimestamps(&start, &end); | 170 gpu_timer->GetStartEndTimestamps(&start, &end); |
169 EXPECT_EQ(begin_cpu_time, start); | 171 EXPECT_EQ(begin_cpu_time, start); |
170 EXPECT_EQ(begin_cpu_time, end); | 172 EXPECT_EQ(begin_cpu_time, end); |
171 } | 173 } |
172 | 174 |
173 TEST_F(GPUTimingTest, QueryTimestampUsingElapsedARBTest) { | 175 TEST_F(GPUTimingTest, QueryTimestampUsingElapsedARBTest) { |
174 // Test timestamp queries on platforms with GL_ARB_timer_query but still lack | 176 // Test timestamp queries on platforms with GL_ARB_timer_query but still lack |
175 // support for timestamp queries | 177 // support for timestamp queries |
176 SetupGLContext("3.2", "GL_ARB_timer_query"); | 178 SetupGLContext("3.2", "GL_ARB_timer_query"); |
177 scoped_refptr<GPUTimingClient> client = CreateGPUTimingClient(); | 179 scoped_refptr<GPUTimingClient> client = CreateGPUTimingClient(); |
178 scoped_ptr<GPUTimer> gpu_timer = client->CreateGPUTimer(false); | 180 std::unique_ptr<GPUTimer> gpu_timer = client->CreateGPUTimer(false); |
179 | 181 |
180 const int64_t begin_cpu_time = 123; | 182 const int64_t begin_cpu_time = 123; |
181 const int64_t begin_gl_time = 10 * base::Time::kNanosecondsPerMicrosecond; | 183 const int64_t begin_gl_time = 10 * base::Time::kNanosecondsPerMicrosecond; |
182 const int64_t cpu_gl_offset = begin_gl_time - begin_cpu_time; | 184 const int64_t cpu_gl_offset = begin_gl_time - begin_cpu_time; |
183 gpu_timing_fake_queries_.SetCPUGLOffset(cpu_gl_offset); | 185 gpu_timing_fake_queries_.SetCPUGLOffset(cpu_gl_offset); |
184 gpu_timing_fake_queries_.SetCurrentCPUTime(begin_cpu_time); | 186 gpu_timing_fake_queries_.SetCurrentCPUTime(begin_cpu_time); |
185 | 187 |
186 gpu_timing_fake_queries_.ExpectGPUTimeStampQuery(*gl_, true); | 188 gpu_timing_fake_queries_.ExpectGPUTimeStampQuery(*gl_, true); |
187 | 189 |
188 // Custom mock override to ensure the timestamp bits are 0 | 190 // Custom mock override to ensure the timestamp bits are 0 |
(...skipping 12 matching lines...) Expand all Loading... |
201 | 203 |
202 int64_t start, end; | 204 int64_t start, end; |
203 gpu_timer->GetStartEndTimestamps(&start, &end); | 205 gpu_timer->GetStartEndTimestamps(&start, &end); |
204 // Force time elapsed won't be set until a query is actually attempted | 206 // Force time elapsed won't be set until a query is actually attempted |
205 ASSERT_TRUE(client->IsForceTimeElapsedQuery()); | 207 ASSERT_TRUE(client->IsForceTimeElapsedQuery()); |
206 EXPECT_EQ(begin_cpu_time, start); | 208 EXPECT_EQ(begin_cpu_time, start); |
207 EXPECT_EQ(begin_cpu_time, end); | 209 EXPECT_EQ(begin_cpu_time, end); |
208 } | 210 } |
209 | 211 |
210 } // namespace gpu | 212 } // namespace gpu |
OLD | NEW |