BsD3D9EventQuery.cpp 1.7 KB

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