| 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 <stddef.h> |
| 8 #include <stdint.h> |
| 9 |
| 7 #include "base/atomicops.h" | 10 #include "base/atomicops.h" |
| 8 #include "base/bind.h" | 11 #include "base/bind.h" |
| 9 #include "base/logging.h" | 12 #include "base/logging.h" |
| 10 #include "base/memory/shared_memory.h" | 13 #include "base/memory/shared_memory.h" |
| 11 #include "base/numerics/safe_math.h" | 14 #include "base/numerics/safe_math.h" |
| 12 #include "base/synchronization/lock.h" | 15 #include "base/synchronization/lock.h" |
| 13 #include "base/time/time.h" | 16 #include "base/time/time.h" |
| 14 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 17 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
| 15 #include "gpu/command_buffer/service/error_state.h" | 18 #include "gpu/command_buffer/service/error_state.h" |
| 16 #include "gpu/command_buffer/service/feature_info.h" | 19 #include "gpu/command_buffer/service/feature_info.h" |
| 17 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 20 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 18 #include "ui/gl/gl_bindings.h" | 21 #include "ui/gl/gl_bindings.h" |
| 19 #include "ui/gl/gl_context.h" | 22 #include "ui/gl/gl_context.h" |
| 20 #include "ui/gl/gl_fence.h" | 23 #include "ui/gl/gl_fence.h" |
| 21 #include "ui/gl/gpu_timing.h" | 24 #include "ui/gl/gpu_timing.h" |
| 22 | 25 |
| 23 namespace gpu { | 26 namespace gpu { |
| 24 namespace gles2 { | 27 namespace gles2 { |
| 25 | 28 |
| 26 class AbstractIntegerQuery : public QueryManager::Query { | 29 class AbstractIntegerQuery : public QueryManager::Query { |
| 27 public: | 30 public: |
| 28 AbstractIntegerQuery( | 31 AbstractIntegerQuery(QueryManager* manager, |
| 29 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 32 GLenum target, |
| 33 int32_t shm_id, |
| 34 uint32_t shm_offset); |
| 30 bool Begin() override; | 35 bool Begin() override; |
| 31 bool End(base::subtle::Atomic32 submit_count) override; | 36 bool End(base::subtle::Atomic32 submit_count) override; |
| 32 bool QueryCounter(base::subtle::Atomic32 submit_count) override; | 37 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 33 void Pause() override; | 38 void Pause() override; |
| 34 void Resume() override; | 39 void Resume() override; |
| 35 void Destroy(bool have_context) override; | 40 void Destroy(bool have_context) override; |
| 36 | 41 |
| 37 protected: | 42 protected: |
| 38 ~AbstractIntegerQuery() override; | 43 ~AbstractIntegerQuery() override; |
| 39 bool AreAllResultsAvailable(); | 44 bool AreAllResultsAvailable(); |
| 40 | 45 |
| 41 // Service side query ids. | 46 // Service side query ids. |
| 42 std::vector<GLuint> service_ids_; | 47 std::vector<GLuint> service_ids_; |
| 43 }; | 48 }; |
| 44 | 49 |
| 45 AbstractIntegerQuery::AbstractIntegerQuery( | 50 AbstractIntegerQuery::AbstractIntegerQuery(QueryManager* manager, |
| 46 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 51 GLenum target, |
| 52 int32_t shm_id, |
| 53 uint32_t shm_offset) |
| 47 : Query(manager, target, shm_id, shm_offset) { | 54 : Query(manager, target, shm_id, shm_offset) { |
| 48 GLuint service_id = 0; | 55 GLuint service_id = 0; |
| 49 glGenQueries(1, &service_id); | 56 glGenQueries(1, &service_id); |
| 50 DCHECK_NE(0u, service_id); | 57 DCHECK_NE(0u, service_id); |
| 51 service_ids_.push_back(service_id); | 58 service_ids_.push_back(service_id); |
| 52 } | 59 } |
| 53 | 60 |
| 54 bool AbstractIntegerQuery::Begin() { | 61 bool AbstractIntegerQuery::Begin() { |
| 55 MarkAsActive(); | 62 MarkAsActive(); |
| 56 // Delete all but the first one when beginning a new query. | 63 // Delete all but the first one when beginning a new query. |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 | 107 |
| 101 bool AbstractIntegerQuery::AreAllResultsAvailable() { | 108 bool AbstractIntegerQuery::AreAllResultsAvailable() { |
| 102 GLuint available = 0; | 109 GLuint available = 0; |
| 103 glGetQueryObjectuiv( | 110 glGetQueryObjectuiv( |
| 104 service_ids_.back(), GL_QUERY_RESULT_AVAILABLE_EXT, &available); | 111 service_ids_.back(), GL_QUERY_RESULT_AVAILABLE_EXT, &available); |
| 105 return !!available; | 112 return !!available; |
| 106 } | 113 } |
| 107 | 114 |
| 108 class BooleanQuery : public AbstractIntegerQuery { | 115 class BooleanQuery : public AbstractIntegerQuery { |
| 109 public: | 116 public: |
| 110 BooleanQuery( | 117 BooleanQuery(QueryManager* manager, |
| 111 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 118 GLenum target, |
| 119 int32_t shm_id, |
| 120 uint32_t shm_offset); |
| 112 bool Process(bool did_finish) override; | 121 bool Process(bool did_finish) override; |
| 113 | 122 |
| 114 protected: | 123 protected: |
| 115 ~BooleanQuery() override; | 124 ~BooleanQuery() override; |
| 116 }; | 125 }; |
| 117 | 126 |
| 118 BooleanQuery::BooleanQuery( | 127 BooleanQuery::BooleanQuery(QueryManager* manager, |
| 119 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 128 GLenum target, |
| 120 : AbstractIntegerQuery(manager, target, shm_id, shm_offset) { | 129 int32_t shm_id, |
| 121 } | 130 uint32_t shm_offset) |
| 131 : AbstractIntegerQuery(manager, target, shm_id, shm_offset) {} |
| 122 | 132 |
| 123 BooleanQuery::~BooleanQuery() { | 133 BooleanQuery::~BooleanQuery() { |
| 124 } | 134 } |
| 125 | 135 |
| 126 bool BooleanQuery::Process(bool did_finish) { | 136 bool BooleanQuery::Process(bool did_finish) { |
| 127 if (!AreAllResultsAvailable()) { | 137 if (!AreAllResultsAvailable()) { |
| 128 // Must return true to avoid generating an error at the command | 138 // Must return true to avoid generating an error at the command |
| 129 // buffer level. | 139 // buffer level. |
| 130 return true; | 140 return true; |
| 131 } | 141 } |
| 132 for (const GLuint& service_id : service_ids_) { | 142 for (const GLuint& service_id : service_ids_) { |
| 133 GLuint result = 0; | 143 GLuint result = 0; |
| 134 glGetQueryObjectuiv(service_id, GL_QUERY_RESULT_EXT, &result); | 144 glGetQueryObjectuiv(service_id, GL_QUERY_RESULT_EXT, &result); |
| 135 if (result != 0) | 145 if (result != 0) |
| 136 return MarkAsCompleted(1); | 146 return MarkAsCompleted(1); |
| 137 } | 147 } |
| 138 return MarkAsCompleted(0); | 148 return MarkAsCompleted(0); |
| 139 } | 149 } |
| 140 | 150 |
| 141 class SummedIntegerQuery : public AbstractIntegerQuery { | 151 class SummedIntegerQuery : public AbstractIntegerQuery { |
| 142 public: | 152 public: |
| 143 SummedIntegerQuery( | 153 SummedIntegerQuery(QueryManager* manager, |
| 144 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 154 GLenum target, |
| 155 int32_t shm_id, |
| 156 uint32_t shm_offset); |
| 145 bool Process(bool did_finish) override; | 157 bool Process(bool did_finish) override; |
| 146 | 158 |
| 147 protected: | 159 protected: |
| 148 ~SummedIntegerQuery() override; | 160 ~SummedIntegerQuery() override; |
| 149 }; | 161 }; |
| 150 | 162 |
| 151 SummedIntegerQuery::SummedIntegerQuery( | 163 SummedIntegerQuery::SummedIntegerQuery(QueryManager* manager, |
| 152 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 164 GLenum target, |
| 153 : AbstractIntegerQuery(manager, target, shm_id, shm_offset) { | 165 int32_t shm_id, |
| 154 } | 166 uint32_t shm_offset) |
| 167 : AbstractIntegerQuery(manager, target, shm_id, shm_offset) {} |
| 155 | 168 |
| 156 SummedIntegerQuery::~SummedIntegerQuery() { | 169 SummedIntegerQuery::~SummedIntegerQuery() { |
| 157 } | 170 } |
| 158 | 171 |
| 159 bool SummedIntegerQuery::Process(bool did_finish) { | 172 bool SummedIntegerQuery::Process(bool did_finish) { |
| 160 if (!AreAllResultsAvailable()) { | 173 if (!AreAllResultsAvailable()) { |
| 161 // Must return true to avoid generating an error at the command | 174 // Must return true to avoid generating an error at the command |
| 162 // buffer level. | 175 // buffer level. |
| 163 return true; | 176 return true; |
| 164 } | 177 } |
| 165 GLuint summed_result = 0; | 178 GLuint summed_result = 0; |
| 166 for (const GLuint& service_id : service_ids_) { | 179 for (const GLuint& service_id : service_ids_) { |
| 167 GLuint result = 0; | 180 GLuint result = 0; |
| 168 glGetQueryObjectuiv(service_id, GL_QUERY_RESULT_EXT, &result); | 181 glGetQueryObjectuiv(service_id, GL_QUERY_RESULT_EXT, &result); |
| 169 summed_result += result; | 182 summed_result += result; |
| 170 } | 183 } |
| 171 return MarkAsCompleted(summed_result); | 184 return MarkAsCompleted(summed_result); |
| 172 } | 185 } |
| 173 | 186 |
| 174 class CommandsIssuedQuery : public QueryManager::Query { | 187 class CommandsIssuedQuery : public QueryManager::Query { |
| 175 public: | 188 public: |
| 176 CommandsIssuedQuery( | 189 CommandsIssuedQuery(QueryManager* manager, |
| 177 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 190 GLenum target, |
| 191 int32_t shm_id, |
| 192 uint32_t shm_offset); |
| 178 | 193 |
| 179 bool Begin() override; | 194 bool Begin() override; |
| 180 bool End(base::subtle::Atomic32 submit_count) override; | 195 bool End(base::subtle::Atomic32 submit_count) override; |
| 181 bool QueryCounter(base::subtle::Atomic32 submit_count) override; | 196 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 182 void Pause() override; | 197 void Pause() override; |
| 183 void Resume() override; | 198 void Resume() override; |
| 184 bool Process(bool did_finish) override; | 199 bool Process(bool did_finish) override; |
| 185 void Destroy(bool have_context) override; | 200 void Destroy(bool have_context) override; |
| 186 | 201 |
| 187 protected: | 202 protected: |
| 188 ~CommandsIssuedQuery() override; | 203 ~CommandsIssuedQuery() override; |
| 189 | 204 |
| 190 private: | 205 private: |
| 191 base::TimeTicks begin_time_; | 206 base::TimeTicks begin_time_; |
| 192 }; | 207 }; |
| 193 | 208 |
| 194 CommandsIssuedQuery::CommandsIssuedQuery( | 209 CommandsIssuedQuery::CommandsIssuedQuery(QueryManager* manager, |
| 195 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 210 GLenum target, |
| 196 : Query(manager, target, shm_id, shm_offset) { | 211 int32_t shm_id, |
| 197 } | 212 uint32_t shm_offset) |
| 213 : Query(manager, target, shm_id, shm_offset) {} |
| 198 | 214 |
| 199 bool CommandsIssuedQuery::Begin() { | 215 bool CommandsIssuedQuery::Begin() { |
| 200 MarkAsActive(); | 216 MarkAsActive(); |
| 201 begin_time_ = base::TimeTicks::Now(); | 217 begin_time_ = base::TimeTicks::Now(); |
| 202 return true; | 218 return true; |
| 203 } | 219 } |
| 204 | 220 |
| 205 void CommandsIssuedQuery::Pause() { | 221 void CommandsIssuedQuery::Pause() { |
| 206 MarkAsPaused(); | 222 MarkAsPaused(); |
| 207 } | 223 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 230 if (!IsDeleted()) { | 246 if (!IsDeleted()) { |
| 231 MarkAsDeleted(); | 247 MarkAsDeleted(); |
| 232 } | 248 } |
| 233 } | 249 } |
| 234 | 250 |
| 235 CommandsIssuedQuery::~CommandsIssuedQuery() { | 251 CommandsIssuedQuery::~CommandsIssuedQuery() { |
| 236 } | 252 } |
| 237 | 253 |
| 238 class CommandLatencyQuery : public QueryManager::Query { | 254 class CommandLatencyQuery : public QueryManager::Query { |
| 239 public: | 255 public: |
| 240 CommandLatencyQuery( | 256 CommandLatencyQuery(QueryManager* manager, |
| 241 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 257 GLenum target, |
| 258 int32_t shm_id, |
| 259 uint32_t shm_offset); |
| 242 | 260 |
| 243 bool Begin() override; | 261 bool Begin() override; |
| 244 bool End(base::subtle::Atomic32 submit_count) override; | 262 bool End(base::subtle::Atomic32 submit_count) override; |
| 245 bool QueryCounter(base::subtle::Atomic32 submit_count) override; | 263 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 246 void Pause() override; | 264 void Pause() override; |
| 247 void Resume() override; | 265 void Resume() override; |
| 248 bool Process(bool did_finish) override; | 266 bool Process(bool did_finish) override; |
| 249 void Destroy(bool have_context) override; | 267 void Destroy(bool have_context) override; |
| 250 | 268 |
| 251 protected: | 269 protected: |
| 252 ~CommandLatencyQuery() override; | 270 ~CommandLatencyQuery() override; |
| 253 }; | 271 }; |
| 254 | 272 |
| 255 CommandLatencyQuery::CommandLatencyQuery( | 273 CommandLatencyQuery::CommandLatencyQuery(QueryManager* manager, |
| 256 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 274 GLenum target, |
| 257 : Query(manager, target, shm_id, shm_offset) { | 275 int32_t shm_id, |
| 258 } | 276 uint32_t shm_offset) |
| 277 : Query(manager, target, shm_id, shm_offset) {} |
| 259 | 278 |
| 260 bool CommandLatencyQuery::Begin() { | 279 bool CommandLatencyQuery::Begin() { |
| 261 MarkAsActive(); | 280 MarkAsActive(); |
| 262 return true; | 281 return true; |
| 263 } | 282 } |
| 264 | 283 |
| 265 void CommandLatencyQuery::Pause() { | 284 void CommandLatencyQuery::Pause() { |
| 266 MarkAsPaused(); | 285 MarkAsPaused(); |
| 267 } | 286 } |
| 268 | 287 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 293 } | 312 } |
| 294 | 313 |
| 295 CommandLatencyQuery::~CommandLatencyQuery() { | 314 CommandLatencyQuery::~CommandLatencyQuery() { |
| 296 } | 315 } |
| 297 | 316 |
| 298 | 317 |
| 299 class AsyncReadPixelsCompletedQuery | 318 class AsyncReadPixelsCompletedQuery |
| 300 : public QueryManager::Query, | 319 : public QueryManager::Query, |
| 301 public base::SupportsWeakPtr<AsyncReadPixelsCompletedQuery> { | 320 public base::SupportsWeakPtr<AsyncReadPixelsCompletedQuery> { |
| 302 public: | 321 public: |
| 303 AsyncReadPixelsCompletedQuery( | 322 AsyncReadPixelsCompletedQuery(QueryManager* manager, |
| 304 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 323 GLenum target, |
| 324 int32_t shm_id, |
| 325 uint32_t shm_offset); |
| 305 | 326 |
| 306 bool Begin() override; | 327 bool Begin() override; |
| 307 bool End(base::subtle::Atomic32 submit_count) override; | 328 bool End(base::subtle::Atomic32 submit_count) override; |
| 308 bool QueryCounter(base::subtle::Atomic32 submit_count) override; | 329 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 309 void Pause() override; | 330 void Pause() override; |
| 310 void Resume() override; | 331 void Resume() override; |
| 311 bool Process(bool did_finish) override; | 332 bool Process(bool did_finish) override; |
| 312 void Destroy(bool have_context) override; | 333 void Destroy(bool have_context) override; |
| 313 | 334 |
| 314 protected: | 335 protected: |
| 315 void Complete(); | 336 void Complete(); |
| 316 ~AsyncReadPixelsCompletedQuery() override; | 337 ~AsyncReadPixelsCompletedQuery() override; |
| 317 | 338 |
| 318 private: | 339 private: |
| 319 bool complete_result_; | 340 bool complete_result_; |
| 320 }; | 341 }; |
| 321 | 342 |
| 322 AsyncReadPixelsCompletedQuery::AsyncReadPixelsCompletedQuery( | 343 AsyncReadPixelsCompletedQuery::AsyncReadPixelsCompletedQuery( |
| 323 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 344 QueryManager* manager, |
| 324 : Query(manager, target, shm_id, shm_offset), | 345 GLenum target, |
| 325 complete_result_(false) { | 346 int32_t shm_id, |
| 326 } | 347 uint32_t shm_offset) |
| 348 : Query(manager, target, shm_id, shm_offset), complete_result_(false) {} |
| 327 | 349 |
| 328 bool AsyncReadPixelsCompletedQuery::Begin() { | 350 bool AsyncReadPixelsCompletedQuery::Begin() { |
| 329 MarkAsActive(); | 351 MarkAsActive(); |
| 330 return true; | 352 return true; |
| 331 } | 353 } |
| 332 | 354 |
| 333 void AsyncReadPixelsCompletedQuery::Pause() { | 355 void AsyncReadPixelsCompletedQuery::Pause() { |
| 334 MarkAsPaused(); | 356 MarkAsPaused(); |
| 335 } | 357 } |
| 336 | 358 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 MarkAsDeleted(); | 390 MarkAsDeleted(); |
| 369 } | 391 } |
| 370 } | 392 } |
| 371 | 393 |
| 372 AsyncReadPixelsCompletedQuery::~AsyncReadPixelsCompletedQuery() { | 394 AsyncReadPixelsCompletedQuery::~AsyncReadPixelsCompletedQuery() { |
| 373 } | 395 } |
| 374 | 396 |
| 375 | 397 |
| 376 class GetErrorQuery : public QueryManager::Query { | 398 class GetErrorQuery : public QueryManager::Query { |
| 377 public: | 399 public: |
| 378 GetErrorQuery( | 400 GetErrorQuery(QueryManager* manager, |
| 379 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 401 GLenum target, |
| 402 int32_t shm_id, |
| 403 uint32_t shm_offset); |
| 380 | 404 |
| 381 bool Begin() override; | 405 bool Begin() override; |
| 382 bool End(base::subtle::Atomic32 submit_count) override; | 406 bool End(base::subtle::Atomic32 submit_count) override; |
| 383 bool QueryCounter(base::subtle::Atomic32 submit_count) override; | 407 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 384 void Pause() override; | 408 void Pause() override; |
| 385 void Resume() override; | 409 void Resume() override; |
| 386 bool Process(bool did_finish) override; | 410 bool Process(bool did_finish) override; |
| 387 void Destroy(bool have_context) override; | 411 void Destroy(bool have_context) override; |
| 388 | 412 |
| 389 protected: | 413 protected: |
| 390 ~GetErrorQuery() override; | 414 ~GetErrorQuery() override; |
| 391 | 415 |
| 392 private: | 416 private: |
| 393 }; | 417 }; |
| 394 | 418 |
| 395 GetErrorQuery::GetErrorQuery( | 419 GetErrorQuery::GetErrorQuery(QueryManager* manager, |
| 396 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 420 GLenum target, |
| 397 : Query(manager, target, shm_id, shm_offset) { | 421 int32_t shm_id, |
| 398 } | 422 uint32_t shm_offset) |
| 423 : Query(manager, target, shm_id, shm_offset) {} |
| 399 | 424 |
| 400 bool GetErrorQuery::Begin() { | 425 bool GetErrorQuery::Begin() { |
| 401 MarkAsActive(); | 426 MarkAsActive(); |
| 402 return true; | 427 return true; |
| 403 } | 428 } |
| 404 | 429 |
| 405 void GetErrorQuery::Pause() { | 430 void GetErrorQuery::Pause() { |
| 406 MarkAsPaused(); | 431 MarkAsPaused(); |
| 407 } | 432 } |
| 408 | 433 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 431 } | 456 } |
| 432 } | 457 } |
| 433 | 458 |
| 434 GetErrorQuery::~GetErrorQuery() { | 459 GetErrorQuery::~GetErrorQuery() { |
| 435 } | 460 } |
| 436 | 461 |
| 437 class CommandsCompletedQuery : public QueryManager::Query { | 462 class CommandsCompletedQuery : public QueryManager::Query { |
| 438 public: | 463 public: |
| 439 CommandsCompletedQuery(QueryManager* manager, | 464 CommandsCompletedQuery(QueryManager* manager, |
| 440 GLenum target, | 465 GLenum target, |
| 441 int32 shm_id, | 466 int32_t shm_id, |
| 442 uint32 shm_offset); | 467 uint32_t shm_offset); |
| 443 | 468 |
| 444 // Overridden from QueryManager::Query: | 469 // Overridden from QueryManager::Query: |
| 445 bool Begin() override; | 470 bool Begin() override; |
| 446 bool End(base::subtle::Atomic32 submit_count) override; | 471 bool End(base::subtle::Atomic32 submit_count) override; |
| 447 bool QueryCounter(base::subtle::Atomic32 submit_count) override; | 472 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 448 void Pause() override; | 473 void Pause() override; |
| 449 void Resume() override; | 474 void Resume() override; |
| 450 bool Process(bool did_finish) override; | 475 bool Process(bool did_finish) override; |
| 451 void Destroy(bool have_context) override; | 476 void Destroy(bool have_context) override; |
| 452 | 477 |
| 453 protected: | 478 protected: |
| 454 ~CommandsCompletedQuery() override; | 479 ~CommandsCompletedQuery() override; |
| 455 | 480 |
| 456 private: | 481 private: |
| 457 scoped_ptr<gfx::GLFence> fence_; | 482 scoped_ptr<gfx::GLFence> fence_; |
| 458 base::TimeTicks begin_time_; | 483 base::TimeTicks begin_time_; |
| 459 }; | 484 }; |
| 460 | 485 |
| 461 CommandsCompletedQuery::CommandsCompletedQuery(QueryManager* manager, | 486 CommandsCompletedQuery::CommandsCompletedQuery(QueryManager* manager, |
| 462 GLenum target, | 487 GLenum target, |
| 463 int32 shm_id, | 488 int32_t shm_id, |
| 464 uint32 shm_offset) | 489 uint32_t shm_offset) |
| 465 : Query(manager, target, shm_id, shm_offset) {} | 490 : Query(manager, target, shm_id, shm_offset) {} |
| 466 | 491 |
| 467 bool CommandsCompletedQuery::Begin() { | 492 bool CommandsCompletedQuery::Begin() { |
| 468 MarkAsActive(); | 493 MarkAsActive(); |
| 469 begin_time_ = base::TimeTicks::Now(); | 494 begin_time_ = base::TimeTicks::Now(); |
| 470 return true; | 495 return true; |
| 471 } | 496 } |
| 472 | 497 |
| 473 void CommandsCompletedQuery::Pause() { | 498 void CommandsCompletedQuery::Pause() { |
| 474 MarkAsPaused(); | 499 MarkAsPaused(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 MarkAsDeleted(); | 531 MarkAsDeleted(); |
| 507 } | 532 } |
| 508 } | 533 } |
| 509 | 534 |
| 510 CommandsCompletedQuery::~CommandsCompletedQuery() {} | 535 CommandsCompletedQuery::~CommandsCompletedQuery() {} |
| 511 | 536 |
| 512 class TimeElapsedQuery : public QueryManager::Query { | 537 class TimeElapsedQuery : public QueryManager::Query { |
| 513 public: | 538 public: |
| 514 TimeElapsedQuery(QueryManager* manager, | 539 TimeElapsedQuery(QueryManager* manager, |
| 515 GLenum target, | 540 GLenum target, |
| 516 int32 shm_id, | 541 int32_t shm_id, |
| 517 uint32 shm_offset); | 542 uint32_t shm_offset); |
| 518 | 543 |
| 519 // Overridden from QueryManager::Query: | 544 // Overridden from QueryManager::Query: |
| 520 bool Begin() override; | 545 bool Begin() override; |
| 521 bool End(base::subtle::Atomic32 submit_count) override; | 546 bool End(base::subtle::Atomic32 submit_count) override; |
| 522 bool QueryCounter(base::subtle::Atomic32 submit_count) override; | 547 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 523 void Pause() override; | 548 void Pause() override; |
| 524 void Resume() override; | 549 void Resume() override; |
| 525 bool Process(bool did_finish) override; | 550 bool Process(bool did_finish) override; |
| 526 void Destroy(bool have_context) override; | 551 void Destroy(bool have_context) override; |
| 527 | 552 |
| 528 protected: | 553 protected: |
| 529 ~TimeElapsedQuery() override; | 554 ~TimeElapsedQuery() override; |
| 530 | 555 |
| 531 private: | 556 private: |
| 532 scoped_ptr<gfx::GPUTimer> gpu_timer_; | 557 scoped_ptr<gfx::GPUTimer> gpu_timer_; |
| 533 }; | 558 }; |
| 534 | 559 |
| 535 TimeElapsedQuery::TimeElapsedQuery(QueryManager* manager, | 560 TimeElapsedQuery::TimeElapsedQuery(QueryManager* manager, |
| 536 GLenum target, | 561 GLenum target, |
| 537 int32 shm_id, | 562 int32_t shm_id, |
| 538 uint32 shm_offset) | 563 uint32_t shm_offset) |
| 539 : Query(manager, target, shm_id, shm_offset), | 564 : Query(manager, target, shm_id, shm_offset), |
| 540 gpu_timer_(manager->CreateGPUTimer(true)) { | 565 gpu_timer_(manager->CreateGPUTimer(true)) {} |
| 541 } | |
| 542 | 566 |
| 543 bool TimeElapsedQuery::Begin() { | 567 bool TimeElapsedQuery::Begin() { |
| 544 // Reset the disjoint value before the query begins if it is safe. | 568 // Reset the disjoint value before the query begins if it is safe. |
| 545 SafelyResetDisjointValue(); | 569 SafelyResetDisjointValue(); |
| 546 MarkAsActive(); | 570 MarkAsActive(); |
| 547 gpu_timer_->Start(); | 571 gpu_timer_->Start(); |
| 548 return true; | 572 return true; |
| 549 } | 573 } |
| 550 | 574 |
| 551 bool TimeElapsedQuery::End(base::subtle::Atomic32 submit_count) { | 575 bool TimeElapsedQuery::End(base::subtle::Atomic32 submit_count) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 void TimeElapsedQuery::Destroy(bool have_context) { | 608 void TimeElapsedQuery::Destroy(bool have_context) { |
| 585 gpu_timer_->Destroy(have_context); | 609 gpu_timer_->Destroy(have_context); |
| 586 } | 610 } |
| 587 | 611 |
| 588 TimeElapsedQuery::~TimeElapsedQuery() {} | 612 TimeElapsedQuery::~TimeElapsedQuery() {} |
| 589 | 613 |
| 590 class TimeStampQuery : public QueryManager::Query { | 614 class TimeStampQuery : public QueryManager::Query { |
| 591 public: | 615 public: |
| 592 TimeStampQuery(QueryManager* manager, | 616 TimeStampQuery(QueryManager* manager, |
| 593 GLenum target, | 617 GLenum target, |
| 594 int32 shm_id, | 618 int32_t shm_id, |
| 595 uint32 shm_offset); | 619 uint32_t shm_offset); |
| 596 | 620 |
| 597 // Overridden from QueryManager::Query: | 621 // Overridden from QueryManager::Query: |
| 598 bool Begin() override; | 622 bool Begin() override; |
| 599 bool End(base::subtle::Atomic32 submit_count) override; | 623 bool End(base::subtle::Atomic32 submit_count) override; |
| 600 bool QueryCounter(base::subtle::Atomic32 submit_count) override; | 624 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
| 601 void Pause() override; | 625 void Pause() override; |
| 602 void Resume() override; | 626 void Resume() override; |
| 603 bool Process(bool did_finish) override; | 627 bool Process(bool did_finish) override; |
| 604 void Destroy(bool have_context) override; | 628 void Destroy(bool have_context) override; |
| 605 | 629 |
| 606 protected: | 630 protected: |
| 607 ~TimeStampQuery() override; | 631 ~TimeStampQuery() override; |
| 608 | 632 |
| 609 private: | 633 private: |
| 610 scoped_ptr<gfx::GPUTimer> gpu_timer_; | 634 scoped_ptr<gfx::GPUTimer> gpu_timer_; |
| 611 }; | 635 }; |
| 612 | 636 |
| 613 TimeStampQuery::TimeStampQuery(QueryManager* manager, | 637 TimeStampQuery::TimeStampQuery(QueryManager* manager, |
| 614 GLenum target, | 638 GLenum target, |
| 615 int32 shm_id, | 639 int32_t shm_id, |
| 616 uint32 shm_offset) | 640 uint32_t shm_offset) |
| 617 : Query(manager, target, shm_id, shm_offset), | 641 : Query(manager, target, shm_id, shm_offset), |
| 618 gpu_timer_(manager->CreateGPUTimer(false)) {} | 642 gpu_timer_(manager->CreateGPUTimer(false)) {} |
| 619 | 643 |
| 620 bool TimeStampQuery::Begin() { | 644 bool TimeStampQuery::Begin() { |
| 621 NOTREACHED(); | 645 NOTREACHED(); |
| 622 return false; | 646 return false; |
| 623 } | 647 } |
| 624 | 648 |
| 625 bool TimeStampQuery::End(base::subtle::Atomic32 submit_count) { | 649 bool TimeStampQuery::End(base::subtle::Atomic32 submit_count) { |
| 626 NOTREACHED(); | 650 NOTREACHED(); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 714 pending_queries_.clear(); | 738 pending_queries_.clear(); |
| 715 pending_transfer_queries_.clear(); | 739 pending_transfer_queries_.clear(); |
| 716 active_queries_.clear(); | 740 active_queries_.clear(); |
| 717 while (!queries_.empty()) { | 741 while (!queries_.empty()) { |
| 718 Query* query = queries_.begin()->second.get(); | 742 Query* query = queries_.begin()->second.get(); |
| 719 query->Destroy(have_context); | 743 query->Destroy(have_context); |
| 720 queries_.erase(queries_.begin()); | 744 queries_.erase(queries_.begin()); |
| 721 } | 745 } |
| 722 } | 746 } |
| 723 | 747 |
| 724 void QueryManager::SetDisjointSync(int32 shm_id, uint32 shm_offset) { | 748 void QueryManager::SetDisjointSync(int32_t shm_id, uint32_t shm_offset) { |
| 725 DCHECK(disjoint_notify_shm_id_ == -1); | 749 DCHECK(disjoint_notify_shm_id_ == -1); |
| 726 DCHECK(shm_id != -1); | 750 DCHECK(shm_id != -1); |
| 727 | 751 |
| 728 DisjointValueSync* sync = decoder_->GetSharedMemoryAs<DisjointValueSync*>( | 752 DisjointValueSync* sync = decoder_->GetSharedMemoryAs<DisjointValueSync*>( |
| 729 shm_id, shm_offset, sizeof(*sync)); | 753 shm_id, shm_offset, sizeof(*sync)); |
| 730 DCHECK(sync); | 754 DCHECK(sync); |
| 731 sync->Reset(); | 755 sync->Reset(); |
| 732 disjoints_notified_ = 0; | 756 disjoints_notified_ = 0; |
| 733 | 757 |
| 734 disjoint_notify_shm_id_ = shm_id; | 758 disjoint_notify_shm_id_ = shm_id; |
| 735 disjoint_notify_shm_offset_ = shm_offset; | 759 disjoint_notify_shm_offset_ = shm_offset; |
| 736 } | 760 } |
| 737 | 761 |
| 738 QueryManager::Query* QueryManager::CreateQuery( | 762 QueryManager::Query* QueryManager::CreateQuery(GLenum target, |
| 739 GLenum target, GLuint client_id, int32 shm_id, uint32 shm_offset) { | 763 GLuint client_id, |
| 764 int32_t shm_id, |
| 765 uint32_t shm_offset) { |
| 740 scoped_refptr<Query> query; | 766 scoped_refptr<Query> query; |
| 741 switch (target) { | 767 switch (target) { |
| 742 case GL_COMMANDS_ISSUED_CHROMIUM: | 768 case GL_COMMANDS_ISSUED_CHROMIUM: |
| 743 query = new CommandsIssuedQuery(this, target, shm_id, shm_offset); | 769 query = new CommandsIssuedQuery(this, target, shm_id, shm_offset); |
| 744 break; | 770 break; |
| 745 case GL_LATENCY_QUERY_CHROMIUM: | 771 case GL_LATENCY_QUERY_CHROMIUM: |
| 746 query = new CommandLatencyQuery(this, target, shm_id, shm_offset); | 772 query = new CommandLatencyQuery(this, target, shm_id, shm_offset); |
| 747 break; | 773 break; |
| 748 case GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM: | 774 case GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM: |
| 749 query = new AsyncReadPixelsCompletedQuery( | 775 query = new AsyncReadPixelsCompletedQuery( |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 889 | 915 |
| 890 void QueryManager::SafelyResetDisjointValue() { | 916 void QueryManager::SafelyResetDisjointValue() { |
| 891 // It is only safe to reset the disjoint value is there is no active | 917 // It is only safe to reset the disjoint value is there is no active |
| 892 // elapsed timer and we are not continually updating the disjoint value. | 918 // elapsed timer and we are not continually updating the disjoint value. |
| 893 if (!update_disjoints_continually_ && !GetActiveQuery(GL_TIME_ELAPSED)) { | 919 if (!update_disjoints_continually_ && !GetActiveQuery(GL_TIME_ELAPSED)) { |
| 894 // Reset the error state without storing the result. | 920 // Reset the error state without storing the result. |
| 895 gpu_timing_client_->CheckAndResetTimerErrors(); | 921 gpu_timing_client_->CheckAndResetTimerErrors(); |
| 896 } | 922 } |
| 897 } | 923 } |
| 898 | 924 |
| 899 QueryManager::Query::Query( | 925 QueryManager::Query::Query(QueryManager* manager, |
| 900 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 926 GLenum target, |
| 927 int32_t shm_id, |
| 928 uint32_t shm_offset) |
| 901 : manager_(manager), | 929 : manager_(manager), |
| 902 target_(target), | 930 target_(target), |
| 903 shm_id_(shm_id), | 931 shm_id_(shm_id), |
| 904 shm_offset_(shm_offset), | 932 shm_offset_(shm_offset), |
| 905 submit_count_(0), | 933 submit_count_(0), |
| 906 query_state_(kQueryState_Initialize), | 934 query_state_(kQueryState_Initialize), |
| 907 deleted_(false) { | 935 deleted_(false) { |
| 908 DCHECK(manager); | 936 DCHECK(manager); |
| 909 manager_->StartTracking(this); | 937 manager_->StartTracking(this); |
| 910 } | 938 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 928 // The query is getting deleted, either by the client or | 956 // The query is getting deleted, either by the client or |
| 929 // because the context was lost. Call any outstanding | 957 // because the context was lost. Call any outstanding |
| 930 // callbacks to avoid leaks. | 958 // callbacks to avoid leaks. |
| 931 RunCallbacks(); | 959 RunCallbacks(); |
| 932 if (manager_) { | 960 if (manager_) { |
| 933 manager_->StopTracking(this); | 961 manager_->StopTracking(this); |
| 934 manager_ = NULL; | 962 manager_ = NULL; |
| 935 } | 963 } |
| 936 } | 964 } |
| 937 | 965 |
| 938 bool QueryManager::Query::MarkAsCompleted(uint64 result) { | 966 bool QueryManager::Query::MarkAsCompleted(uint64_t result) { |
| 939 UnmarkAsPending(); | 967 UnmarkAsPending(); |
| 940 QuerySync* sync = manager_->decoder_->GetSharedMemoryAs<QuerySync*>( | 968 QuerySync* sync = manager_->decoder_->GetSharedMemoryAs<QuerySync*>( |
| 941 shm_id_, shm_offset_, sizeof(*sync)); | 969 shm_id_, shm_offset_, sizeof(*sync)); |
| 942 if (!sync) { | 970 if (!sync) { |
| 943 return false; | 971 return false; |
| 944 } | 972 } |
| 945 | 973 |
| 946 sync->result = result; | 974 sync->result = result; |
| 947 base::subtle::Release_Store(&sync->process_count, submit_count_); | 975 base::subtle::Release_Store(&sync->process_count, submit_count_); |
| 948 | 976 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1095 for (std::pair<const GLenum, scoped_refptr<Query> >& it : active_queries_) { | 1123 for (std::pair<const GLenum, scoped_refptr<Query> >& it : active_queries_) { |
| 1096 if (it.second->IsPaused()) { | 1124 if (it.second->IsPaused()) { |
| 1097 it.second->Resume(); | 1125 it.second->Resume(); |
| 1098 DCHECK(it.second->IsActive()); | 1126 DCHECK(it.second->IsActive()); |
| 1099 } | 1127 } |
| 1100 } | 1128 } |
| 1101 } | 1129 } |
| 1102 | 1130 |
| 1103 } // namespace gles2 | 1131 } // namespace gles2 |
| 1104 } // namespace gpu | 1132 } // namespace gpu |
| OLD | NEW |