BsQueryManager.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Managers/BsQueryManager.h"
  4. #include "RenderAPI/BsEventQuery.h"
  5. #include "RenderAPI/BsTimerQuery.h"
  6. #include "RenderAPI/BsOcclusionQuery.h"
  7. #include "Profiling/BsProfilerCPU.h"
  8. namespace bs { namespace ct
  9. {
  10. QueryManager::QueryManager()
  11. {
  12. }
  13. QueryManager::~QueryManager()
  14. {
  15. // Trigger all remaining queries, whether they completed or not
  16. for (auto& query : mEventQueries)
  17. {
  18. if (query->isActive())
  19. query->onTriggered();
  20. }
  21. for (auto& query : mTimerQueries)
  22. {
  23. if (query->isActive())
  24. query->onTriggered(query->getTimeMs());
  25. }
  26. for (auto& query : mOcclusionQueries)
  27. {
  28. if (query->isActive())
  29. query->onComplete(query->getNumSamples());
  30. }
  31. processDeletedQueue();
  32. }
  33. void QueryManager::_update()
  34. {
  35. for(auto& query : mEventQueries)
  36. {
  37. if(query->isActive() && query->isReady())
  38. {
  39. query->onTriggered();
  40. query->setActive(false);
  41. }
  42. }
  43. for(auto& query : mTimerQueries)
  44. {
  45. if(query->isActive() && query->isReady())
  46. {
  47. query->onTriggered(query->getTimeMs());
  48. query->setActive(false);
  49. }
  50. }
  51. for (auto& query : mOcclusionQueries)
  52. {
  53. if (query->isActive() && query->isReady())
  54. {
  55. query->onComplete(query->getNumSamples());
  56. query->setActive(false);
  57. }
  58. }
  59. processDeletedQueue();
  60. }
  61. void QueryManager::deleteEventQuery(EventQuery* query)
  62. {
  63. instance().mDeletedEventQueries.push_back(query);
  64. }
  65. void QueryManager::deleteTimerQuery(TimerQuery* query)
  66. {
  67. instance().mDeletedTimerQueries.push_back(query);
  68. }
  69. void QueryManager::deleteOcclusionQuery(OcclusionQuery* query)
  70. {
  71. instance().mDeletedOcclusionQueries.push_back(query);
  72. }
  73. void QueryManager::processDeletedQueue()
  74. {
  75. for (auto& query : mDeletedEventQueries)
  76. {
  77. auto iterFind = std::find(mEventQueries.begin(), mEventQueries.end(), query);
  78. if (iterFind != mEventQueries.end())
  79. mEventQueries.erase(iterFind);
  80. bs_delete(query);
  81. }
  82. mDeletedEventQueries.clear();
  83. for (auto& query : mDeletedTimerQueries)
  84. {
  85. auto iterFind = std::find(mTimerQueries.begin(), mTimerQueries.end(), query);
  86. if (iterFind != mTimerQueries.end())
  87. mTimerQueries.erase(iterFind);
  88. bs_delete(query);
  89. }
  90. mDeletedTimerQueries.clear();
  91. for (auto& query : mDeletedOcclusionQueries)
  92. {
  93. auto iterFind = std::find(mOcclusionQueries.begin(), mOcclusionQueries.end(), query);
  94. if (iterFind != mOcclusionQueries.end())
  95. mOcclusionQueries.erase(iterFind);
  96. bs_delete(query);
  97. }
  98. mDeletedOcclusionQueries.clear();
  99. }
  100. }}