aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Lobodzinski <mark@lunarg.com>2016-03-09 15:42:55 -0700
committerMark Lobodzinski <mark@lunarg.com>2016-03-10 17:06:59 -0700
commit3e7ed76b4f8f444195c68bbdf5aecbf130fe31d0 (patch)
tree43e27dad3be0cfe17a8db4d61429072b10158b26
parentc9f78709aa5f1296bdba2c9285f2562ada6d6a04 (diff)
downloadusermoji-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
-rw-r--r--layers/draw_state.cpp27
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;