VkOcclusionQuery.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Gr/Vulkan/VkOcclusionQuery.h>
  6. #include <AnKi/Gr/Vulkan/VkGrManager.h>
  7. namespace anki {
  8. OcclusionQuery* OcclusionQuery::newInstance()
  9. {
  10. OcclusionQueryImpl* impl = anki::newInstance<OcclusionQueryImpl>(GrMemoryPool::getSingleton(), "N/A");
  11. const Error err = impl->init();
  12. if(err)
  13. {
  14. deleteInstance(GrMemoryPool::getSingleton(), impl);
  15. impl = nullptr;
  16. }
  17. return impl;
  18. }
  19. OcclusionQueryResult OcclusionQuery::getResult() const
  20. {
  21. return static_cast<const OcclusionQueryImpl*>(this)->getResultInternal();
  22. }
  23. OcclusionQueryImpl::~OcclusionQueryImpl()
  24. {
  25. if(m_handle)
  26. {
  27. OcclusionQueryFactory::getSingleton().deleteQuery(m_handle);
  28. }
  29. }
  30. Error OcclusionQueryImpl::init()
  31. {
  32. ANKI_CHECK(OcclusionQueryFactory::getSingleton().newQuery(m_handle));
  33. return Error::kNone;
  34. }
  35. OcclusionQueryResult OcclusionQueryImpl::getResultInternal() const
  36. {
  37. ANKI_ASSERT(m_handle);
  38. U64 out = 0;
  39. VkResult res;
  40. ANKI_VK_CHECKF(res = vkGetQueryPoolResults(getVkDevice(), m_handle.getQueryPool(), m_handle.getQueryIndex(), 1, sizeof(out), &out, sizeof(out),
  41. VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT | VK_QUERY_RESULT_PARTIAL_BIT));
  42. OcclusionQueryResult qout = OcclusionQueryResult::kNotAvailable;
  43. if(res == VK_SUCCESS)
  44. {
  45. qout = (out) ? OcclusionQueryResult::kVisible : OcclusionQueryResult::kNotVisible;
  46. }
  47. else if(res == VK_NOT_READY)
  48. {
  49. qout = OcclusionQueryResult::kNotAvailable;
  50. }
  51. else
  52. {
  53. ANKI_ASSERT(0);
  54. }
  55. return qout;
  56. }
  57. } // end namespace anki