BsD3D9EventQuery.cpp 1.9 KB

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