bug-14184: Transient memory allocations
diff --git a/include/vk_layer.h b/include/vk_layer.h
index 0881d24..6d1945b 100644
--- a/include/vk_layer.h
+++ b/include/vk_layer.h
@@ -41,6 +41,7 @@
PFN_vkUnmapMemory UnmapMemory;
PFN_vkFlushMappedMemoryRanges FlushMappedMemoryRanges;
PFN_vkInvalidateMappedMemoryRanges InvalidateMappedMemoryRanges;
+ PFN_vkGetDeviceMemoryCommitment GetDeviceMemoryCommitment;
PFN_vkGetImageSparseMemoryRequirements GetImageSparseMemoryRequirements;
PFN_vkGetImageMemoryRequirements GetImageMemoryRequirements;
PFN_vkGetBufferMemoryRequirements GetBufferMemoryRequirements;
diff --git a/include/vulkan.h b/include/vulkan.h
index 78b0152..6204941 100644
--- a/include/vulkan.h
+++ b/include/vulkan.h
@@ -876,6 +876,7 @@
// vkInvalidateMappedMemoryRanges must be used flush/invalidate host cache
VK_MEMORY_PROPERTY_HOST_UNCACHED_BIT = VK_BIT(2), // Memory should not be cached by the host
VK_MEMORY_PROPERTY_HOST_WRITE_COMBINED_BIT = VK_BIT(3), // Memory should support host write combining
+ VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT = 0x00000010, // Memory may be allocated by the driver when it is required
} VkMemoryPropertyFlagBits;
// Memory output flags passed to resource transition commands
@@ -2286,6 +2287,7 @@
typedef VkResult (VKAPI *PFN_vkUnmapMemory)(VkDevice device, VkDeviceMemory mem);
typedef VkResult (VKAPI *PFN_vkFlushMappedMemoryRanges)(VkDevice device, uint32_t memRangeCount, const VkMappedMemoryRange* pMemRanges);
typedef VkResult (VKAPI *PFN_vkInvalidateMappedMemoryRanges)(VkDevice device, uint32_t memRangeCount, const VkMappedMemoryRange* pMemRanges);
+typedef VkResult (VKAPI *PFN_vkGetDeviceMemoryCommitment)(VkDevice device, VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes);
typedef VkResult (VKAPI *PFN_vkBindBufferMemory)(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memOffset);
typedef VkResult (VKAPI *PFN_vkBindImageMemory)(VkDevice device, VkImage image, VkDeviceMemory mem, VkDeviceSize memOffset);
typedef VkResult (VKAPI *PFN_vkGetBufferMemoryRequirements)(VkDevice device, VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements);
@@ -2546,6 +2548,12 @@
uint32_t memRangeCount,
const VkMappedMemoryRange* pMemRanges);
+VkResult VKAPI vkGetDeviceMemoryCommitment(
+ VkDevice device,
+ VkDeviceMemory memory,
+ VkDeviceSize* pCommittedMemoryInBytes);
+
+
// Memory management API functions
VkResult VKAPI vkBindBufferMemory(
diff --git a/layers/param_checker.cpp b/layers/param_checker.cpp
index 49c1bea..17ccad4 100644
--- a/layers/param_checker.cpp
+++ b/layers/param_checker.cpp
@@ -2537,6 +2537,16 @@
return result;
}
+VK_LAYER_EXPORT VkResult VKAPI vkGetDeviceMemoryCommitment(
+ VkDevice device,
+ VkDeviceMemory memory,
+ VkDeviceSize* pCommittedMemoryInBytes)
+{
+ VkResult result = get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
+
+ return result;
+}
+
bool PostBindBufferMemory(
VkDevice device,
VkBuffer buffer,
diff --git a/loader/table_ops.h b/loader/table_ops.h
index 8e8ce9b..601be42 100644
--- a/loader/table_ops.h
+++ b/loader/table_ops.h
@@ -49,6 +49,7 @@
table->UnmapMemory = (PFN_vkUnmapMemory) gpa(dev, "vkUnmapMemory");
table->FlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges) gpa(dev, "vkFlushMappedMemoryRanges");
table->InvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges) gpa(dev, "vkInvalidateMappedMemoryRanges");
+ table->GetDeviceMemoryCommitment = (PFN_vkGetDeviceMemoryCommitment) gpa(dev, "vkGetDeviceMemoryCommitment");
table->GetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements) gpa(dev, "vkGetBufferMemoryRequirements");
table->GetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements) gpa(dev, "vkGetImageMemoryRequirements");
table->BindBufferMemory = (PFN_vkBindBufferMemory) gpa(dev, "vkBindBufferMemory");
@@ -208,6 +209,8 @@
return (void *) table->FlushMappedMemoryRanges;
if (!strcmp(name, "InvalidateMappedMemoryRanges"))
return (void *) table->InvalidateMappedMemoryRanges;
+ if (!strcmp(name, "GetDeviceMemoryCommitment"))
+ return (void *) table->GetDeviceMemoryCommitment;
if (!strcmp(name, "GetBufferMemoryRequirements"))
return (void *) table->GetBufferMemoryRequirements;
if (!strcmp(name, "GetImageMemoryRequirements"))
diff --git a/loader/trampoline.c b/loader/trampoline.c
index 13d4e68..0e10274 100644
--- a/loader/trampoline.c
+++ b/loader/trampoline.c
@@ -420,6 +420,15 @@
return disp->InvalidateMappedMemoryRanges(device, memRangeCount, pMemRanges);
}
+LOADER_EXPORT VkResult VKAPI vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes)
+{
+ const VkLayerDispatchTable *disp;
+
+ disp = loader_get_dispatch(device);
+
+ return disp->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
+}
+
LOADER_EXPORT VkResult VKAPI vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements)
{
const VkLayerDispatchTable *disp;
diff --git a/vulkan.py b/vulkan.py
index 4ef8f41..fa71314 100755
--- a/vulkan.py
+++ b/vulkan.py
@@ -346,6 +346,11 @@
Param("uint32_t", "memRangeCount"),
Param("const VkMappedMemoryRange*", "pMemRanges")]),
+ Proto("VkResult", "GetDeviceMemoryCommitment",
+ [Param("VkDevice", "device"),
+ Param("VkDeviceMemory", "memory"),
+ Param("VkDeviceSize*", "pCommittedMemoryInBytes")]),
+
Proto("VkResult", "BindBufferMemory",
[Param("VkDevice", "device"),
Param("VkBuffer", "buffer"),