BsD3D9ResourceManager.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsD3D9Resource.h"
  4. #include "BsD3D9ResourceManager.h"
  5. #include "BsD3D9PixelBuffer.h"
  6. namespace BansheeEngine
  7. {
  8. D3D9ResourceManager::D3D9ResourceManager()
  9. {
  10. mResourceCreationPolicy = RCP_CREATE_ON_ALL_DEVICES;
  11. mDeviceAccessLockCount = 0;
  12. }
  13. D3D9ResourceManager::~D3D9ResourceManager()
  14. {
  15. }
  16. void D3D9ResourceManager::setCreationPolicy(D3D9ResourceCreationPolicy creationPolicy)
  17. {
  18. mResourceCreationPolicy = creationPolicy;
  19. }
  20. D3D9ResourceCreationPolicy D3D9ResourceManager::getCreationPolicy() const
  21. {
  22. return mResourceCreationPolicy;
  23. }
  24. void D3D9ResourceManager::notifyOnDeviceCreate(IDirect3DDevice9* d3d9Device)
  25. {
  26. BS_LOCK_MUTEX(mResourcesMutex)
  27. for (auto& resource : mResources)
  28. resource->notifyOnDeviceCreate(d3d9Device);
  29. }
  30. void D3D9ResourceManager::notifyOnDeviceDestroy(IDirect3DDevice9* d3d9Device)
  31. {
  32. BS_LOCK_MUTEX(mResourcesMutex)
  33. for (auto& resource : mResources)
  34. resource->notifyOnDeviceDestroy(d3d9Device);
  35. }
  36. void D3D9ResourceManager::notifyOnDeviceLost(IDirect3DDevice9* d3d9Device)
  37. {
  38. BS_LOCK_MUTEX(mResourcesMutex)
  39. for (auto& resource : mResources)
  40. resource->notifyOnDeviceLost(d3d9Device);
  41. }
  42. void D3D9ResourceManager::notifyOnDeviceReset(IDirect3DDevice9* d3d9Device)
  43. {
  44. BS_LOCK_MUTEX(mResourcesMutex)
  45. for (auto& resource : mResources)
  46. resource->notifyOnDeviceReset(d3d9Device);
  47. }
  48. void D3D9ResourceManager::_notifyResourceCreated(D3D9Resource* pResource)
  49. {
  50. BS_LOCK_MUTEX(mResourcesMutex)
  51. mResources.push_back(pResource);
  52. }
  53. void D3D9ResourceManager::_notifyResourceDestroyed(D3D9Resource* pResource)
  54. {
  55. BS_LOCK_MUTEX(mResourcesMutex)
  56. auto iter = mResources.begin();
  57. while (iter != mResources.end())
  58. {
  59. if ((*iter) == pResource)
  60. {
  61. mResources.erase(iter);
  62. break;
  63. }
  64. ++iter;
  65. }
  66. }
  67. void D3D9ResourceManager::lockDeviceAccess()
  68. {
  69. assert(mDeviceAccessLockCount >= 0);
  70. mDeviceAccessLockCount++;
  71. if (mDeviceAccessLockCount == 1)
  72. {
  73. D3D9Resource::lockDeviceAccess();
  74. D3D9PixelBuffer::lockDeviceAccess();
  75. }
  76. }
  77. void D3D9ResourceManager::unlockDeviceAccess()
  78. {
  79. assert(mDeviceAccessLockCount > 0);
  80. mDeviceAccessLockCount--;
  81. if (mDeviceAccessLockCount == 0)
  82. {
  83. D3D9PixelBuffer::unlockDeviceAccess();
  84. D3D9Resource::unlockDeviceAccess();
  85. }
  86. }
  87. }