GlObject.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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/gl/GlObject.h>
  6. #include <AnKi/Gr/GrManager.h>
  7. #include <AnKi/Gr/gl/GrManagerImpl.h>
  8. #include <AnKi/Gr/gl/RenderingThread.h>
  9. #include <AnKi/Gr/CommandBuffer.h>
  10. #include <AnKi/Gr/gl/CommandBufferImpl.h>
  11. namespace anki
  12. {
  13. GlObject::GlObject()
  14. : m_glName(0)
  15. , m_state(I32(State::TO_BE_CREATED))
  16. {
  17. }
  18. Error GlObject::serializeRenderingThread(GrManager& manager)
  19. {
  20. Error err = Error::NONE;
  21. State state = State(m_state.load());
  22. ANKI_ASSERT(state != State::NEW);
  23. if(state == State::TO_BE_CREATED)
  24. {
  25. RenderingThread& thread = static_cast<GrManagerImpl&>(manager).getRenderingThread();
  26. thread.syncClientServer();
  27. state = State(m_state.load());
  28. if(state == State::ERROR)
  29. {
  30. err = Error::UNKNOWN;
  31. }
  32. }
  33. ANKI_ASSERT(state > State::TO_BE_CREATED);
  34. return err;
  35. }
  36. void GlObject::destroyDeferred(GrManager& manager, GlDeleteFunction deleteCallback)
  37. {
  38. class DeleteGlObjectCommand final : public GlCommand
  39. {
  40. public:
  41. GlObject::GlDeleteFunction m_callback;
  42. GLuint m_glName;
  43. DeleteGlObjectCommand(GlObject::GlDeleteFunction callback, GLuint name)
  44. : m_callback(callback)
  45. , m_glName(name)
  46. {
  47. }
  48. Error operator()(GlState&)
  49. {
  50. m_callback(1, &m_glName);
  51. return Error::NONE;
  52. }
  53. };
  54. if(m_glName == 0)
  55. {
  56. return;
  57. }
  58. RenderingThread& thread = static_cast<GrManagerImpl&>(manager).getRenderingThread();
  59. if(!thread.isServerThread())
  60. {
  61. CommandBufferPtr commands;
  62. commands = manager.newCommandBuffer(CommandBufferInitInfo());
  63. static_cast<CommandBufferImpl&>(*commands).pushBackNewCommand<DeleteGlObjectCommand>(deleteCallback, m_glName);
  64. static_cast<CommandBufferImpl&>(*commands).flush();
  65. }
  66. else
  67. {
  68. deleteCallback(1, &m_glName);
  69. }
  70. m_glName = 0;
  71. }
  72. } // end namespace anki