BsCoreObjectCore.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsCorePrerequisites.h"
  5. #include "BsAsyncOp.h"
  6. namespace BansheeEngine
  7. {
  8. /** @addtogroup CoreThread
  9. * @{
  10. */
  11. /**
  12. * Represents counterpart of a CoreObject that is meant to be used specifically on the core thread.
  13. *
  14. * @note Core thread only.
  15. * @note Different CoreObject implementations should implement this class for their own needs.
  16. */
  17. class BS_CORE_EXPORT CoreObjectCore
  18. {
  19. protected:
  20. /** Values that represent current state of the object */
  21. enum Flags
  22. {
  23. CGCO_INITIALIZED = 0x01, /**< Object has been initialized and can be used. */
  24. CGCO_SCHEDULED_FOR_INIT = 0x02 /**< Object has been scheduled for initialization but core thread has not completed it yet. */
  25. };
  26. public:
  27. CoreObjectCore();
  28. virtual ~CoreObjectCore();
  29. /** Called on the core thread when the object is first created. */
  30. virtual void initialize();
  31. /** Returns a shared_ptr version of "this" pointer. */
  32. SPtr<CoreObjectCore> getThisPtr() const { return mThis.lock(); }
  33. public: // ***** INTERNAL ******
  34. /** @cond INTERNAL */
  35. /**
  36. * Sets a shared this pointer to this object. This MUST be called immediately after construction.
  37. *
  38. * @note Internal method.
  39. * @note Called automatically by the factory creation methods so user should not call this manually.
  40. */
  41. void _setThisPtr(std::shared_ptr<CoreObjectCore> ptrThis);
  42. /** @endcond */
  43. protected:
  44. friend class CoreObjectManager;
  45. friend class CoreObject;
  46. /**
  47. * Update internal data from provided memory buffer that was populated with data from the sim thread.
  48. *
  49. * @note
  50. * This generally happens at the start of a core thread frame. Data used was recorded on the previous sim thread
  51. * frame.
  52. */
  53. virtual void syncToCore(const CoreSyncData& data) { }
  54. /**
  55. * Blocks the current thread until the resource is fully initialized.
  56. *
  57. * @note
  58. * If you call this without calling initialize first a deadlock will occur. You should not call this from core thread.
  59. */
  60. void synchronize();
  61. /**
  62. * Returns true if the object has been properly initialized. Methods are not allowed to be called on the object
  63. * until it is initialized.
  64. */
  65. bool isInitialized() const { return (mFlags & CGCO_INITIALIZED) != 0; }
  66. bool isScheduledToBeInitialized() const { return (mFlags & CGCO_SCHEDULED_FOR_INIT) != 0; }
  67. void setIsInitialized(bool initialized) { mFlags = initialized ? mFlags | CGCO_INITIALIZED : mFlags & ~CGCO_INITIALIZED; }
  68. void setScheduledToBeInitialized(bool scheduled) { mFlags = scheduled ? mFlags | CGCO_SCHEDULED_FOR_INIT : mFlags & ~CGCO_SCHEDULED_FOR_INIT; }
  69. volatile UINT8 mFlags;
  70. std::weak_ptr<CoreObjectCore> mThis;
  71. BS_STATIC_THREAD_SYNCHRONISER(mCoreGpuObjectLoadedCondition)
  72. BS_STATIC_MUTEX(mCoreGpuObjectLoadedMutex)
  73. };
  74. /** @} */
  75. }