Implement basic SPIR-V texture sampling

Replaces VkDescriptorImageInfo with a more concrete
SampledImageDescriptor, which contains an sw::Texture that SamplerCore
uses.

The parameters can be looked up statically only because the
shaderSampledImageArrayDynamicIndexing feature is currently not
supported.

Bug b/129523279

Test: dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_unorm.nearest
Change-Id: I619b5b48b2b4552d9bfc70b087df2c31eabb49ea
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/28434
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/Vulkan/VkSampler.hpp b/src/Vulkan/VkSampler.hpp
index fc62389..5fa0b4e 100644
--- a/src/Vulkan/VkSampler.hpp
+++ b/src/Vulkan/VkSampler.hpp
@@ -49,22 +49,21 @@
 		return 0;
 	}
 
-private:
-	VkFilter                magFilter = VK_FILTER_NEAREST;
-	VkFilter                minFilter = VK_FILTER_NEAREST;
-	VkSamplerMipmapMode     mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
-	VkSamplerAddressMode    addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
-	VkSamplerAddressMode    addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
-	VkSamplerAddressMode    addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
-	float                   mipLodBias = 0.0f;
-	VkBool32                anisotropyEnable = VK_FALSE;
-	float                   maxAnisotropy = 0.0f;
-	VkBool32                compareEnable = VK_FALSE;
-	VkCompareOp             compareOp = VK_COMPARE_OP_NEVER;
-	float                   minLod = 0.0f;
-	float                   maxLod = 0.0f;
-	VkBorderColor           borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
-	VkBool32                unnormalizedCoordinates = VK_FALSE;
+	const VkFilter             magFilter = VK_FILTER_NEAREST;
+	const VkFilter             minFilter = VK_FILTER_NEAREST;
+	const VkSamplerMipmapMode  mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
+	const VkSamplerAddressMode addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
+	const VkSamplerAddressMode addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
+	const VkSamplerAddressMode addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
+	const float                mipLodBias = 0.0f;
+	const VkBool32             anisotropyEnable = VK_FALSE;
+	const float                maxAnisotropy = 0.0f;
+	const VkBool32             compareEnable = VK_FALSE;
+	const VkCompareOp          compareOp = VK_COMPARE_OP_NEVER;
+	const float                minLod = 0.0f;
+	const float                maxLod = 0.0f;
+	const VkBorderColor        borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
+	const VkBool32             unnormalizedCoordinates = VK_FALSE;
 };
 
 static inline Sampler* Cast(VkSampler object)