|
@@ -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.
|
|
|
*/
|
|
*/
|