bug 14848: Verifying Sparse Behavior (WIP)
Merge vkQueueBindSparse*() to one.
https://cvs.khronos.org/bugzilla/show_bug.cgi?id=14848
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp
index 644c17d..7860486 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -1372,61 +1372,53 @@
my_data->device_dispatch_table->GetImageMemoryRequirements(device, image, pMemoryRequirements);
}
-VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseImageOpaqueMemory(
+VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparse(
VkQueue queue,
- VkImage image,
- uint32_t numBindings,
- const VkSparseMemoryBindInfo* pBindInfo)
+ uint32_t bindInfoCount,
+ const VkBindSparseInfo* pBindInfo,
+ VkFence fence)
{
layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
VkResult result = VK_ERROR_VALIDATION_FAILED;
- loader_platform_thread_lock_mutex(&globalLock);
- // Track objects tied to memory
- VkBool32 skipCall = set_sparse_mem_binding(my_data, queue, pBindInfo->mem, (uint64_t)image, VK_OBJECT_TYPE_IMAGE, "vkQueueBindSparseImageOpaqeMemory");
- print_mem_list(my_data, queue);
- loader_platform_thread_unlock_mutex(&globalLock);
- if (VK_FALSE == skipCall) {
- result = my_data->device_dispatch_table->QueueBindSparseImageOpaqueMemory( queue, image, numBindings, pBindInfo);
- }
- return result;
-}
+ VkBool32 skipCall = VK_FALSE;
-VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseImageMemory(
- VkQueue queue,
- VkImage image,
- uint32_t numBindings,
- const VkSparseImageMemoryBindInfo* pBindInfo)
-{
- layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
- VkResult result = VK_ERROR_VALIDATION_FAILED;
loader_platform_thread_lock_mutex(&globalLock);
- // Track objects tied to memory
- VkBool32 skipCall = set_sparse_mem_binding(my_data, queue, pBindInfo->mem, (uint64_t)image, VK_OBJECT_TYPE_IMAGE, "vkQueueBindSparseImageMemory");
- print_mem_list(my_data, queue);
- loader_platform_thread_unlock_mutex(&globalLock);
- if (VK_FALSE == skipCall) {
- VkResult result = my_data->device_dispatch_table->QueueBindSparseImageMemory(
- queue, image, numBindings, pBindInfo);
- }
- return result;
-}
-VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseBufferMemory(
- VkQueue queue,
- VkBuffer buffer,
- uint32_t numBindings,
- const VkSparseMemoryBindInfo* pBindInfo)
-{
- layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
- VkResult result = VK_ERROR_VALIDATION_FAILED;
- loader_platform_thread_lock_mutex(&globalLock);
- // Track objects tied to memory
- VkBool32 skipCall = set_sparse_mem_binding(my_data, queue, pBindInfo->mem, (uint64_t)buffer, VK_OBJECT_TYPE_BUFFER, "VkQueueBindSparseBufferMemory");
+ for (uint32_t i = 0; i < bindInfoCount; i++) {
+ // Track objects tied to memory
+ for (uint32_t j = 0; j < pBindInfo[i].bufferBindCount; j++) {
+ for (uint32_t k = 0; k < pBindInfo[i].pBufferBinds[j].bindCount; k++) {
+ if (set_sparse_mem_binding(my_data, queue,
+ pBindInfo[i].pBufferBinds[j].pBinds[k].mem,
+ (uint64_t) pBindInfo[i].pBufferBinds[j].buffer,
+ VK_OBJECT_TYPE_BUFFER, "vkQueueBindSparse"))
+ skipCall = VK_TRUE;
+ }
+ }
+ for (uint32_t j = 0; j < pBindInfo[i].imageOpaqueBindCount; j++) {
+ for (uint32_t k = 0; k < pBindInfo[i].pImageOpaqueBinds[j].bindCount; k++) {
+ if (set_sparse_mem_binding(my_data, queue,
+ pBindInfo[i].pImageOpaqueBinds[j].pBinds[k].mem,
+ (uint64_t) pBindInfo[i].pImageOpaqueBinds[j].image,
+ VK_OBJECT_TYPE_IMAGE, "vkQueueBindSparse"))
+ skipCall = VK_TRUE;
+ }
+ }
+ for (uint32_t j = 0; j < pBindInfo[i].imageBindCount; j++) {
+ for (uint32_t k = 0; k < pBindInfo[i].pImageBinds[j].bindCount; k++) {
+ if (set_sparse_mem_binding(my_data, queue,
+ pBindInfo[i].pImageBinds[j].pBinds[k].mem,
+ (uint64_t) pBindInfo[i].pImageBinds[j].image,
+ VK_OBJECT_TYPE_IMAGE, "vkQueueBindSparse"))
+ skipCall = VK_TRUE;
+ }
+ }
+ }
+
print_mem_list(my_data, queue);
loader_platform_thread_unlock_mutex(&globalLock);
if (VK_FALSE == skipCall) {
- VkResult result = my_data->device_dispatch_table->QueueBindSparseBufferMemory(
- queue, buffer, numBindings, pBindInfo);
+ result = my_data->device_dispatch_table->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
}
return result;
}
@@ -2513,12 +2505,8 @@
return (PFN_vkVoidFunction) vkGetBufferMemoryRequirements;
if (!strcmp(funcName, "vkGetImageMemoryRequirements"))
return (PFN_vkVoidFunction) vkGetImageMemoryRequirements;
- if (!strcmp(funcName, "vkQueueBindSparseBufferMemory"))
- return (PFN_vkVoidFunction) vkQueueBindSparseBufferMemory;
- if (!strcmp(funcName, "vkQueueBindSparseImageOpaqueMemory"))
- return (PFN_vkVoidFunction) vkQueueBindSparseImageOpaqueMemory;
- if (!strcmp(funcName, "vkQueueBindSparseImageMemory"))
- return (PFN_vkVoidFunction) vkQueueBindSparseImageMemory;
+ if (!strcmp(funcName, "vkQueueBindSparse"))
+ return (PFN_vkVoidFunction) vkQueueBindSparse;
if (!strcmp(funcName, "vkCreateFence"))
return (PFN_vkVoidFunction) vkCreateFence;
if (!strcmp(funcName, "vkGetFenceStatus"))