Implement sampler LOD bias

Factor the duplicate code out of 2D/3D/Cube LOD calculation and add the
mipLodBias field from the sampler descriptor.

Bug: b/129523279
Test: dEQP-VK.pipeline.sampler.*
Change-Id: I7e25fad13fbe3307dddb2dcb853ed638344ee4aa
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30429
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
diff --git a/src/Pipeline/SamplerCore.cpp b/src/Pipeline/SamplerCore.cpp
index d7039fa..fa34587 100644
--- a/src/Pipeline/SamplerCore.cpp
+++ b/src/Pipeline/SamplerCore.cpp
@@ -121,6 +121,7 @@
 
 		if(function != Base)
 		{
+			lod += *Pointer<Float>(sampler + OFFSET(vk::Sampler, mipLodBias));
 			lod = Max(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, minLod)));
 			lod = Min(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, maxLod)));
 		}
diff --git a/src/Pipeline/SpirvShaderSampling.cpp b/src/Pipeline/SpirvShaderSampling.cpp
index 45bff82..46bae61 100644
--- a/src/Pipeline/SpirvShaderSampling.cpp
+++ b/src/Pipeline/SpirvShaderSampling.cpp
@@ -68,10 +68,6 @@
 	samplerState.highPrecisionFiltering = false;
 	samplerState.compare = COMPARE_BYPASS;                  ASSERT(sampler->compareEnable == VK_FALSE);  // TODO(b/129523279)
 
-//	minLod  // TODO(b/129523279)
-//	maxLod  // TODO(b/129523279)
-//	borderColor  // TODO(b/129523279)
-	ASSERT(sampler->mipLodBias == 0.0f);  // TODO(b/129523279)
 	ASSERT(sampler->anisotropyEnable == VK_FALSE);  // TODO(b/129523279)
 	ASSERT(sampler->unnormalizedCoordinates == VK_FALSE);  // TODO(b/129523279)
 
diff --git a/src/Vulkan/VkPhysicalDevice.cpp b/src/Vulkan/VkPhysicalDevice.cpp
index b64b17b..8387e2f 100644
--- a/src/Vulkan/VkPhysicalDevice.cpp
+++ b/src/Vulkan/VkPhysicalDevice.cpp
@@ -13,10 +13,11 @@
 // limitations under the License.
 
 #include "VkPhysicalDevice.hpp"
-#include "VkConfig.h"
 
+#include "VkConfig.h"
 #include "Pipeline/SpirvShader.hpp" // sw::SIMD::Width
 
+#include <limits>
 #include <cstring>
 
 namespace vk
@@ -204,7 +205,7 @@
 		4, // mipmapPrecisionBits
 		UINT32_MAX, // maxDrawIndexedIndexValue
 		UINT32_MAX, // maxDrawIndirectCount
-		2, // maxSamplerLodBias
+		std::numeric_limits<float>::infinity(), // maxSamplerLodBias (no clamping takes place)
 		16, // maxSamplerAnisotropy
 		16, // maxViewports
 		{ 4096, 4096 }, // maxViewportDimensions[2]