BsD3D9OcclusionQuery.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. //__________________________ Banshee Project - A modern game development toolkit _________________________________//
  2. //_____________________________________ www.banshee-project.com __________________________________________________//
  3. //________________________ Copyright (c) 2014 Marko Pintera. All rights reserved. ________________________________//
  4. #include "BsD3D9OcclusionQuery.h"
  5. #include "BsD3D9RenderSystem.h"
  6. #include "BsRenderStats.h"
  7. #include "BsMath.h"
  8. namespace BansheeEngine
  9. {
  10. D3D9OcclusionQuery::D3D9OcclusionQuery(bool binary)
  11. :OcclusionQuery(binary), mQuery(nullptr), mNumSamples(0),
  12. mFinalized(false), mDevice(nullptr), mQueryIssued(false)
  13. {
  14. createQuery();
  15. }
  16. D3D9OcclusionQuery::~D3D9OcclusionQuery()
  17. {
  18. releaseQuery();
  19. }
  20. void D3D9OcclusionQuery::createQuery()
  21. {
  22. mDevice = D3D9RenderSystem::getActiveD3D9Device();
  23. HRESULT hr = mDevice->CreateQuery(D3DQUERYTYPE_OCCLUSION, &mQuery);
  24. if (hr != S_OK)
  25. {
  26. BS_EXCEPT(RenderingAPIException, "Failed to create an occlusion query.");
  27. }
  28. BS_INC_RENDER_STAT_CAT(ResCreated, RenderStatObject_Query);
  29. }
  30. void D3D9OcclusionQuery::releaseQuery()
  31. {
  32. SAFE_RELEASE(mQuery);
  33. BS_INC_RENDER_STAT_CAT(ResDestroyed, RenderStatObject_Query);
  34. }
  35. void D3D9OcclusionQuery::begin()
  36. {
  37. if (mQuery != nullptr)
  38. mQuery->Issue(D3DISSUE_BEGIN);
  39. mNumSamples = 0;
  40. mQueryIssued = false;
  41. setActive(true);
  42. }
  43. void D3D9OcclusionQuery::end()
  44. {
  45. if (mQuery != nullptr)
  46. mQuery->Issue(D3DISSUE_END);
  47. mQueryIssued = true;
  48. mFinalized = false;
  49. }
  50. bool D3D9OcclusionQuery::isReady() const
  51. {
  52. if (mQuery == nullptr)
  53. return mQueryIssued; // If we lost the query, return as ready if it was ever issued
  54. if (!mQueryIssued)
  55. return false;
  56. BOOL queryData;
  57. return mQuery->GetData(&queryData, sizeof(BOOL), 0) == S_OK;
  58. }
  59. UINT32 D3D9OcclusionQuery::getNumSamples()
  60. {
  61. if (!mFinalized && isReady())
  62. {
  63. finalize();
  64. }
  65. return mNumSamples;
  66. }
  67. void D3D9OcclusionQuery::finalize()
  68. {
  69. mFinalized = true;
  70. if (mQuery == nullptr)
  71. {
  72. mNumSamples = 0;
  73. return;
  74. }
  75. DWORD numSamples;
  76. mQuery->GetData(&numSamples, sizeof(DWORD), 0);
  77. mNumSamples = (UINT32)numSamples;
  78. }
  79. void D3D9OcclusionQuery::notifyOnDeviceCreate(IDirect3DDevice9* d3d9Device)
  80. {
  81. if (d3d9Device == mDevice)
  82. createQuery();
  83. }
  84. void D3D9OcclusionQuery::notifyOnDeviceDestroy(IDirect3DDevice9* d3d9Device)
  85. {
  86. if (d3d9Device == mDevice)
  87. releaseQuery();
  88. }
  89. void D3D9OcclusionQuery::notifyOnDeviceLost(IDirect3DDevice9* d3d9Device)
  90. {
  91. if (d3d9Device == mDevice)
  92. releaseQuery();
  93. }
  94. void D3D9OcclusionQuery::notifyOnDeviceReset(IDirect3DDevice9* d3d9Device)
  95. {
  96. if (d3d9Device == mDevice)
  97. createQuery();
  98. }
  99. }