diff options
| author | Chris Forbes <chrisforbes@google.com> | 2016-02-26 18:04:30 +1300 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2016-03-03 14:15:43 -0700 |
| commit | ed073ee67b8c4bd4e5c473b541fcd7b68d33eb9d (patch) | |
| tree | 0cc2fdbcf1000b007c21432e8fd8c69c332d5535 /layers/draw_state.cpp | |
| parent | 34d8b7d72bf2052dbbcfd41966d2a3de58a8d443 (diff) | |
| download | usermoji-ed073ee67b8c4bd4e5c473b541fcd7b68d33eb9d.tar.xz | |
layers: GHPR43, Add tracking of total number of levels and layers for images
Diffstat (limited to 'layers/draw_state.cpp')
| -rw-r--r-- | layers/draw_state.cpp | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp index 3200cb90..86368642 100644 --- a/layers/draw_state.cpp +++ b/layers/draw_state.cpp @@ -4744,6 +4744,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(VkDevice device, co IMAGE_NODE image_node; image_node.layout = pCreateInfo->initialLayout; image_node.format = pCreateInfo->format; + image_node.mipLevels = pCreateInfo->mipLevels; + image_node.arrayLayers = pCreateInfo->arrayLayers; loader_platform_thread_lock_mutex(&globalLock); dev_data->imageMap[*pImage] = unique_ptr<VkImageCreateInfo>(new VkImageCreateInfo(*pCreateInfo)); ImageSubresourcePair subpair = {*pImage, false, VkImageSubresource()}; @@ -4754,13 +4756,40 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(VkDevice device, co return result; } +static void ResolveRemainingLevelsLayers(layer_data* dev_data, + VkImageSubresourceRange* range, + VkImage image) { + /* expects globalLock to be held by caller */ + + auto image_node_it = dev_data->imageMap.find(image); + if (image_node_it != dev_data->imageMap.end()) { + /* If the caller used the special values VK_REMAINING_MIP_LEVELS and + * VK_REMAINING_ARRAY_LAYERS, resolve them now in our internal state to + * the actual values. + */ + if (range->levelCount == VK_REMAINING_MIP_LEVELS) { + range->levelCount = + image_node_it->second->mipLevels - range->baseMipLevel; + } + + if (range->layerCount == VK_REMAINING_ARRAY_LAYERS) { + range->layerCount = + image_node_it->second->arrayLayers - range->baseArrayLayer; + } + } +} + VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImageView* pView) { layer_data* dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); VkResult result = dev_data->device_dispatch_table->CreateImageView(device, pCreateInfo, pAllocator, pView); if (VK_SUCCESS == result) { loader_platform_thread_lock_mutex(&globalLock); - dev_data->imageViewMap[*pView] = unique_ptr<VkImageViewCreateInfo>(new VkImageViewCreateInfo(*pCreateInfo)); + auto image_view = unique_ptr<VkImageViewCreateInfo>( + new VkImageViewCreateInfo(*pCreateInfo)); + ResolveRemainingLevelsLayers(dev_data, &image_view->subresourceRange, + pCreateInfo->image); + dev_data->imageViewMap[*pView] = std::move(image_view); loader_platform_thread_unlock_mutex(&globalLock); } return result; @@ -7952,6 +7981,9 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainImagesKHR( image_node.layout = VK_IMAGE_LAYOUT_UNDEFINED; auto swapchain_node = dev_data->device_extensions.swapchainMap[swapchain]; image_node.format = swapchain_node->createInfo.imageFormat; + image_node.mipLevels = 1; + image_node.arrayLayers = + swapchain_node->createInfo.imageArrayLayers; swapchain_node->images.push_back(pSwapchainImages[i]); ImageSubresourcePair subpair = {pSwapchainImages[i], false, VkImageSubresource()}; |
