aboutsummaryrefslogtreecommitdiff
path: root/layers/draw_state.cpp
diff options
context:
space:
mode:
authorChris Forbes <chrisforbes@google.com>2016-02-26 18:04:30 +1300
committerMark Lobodzinski <mark@lunarg.com>2016-03-03 14:15:43 -0700
commited073ee67b8c4bd4e5c473b541fcd7b68d33eb9d (patch)
tree0cc2fdbcf1000b007c21432e8fd8c69c332d5535 /layers/draw_state.cpp
parent34d8b7d72bf2052dbbcfd41966d2a3de58a8d443 (diff)
downloadusermoji-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.cpp34
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()};