Validate descriptor ID's

Bug: b/129523279
Test: dEQP-VK.glsl.texture_functions.*
Test: dEQP-VK.spirv_assembly.instruction.graphics.image_sampler.*
Change-Id: I26959eb7665af9f35dba81f83b0e0f13a4798865
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30408
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/Pipeline/SpirvShaderSampling.cpp b/src/Pipeline/SpirvShaderSampling.cpp
index 52bf802..45bff82 100644
--- a/src/Pipeline/SpirvShaderSampling.cpp
+++ b/src/Pipeline/SpirvShaderSampling.cpp
@@ -37,8 +37,11 @@
 
 namespace sw {
 
-SpirvShader::ImageSampler *SpirvShader::getImageSampler(uint32_t instruction, const vk::ImageView *imageView, const vk::Sampler *sampler)
+SpirvShader::ImageSampler *SpirvShader::getImageSampler(uint32_t inst, const vk::ImageView *imageView, const vk::Sampler *sampler)
 {
+	ImageInstruction instruction(inst);
+	ASSERT(imageView->id != 0 && (sampler->id != 0 || instruction.samplerMethod == Fetch));
+
 	// TODO(b/129523279): Move somewhere sensible.
 	static std::unordered_map<uint64_t, ImageSampler*> cache;
 	static std::mutex mutex;
@@ -72,7 +75,7 @@
 	ASSERT(sampler->anisotropyEnable == VK_FALSE);  // TODO(b/129523279)
 	ASSERT(sampler->unnormalizedCoordinates == VK_FALSE);  // TODO(b/129523279)
 
-	auto fptr = emitSamplerFunction({instruction}, samplerState);
+	auto fptr = emitSamplerFunction(instruction, samplerState);
 
 	cache.emplace(key, fptr);
 	return fptr;
diff --git a/src/Vulkan/VkDescriptorSetLayout.cpp b/src/Vulkan/VkDescriptorSetLayout.cpp
index f92327c..25c1a9a 100644
--- a/src/Vulkan/VkDescriptorSetLayout.cpp
+++ b/src/Vulkan/VkDescriptorSetLayout.cpp
@@ -262,6 +262,12 @@
 	{
 		memcpy(&this->sampler, sampler, sizeof(this->sampler));
 	}
+	else
+	{
+		// Descriptor ID's start at 1, allowing to detect descriptor update
+		// bugs by checking for 0. Also avoid reading random values.
+		memset(&this->sampler, 0, sizeof(this->sampler));
+	}
 }
 
 void DescriptorSetLayout::WriteDescriptorSet(DescriptorSet *dstSet, VkDescriptorUpdateTemplateEntry const &entry, char const *src)