diff options
| author | Mark Lobodzinski <mark@lunarg.com> | 2016-03-09 15:42:55 -0700 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2016-03-10 17:06:59 -0700 |
| commit | 3e7ed76b4f8f444195c68bbdf5aecbf130fe31d0 (patch) | |
| tree | 43e27dad3be0cfe17a8db4d61429072b10158b26 /layers | |
| parent | c9f78709aa5f1296bdba2c9285f2562ada6d6a04 (diff) | |
| download | usermoji-3e7ed76b4f8f444195c68bbdf5aecbf130fe31d0.tar.xz | |
layers: Fix draw_state handling of special image layouts in CmdPipelineBarrier
Layer was ignoring VK_REMAINING_MIP_LEVELS and *ARRAY_LAYERS, resulting in
Source2 applications hanging.
Change-Id: I2ebecd3120eec9a97b6f3672984c15bd2e438c5c
Diffstat (limited to 'layers')
| -rw-r--r-- | layers/draw_state.cpp | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp index c3fcde07..6e72a3d5 100644 --- a/layers/draw_state.cpp +++ b/layers/draw_state.cpp @@ -4895,6 +4895,25 @@ static void ResolveRemainingLevelsLayers(layer_data *dev_data, VkImageSubresourc } } +// Return the correct layer/level counts if the caller used the special +// values VK_REMAINING_MIP_LEVELS or VK_REMAINING_ARRAY_LAYERS. +static void ResolveRemainingLevelsLayers(layer_data *dev_data, uint32_t *levels, uint32_t *layers, VkImageSubresourceRange range, + VkImage image) { + /* expects globalLock to be held by caller */ + + *levels = range.levelCount; + *layers = range.layerCount; + auto image_node_it = dev_data->imageMap.find(image); + if (image_node_it != dev_data->imageMap.end()) { + if (range.levelCount == VK_REMAINING_MIP_LEVELS) { + *levels = image_node_it->second.createInfo.mipLevels - range.baseMipLevel; + } + if (range.layerCount == VK_REMAINING_ARRAY_LAYERS) { + *layers = image_node_it->second.createInfo.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); @@ -6484,6 +6503,8 @@ VkBool32 TransitionImageLayouts(VkCommandBuffer cmdBuffer, uint32_t memBarrierCo layer_data *dev_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map); GLOBAL_CB_NODE *pCB = getCBNode(dev_data, cmdBuffer); VkBool32 skip = VK_FALSE; + uint32_t levelCount = 0; + uint32_t layerCount = 0; for (uint32_t i = 0; i < memBarrierCount; ++i) { auto mem_barrier = &pImgMemBarriers[i]; @@ -6491,9 +6512,11 @@ VkBool32 TransitionImageLayouts(VkCommandBuffer cmdBuffer, uint32_t memBarrierCo continue; // TODO: Do not iterate over every possibility - consolidate where // possible - for (uint32_t j = 0; j < mem_barrier->subresourceRange.levelCount; j++) { + ResolveRemainingLevelsLayers(dev_data, &levelCount, &layerCount, mem_barrier->subresourceRange, mem_barrier->image); + + for (uint32_t j = 0; j < levelCount; j++) { uint32_t level = mem_barrier->subresourceRange.baseMipLevel + j; - for (uint32_t k = 0; k < mem_barrier->subresourceRange.layerCount; k++) { + for (uint32_t k = 0; k < layerCount; k++) { uint32_t layer = mem_barrier->subresourceRange.baseArrayLayer + k; VkImageSubresource sub = {mem_barrier->subresourceRange.aspectMask, level, layer}; IMAGE_CMD_BUF_LAYOUT_NODE node; |
