From 4ea32eac4376f7184b5b722dd2004b35ab0b022a Mon Sep 17 00:00:00 2001 From: Benson Joeris Date: Fri, 29 Nov 2019 15:51:03 -0500 Subject: [PATCH] Improve handling of VK_REMAINING_* in ViewRange Change-Id: I22ce05e67b637a4edf3418f83e829a5e25510eb0 --- renderdoc/driver/vulkan/vk_resources.h | 59 +++++++++++++++++--------- 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 8e6a026e3..b7bd985ad 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -1600,9 +1600,9 @@ public: { aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; baseMipLevel = 0; - levelCount = 1; + packedLevelCount = 1; baseArrayLayer = 0; - layerCount = 1; + packedLayerCount = 1; packedViewType = 7; } @@ -1613,14 +1613,14 @@ public: baseArrayLayer = range.baseArrayLayer; if(range.levelCount == VK_REMAINING_MIP_LEVELS) - levelCount = MipMaxValue; + packedLevelCount = MipMaxValue; else - levelCount = range.levelCount; + packedLevelCount = range.levelCount; if(range.layerCount == VK_REMAINING_ARRAY_LAYERS) - layerCount = SliceMaxValue; + packedLayerCount = SliceMaxValue; else - layerCount = range.layerCount; + packedLayerCount = range.layerCount; return *this; } @@ -1632,17 +1632,8 @@ public: ret.aspectMask = (VkImageAspectFlags)aspectMask; ret.baseMipLevel = baseMipLevel; ret.baseArrayLayer = baseArrayLayer; - - if(levelCount == MipMaxValue) - ret.levelCount = VK_REMAINING_MIP_LEVELS; - else - ret.levelCount = levelCount; - - if(layerCount == SliceMaxValue) - ret.layerCount = VK_REMAINING_ARRAY_LAYERS; - else - ret.layerCount = layerCount; - + ret.levelCount = levelCount(); + ret.layerCount = layerCount(); return ret; } @@ -1662,6 +1653,36 @@ public: packedViewType = 7; } + inline uint32_t levelCount() const + { + if(packedLevelCount == MipMaxValue) + return VK_REMAINING_MIP_LEVELS; + else + return packedLevelCount; + } + inline void setLevelCount(uint32_t levelCount) + { + if(levelCount == VK_REMAINING_MIP_LEVELS) + packedLevelCount = MipMaxValue; + else + packedLevelCount = levelCount; + } + + inline uint32_t layerCount() const + { + if(packedLayerCount == SliceMaxValue) + return VK_REMAINING_ARRAY_LAYERS; + else + return packedLayerCount; + } + inline void setLayerCount(uint32_t layerCount) + { + if(layerCount == VK_REMAINING_ARRAY_LAYERS) + packedLayerCount = SliceMaxValue; + else + packedLayerCount = layerCount; + } + // View type (VkImageViewType). // Values <= 6, fits in 3 bits; 7 encodes an unknown/uninitialized view type. // Stored as uint32_t instead of VkImageViewType to prevent signed extension. @@ -1674,7 +1695,7 @@ public: // note we also need to pack in VK_REMAINING_MIPS etc so we can't // necessarily use the maximum levelCount value (64) uint32_t baseMipLevel : 6; - uint32_t levelCount : 6; + uint32_t packedLevelCount : 6; static const uint32_t MipMaxValue = 0x3f; @@ -1682,7 +1703,7 @@ public: // future proof than above, but at time of writing typical // maxImageArrayLayers is 2048. uint32_t baseArrayLayer : 16; - uint32_t layerCount : 16; + uint32_t packedLayerCount : 16; static const uint32_t SliceMaxValue = 0xffff; } viewRange;