BsD3D11OcclusionQuery.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "BsD3D11OcclusionQuery.h"
  2. #include "BsD3D11RenderSystem.h"
  3. #include "BsD3D11Device.h"
  4. #include "BsMath.h"
  5. namespace BansheeEngine
  6. {
  7. D3D11OcclusionQuery::D3D11OcclusionQuery(bool binary)
  8. :OcclusionQuery(binary), mContext(nullptr), mQuery(nullptr), mNumSamples(0), mFinalized(false)
  9. {
  10. D3D11RenderSystem* rs = static_cast<D3D11RenderSystem*>(RenderSystem::instancePtr());
  11. D3D11Device& device = rs->getPrimaryDevice();
  12. D3D11_QUERY_DESC queryDesc;
  13. queryDesc.Query = mBinary ? D3D11_QUERY_OCCLUSION_PREDICATE : D3D11_QUERY_OCCLUSION;
  14. queryDesc.MiscFlags = 0;
  15. HRESULT hr = device.getD3D11Device()->CreateQuery(&queryDesc, &mQuery);
  16. if (hr != S_OK)
  17. BS_EXCEPT(RenderingAPIException, "Failed to create an occlusion query.");
  18. mContext = device.getImmediateContext();
  19. }
  20. D3D11OcclusionQuery::~D3D11OcclusionQuery()
  21. {
  22. if (mQuery != nullptr)
  23. mQuery->Release();
  24. }
  25. void D3D11OcclusionQuery::begin()
  26. {
  27. mContext->Begin(mQuery);
  28. mNumSamples = 0;
  29. setActive(true);
  30. }
  31. void D3D11OcclusionQuery::end()
  32. {
  33. mContext->End(mQuery);
  34. }
  35. bool D3D11OcclusionQuery::isReady() const
  36. {
  37. if (mBinary)
  38. {
  39. BOOL anySamples = FALSE;
  40. return mContext->GetData(mQuery, &anySamples, sizeof(anySamples), 0) == S_OK;
  41. }
  42. else
  43. {
  44. UINT64 numSamples = 0;
  45. return mContext->GetData(mQuery, &numSamples, sizeof(numSamples), 0) == S_OK;
  46. }
  47. }
  48. UINT32 D3D11OcclusionQuery::getNumSamples()
  49. {
  50. if (!mFinalized && isReady())
  51. {
  52. finalize();
  53. }
  54. return mNumSamples;
  55. }
  56. void D3D11OcclusionQuery::finalize()
  57. {
  58. mFinalized = true;
  59. if (mBinary)
  60. {
  61. BOOL anySamples = FALSE;
  62. mContext->GetData(mQuery, &anySamples, sizeof(anySamples), 0);
  63. mNumSamples = anySamples == TRUE ? 1 : 0;
  64. }
  65. else
  66. {
  67. UINT64 numSamples = 0;
  68. mContext->GetData(mQuery, &numSamples, sizeof(numSamples), 0);
  69. mNumSamples = (UINT32)numSamples;
  70. }
  71. }
  72. }