Image type and view type compatibility check fix

Fixed ImageView::imageTypesMatch() according to the Vulkan Spec,
Section 11.5. Image Views, Table 15. Image and image view parameter
compatibility requirements.

Also allowed already supported mip level parameters to be used in
the clear function.

Bug b/119620767

Tests: dEQP-VK.pipeline.render_to_image.core.cube.*

Change-Id: I4785c4594ba82f8e97b40aaddce8c950d255c846
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/28748
Presubmit-Ready: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Vulkan/VkImage.cpp b/src/Vulkan/VkImage.cpp
index a5d8679..5498bb7 100644
--- a/src/Vulkan/VkImage.cpp
+++ b/src/Vulkan/VkImage.cpp
@@ -669,12 +669,6 @@
 
 void Image::clear(void* pixelData, VkFormat pixelFormat, const vk::Format& viewFormat, const VkImageSubresourceRange& subresourceRange, const VkRect2D& renderArea)
 {
-	if((subresourceRange.baseMipLevel != 0) ||
-	   (subresourceRange.levelCount != 1))
-	{
-		UNIMPLEMENTED("subresourceRange");
-	}
-
 	device->getBlitter()->clear(pixelData, pixelFormat, this, viewFormat, subresourceRange, &renderArea);
 }
 
@@ -715,9 +709,7 @@
 {
 	if(!((subresourceRange.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) ||
 	     (subresourceRange.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT |
-	                                     VK_IMAGE_ASPECT_STENCIL_BIT))) ||
-	   (subresourceRange.baseMipLevel != 0) ||
-	   (subresourceRange.levelCount != 1))
+	                                     VK_IMAGE_ASPECT_STENCIL_BIT))))
 	{
 		UNIMPLEMENTED("subresourceRange");
 	}
diff --git a/src/Vulkan/VkImageView.cpp b/src/Vulkan/VkImageView.cpp
index e8b7be9..b5e3c0a 100644
--- a/src/Vulkan/VkImageView.cpp
+++ b/src/Vulkan/VkImageView.cpp
@@ -1,4 +1,4 @@
-// Copyright 2018 The SwiftShader Authors. All Rights Reserved.
+// Copyright 2018 The SwiftShader Authors. All Rights Reserved.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -35,44 +35,38 @@
 
 bool ImageView::imageTypesMatch(VkImageType imageType) const
 {
-	bool isCube = image->isCube();
+	uint32_t imageArrayLayers = image->getArrayLayers();
 
-	switch(imageType)
+	switch(viewType)
 	{
-	case VK_IMAGE_TYPE_1D:
-		switch(viewType)
-		{
-		case VK_IMAGE_VIEW_TYPE_1D:
-		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
-			return true;
-		default:
-			break;
-		}
-		break;
-	case VK_IMAGE_TYPE_2D:
-		switch(viewType)
-		{
-		case VK_IMAGE_VIEW_TYPE_2D:
-		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
-			return !isCube;
-		case VK_IMAGE_VIEW_TYPE_CUBE:
-		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
-			return isCube;
-		default:
-			break;
-		}
-		break;
-	case VK_IMAGE_TYPE_3D:
-		switch(viewType)
-		{
-		case VK_IMAGE_VIEW_TYPE_3D:
-			return true;
-		default:
-			break;
-		}
-		break;
+	case VK_IMAGE_VIEW_TYPE_1D:
+		return (imageType == VK_IMAGE_TYPE_1D) &&
+		       (subresourceRange.layerCount == 1);
+	case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
+		return imageType == VK_IMAGE_TYPE_1D;
+	case VK_IMAGE_VIEW_TYPE_2D:
+		return ((imageType == VK_IMAGE_TYPE_2D) ||
+		        ((imageType == VK_IMAGE_TYPE_3D) &&
+		         (imageArrayLayers == 1))) &&
+		       (subresourceRange.layerCount == 1);
+	case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
+		return (imageType == VK_IMAGE_TYPE_2D) ||
+		       ((imageType == VK_IMAGE_TYPE_3D) &&
+		        (imageArrayLayers == 1));
+	case VK_IMAGE_VIEW_TYPE_CUBE:
+		return image->isCube() &&
+		       (imageArrayLayers >= subresourceRange.layerCount) &&
+		       (subresourceRange.layerCount == 6);
+	case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
+		return image->isCube() &&
+		       (imageArrayLayers >= subresourceRange.layerCount) &&
+		       (subresourceRange.layerCount >= 6);
+	case VK_IMAGE_VIEW_TYPE_3D:
+		return (imageType == VK_IMAGE_TYPE_3D) &&
+		       (imageArrayLayers == 1) &&
+		       (subresourceRange.layerCount == 1);
 	default:
-		break;
+		UNREACHABLE("Unexpected viewType %d", (int)viewType);
 	}
 
 	return false;