BsD3D11OcclusionQuery.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. //__________________________ Banshee Project - A modern game development toolkit _________________________________//
  2. //_____________________________________ www.banshee-project.com __________________________________________________//
  3. //________________________ Copyright (c) 2014 Marko Pintera. All rights reserved. ________________________________//
  4. #include "BsD3D11OcclusionQuery.h"
  5. #include "BsD3D11RenderSystem.h"
  6. #include "BsD3D11Device.h"
  7. #include "BsRenderStats.h"
  8. #include "BsMath.h"
  9. namespace BansheeEngine
  10. {
  11. D3D11OcclusionQuery::D3D11OcclusionQuery(bool binary)
  12. :OcclusionQuery(binary), mContext(nullptr), mQuery(nullptr), mNumSamples(0), mFinalized(false), mQueryEndCalled(false)
  13. {
  14. D3D11RenderSystem* rs = static_cast<D3D11RenderSystem*>(RenderSystem::instancePtr());
  15. D3D11Device& device = rs->getPrimaryDevice();
  16. D3D11_QUERY_DESC queryDesc;
  17. queryDesc.Query = mBinary ? D3D11_QUERY_OCCLUSION_PREDICATE : D3D11_QUERY_OCCLUSION;
  18. queryDesc.MiscFlags = 0;
  19. HRESULT hr = device.getD3D11Device()->CreateQuery(&queryDesc, &mQuery);
  20. if (hr != S_OK)
  21. BS_EXCEPT(RenderingAPIException, "Failed to create an occlusion query.");
  22. mContext = device.getImmediateContext();
  23. BS_INC_RENDER_STAT_CAT(ResCreated, RenderStatObject_Query);
  24. }
  25. D3D11OcclusionQuery::~D3D11OcclusionQuery()
  26. {
  27. if (mQuery != nullptr)
  28. mQuery->Release();
  29. BS_INC_RENDER_STAT_CAT(ResDestroyed, RenderStatObject_Query);
  30. }
  31. void D3D11OcclusionQuery::begin()
  32. {
  33. mContext->Begin(mQuery);
  34. mNumSamples = 0;
  35. mQueryEndCalled = false;
  36. setActive(true);
  37. }
  38. void D3D11OcclusionQuery::end()
  39. {
  40. mContext->End(mQuery);
  41. mQueryEndCalled = true;
  42. mFinalized = false;
  43. }
  44. bool D3D11OcclusionQuery::isReady() const
  45. {
  46. if (!mQueryEndCalled)
  47. return false;
  48. if (mBinary)
  49. {
  50. BOOL anySamples = FALSE;
  51. return mContext->GetData(mQuery, &anySamples, sizeof(anySamples), 0) == S_OK;
  52. }
  53. else
  54. {
  55. UINT64 numSamples = 0;
  56. return mContext->GetData(mQuery, &numSamples, sizeof(numSamples), 0) == S_OK;
  57. }
  58. }
  59. UINT32 D3D11OcclusionQuery::getNumSamples()
  60. {
  61. if (!mFinalized && isReady())
  62. {
  63. finalize();
  64. }
  65. return mNumSamples;
  66. }
  67. void D3D11OcclusionQuery::finalize()
  68. {
  69. mFinalized = true;
  70. if (mBinary)
  71. {
  72. BOOL anySamples = FALSE;
  73. mContext->GetData(mQuery, &anySamples, sizeof(anySamples), 0);
  74. mNumSamples = anySamples == TRUE ? 1 : 0;
  75. }
  76. else
  77. {
  78. UINT64 numSamples = 0;
  79. mContext->GetData(mQuery, &numSamples, sizeof(numSamples), 0);
  80. mNumSamples = (UINT32)numSamples;
  81. }
  82. }
  83. }