BsD3D11EventQuery.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsD3D11EventQuery.h"
  4. #include "BsD3D11RenderAPI.h"
  5. #include "BsD3D11Device.h"
  6. #include "BsD3D11CommandBuffer.h"
  7. #include "Profiling/BsRenderStats.h"
  8. #include "Error/BsException.h"
  9. namespace bs { namespace ct
  10. {
  11. D3D11EventQuery::D3D11EventQuery(UINT32 deviceIdx)
  12. :mQuery(nullptr)
  13. {
  14. assert(deviceIdx == 0 && "Multiple GPUs not supported natively on DirectX 11.");
  15. D3D11RenderAPI* rs = static_cast<D3D11RenderAPI*>(RenderAPI::instancePtr());
  16. D3D11Device& device = rs->getPrimaryDevice();
  17. D3D11_QUERY_DESC queryDesc;
  18. queryDesc.Query = D3D11_QUERY_EVENT;
  19. queryDesc.MiscFlags = 0;
  20. HRESULT hr = device.getD3D11Device()->CreateQuery(&queryDesc, &mQuery);
  21. if(hr != S_OK)
  22. {
  23. BS_EXCEPT(RenderingAPIException, "Failed to create an Event query.");
  24. }
  25. mContext = device.getImmediateContext();
  26. BS_INC_RENDER_STAT_CAT(ResCreated, RenderStatObject_Query);
  27. }
  28. D3D11EventQuery::~D3D11EventQuery()
  29. {
  30. if(mQuery != nullptr)
  31. {
  32. mQuery->Release();
  33. }
  34. BS_INC_RENDER_STAT_CAT(ResDestroyed, RenderStatObject_Query);
  35. }
  36. void D3D11EventQuery::begin(const SPtr<CommandBuffer>& cb)
  37. {
  38. auto execute = [&]()
  39. {
  40. mContext->End(mQuery);
  41. setActive(true);
  42. };
  43. if (cb == nullptr)
  44. execute();
  45. else
  46. {
  47. SPtr<D3D11CommandBuffer> d3d11cb = std::static_pointer_cast<D3D11CommandBuffer>(cb);
  48. d3d11cb->queueCommand(execute);
  49. }
  50. }
  51. bool D3D11EventQuery::isReady() const
  52. {
  53. BOOL queryData;
  54. return mContext->GetData(mQuery, &queryData, sizeof(BOOL), 0) == S_OK;
  55. }
  56. }}