From 6be3cdfac51fd153b8039803ce38c31af4384fcd Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 6 Sep 2016 18:46:55 -0600 Subject: layers: Add MEMTRACK_INVALID_MEM_REGION error Add new enum value "MEMTRACK_INVALID_MEM_REGION" to track case when a region of an allocation bound to an image or buffer is not valid due to the memory not being correctly updated. This was previously aliased to USAGE_FLAG case which was masking the fact that there are no tests written for this invalid mem region case. --- layers/core_validation.cpp | 4 ++-- layers/core_validation_error_enums.h | 1 + layers/vk_validation_layer_details.md | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index e687cf79..12a8ee7e 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -474,7 +474,7 @@ static bool ValidateMemoryIsValid(layer_data *dev_data, VkDeviceMemory mem, uint if (mem_info) { if (!mem_info->bound_ranges[bound_object_handle].valid) { return log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - reinterpret_cast(mem), __LINE__, MEMTRACK_INVALID_USAGE_FLAG, "MEM", + reinterpret_cast(mem), __LINE__, MEMTRACK_INVALID_MEM_REGION, "MEM", "%s: Cannot read invalid region of memory allocation 0x%" PRIx64 " for bound %s object 0x%" PRIx64 ", please fill the memory before using.", functionName, reinterpret_cast(mem), object_type_to_string(type), bound_object_handle); @@ -489,7 +489,7 @@ static bool ValidateImageMemoryIsValid(layer_data *dev_data, IMAGE_NODE *image_n if (image_node->mem == MEMTRACKER_SWAP_CHAIN_IMAGE_KEY) { if (!image_node->valid) { return log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - reinterpret_cast(image_node->mem), __LINE__, MEMTRACK_INVALID_USAGE_FLAG, "MEM", + reinterpret_cast(image_node->mem), __LINE__, MEMTRACK_INVALID_MEM_REGION, "MEM", "%s: Cannot read invalid swapchain image 0x%" PRIx64 ", please fill the memory before using.", functionName, reinterpret_cast(image_node->image)); } diff --git a/layers/core_validation_error_enums.h b/layers/core_validation_error_enums.h index 8ceba84d..b90b9d4c 100644 --- a/layers/core_validation_error_enums.h +++ b/layers/core_validation_error_enums.h @@ -40,6 +40,7 @@ enum MEM_TRACK_ERROR { MEMTRACK_INVALID_USAGE_FLAG, // Usage flags specified at image/buffer create conflict w/ use of object MEMTRACK_INVALID_MAP, // Size flag specified at alloc is too small for mapping range MEMTRACK_INVALID_MEM_TYPE, // Memory Type mismatch + MEMTRACK_INVALID_MEM_REGION, // Memory region for object bound to an allocation is invalid MEMTRACK_OBJECT_NOT_BOUND, // Image or Buffer used without having memory bound to it }; diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index d7009c4c..0d0a9fbf 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -165,7 +165,8 @@ The Mem Tracker portion of the VK_LAYER_LUNARG_core_validation layer tracks memo | Image/Buffer Usage bits | Verify correct USAGE bits set based on how Images and Buffers are used | INVALID_USAGE_FLAG | vkCreateImage, vkCreateBuffer, vkCreateBufferView, vkCmdCopyBuffer, vkCmdCopyQueryPoolResults, vkCmdCopyImage, vkCmdBlitImage, vkCmdCopyBufferToImage, vkCmdCopyImageToBuffer, vkCmdUpdateBuffer, vkCmdFillBuffer | InvalidUsageBits | NA | | Memory Map Range Checks | Validates that Memory Mapping Requests are valid for the Memory Object (in-range, not currently mapped on Map, currently mapped on UnMap, size is non-zero) | INVALID_MAP | vkMapMemory | InvalidMemoryMapping | NA | | Memory Type Index Checks | Validates that specified memory type indices are valid | INVALID_MEM_TYPE | vkBindImageMemory vkBindBufferMemory | TODO | Need to fix up and re-enable BindImageInvalidMemoryType test as noted in comment in test | -| Memory Bound To Object Checks | Validates that memory was bound to image or buffer before use | OBJECT_NOT_BOUND | vkCreateImageView vkCreateBufferView vkCmdCopyImage vkCmdBlitImage vkCmdCopyBufferToImage vkCmdCopyImageToBuffer vkCmdClearColorImage vkCmdClearDepthStencilImage vkCmdResolveImage vkCmdUpdateBuffer vkCmdFillBuffer vkCmdBindIndexBuffer vkCmdBindVertexBuffers vkCmdDrawIndirect vkCmdDrawIndexedIndirect vkCmdDispatchIndirect vkCmdCopyBuffer vkCmdCopyQueryPoolResults| CreateBufferViewNoMemoryBoundToBuffer CreateImageViewNoMemoryBoundToImage ImageMemoryNotBound BufferMemoryNotBound | None | +| Memory Region Valid | Verify that a portion of a memory allocation with a bound image or object has valid data. | INVALID_MEM_REGION | vkCmdCopyImage vkCmdBlitImage vkCmdCopyBufferToImage vkCmdCopyImageToBuffer vkCmdClearColorImage vkCmdClearDepthStencilImage vkCmdResolveImage vkCmdBindIndexBuffer vkCmdBindVertexBuffers vkCmdCopyBuffer vkCmdBeginRenderPass vkQueuePresentKHR vkQueueSubmit | TODO | Write tests for this case | +| Memory Bound To Object Checks | Validates that memory was bound to image or buffer before use | OBJECT_NOT_BOUND | vkCreateImageView vkCreateBufferView vkCmdCopyImage vkCmdBlitImage vkCmdCopyBufferToImage vkCmdCopyImageToBuffer vkCmdResolveImage vkCmdUpdateBuffer vkCmdFillBuffer vkCmdBindIndexBuffer vkCmdBindVertexBuffers vkCmdDrawIndirect vkCmdDrawIndexedIndirect vkCmdDispatchIndirect vkCmdCopyBuffer vkCmdCopyQueryPoolResults| CreateBufferViewNoMemoryBoundToBuffer CreateImageViewNoMemoryBoundToImage ImageMemoryNotBound BufferMemoryNotBound | None | | NA | Enum used for informational messages | NONE | | TODO | None | | NA | Enum used for errors in the layer itself. This does not indicate an app issue, but instead a bug in the layer. | INTERNAL_ERROR | | TODO | None | -- cgit v1.2.3