BsD3D9EventQuery.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "BsD3D9EventQuery.h"
  2. #include "BsD3D9RenderSystem.h"
  3. #include "BsD3D9ResourceManager.h"
  4. #include "BsD3D9Device.h"
  5. #include "BsException.h"
  6. namespace BansheeEngine
  7. {
  8. D3D9EventQuery::D3D9EventQuery()
  9. :mQuery(nullptr), mDevice(nullptr), mQueryIssued(false)
  10. {
  11. createQuery();
  12. }
  13. D3D9EventQuery::~D3D9EventQuery()
  14. {
  15. releaseQuery();
  16. }
  17. void D3D9EventQuery::createQuery()
  18. {
  19. mDevice = D3D9RenderSystem::getActiveD3D9Device();
  20. HRESULT hr = mDevice->CreateQuery(D3DQUERYTYPE_EVENT, &mQuery);
  21. if (hr != S_OK)
  22. {
  23. BS_EXCEPT(RenderingAPIException, "Failed to create an Event query.");
  24. }
  25. }
  26. void D3D9EventQuery::releaseQuery()
  27. {
  28. SAFE_RELEASE(mQuery);
  29. }
  30. void D3D9EventQuery::begin()
  31. {
  32. if (mQuery != nullptr)
  33. mQuery->Issue(D3DISSUE_END);
  34. setActive(true);
  35. mQueryIssued = true;
  36. }
  37. bool D3D9EventQuery::isReady() const
  38. {
  39. if (mQuery == nullptr) // Possibly device reset, in which case query is done
  40. return mQueryIssued;
  41. BOOL queryData;
  42. return mQuery->GetData(&queryData, sizeof(BOOL), 0) == S_OK;
  43. }
  44. void D3D9EventQuery::notifyOnDeviceCreate(IDirect3DDevice9* d3d9Device)
  45. {
  46. if (d3d9Device == mDevice)
  47. createQuery();
  48. }
  49. void D3D9EventQuery::notifyOnDeviceDestroy(IDirect3DDevice9* d3d9Device)
  50. {
  51. if (d3d9Device == mDevice)
  52. releaseQuery();
  53. }
  54. void D3D9EventQuery::notifyOnDeviceLost(IDirect3DDevice9* d3d9Device)
  55. {
  56. if (d3d9Device == mDevice)
  57. releaseQuery();
  58. }
  59. void D3D9EventQuery::notifyOnDeviceReset(IDirect3DDevice9* d3d9Device)
  60. {
  61. if (d3d9Device == mDevice)
  62. createQuery();
  63. }
  64. }