aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'layers/core_validation.cpp')
-rw-r--r--layers/core_validation.cpp68
1 files changed, 53 insertions, 15 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index 74eae325..8f515460 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -353,18 +353,20 @@ static void add_mem_obj_info(layer_data *dev_data, void *object, const VkDeviceM
const VkMemoryAllocateInfo *pAllocateInfo) {
assert(object != NULL);
- dev_data->memObjMap[mem] = unique_ptr<DEVICE_MEM_INFO>(new DEVICE_MEM_INFO(object, mem, pAllocateInfo));
-
- if (pAllocateInfo->pNext) {
- auto struct_header = reinterpret_cast<const GENERIC_HEADER *>(pAllocateInfo->pNext);
- while (struct_header) {
- if (VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR == struct_header->sType ||
- VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR == struct_header->sType) {
- dev_data->memObjMap[mem]->global_valid = true;
- break;
- }
- struct_header = reinterpret_cast<const GENERIC_HEADER *>(struct_header->pNext);
- }
+ auto *mem_info = new DEVICE_MEM_INFO(object, mem, pAllocateInfo);
+ dev_data->memObjMap[mem] = unique_ptr<DEVICE_MEM_INFO>(mem_info);
+
+ // TODO: If the number of things we search for goes much higher, need a map...
+ mem_info->global_valid = nullptr != lvl_find_in_chain<VkImportMemoryFdInfoKHR>(pAllocateInfo->pNext);
+#ifdef VK_USE_PLATFORM_WIN32_KHR
+ mem_info->global_valid |= nullptr != lvl_find_in_chain<VkImportMemoryWin32HandleInfoKHR>(pAllocateInfo->pNext);
+#endif
+
+ auto dedicated = lvl_find_in_chain<VkMemoryDedicatedAllocateInfoKHR>(pAllocateInfo->pNext);
+ if (dedicated) {
+ mem_info->is_dedicated = true;
+ mem_info->dedicated_buffer = dedicated->buffer;
+ mem_info->dedicated_image = dedicated->image;
}
}
@@ -3825,7 +3827,7 @@ static bool PreCallValidateBindBufferMemory(layer_data *dev_data, VkBuffer buffe
}
// Validate bound memory range information
- auto mem_info = GetMemObjInfo(dev_data, mem);
+ const auto mem_info = GetMemObjInfo(dev_data, mem);
if (mem_info) {
skip |= ValidateInsertBufferMemoryRange(dev_data, buffer, mem_info, memoryOffset, buffer_state->requirements, api_name);
skip |= ValidateMemoryTypes(dev_data, mem_info, buffer_state->requirements.memoryTypeBits, api_name,
@@ -3843,8 +3845,8 @@ static bool PreCallValidateBindBufferMemory(layer_data *dev_data, VkBuffer buffe
validation_error_map[VALIDATION_ERROR_17000818]);
}
- // Validate memory requirements size
if (mem_info) {
+ // Validate memory requirements size
if (buffer_state->requirements.size > (mem_info->alloc_info.allocationSize - memoryOffset)) {
skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT,
buffer_handle, __LINE__, VALIDATION_ERROR_1700081a, "DS",
@@ -3854,6 +3856,24 @@ static bool PreCallValidateBindBufferMemory(layer_data *dev_data, VkBuffer buffe
api_name, mem_info->alloc_info.allocationSize - memoryOffset, buffer_state->requirements.size,
validation_error_map[VALIDATION_ERROR_1700081a]);
}
+
+ // Validate dedicated allocation
+ if (mem_info->is_dedicated && ((mem_info->dedicated_buffer != buffer) || (memoryOffset != 0))) {
+ // TODO: Add vkBindBufferMemory2KHR error message when added to spec.
+ auto validation_error = VALIDATION_ERROR_UNDEFINED;
+ const char *validation_error_msg = "";
+ if (strcmp(api_name, "vkBindBufferMemory()") == 0) {
+ validation_error = VALIDATION_ERROR_17000bc8;
+ validation_error_msg = validation_error_map[validation_error];
+ }
+ skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT,
+ buffer_handle, __LINE__, validation_error, "DS",
+ "%s: for dedicated memory allocation 0x%" PRIxLEAST64
+ ", VkMemoryDedicatedAllocateInfoKHR::buffer 0x%" PRIXLEAST64
+ " must be equal to buffer 0x%" PRIxLEAST64 " and memoryOffset 0x%" PRIxLEAST64 " must be zero. %s",
+ api_name, HandleToUint64(mem), HandleToUint64(mem_info->dedicated_buffer), buffer_handle,
+ memoryOffset, validation_error_msg);
+ }
}
// Validate device limits alignments
@@ -9513,8 +9533,8 @@ static bool PreCallValidateBindImageMemory(layer_data *dev_data, VkImage image,
validation_error_map[VALIDATION_ERROR_17400830]);
}
- // Validate memory requirements size
if (mem_info) {
+ // Validate memory requirements size
if (image_state->requirements.size > mem_info->alloc_info.allocationSize - memoryOffset) {
skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
image_handle, __LINE__, VALIDATION_ERROR_17400832, "DS",
@@ -9524,6 +9544,24 @@ static bool PreCallValidateBindImageMemory(layer_data *dev_data, VkImage image,
api_name, mem_info->alloc_info.allocationSize - memoryOffset, image_state->requirements.size,
validation_error_map[VALIDATION_ERROR_17400832]);
}
+
+ // Validate dedicated allocation
+ if (mem_info->is_dedicated && ((mem_info->dedicated_image != image) || (memoryOffset != 0))) {
+ // TODO: Add vkBindImageMemory2KHR error message when added to spec.
+ auto validation_error = VALIDATION_ERROR_UNDEFINED;
+ const char *validation_error_msg = "";
+ if (strcmp(api_name, "vkBindImageMemory()") == 0) {
+ validation_error = VALIDATION_ERROR_17400bca;
+ validation_error_msg = validation_error_map[validation_error];
+ }
+ skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT,
+ image_handle, __LINE__, validation_error, "DS",
+ "%s: for dedicated memory allocation 0x%" PRIxLEAST64
+ ", VkMemoryDedicatedAllocateInfoKHR::image 0x%" PRIXLEAST64
+ " must be equal to image 0x%" PRIxLEAST64 " and memoryOffset 0x%" PRIxLEAST64 " must be zero. %s",
+ api_name, HandleToUint64(mem), HandleToUint64(mem_info->dedicated_image), image_handle,
+ memoryOffset, validation_error_msg);
+ }
}
}
return skip;