From 4cbd525001d5d156fc4ba569b82b813eba05246e Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 8 Feb 2018 14:10:35 -0700 Subject: layers:Verify sparse image metadata is bound Any image for which sparse memory requirements are bound, flag if that image requires metadata. When binding sparse memory, for any image that requires metadata and no metadata was bound, issue a warning. --- layers/core_validation.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'layers/core_validation.cpp') diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 466007aa..dd91a140 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -4034,6 +4034,11 @@ static void PostCallRecordGetImageSparseMemoryRequirements(IMAGE_STATE *image_st if (reqs) { std::copy(reqs, reqs + req_count, image_state->sparse_requirements.begin()); } + for (const auto &req : image_state->sparse_requirements) { + if (req.formatProperties.aspectMask & VK_IMAGE_ASPECT_METADATA_BIT) { + image_state->sparse_metadata_required = true; + } + } } VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount, @@ -9759,9 +9764,15 @@ static bool PreCallValidateQueueBindSparse(layer_data *dev_data, VkQueue queue, " without first calling vkGetImageSparseMemoryRequirements[2KHR]() to retrieve requirements.", HandleToUint64(image_state->image)); } + for (uint32_t j = 0; j < opaque_bind.bindCount; ++j) { + if (opaque_bind.pBinds[j].flags & VK_IMAGE_ASPECT_METADATA_BIT) { + image_state->sparse_metadata_bound = true; + } + } } for (uint32_t i = 0; i < bindInfo.imageOpaqueBindCount; ++i) { auto image_state = GetImageState(dev_data, bindInfo.pImageOpaqueBinds[i].image); + sparse_images.insert(image_state); if (!image_state->get_sparse_reqs_called || image_state->sparse_requirements.empty()) { // For now just warning if sparse image binding occurs without calling to get reqs first return log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, @@ -9771,6 +9782,16 @@ static bool PreCallValidateQueueBindSparse(layer_data *dev_data, VkQueue queue, HandleToUint64(image_state->image)); } } + for (const auto &sparse_image_state : sparse_images) { + if (sparse_image_state->sparse_metadata_required && !sparse_image_state->sparse_metadata_bound) { + // Warn if sparse image binding metadata required for image with sparse binding, but metadata not bound + return log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + HandleToUint64(sparse_image_state->image), __LINE__, MEMTRACK_INVALID_STATE, "CV", + "vkQueueBindSparse(): Binding sparse memory to image 0x%" PRIx64 + " which requires a metadata aspect but no binding with VK_IMAGE_ASPECT_METADATA_BIT set was made.", + HandleToUint64(sparse_image_state->image)); + } + } } return skip; -- cgit v1.2.3