Resolve remaining levels/layers at VkImageView creation time
Bug: b/119620767
Test: dEQP-VK.pipeline.image_view.view_type.1d.format.r8g8b8a8_unorm.subresource_range.lod_base_mip_level_remaining_levels
Change-Id: I977598ee0513928e6a6ce6ba5d0b698653c74fdc
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/29968
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
diff --git a/src/System/Math.hpp b/src/System/Math.hpp
index 9ba58b0..2e7f344 100644
--- a/src/System/Math.hpp
+++ b/src/System/Math.hpp
@@ -18,6 +18,8 @@
#include "Types.hpp"
#include "Half.hpp"
+#include "Vulkan/VkDebug.hpp"
+
#include <cmath>
#if defined(_MSC_VER)
#include <intrin.h>
@@ -177,6 +179,7 @@
template<class T>
inline T clamp(T x, T a, T b)
{
+ ASSERT(a <= b);
if(x < a) x = a;
if(x > b) x = b;
diff --git a/src/Vulkan/VkImageView.cpp b/src/Vulkan/VkImageView.cpp
index 5310acf..6104adb 100644
--- a/src/Vulkan/VkImageView.cpp
+++ b/src/Vulkan/VkImageView.cpp
@@ -26,6 +26,17 @@
(m.a == VK_COMPONENT_SWIZZLE_IDENTITY) ? VK_COMPONENT_SWIZZLE_A : m.a,
};
}
+
+ VkImageSubresourceRange ResolveRemainingLevelsLayers(VkImageSubresourceRange range, const vk::Image *image)
+ {
+ return {
+ range.aspectMask,
+ range.baseMipLevel,
+ (range.levelCount == VK_REMAINING_MIP_LEVELS) ? (image->getMipLevels() - range.baseMipLevel) : range.levelCount,
+ range.baseArrayLayer,
+ (range.layerCount == VK_REMAINING_ARRAY_LAYERS) ? (image->getArrayLayers() - range.baseArrayLayer) : range.layerCount,
+ };
+ }
}
namespace vk
@@ -33,7 +44,8 @@
ImageView::ImageView(const VkImageViewCreateInfo* pCreateInfo, void* mem) :
image(Cast(pCreateInfo->image)), viewType(pCreateInfo->viewType), format(pCreateInfo->format),
- components(ResolveIdentityMapping(pCreateInfo->components)), subresourceRange(pCreateInfo->subresourceRange)
+ components(ResolveIdentityMapping(pCreateInfo->components)),
+ subresourceRange(ResolveRemainingLevelsLayers(pCreateInfo->subresourceRange, image))
{
}