CmD3D9OcclusionQuery.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include "CmD3D9OcclusionQuery.h"
  2. #include "CmD3D9RenderSystem.h"
  3. #include "CmMath.h"
  4. namespace BansheeEngine
  5. {
  6. D3D9OcclusionQuery::D3D9OcclusionQuery(bool binary)
  7. :OcclusionQuery(binary), mQuery(nullptr), mNumFragments(0), mFinalized(false)
  8. {
  9. IDirect3DDevice9* device = D3D9RenderSystem::getActiveD3D9Device();
  10. HRESULT hr = device->CreateQuery(D3DQUERYTYPE_OCCLUSION, &mQuery);
  11. if (hr != S_OK)
  12. {
  13. CM_EXCEPT(RenderingAPIException, "Failed to create an occlusion query.");
  14. }
  15. }
  16. D3D9OcclusionQuery::~D3D9OcclusionQuery()
  17. {
  18. if (mQuery != nullptr)
  19. mQuery->Release();
  20. }
  21. void D3D9OcclusionQuery::begin()
  22. {
  23. mQuery->Issue(D3DISSUE_BEGIN);
  24. mNumFragments = 0;
  25. setActive(true);
  26. }
  27. void D3D9OcclusionQuery::end()
  28. {
  29. mQuery->Issue(D3DISSUE_END);
  30. }
  31. bool D3D9OcclusionQuery::isReady() const
  32. {
  33. BOOL queryData;
  34. return mQuery->GetData(&queryData, sizeof(BOOL), 0) == S_OK;
  35. }
  36. UINT32 D3D9OcclusionQuery::getNumFragments()
  37. {
  38. if (!mFinalized && isReady())
  39. {
  40. finalize();
  41. }
  42. return mNumFragments;
  43. }
  44. void D3D9OcclusionQuery::finalize()
  45. {
  46. mFinalized = true;
  47. DWORD numFragments;
  48. mQuery->GetData(&numFragments, sizeof(DWORD), 0);
  49. mNumFragments = (UINT32)numFragments;
  50. }
  51. }