GlObject.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright (C) 2009-2015, Panagiotis Christopoulos Charitos.
  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(GrManager* manager)
  14. : m_manager(manager)
  15. , m_glName(0)
  16. , m_state(I32(State::TO_BE_CREATED))
  17. {}
  18. //==============================================================================
  19. Error GlObject::serializeRenderingThread()
  20. {
  21. Error err = ErrorCode::NONE;
  22. State state = State(m_state.load());
  23. ANKI_ASSERT(state != State::NEW);
  24. if(state == State::TO_BE_CREATED)
  25. {
  26. RenderingThread& thread =
  27. m_manager->getImplementation().getRenderingThread();
  28. thread.syncClientServer();
  29. state = State(m_state.load());
  30. if(state == State::ERROR)
  31. {
  32. err = ErrorCode::UNKNOWN;
  33. }
  34. }
  35. ANKI_ASSERT(state > State::TO_BE_CREATED);
  36. return err;
  37. }
  38. //==============================================================================
  39. class DeleteGlObjectCommand final: public GlCommand
  40. {
  41. public:
  42. GlObject::GlDeleteFunction m_callback;
  43. GLuint m_glName;
  44. DeleteGlObjectCommand(GlObject::GlDeleteFunction callback, GLuint name)
  45. : m_callback(callback)
  46. , m_glName(name)
  47. {}
  48. Error operator()(GlState&)
  49. {
  50. m_callback(1, &m_glName);
  51. return ErrorCode::NONE;
  52. }
  53. };
  54. void GlObject::destroyDeferred(GlDeleteFunction deleteCallback)
  55. {
  56. if(m_glName == 0)
  57. {
  58. return;
  59. }
  60. GrManager& manager = getManager();
  61. RenderingThread& thread = manager.getImplementation().getRenderingThread();
  62. if(!thread.isServerThread())
  63. {
  64. CommandBufferPtr commands;
  65. commands = manager.newInstance<CommandBuffer>();
  66. commands->getImplementation().pushBackNewCommand<DeleteGlObjectCommand>(
  67. deleteCallback, m_glName);
  68. commands->flush();
  69. }
  70. else
  71. {
  72. deleteCallback(1, &m_glName);
  73. }
  74. m_glName = 0;
  75. }
  76. //==============================================================================
  77. GrAllocator<U8> GlObject::getAllocator() const
  78. {
  79. return m_manager->getAllocator();
  80. }
  81. } // end namespace anki