BsD3D9OcclusionQuery.cpp 2.1 KB

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