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))
 {
 }