فهرست منبع

vulkan: Clean up old persistent mappings

rdb 4 سال پیش
والد
کامیت
defa621f82

+ 2 - 0
panda/src/vulkandisplay/vulkanGraphicsStateGuardian.cxx

@@ -4186,6 +4186,8 @@ alloc_staging_buffer(VkDeviceSize size, VkBuffer &buffer, uint32_t &offset) {
     return nullptr;
     return nullptr;
   }
   }
 
 
+  _staging_buffer_memory.unmap_persistent();
+
   _frame_data->_pending_free.push_back(std::move(_staging_buffer_memory));
   _frame_data->_pending_free.push_back(std::move(_staging_buffer_memory));
   _frame_data->_pending_destroy_buffers.push_back(_staging_buffer);
   _frame_data->_pending_destroy_buffers.push_back(_staging_buffer);
 
 

+ 23 - 2
panda/src/vulkandisplay/vulkanMemoryPage.I

@@ -88,7 +88,7 @@ meets_requirements(const VkMemoryRequirements &reqs, VkFlags required_flags,
  * Maps this memory page persistently.
  * Maps this memory page persistently.
  */
  */
 INLINE void *VulkanMemoryPage::
 INLINE void *VulkanMemoryPage::
-ensure_persistently_mapped() {
+map_persistent() {
   if (_persistent_ptr == nullptr) {
   if (_persistent_ptr == nullptr) {
     VkResult err = vkMapMemory(_device, _memory, 0, VK_WHOLE_SIZE, 0, &_persistent_ptr);
     VkResult err = vkMapMemory(_device, _memory, 0, VK_WHOLE_SIZE, 0, &_persistent_ptr);
     if (err) {
     if (err) {
@@ -96,9 +96,21 @@ ensure_persistently_mapped() {
       _persistent_ptr = nullptr;
       _persistent_ptr = nullptr;
     }
     }
   }
   }
+  ++_persistent_ptr_count;
   return _persistent_ptr;
   return _persistent_ptr;
 }
 }
 
 
+/**
+ * Decreases the number of blocks that use a persistent mapping.  If it
+ * reaches zero, unmaps the page.
+ */
+INLINE void VulkanMemoryPage::
+unmap_persistent() {
+  if (--_persistent_ptr_count == 0) {
+    vkUnmapMemory(_device, _memory);
+  }
+}
+
 /**
 /**
  * Returns the VkDeviceMemory of the page this block is located in.
  * Returns the VkDeviceMemory of the page this block is located in.
  */
  */
@@ -169,11 +181,20 @@ map() {
 INLINE void *VulkanMemoryBlock::
 INLINE void *VulkanMemoryBlock::
 map_persistent() {
 map_persistent() {
   VulkanMemoryPage *page = (VulkanMemoryPage *)get_allocator();
   VulkanMemoryPage *page = (VulkanMemoryPage *)get_allocator();
-  void *ptr = page->ensure_persistently_mapped();
+  void *ptr = page->map_persistent();
   nassertr(ptr != nullptr, nullptr);
   nassertr(ptr != nullptr, nullptr);
   return (char *)ptr + get_start();
   return (char *)ptr + get_start();
 }
 }
 
 
+/**
+ * Opposite of map_persistent().
+ */
+INLINE void VulkanMemoryBlock::
+unmap_persistent() {
+  VulkanMemoryPage *page = (VulkanMemoryPage *)get_allocator();
+  page->unmap_persistent();
+}
+
 /**
 /**
  * Just grabs the page lock.
  * Just grabs the page lock.
  */
  */

+ 4 - 1
panda/src/vulkandisplay/vulkanMemoryPage.h

@@ -36,7 +36,8 @@ public:
                                  bool linear_tiling = false);
                                  bool linear_tiling = false);
 
 
 private:
 private:
-  INLINE void *ensure_persistently_mapped();
+  INLINE void *map_persistent();
+  INLINE void unmap_persistent();
 
 
 private:
 private:
   VkDevice _device;
   VkDevice _device;
@@ -45,6 +46,7 @@ private:
   VkFlags _flags;
   VkFlags _flags;
   bool _linear_tiling;
   bool _linear_tiling;
   void *_persistent_ptr;
   void *_persistent_ptr;
+  unsigned int _persistent_ptr_count = 0;
 
 
   friend class VulkanGraphicsStateGuardian;
   friend class VulkanGraphicsStateGuardian;
   friend class VulkanMemoryBlock;
   friend class VulkanMemoryBlock;
@@ -69,6 +71,7 @@ public:
 
 
   INLINE VulkanMemoryMapping map();
   INLINE VulkanMemoryMapping map();
   INLINE void *map_persistent();
   INLINE void *map_persistent();
+  INLINE void unmap_persistent();
 
 
   friend class VulkanMemoryPage;
   friend class VulkanMemoryPage;
 };
 };