GlObject.cpp 1.9 KB

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