| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "gpu/command_buffer/service/query_manager.h" | 5 #include "gpu/command_buffer/service/query_manager.h" |
| 6 | 6 |
| 7 #include "base/atomicops.h" | 7 #include "base/atomicops.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/shared_memory.h" | 10 #include "base/memory/shared_memory.h" |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 | 59 |
| 60 class AsyncPixelTransfersCompletedQuery | 60 class AsyncPixelTransfersCompletedQuery |
| 61 : public QueryManager::Query, | 61 : public QueryManager::Query, |
| 62 public base::SupportsWeakPtr<AsyncPixelTransfersCompletedQuery> { | 62 public base::SupportsWeakPtr<AsyncPixelTransfersCompletedQuery> { |
| 63 public: | 63 public: |
| 64 AsyncPixelTransfersCompletedQuery( | 64 AsyncPixelTransfersCompletedQuery( |
| 65 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 65 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); |
| 66 | 66 |
| 67 bool Begin() override; | 67 bool Begin() override; |
| 68 bool End(base::subtle::Atomic32 submit_count) override; | 68 bool End(base::subtle::Atomic32 submit_count) override; |
| 69 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 69 bool Process(bool did_finish) override; | 70 bool Process(bool did_finish) override; |
| 70 void Destroy(bool have_context) override; | 71 void Destroy(bool have_context) override; |
| 71 | 72 |
| 72 protected: | 73 protected: |
| 73 ~AsyncPixelTransfersCompletedQuery() override; | 74 ~AsyncPixelTransfersCompletedQuery() override; |
| 74 | 75 |
| 75 scoped_refptr<AsyncPixelTransferCompletionObserverImpl> observer_; | 76 scoped_refptr<AsyncPixelTransferCompletionObserverImpl> observer_; |
| 76 }; | 77 }; |
| 77 | 78 |
| 78 AsyncPixelTransfersCompletedQuery::AsyncPixelTransfersCompletedQuery( | 79 AsyncPixelTransfersCompletedQuery::AsyncPixelTransfersCompletedQuery( |
| (...skipping 21 matching lines...) Expand all Loading... |
| 100 | 101 |
| 101 // Ask AsyncPixelTransferDelegate to run completion callback after all | 102 // Ask AsyncPixelTransferDelegate to run completion callback after all |
| 102 // previous async transfers are done. No guarantee that callback is run | 103 // previous async transfers are done. No guarantee that callback is run |
| 103 // on the current thread. | 104 // on the current thread. |
| 104 manager()->decoder()->GetAsyncPixelTransferManager()->AsyncNotifyCompletion( | 105 manager()->decoder()->GetAsyncPixelTransferManager()->AsyncNotifyCompletion( |
| 105 mem_params, observer_.get()); | 106 mem_params, observer_.get()); |
| 106 | 107 |
| 107 return AddToPendingTransferQueue(submit_count); | 108 return AddToPendingTransferQueue(submit_count); |
| 108 } | 109 } |
| 109 | 110 |
| 111 bool AsyncPixelTransfersCompletedQuery::QueryCounter( |
| 112 base::subtle::Atomic32 submit_count) { |
| 113 NOTREACHED(); |
| 114 return false; |
| 115 } |
| 116 |
| 110 bool AsyncPixelTransfersCompletedQuery::Process(bool did_finish) { | 117 bool AsyncPixelTransfersCompletedQuery::Process(bool did_finish) { |
| 111 QuerySync* sync = manager()->decoder()->GetSharedMemoryAs<QuerySync*>( | 118 QuerySync* sync = manager()->decoder()->GetSharedMemoryAs<QuerySync*>( |
| 112 shm_id(), shm_offset(), sizeof(*sync)); | 119 shm_id(), shm_offset(), sizeof(*sync)); |
| 113 if (!sync) | 120 if (!sync) |
| 114 return false; | 121 return false; |
| 115 | 122 |
| 116 // Check if completion callback has been run. sync->process_count atomicity | 123 // Check if completion callback has been run. sync->process_count atomicity |
| 117 // is guaranteed as this is already used to notify client of a completed | 124 // is guaranteed as this is already used to notify client of a completed |
| 118 // query. | 125 // query. |
| 119 if (base::subtle::Acquire_Load(&sync->process_count) != submit_count()) | 126 if (base::subtle::Acquire_Load(&sync->process_count) != submit_count()) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 136 | 143 |
| 137 } // namespace | 144 } // namespace |
| 138 | 145 |
| 139 class AllSamplesPassedQuery : public QueryManager::Query { | 146 class AllSamplesPassedQuery : public QueryManager::Query { |
| 140 public: | 147 public: |
| 141 AllSamplesPassedQuery( | 148 AllSamplesPassedQuery( |
| 142 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset, | 149 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset, |
| 143 GLuint service_id); | 150 GLuint service_id); |
| 144 bool Begin() override; | 151 bool Begin() override; |
| 145 bool End(base::subtle::Atomic32 submit_count) override; | 152 bool End(base::subtle::Atomic32 submit_count) override; |
| 153 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 146 bool Process(bool did_finish) override; | 154 bool Process(bool did_finish) override; |
| 147 void Destroy(bool have_context) override; | 155 void Destroy(bool have_context) override; |
| 148 | 156 |
| 149 protected: | 157 protected: |
| 150 ~AllSamplesPassedQuery() override; | 158 ~AllSamplesPassedQuery() override; |
| 151 | 159 |
| 152 private: | 160 private: |
| 153 // Service side query id. | 161 // Service side query id. |
| 154 GLuint service_id_; | 162 GLuint service_id_; |
| 155 }; | 163 }; |
| 156 | 164 |
| 157 AllSamplesPassedQuery::AllSamplesPassedQuery( | 165 AllSamplesPassedQuery::AllSamplesPassedQuery( |
| 158 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset, | 166 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset, |
| 159 GLuint service_id) | 167 GLuint service_id) |
| 160 : Query(manager, target, shm_id, shm_offset), | 168 : Query(manager, target, shm_id, shm_offset), |
| 161 service_id_(service_id) { | 169 service_id_(service_id) { |
| 162 } | 170 } |
| 163 | 171 |
| 164 bool AllSamplesPassedQuery::Begin() { | 172 bool AllSamplesPassedQuery::Begin() { |
| 165 BeginQueryHelper(target(), service_id_); | 173 BeginQueryHelper(target(), service_id_); |
| 166 return true; | 174 return true; |
| 167 } | 175 } |
| 168 | 176 |
| 169 bool AllSamplesPassedQuery::End(base::subtle::Atomic32 submit_count) { | 177 bool AllSamplesPassedQuery::End(base::subtle::Atomic32 submit_count) { |
| 170 EndQueryHelper(target()); | 178 EndQueryHelper(target()); |
| 171 return AddToPendingQueue(submit_count); | 179 return AddToPendingQueue(submit_count); |
| 172 } | 180 } |
| 173 | 181 |
| 182 bool AllSamplesPassedQuery::QueryCounter(base::subtle::Atomic32 submit_count) { |
| 183 NOTREACHED(); |
| 184 return false; |
| 185 } |
| 186 |
| 174 bool AllSamplesPassedQuery::Process(bool did_finish) { | 187 bool AllSamplesPassedQuery::Process(bool did_finish) { |
| 175 GLuint available = 0; | 188 GLuint available = 0; |
| 176 glGetQueryObjectuiv( | 189 glGetQueryObjectuiv( |
| 177 service_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &available); | 190 service_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &available); |
| 178 if (!available) { | 191 if (!available) { |
| 179 return true; | 192 return true; |
| 180 } | 193 } |
| 181 GLuint result = 0; | 194 GLuint result = 0; |
| 182 glGetQueryObjectuiv( | 195 glGetQueryObjectuiv( |
| 183 service_id_, GL_QUERY_RESULT_EXT, &result); | 196 service_id_, GL_QUERY_RESULT_EXT, &result); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 195 AllSamplesPassedQuery::~AllSamplesPassedQuery() { | 208 AllSamplesPassedQuery::~AllSamplesPassedQuery() { |
| 196 } | 209 } |
| 197 | 210 |
| 198 class CommandsIssuedQuery : public QueryManager::Query { | 211 class CommandsIssuedQuery : public QueryManager::Query { |
| 199 public: | 212 public: |
| 200 CommandsIssuedQuery( | 213 CommandsIssuedQuery( |
| 201 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 214 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); |
| 202 | 215 |
| 203 bool Begin() override; | 216 bool Begin() override; |
| 204 bool End(base::subtle::Atomic32 submit_count) override; | 217 bool End(base::subtle::Atomic32 submit_count) override; |
| 218 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 205 bool Process(bool did_finish) override; | 219 bool Process(bool did_finish) override; |
| 206 void Destroy(bool have_context) override; | 220 void Destroy(bool have_context) override; |
| 207 | 221 |
| 208 protected: | 222 protected: |
| 209 ~CommandsIssuedQuery() override; | 223 ~CommandsIssuedQuery() override; |
| 210 | 224 |
| 211 private: | 225 private: |
| 212 base::TimeTicks begin_time_; | 226 base::TimeTicks begin_time_; |
| 213 }; | 227 }; |
| 214 | 228 |
| 215 CommandsIssuedQuery::CommandsIssuedQuery( | 229 CommandsIssuedQuery::CommandsIssuedQuery( |
| 216 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 230 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) |
| 217 : Query(manager, target, shm_id, shm_offset) { | 231 : Query(manager, target, shm_id, shm_offset) { |
| 218 } | 232 } |
| 219 | 233 |
| 220 bool CommandsIssuedQuery::Begin() { | 234 bool CommandsIssuedQuery::Begin() { |
| 221 begin_time_ = base::TimeTicks::Now(); | 235 begin_time_ = base::TimeTicks::Now(); |
| 222 return true; | 236 return true; |
| 223 } | 237 } |
| 224 | 238 |
| 225 bool CommandsIssuedQuery::End(base::subtle::Atomic32 submit_count) { | 239 bool CommandsIssuedQuery::End(base::subtle::Atomic32 submit_count) { |
| 226 base::TimeDelta elapsed = base::TimeTicks::Now() - begin_time_; | 240 base::TimeDelta elapsed = base::TimeTicks::Now() - begin_time_; |
| 227 MarkAsPending(submit_count); | 241 MarkAsPending(submit_count); |
| 228 return MarkAsCompleted(elapsed.InMicroseconds()); | 242 return MarkAsCompleted(elapsed.InMicroseconds()); |
| 229 } | 243 } |
| 230 | 244 |
| 245 bool CommandsIssuedQuery::QueryCounter(base::subtle::Atomic32 submit_count) { |
| 246 NOTREACHED(); |
| 247 return false; |
| 248 } |
| 249 |
| 231 bool CommandsIssuedQuery::Process(bool did_finish) { | 250 bool CommandsIssuedQuery::Process(bool did_finish) { |
| 232 NOTREACHED(); | 251 NOTREACHED(); |
| 233 return true; | 252 return true; |
| 234 } | 253 } |
| 235 | 254 |
| 236 void CommandsIssuedQuery::Destroy(bool /* have_context */) { | 255 void CommandsIssuedQuery::Destroy(bool /* have_context */) { |
| 237 if (!IsDeleted()) { | 256 if (!IsDeleted()) { |
| 238 MarkAsDeleted(); | 257 MarkAsDeleted(); |
| 239 } | 258 } |
| 240 } | 259 } |
| 241 | 260 |
| 242 CommandsIssuedQuery::~CommandsIssuedQuery() { | 261 CommandsIssuedQuery::~CommandsIssuedQuery() { |
| 243 } | 262 } |
| 244 | 263 |
| 245 class CommandLatencyQuery : public QueryManager::Query { | 264 class CommandLatencyQuery : public QueryManager::Query { |
| 246 public: | 265 public: |
| 247 CommandLatencyQuery( | 266 CommandLatencyQuery( |
| 248 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 267 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); |
| 249 | 268 |
| 250 bool Begin() override; | 269 bool Begin() override; |
| 251 bool End(base::subtle::Atomic32 submit_count) override; | 270 bool End(base::subtle::Atomic32 submit_count) override; |
| 271 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 252 bool Process(bool did_finish) override; | 272 bool Process(bool did_finish) override; |
| 253 void Destroy(bool have_context) override; | 273 void Destroy(bool have_context) override; |
| 254 | 274 |
| 255 protected: | 275 protected: |
| 256 ~CommandLatencyQuery() override; | 276 ~CommandLatencyQuery() override; |
| 257 }; | 277 }; |
| 258 | 278 |
| 259 CommandLatencyQuery::CommandLatencyQuery( | 279 CommandLatencyQuery::CommandLatencyQuery( |
| 260 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 280 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) |
| 261 : Query(manager, target, shm_id, shm_offset) { | 281 : Query(manager, target, shm_id, shm_offset) { |
| 262 } | 282 } |
| 263 | 283 |
| 264 bool CommandLatencyQuery::Begin() { | 284 bool CommandLatencyQuery::Begin() { |
| 265 return true; | 285 return true; |
| 266 } | 286 } |
| 267 | 287 |
| 268 bool CommandLatencyQuery::End(base::subtle::Atomic32 submit_count) { | 288 bool CommandLatencyQuery::End(base::subtle::Atomic32 submit_count) { |
| 269 base::TimeDelta now = base::TimeTicks::Now() - base::TimeTicks(); | 289 base::TimeDelta now = base::TimeTicks::Now() - base::TimeTicks(); |
| 270 MarkAsPending(submit_count); | 290 MarkAsPending(submit_count); |
| 271 return MarkAsCompleted(now.InMicroseconds()); | 291 return MarkAsCompleted(now.InMicroseconds()); |
| 272 } | 292 } |
| 273 | 293 |
| 294 bool CommandLatencyQuery::QueryCounter(base::subtle::Atomic32 submit_count) { |
| 295 NOTREACHED(); |
| 296 return false; |
| 297 } |
| 298 |
| 274 bool CommandLatencyQuery::Process(bool did_finish) { | 299 bool CommandLatencyQuery::Process(bool did_finish) { |
| 275 NOTREACHED(); | 300 NOTREACHED(); |
| 276 return true; | 301 return true; |
| 277 } | 302 } |
| 278 | 303 |
| 279 void CommandLatencyQuery::Destroy(bool /* have_context */) { | 304 void CommandLatencyQuery::Destroy(bool /* have_context */) { |
| 280 if (!IsDeleted()) { | 305 if (!IsDeleted()) { |
| 281 MarkAsDeleted(); | 306 MarkAsDeleted(); |
| 282 } | 307 } |
| 283 } | 308 } |
| 284 | 309 |
| 285 CommandLatencyQuery::~CommandLatencyQuery() { | 310 CommandLatencyQuery::~CommandLatencyQuery() { |
| 286 } | 311 } |
| 287 | 312 |
| 288 | 313 |
| 289 class AsyncReadPixelsCompletedQuery | 314 class AsyncReadPixelsCompletedQuery |
| 290 : public QueryManager::Query, | 315 : public QueryManager::Query, |
| 291 public base::SupportsWeakPtr<AsyncReadPixelsCompletedQuery> { | 316 public base::SupportsWeakPtr<AsyncReadPixelsCompletedQuery> { |
| 292 public: | 317 public: |
| 293 AsyncReadPixelsCompletedQuery( | 318 AsyncReadPixelsCompletedQuery( |
| 294 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 319 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); |
| 295 | 320 |
| 296 bool Begin() override; | 321 bool Begin() override; |
| 297 bool End(base::subtle::Atomic32 submit_count) override; | 322 bool End(base::subtle::Atomic32 submit_count) override; |
| 323 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 298 bool Process(bool did_finish) override; | 324 bool Process(bool did_finish) override; |
| 299 void Destroy(bool have_context) override; | 325 void Destroy(bool have_context) override; |
| 300 | 326 |
| 301 protected: | 327 protected: |
| 302 void Complete(); | 328 void Complete(); |
| 303 ~AsyncReadPixelsCompletedQuery() override; | 329 ~AsyncReadPixelsCompletedQuery() override; |
| 304 | 330 |
| 305 private: | 331 private: |
| 306 bool completed_; | 332 bool completed_; |
| 307 bool complete_result_; | 333 bool complete_result_; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 322 if (!AddToPendingQueue(submit_count)) { | 348 if (!AddToPendingQueue(submit_count)) { |
| 323 return false; | 349 return false; |
| 324 } | 350 } |
| 325 manager()->decoder()->WaitForReadPixels( | 351 manager()->decoder()->WaitForReadPixels( |
| 326 base::Bind(&AsyncReadPixelsCompletedQuery::Complete, | 352 base::Bind(&AsyncReadPixelsCompletedQuery::Complete, |
| 327 AsWeakPtr())); | 353 AsWeakPtr())); |
| 328 | 354 |
| 329 return Process(false); | 355 return Process(false); |
| 330 } | 356 } |
| 331 | 357 |
| 358 bool AsyncReadPixelsCompletedQuery::QueryCounter( |
| 359 base::subtle::Atomic32 submit_count) { |
| 360 NOTREACHED(); |
| 361 return false; |
| 362 } |
| 363 |
| 332 void AsyncReadPixelsCompletedQuery::Complete() { | 364 void AsyncReadPixelsCompletedQuery::Complete() { |
| 333 completed_ = true; | 365 completed_ = true; |
| 334 complete_result_ = MarkAsCompleted(1); | 366 complete_result_ = MarkAsCompleted(1); |
| 335 } | 367 } |
| 336 | 368 |
| 337 bool AsyncReadPixelsCompletedQuery::Process(bool did_finish) { | 369 bool AsyncReadPixelsCompletedQuery::Process(bool did_finish) { |
| 338 return !completed_ || complete_result_; | 370 return !completed_ || complete_result_; |
| 339 } | 371 } |
| 340 | 372 |
| 341 void AsyncReadPixelsCompletedQuery::Destroy(bool /* have_context */) { | 373 void AsyncReadPixelsCompletedQuery::Destroy(bool /* have_context */) { |
| 342 if (!IsDeleted()) { | 374 if (!IsDeleted()) { |
| 343 MarkAsDeleted(); | 375 MarkAsDeleted(); |
| 344 } | 376 } |
| 345 } | 377 } |
| 346 | 378 |
| 347 AsyncReadPixelsCompletedQuery::~AsyncReadPixelsCompletedQuery() { | 379 AsyncReadPixelsCompletedQuery::~AsyncReadPixelsCompletedQuery() { |
| 348 } | 380 } |
| 349 | 381 |
| 350 | 382 |
| 351 class GetErrorQuery : public QueryManager::Query { | 383 class GetErrorQuery : public QueryManager::Query { |
| 352 public: | 384 public: |
| 353 GetErrorQuery( | 385 GetErrorQuery( |
| 354 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 386 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); |
| 355 | 387 |
| 356 bool Begin() override; | 388 bool Begin() override; |
| 357 bool End(base::subtle::Atomic32 submit_count) override; | 389 bool End(base::subtle::Atomic32 submit_count) override; |
| 390 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 358 bool Process(bool did_finish) override; | 391 bool Process(bool did_finish) override; |
| 359 void Destroy(bool have_context) override; | 392 void Destroy(bool have_context) override; |
| 360 | 393 |
| 361 protected: | 394 protected: |
| 362 ~GetErrorQuery() override; | 395 ~GetErrorQuery() override; |
| 363 | 396 |
| 364 private: | 397 private: |
| 365 }; | 398 }; |
| 366 | 399 |
| 367 GetErrorQuery::GetErrorQuery( | 400 GetErrorQuery::GetErrorQuery( |
| 368 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 401 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) |
| 369 : Query(manager, target, shm_id, shm_offset) { | 402 : Query(manager, target, shm_id, shm_offset) { |
| 370 } | 403 } |
| 371 | 404 |
| 372 bool GetErrorQuery::Begin() { | 405 bool GetErrorQuery::Begin() { |
| 373 return true; | 406 return true; |
| 374 } | 407 } |
| 375 | 408 |
| 376 bool GetErrorQuery::End(base::subtle::Atomic32 submit_count) { | 409 bool GetErrorQuery::End(base::subtle::Atomic32 submit_count) { |
| 377 MarkAsPending(submit_count); | 410 MarkAsPending(submit_count); |
| 378 return MarkAsCompleted(manager()->decoder()->GetErrorState()->GetGLError()); | 411 return MarkAsCompleted(manager()->decoder()->GetErrorState()->GetGLError()); |
| 379 } | 412 } |
| 380 | 413 |
| 414 bool GetErrorQuery::QueryCounter(base::subtle::Atomic32 submit_count) { |
| 415 NOTREACHED(); |
| 416 return false; |
| 417 } |
| 418 |
| 381 bool GetErrorQuery::Process(bool did_finish) { | 419 bool GetErrorQuery::Process(bool did_finish) { |
| 382 NOTREACHED(); | 420 NOTREACHED(); |
| 383 return true; | 421 return true; |
| 384 } | 422 } |
| 385 | 423 |
| 386 void GetErrorQuery::Destroy(bool /* have_context */) { | 424 void GetErrorQuery::Destroy(bool /* have_context */) { |
| 387 if (!IsDeleted()) { | 425 if (!IsDeleted()) { |
| 388 MarkAsDeleted(); | 426 MarkAsDeleted(); |
| 389 } | 427 } |
| 390 } | 428 } |
| 391 | 429 |
| 392 GetErrorQuery::~GetErrorQuery() { | 430 GetErrorQuery::~GetErrorQuery() { |
| 393 } | 431 } |
| 394 | 432 |
| 395 class CommandsCompletedQuery : public QueryManager::Query { | 433 class CommandsCompletedQuery : public QueryManager::Query { |
| 396 public: | 434 public: |
| 397 CommandsCompletedQuery(QueryManager* manager, | 435 CommandsCompletedQuery(QueryManager* manager, |
| 398 GLenum target, | 436 GLenum target, |
| 399 int32 shm_id, | 437 int32 shm_id, |
| 400 uint32 shm_offset); | 438 uint32 shm_offset); |
| 401 | 439 |
| 402 // Overridden from QueryManager::Query: | 440 // Overridden from QueryManager::Query: |
| 403 bool Begin() override; | 441 bool Begin() override; |
| 404 bool End(base::subtle::Atomic32 submit_count) override; | 442 bool End(base::subtle::Atomic32 submit_count) override; |
| 443 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 405 bool Process(bool did_finish) override; | 444 bool Process(bool did_finish) override; |
| 406 void Destroy(bool have_context) override; | 445 void Destroy(bool have_context) override; |
| 407 | 446 |
| 408 protected: | 447 protected: |
| 409 ~CommandsCompletedQuery() override; | 448 ~CommandsCompletedQuery() override; |
| 410 | 449 |
| 411 private: | 450 private: |
| 412 scoped_ptr<gfx::GLFence> fence_; | 451 scoped_ptr<gfx::GLFence> fence_; |
| 413 base::TimeTicks begin_time_; | 452 base::TimeTicks begin_time_; |
| 414 }; | 453 }; |
| 415 | 454 |
| 416 CommandsCompletedQuery::CommandsCompletedQuery(QueryManager* manager, | 455 CommandsCompletedQuery::CommandsCompletedQuery(QueryManager* manager, |
| 417 GLenum target, | 456 GLenum target, |
| 418 int32 shm_id, | 457 int32 shm_id, |
| 419 uint32 shm_offset) | 458 uint32 shm_offset) |
| 420 : Query(manager, target, shm_id, shm_offset) {} | 459 : Query(manager, target, shm_id, shm_offset) {} |
| 421 | 460 |
| 422 bool CommandsCompletedQuery::Begin() { | 461 bool CommandsCompletedQuery::Begin() { |
| 423 begin_time_ = base::TimeTicks::Now(); | 462 begin_time_ = base::TimeTicks::Now(); |
| 424 return true; | 463 return true; |
| 425 } | 464 } |
| 426 | 465 |
| 427 bool CommandsCompletedQuery::End(base::subtle::Atomic32 submit_count) { | 466 bool CommandsCompletedQuery::End(base::subtle::Atomic32 submit_count) { |
| 428 fence_.reset(gfx::GLFence::Create()); | 467 fence_.reset(gfx::GLFence::Create()); |
| 429 DCHECK(fence_); | 468 DCHECK(fence_); |
| 430 return AddToPendingQueue(submit_count); | 469 return AddToPendingQueue(submit_count); |
| 431 } | 470 } |
| 432 | 471 |
| 472 bool CommandsCompletedQuery::QueryCounter(base::subtle::Atomic32 submit_count) { |
| 473 NOTREACHED(); |
| 474 return false; |
| 475 } |
| 476 |
| 433 bool CommandsCompletedQuery::Process(bool did_finish) { | 477 bool CommandsCompletedQuery::Process(bool did_finish) { |
| 434 // Note: |did_finish| guarantees that the GPU has passed the fence but | 478 // Note: |did_finish| guarantees that the GPU has passed the fence but |
| 435 // we cannot assume that GLFence::HasCompleted() will return true yet as | 479 // we cannot assume that GLFence::HasCompleted() will return true yet as |
| 436 // that's not guaranteed by all GLFence implementations. | 480 // that's not guaranteed by all GLFence implementations. |
| 437 if (!did_finish && fence_ && !fence_->HasCompleted()) | 481 if (!did_finish && fence_ && !fence_->HasCompleted()) |
| 438 return true; | 482 return true; |
| 439 | 483 |
| 440 base::TimeDelta elapsed = base::TimeTicks::Now() - begin_time_; | 484 base::TimeDelta elapsed = base::TimeTicks::Now() - begin_time_; |
| 441 return MarkAsCompleted(elapsed.InMicroseconds()); | 485 return MarkAsCompleted(elapsed.InMicroseconds()); |
| 442 } | 486 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 453 class TimeElapsedQuery : public QueryManager::Query { | 497 class TimeElapsedQuery : public QueryManager::Query { |
| 454 public: | 498 public: |
| 455 TimeElapsedQuery(QueryManager* manager, | 499 TimeElapsedQuery(QueryManager* manager, |
| 456 GLenum target, | 500 GLenum target, |
| 457 int32 shm_id, | 501 int32 shm_id, |
| 458 uint32 shm_offset); | 502 uint32 shm_offset); |
| 459 | 503 |
| 460 // Overridden from QueryManager::Query: | 504 // Overridden from QueryManager::Query: |
| 461 bool Begin() override; | 505 bool Begin() override; |
| 462 bool End(base::subtle::Atomic32 submit_count) override; | 506 bool End(base::subtle::Atomic32 submit_count) override; |
| 507 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 463 bool Process(bool did_finish) override; | 508 bool Process(bool did_finish) override; |
| 464 void Destroy(bool have_context) override; | 509 void Destroy(bool have_context) override; |
| 465 | 510 |
| 466 protected: | 511 protected: |
| 467 ~TimeElapsedQuery() override; | 512 ~TimeElapsedQuery() override; |
| 468 | 513 |
| 469 private: | 514 private: |
| 470 scoped_ptr<gfx::GPUTimer> gpu_timer_; | 515 scoped_ptr<gfx::GPUTimer> gpu_timer_; |
| 471 }; | 516 }; |
| 472 | 517 |
| 473 TimeElapsedQuery::TimeElapsedQuery(QueryManager* manager, | 518 TimeElapsedQuery::TimeElapsedQuery(QueryManager* manager, |
| 474 GLenum target, | 519 GLenum target, |
| 475 int32 shm_id, | 520 int32 shm_id, |
| 476 uint32 shm_offset) | 521 uint32 shm_offset) |
| 477 : Query(manager, target, shm_id, shm_offset), | 522 : Query(manager, target, shm_id, shm_offset), |
| 478 gpu_timer_(manager->CreateGPUTimer(true)) {} | 523 gpu_timer_(manager->CreateGPUTimer(true)) {} |
| 479 | 524 |
| 480 bool TimeElapsedQuery::Begin() { | 525 bool TimeElapsedQuery::Begin() { |
| 481 gpu_timer_->Start(); | 526 gpu_timer_->Start(); |
| 482 return true; | 527 return true; |
| 483 } | 528 } |
| 484 | 529 |
| 485 bool TimeElapsedQuery::End(base::subtle::Atomic32 submit_count) { | 530 bool TimeElapsedQuery::End(base::subtle::Atomic32 submit_count) { |
| 486 gpu_timer_->End(); | 531 gpu_timer_->End(); |
| 487 return AddToPendingQueue(submit_count); | 532 return AddToPendingQueue(submit_count); |
| 488 } | 533 } |
| 489 | 534 |
| 535 bool TimeElapsedQuery::QueryCounter(base::subtle::Atomic32 submit_count) { |
| 536 NOTREACHED(); |
| 537 return false; |
| 538 } |
| 539 |
| 490 bool TimeElapsedQuery::Process(bool did_finish) { | 540 bool TimeElapsedQuery::Process(bool did_finish) { |
| 491 if (!gpu_timer_->IsAvailable()) | 541 if (!gpu_timer_->IsAvailable()) |
| 492 return true; | 542 return true; |
| 493 | 543 |
| 494 const uint64_t nano_seconds = | 544 const uint64_t nano_seconds = |
| 495 gpu_timer_->GetDeltaElapsed() * base::Time::kNanosecondsPerMicrosecond; | 545 gpu_timer_->GetDeltaElapsed() * base::Time::kNanosecondsPerMicrosecond; |
| 496 return MarkAsCompleted(nano_seconds); | 546 return MarkAsCompleted(nano_seconds); |
| 497 } | 547 } |
| 498 | 548 |
| 499 void TimeElapsedQuery::Destroy(bool have_context) { | 549 void TimeElapsedQuery::Destroy(bool have_context) { |
| 500 if (gpu_timer_.get()) { | 550 if (gpu_timer_.get()) { |
| 501 gpu_timer_->Destroy(have_context); | 551 gpu_timer_->Destroy(have_context); |
| 502 gpu_timer_.reset(); | 552 gpu_timer_.reset(); |
| 503 } | 553 } |
| 504 } | 554 } |
| 505 | 555 |
| 506 TimeElapsedQuery::~TimeElapsedQuery() {} | 556 TimeElapsedQuery::~TimeElapsedQuery() {} |
| 507 | 557 |
| 558 class TimeStampQuery : public QueryManager::Query { |
| 559 public: |
| 560 TimeStampQuery(QueryManager* manager, |
| 561 GLenum target, |
| 562 int32 shm_id, |
| 563 uint32 shm_offset); |
| 564 |
| 565 // Overridden from QueryManager::Query: |
| 566 bool Begin() override; |
| 567 bool End(base::subtle::Atomic32 submit_count) override; |
| 568 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 569 bool Process(bool did_finish) override; |
| 570 void Destroy(bool have_context) override; |
| 571 |
| 572 protected: |
| 573 ~TimeStampQuery() override; |
| 574 |
| 575 private: |
| 576 scoped_ptr<gfx::GPUTimer> gpu_timer_; |
| 577 }; |
| 578 |
| 579 TimeStampQuery::TimeStampQuery(QueryManager* manager, |
| 580 GLenum target, |
| 581 int32 shm_id, |
| 582 uint32 shm_offset) |
| 583 : Query(manager, target, shm_id, shm_offset), |
| 584 gpu_timer_(manager->CreateGPUTimer(false)) {} |
| 585 |
| 586 bool TimeStampQuery::Begin() { |
| 587 NOTREACHED(); |
| 588 return false; |
| 589 } |
| 590 |
| 591 bool TimeStampQuery::End(base::subtle::Atomic32 submit_count) { |
| 592 NOTREACHED(); |
| 593 return false; |
| 594 } |
| 595 |
| 596 bool TimeStampQuery::QueryCounter(base::subtle::Atomic32 submit_count) { |
| 597 gpu_timer_->QueryTimeStamp(); |
| 598 return AddToPendingQueue(submit_count); |
| 599 } |
| 600 |
| 601 bool TimeStampQuery::Process(bool did_finish) { |
| 602 if (!gpu_timer_->IsAvailable()) |
| 603 return true; |
| 604 |
| 605 int64_t start = 0; |
| 606 int64_t end = 0; |
| 607 gpu_timer_->GetStartEndTimestamps(&start, &end); |
| 608 DCHECK(start == end); |
| 609 |
| 610 const uint64_t nano_seconds = start * base::Time::kNanosecondsPerMicrosecond; |
| 611 return MarkAsCompleted(nano_seconds); |
| 612 } |
| 613 |
| 614 void TimeStampQuery::Destroy(bool have_context) { |
| 615 if (gpu_timer_.get()) { |
| 616 gpu_timer_->Destroy(have_context); |
| 617 gpu_timer_.reset(); |
| 618 } |
| 619 } |
| 620 |
| 621 TimeStampQuery::~TimeStampQuery() {} |
| 622 |
| 508 QueryManager::QueryManager( | 623 QueryManager::QueryManager( |
| 509 GLES2Decoder* decoder, | 624 GLES2Decoder* decoder, |
| 510 FeatureInfo* feature_info) | 625 FeatureInfo* feature_info) |
| 511 : decoder_(decoder), | 626 : decoder_(decoder), |
| 512 use_arb_occlusion_query2_for_occlusion_query_boolean_( | 627 use_arb_occlusion_query2_for_occlusion_query_boolean_( |
| 513 feature_info->feature_flags( | 628 feature_info->feature_flags( |
| 514 ).use_arb_occlusion_query2_for_occlusion_query_boolean), | 629 ).use_arb_occlusion_query2_for_occlusion_query_boolean), |
| 515 use_arb_occlusion_query_for_occlusion_query_boolean_( | 630 use_arb_occlusion_query_for_occlusion_query_boolean_( |
| 516 feature_info->feature_flags( | 631 feature_info->feature_flags( |
| 517 ).use_arb_occlusion_query_for_occlusion_query_boolean), | 632 ).use_arb_occlusion_query_for_occlusion_query_boolean), |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 566 break; | 681 break; |
| 567 case GL_GET_ERROR_QUERY_CHROMIUM: | 682 case GL_GET_ERROR_QUERY_CHROMIUM: |
| 568 query = new GetErrorQuery(this, target, shm_id, shm_offset); | 683 query = new GetErrorQuery(this, target, shm_id, shm_offset); |
| 569 break; | 684 break; |
| 570 case GL_COMMANDS_COMPLETED_CHROMIUM: | 685 case GL_COMMANDS_COMPLETED_CHROMIUM: |
| 571 query = new CommandsCompletedQuery(this, target, shm_id, shm_offset); | 686 query = new CommandsCompletedQuery(this, target, shm_id, shm_offset); |
| 572 break; | 687 break; |
| 573 case GL_TIME_ELAPSED: | 688 case GL_TIME_ELAPSED: |
| 574 query = new TimeElapsedQuery(this, target, shm_id, shm_offset); | 689 query = new TimeElapsedQuery(this, target, shm_id, shm_offset); |
| 575 break; | 690 break; |
| 691 case GL_TIMESTAMP: |
| 692 query = new TimeStampQuery(this, target, shm_id, shm_offset); |
| 693 break; |
| 576 default: { | 694 default: { |
| 577 GLuint service_id = 0; | 695 GLuint service_id = 0; |
| 578 glGenQueries(1, &service_id); | 696 glGenQueries(1, &service_id); |
| 579 DCHECK_NE(0u, service_id); | 697 DCHECK_NE(0u, service_id); |
| 580 query = new AllSamplesPassedQuery( | 698 query = new AllSamplesPassedQuery( |
| 581 this, target, shm_id, shm_offset, service_id); | 699 this, target, shm_id, shm_offset, service_id); |
| 582 break; | 700 break; |
| 583 } | 701 } |
| 584 } | 702 } |
| 585 std::pair<QueryMap::iterator, bool> result = | 703 std::pair<QueryMap::iterator, bool> result = |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 820 } | 938 } |
| 821 | 939 |
| 822 bool QueryManager::EndQuery(Query* query, base::subtle::Atomic32 submit_count) { | 940 bool QueryManager::EndQuery(Query* query, base::subtle::Atomic32 submit_count) { |
| 823 DCHECK(query); | 941 DCHECK(query); |
| 824 if (!RemovePendingQuery(query)) { | 942 if (!RemovePendingQuery(query)) { |
| 825 return false; | 943 return false; |
| 826 } | 944 } |
| 827 return query->End(submit_count); | 945 return query->End(submit_count); |
| 828 } | 946 } |
| 829 | 947 |
| 948 bool QueryManager::QueryCounter( |
| 949 Query* query, base::subtle::Atomic32 submit_count) { |
| 950 DCHECK(query); |
| 951 return query->QueryCounter(submit_count); |
| 952 } |
| 953 |
| 830 } // namespace gles2 | 954 } // namespace gles2 |
| 831 } // namespace gpu | 955 } // namespace gpu |
| OLD | NEW |