diff options
| author | Mark Lobodzinski <mark@lunarg.com> | 2017-01-27 12:28:30 -0700 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2017-01-31 09:55:10 -0700 |
| commit | 627af0c8f4115bc0138f2f803abb66063eba6e18 (patch) | |
| tree | 7ca124baa60fa9f3c060890eef92df9fbdc99a07 /layers/buffer_validation.cpp | |
| parent | 7950325e9b1ed8d686abb072124433a06bff19cc (diff) | |
| download | usermoji-627af0c8f4115bc0138f2f803abb66063eba6e18.tar.xz | |
layers: Move DestroyImage code into buffer module
Moved CHECK_DISABLED into CV_types.h, moved validation and recording
routines into buffer_validation.cpp.
Change-Id: I103d0fc9c2e985d98943471ec6f83898c58bfdfe
Diffstat (limited to 'layers/buffer_validation.cpp')
| -rw-r--r-- | layers/buffer_validation.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp index e886b138..76a743fc 100644 --- a/layers/buffer_validation.cpp +++ b/layers/buffer_validation.cpp @@ -197,3 +197,41 @@ void PostCallRecordCreateImage(std::unordered_map<VkImage, std::unique_ptr<IMAGE (*imageSubresourceMap)[*pImage].push_back(subpair); (*imageLayoutMap)[subpair] = image_state; } + +bool PreCallValidateDestroyImage(core_validation::layer_data *device_data, VkImage image, IMAGE_STATE **image_state, + VK_OBJECT *obj_struct) { + const CHECK_DISABLED *disabled = core_validation::GetDisables(device_data); + *image_state = core_validation::getImageState(device_data, image); + *obj_struct = {reinterpret_cast<uint64_t &>(image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT}; + if (disabled->destroy_image) return false; + bool skip = false; + if (*image_state) { + skip |= core_validation::ValidateObjectNotInUse(device_data, *image_state, *obj_struct, VALIDATION_ERROR_00743); + } + return skip; +} + +void PostCallRecordDestroyImage(core_validation::layer_data *device_data, VkImage image, IMAGE_STATE *image_state, + VK_OBJECT obj_struct) { + core_validation::invalidateCommandBuffers(device_data, image_state->cb_bindings, obj_struct); + // Clean up memory mapping, bindings and range references for image + for (auto mem_binding : image_state->GetBoundMemory()) { + auto mem_info = core_validation::getMemObjInfo(device_data, mem_binding); + if (mem_info) { + core_validation::RemoveImageMemoryRange(obj_struct.handle, mem_info); + } + } + core_validation::ClearMemoryObjectBindings(device_data, obj_struct.handle, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT); + // Remove image from imageMap + core_validation::GetImageMap(device_data)->erase(image); + std::unordered_map<VkImage, std::vector<ImageSubresourcePair>> *imageSubresourceMap = + core_validation::GetImageSubresourceMap(device_data); + + const auto &sub_entry = imageSubresourceMap->find(image); + if (sub_entry != imageSubresourceMap->end()) { + for (const auto &pair : sub_entry->second) { + core_validation::GetImageLayoutMap(device_data)->erase(pair); + } + imageSubresourceMap->erase(sub_entry); + } +} |
