OcclusionQueryImpl.cpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. // Copyright (C) 2009-2023, 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/OcclusionQueryImpl.h>
  6. #include <AnKi/Gr/Vulkan/GrManagerImpl.h>
  7. namespace anki {
  8. OcclusionQueryImpl::~OcclusionQueryImpl()
  9. {
  10. if(m_handle)
  11. {
  12. getGrManagerImpl().getOcclusionQueryFactory().deleteQuery(m_handle);
  13. }
  14. }
  15. Error OcclusionQueryImpl::init()
  16. {
  17. ANKI_CHECK(getGrManagerImpl().getOcclusionQueryFactory().newQuery(m_handle));
  18. return Error::kNone;
  19. }
  20. OcclusionQueryResult OcclusionQueryImpl::getResultInternal() const
  21. {
  22. ANKI_ASSERT(m_handle);
  23. U64 out = 0;
  24. VkResult res;
  25. ANKI_VK_CHECKF(res = vkGetQueryPoolResults(getVkDevice(), m_handle.getQueryPool(), m_handle.getQueryIndex(), 1, sizeof(out), &out, sizeof(out),
  26. VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT | VK_QUERY_RESULT_PARTIAL_BIT));
  27. OcclusionQueryResult qout = OcclusionQueryResult::kNotAvailable;
  28. if(res == VK_SUCCESS)
  29. {
  30. qout = (out) ? OcclusionQueryResult::kVisible : OcclusionQueryResult::kNotVisible;
  31. }
  32. else if(res == VK_NOT_READY)
  33. {
  34. qout = OcclusionQueryResult::kNotAvailable;
  35. }
  36. else
  37. {
  38. ANKI_ASSERT(0);
  39. }
  40. return qout;
  41. }
  42. } // end namespace anki