diff options
| author | Tobin Ehlis <tobine@google.com> | 2018-02-08 11:19:10 -0700 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2018-02-15 06:50:20 -0700 |
| commit | 88385743b91cf9f94ba83a02be329d9453347c6b (patch) | |
| tree | afa455c6a2c2fecee797b828777e18956d60bd96 /layers/core_validation.cpp | |
| parent | f317e0f3bc5d4e88f1ce813b57772cab4377170a (diff) | |
| download | usermoji-88385743b91cf9f94ba83a02be329d9453347c6b.tar.xz | |
layers:Track sparse image requirements
Add image state tracking for if sparse memory requirements have been
queried and when they are queried, save the requirements.
Diffstat (limited to 'layers/core_validation.cpp')
| -rw-r--r-- | layers/core_validation.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index db3a9e10..22c963d6 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -4027,12 +4027,35 @@ VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements2KHR(VkDevice device, const PostCallRecordGetImageMemoryRequirements(dev_data, pInfo->image, &pMemoryRequirements->memoryRequirements); } +static void PostCallRecordGetImageSparseMemoryRequirements(IMAGE_STATE *image_state, uint32_t req_count, + VkSparseImageMemoryRequirements *reqs) { + image_state->get_sparse_reqs_called = true; + image_state->sparse_requirements.resize(req_count); + if (reqs) { + std::copy(reqs, reqs + req_count, image_state->sparse_requirements.begin()); + } +} + VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements *pSparseMemoryRequirements) { // TODO : Implement tracking here, just passthrough initially layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); dev_data->dispatch_table.GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements); + unique_lock_t lock(global_lock); + auto image_state = GetImageState(dev_data, image); + PostCallRecordGetImageSparseMemoryRequirements(image_state, *pSparseMemoryRequirementCount, pSparseMemoryRequirements); +} + +static void PostCallRecordGetImageSparseMemoryRequirements2KHR(IMAGE_STATE *image_state, uint32_t req_count, + VkSparseImageMemoryRequirements2KHR *reqs) { + std::vector<VkSparseImageMemoryRequirements> sparse_reqs(req_count); + // Migrate to old struct type for common handling with GetImageSparseMemoryRequirements() + for (uint32_t i = 0; i < req_count; ++i) { + assert(!reqs[i].pNext); // TODO: If an extension is ever added here we need to handle it + sparse_reqs[i] = reqs[i].memoryRequirements; + } + PostCallRecordGetImageSparseMemoryRequirements(image_state, req_count, sparse_reqs.data()); } VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements2KHR(VkDevice device, @@ -4043,6 +4066,9 @@ VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements2KHR(VkDevice device, layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); dev_data->dispatch_table.GetImageSparseMemoryRequirements2KHR(device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements); + unique_lock_t lock(global_lock); + auto image_state = GetImageState(dev_data, pInfo->image); + PostCallRecordGetImageSparseMemoryRequirements2KHR(image_state, *pSparseMemoryRequirementCount, pSparseMemoryRequirements); } VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, |
