OcclusionQuery.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. // Copyright (C) 2009-2021, 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/OcclusionQuery.h>
  6. #include <AnKi/Gr/gl/OcclusionQueryImpl.h>
  7. #include <AnKi/Gr/gl/CommandBufferImpl.h>
  8. #include <AnKi/Gr/GrManager.h>
  9. namespace anki
  10. {
  11. OcclusionQuery* OcclusionQuery::newInstance(GrManager* manager)
  12. {
  13. class CreateOqCommand final : public GlCommand
  14. {
  15. public:
  16. OcclusionQueryPtr m_q;
  17. CreateOqCommand(OcclusionQuery* q)
  18. : m_q(q)
  19. {
  20. }
  21. Error operator()(GlState&)
  22. {
  23. OcclusionQueryImpl& impl = static_cast<OcclusionQueryImpl&>(*m_q);
  24. impl.init();
  25. GlObject::State oldState = impl.setStateAtomically(GlObject::State::CREATED);
  26. (void)oldState;
  27. ANKI_ASSERT(oldState == GlObject::State::TO_BE_CREATED);
  28. return Error::NONE;
  29. }
  30. };
  31. OcclusionQueryImpl* impl = manager->getAllocator().newInstance<OcclusionQueryImpl>(manager, "N/A");
  32. impl->getRefcount().fetchAdd(1); // Hold a reference in case the command finishes and deletes quickly
  33. CommandBufferPtr cmdb = manager->newCommandBuffer(CommandBufferInitInfo());
  34. static_cast<CommandBufferImpl&>(*cmdb).pushBackNewCommand<CreateOqCommand>(impl);
  35. static_cast<CommandBufferImpl&>(*cmdb).flush();
  36. return impl;
  37. }
  38. } // end namespace anki