diff --git a/CMakeLists.txt b/CMakeLists.txt
index 00dcc13..6d940b3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -282,7 +282,7 @@
 	if (NOT DE_OS_IS_ANDROID AND NOT DE_OS_IS_IOS)
 		# Executable target
 		add_executable(${MODULE_NAME} ${PROJECT_SOURCE_DIR}/framework/platform/tcuMain.cpp ${ENTRY})
-		target_link_libraries(${MODULE_NAME} tcutil-platform "${MODULE_NAME}${MODULE_LIB_TARGET_POSTFIX}")
+		target_link_libraries(${MODULE_NAME} PUBLIC tcutil-platform "${MODULE_NAME}${MODULE_LIB_TARGET_POSTFIX}")
 		target_copy_files(${MODULE_NAME} platform-libs-${MODULE_NAME} "${DEQP_PLATFORM_COPY_LIBRARIES}")
 	endif ()
 
diff --git a/external/vulkancts/modules/vulkan/api/vktApiBufferTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiBufferTests.cpp
index b9f1781..424ef41 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiBufferTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiBufferTests.cpp
@@ -667,14 +667,19 @@
 
 tcu::TestStatus testLargeBuffer(Context& context, LargeBufferParameters params)
 {
-	const DeviceInterface&	vk					= context.getDeviceInterface();
-	const VkDevice			vkDevice			= context.getDevice();
-	const deUint32			queueFamilyIndex	= context.getUniversalQueueFamilyIndex();
-	VkBuffer				rawBuffer			= DE_NULL;
+	const DeviceInterface&			vk					= context.getDeviceInterface();
+	const VkDevice					vkDevice			= context.getDevice();
+	const deUint32					queueFamilyIndex	= context.getUniversalQueueFamilyIndex();
+	const VkPhysicalDeviceLimits	limits				= getPhysicalDeviceProperties(context.getInstanceInterface(),
+				                                                                      context.getPhysicalDevice()).limits;
+	VkBuffer						rawBuffer			= DE_NULL;
 
 	if (params.useMaxBufferSize)
 		params.bufferSize = context.getMaintenance4Properties().maxBufferSize;
 
+	if ((params.flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) != 0)
+		params.bufferSize = std::min(params.bufferSize, limits.sparseAddressSpaceSize);
+
 	VkBufferCreateInfo bufferParams =
 	{
 		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,	// VkStructureType			sType;
diff --git a/external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp
index be26400..ea6d18e 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp
@@ -2644,7 +2644,6 @@
 		&secBufferInheritInfo,
 	};
 
-	// Create an occlusion query with VK_QUERY_CONTROL_PRECISE_BIT set
 	const VkQueryPoolCreateInfo				queryPoolCreateInfo		=
 	{
 		VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,					// sType
@@ -2662,7 +2661,7 @@
 	VK_CHECK(vk.beginCommandBuffer(primCmdBuf.get(), &primBufferBeginInfo));
 	{
 		vk.cmdResetQueryPool(primCmdBuf.get(), queryPool.get(), 0u, 1u);
-		vk.cmdBeginQuery(primCmdBuf.get(), queryPool.get(), 0u, VK_QUERY_CONTROL_PRECISE_BIT);
+		vk.cmdBeginQuery(primCmdBuf.get(), queryPool.get(), 0u, 0u);
 		{
 			vk.cmdExecuteCommands(primCmdBuf.get(), 1u, &secCmdBuf.get());
 		}
@@ -2670,7 +2669,7 @@
 	}
 	endCommandBuffer(vk, primCmdBuf.get());
 
-	return tcu::TestStatus::pass("Successfully recorded a secondary command buffer allowing a precise occlusion query.");
+	return tcu::TestStatus::pass("Successfully recorded an imprecise query with a secondary command buffer allowing a precise occlusion query.");
 }
 
 tcu::TestStatus recordBufferQueryImpreciseWithoutFlagTest(Context& context)
@@ -2740,7 +2739,6 @@
 		&secBufferInheritInfo,
 	};
 
-	// Create an occlusion query with VK_QUERY_CONTROL_PRECISE_BIT set
 	const VkQueryPoolCreateInfo				queryPoolCreateInfo		=
 	{
 		VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,					// sType
@@ -2758,7 +2756,7 @@
 	VK_CHECK(vk.beginCommandBuffer(primCmdBuf.get(), &primBufferBeginInfo));
 	{
 		vk.cmdResetQueryPool(primCmdBuf.get(), queryPool.get(), 0u, 1u);
-		vk.cmdBeginQuery(primCmdBuf.get(), queryPool.get(), 0u, VK_QUERY_CONTROL_PRECISE_BIT);
+		vk.cmdBeginQuery(primCmdBuf.get(), queryPool.get(), 0u, 0u);
 		{
 			vk.cmdExecuteCommands(primCmdBuf.get(), 1u, &secCmdBuf.get());
 		}
@@ -2766,7 +2764,7 @@
 	}
 	endCommandBuffer(vk, primCmdBuf.get());
 
-	return tcu::TestStatus::pass("Successfully recorded a secondary command buffer allowing a precise occlusion query.");
+	return tcu::TestStatus::pass("Successfully recorded an imprecise query with a secondary command buffer not allowing a precise occlusion query.");
 }
 
 /******** 19.4. Command Buffer Submission (5.4 in VK 1.0 Spec) ****************/
diff --git a/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.cpp b/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.cpp
index 0270c29..4fce063 100644
--- a/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.cpp
+++ b/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.cpp
@@ -554,20 +554,23 @@
 
 	bool optional = (m_testParams.additionalDescriptorBinding != BINDING_Undefined) && (m_testParams.additionalDescriptorType != VK_DESCRIPTOR_TYPE_UNDEFINED);
 
+	const VkShaderStageFlags bindingStageFlags = (m_testParams.descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT) ?
+													VkShaderStageFlags{VK_SHADER_STAGE_FRAGMENT_BIT} : m_testParams.stageFlags;
+
 	const VkDescriptorSetLayoutBinding	bindings[] =
 	{
 		{
 			m_testParams.descriptorBinding,				// binding
 			m_testParams.descriptorType,				// descriptorType
 			descriptorCount,							// descriptorCount
-			m_testParams.stageFlags,					// stageFlags
+			bindingStageFlags,							// stageFlags
 			DE_NULL,									// pImmutableSamplers
 		},
 		{
 			m_testParams.additionalDescriptorBinding,	// binding
 			m_testParams.additionalDescriptorType,		// descriptorType
 			1,											// descriptorCount
-			m_testParams.stageFlags,					// stageFlags
+			bindingStageFlags,							// stageFlags
 			DE_NULL,									// pImmutableSamplers
 		}
 	};
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureConversionTests.cpp b/external/vulkancts/modules/vulkan/texture/vktTextureConversionTests.cpp
index 1fe7c8e..6038031 100644
--- a/external/vulkancts/modules/vulkan/texture/vktTextureConversionTests.cpp
+++ b/external/vulkancts/modules/vulkan/texture/vktTextureConversionTests.cpp
@@ -32,6 +32,7 @@
 #include "tcuVectorUtil.hpp"
 #include "deSharedPtr.hpp"
 
+#include <cmath>
 #include <memory>
 
 namespace vkt
@@ -62,6 +63,7 @@
 	virtual tcu::TestStatus	iterate						(void) override;
 
 protected:
+	tcu::IVec4				computeColorDistance		() const;
 	bool					verifyPixels				(const tcu::PixelBufferAccess&	rendered,
 														 const tcu::PixelBufferAccess&	reference,
 														 const ReferenceParams&			samplerParams,
@@ -78,6 +80,7 @@
 	tcu::Texture2D				m_swTexture;
 	TextureRenderer				m_renderer;
 
+	const tcu::IVec4			m_cd;
 	const tcu::IVec4			m_a;
 	const tcu::IVec4			m_b;
 	const tcu::IVec4			m_c;
@@ -96,10 +99,11 @@
 	, m_hwTexture	(TestTexture2DSp(new pipeline::TestTexture2D(m_inFormat, textureWidth, textureHeight)))
 	, m_swTexture	(m_inFormat, textureWidth, textureHeight, 1)
 	, m_renderer	(context, VK_SAMPLE_COUNT_1_BIT, m_params->width, m_params->height, 1u, makeComponentMappingRGBA(), VK_IMAGE_TYPE_2D, VK_IMAGE_VIEW_TYPE_2D, m_outFormat)
-	, m_a			(lim(m_inFormat, 0),	lim(m_inFormat, 1)+2,	lim(m_inFormat, 2),		lim(m_inFormat, 3)+2)
-	, m_b			(lim(m_inFormat, 0)+2,	lim(m_inFormat, 1),		lim(m_inFormat, 2)+2,	lim(m_inFormat, 3)	)
-	, m_c			(lim(m_inFormat, 0)+1,	lim(m_inFormat, 1)+1,	lim(m_inFormat, 2)+1,	lim(m_inFormat, 3)+1)
-	, m_d			(lim(m_inFormat, 0),	lim(m_inFormat, 1),		lim(m_inFormat, 2),		lim(m_inFormat, 3)	)
+	, m_cd			(computeColorDistance())
+	, m_a			(lim(m_inFormat, 0),			lim(m_inFormat, 1)+m_cd[1]*2,	lim(m_inFormat, 2),				lim(m_inFormat, 3)+m_cd[3]*2)
+	, m_b			(lim(m_inFormat, 0)+m_cd[0]*2,	lim(m_inFormat, 1),				lim(m_inFormat, 2)+m_cd[2]*2,	lim(m_inFormat, 3)			)
+	, m_c			(lim(m_inFormat, 0)+m_cd[0]*1,	lim(m_inFormat, 1)+m_cd[1]*1,	lim(m_inFormat, 2)+m_cd[2]*1,	lim(m_inFormat, 3)+m_cd[3]*1)
+	, m_d			(lim(m_inFormat, 0),			lim(m_inFormat, 1),				lim(m_inFormat, 2),				lim(m_inFormat, 3)			)
 {
 	tcu::IVec4 data[textureWidth * textureHeight] =
 	{
@@ -135,6 +139,17 @@
 	return channelBits[channelIdx] ? (-deIntMaxValue32(channelBits[channelIdx])) : (-1);
 }
 
+tcu::IVec4 SnormLinearClampInstance::computeColorDistance () const
+{
+	return tcu::IVec4
+	(
+		static_cast<int>(std::floor(static_cast<float>(-lim(m_inFormat, 0)) / 127.0f)),
+		static_cast<int>(std::floor(static_cast<float>(-lim(m_inFormat, 0)) / 127.0f)),
+		static_cast<int>(std::floor(static_cast<float>(-lim(m_inFormat, 0)) / 127.0f)),
+		static_cast<int>(std::floor(static_cast<float>(-lim(m_inFormat, 0)) / 127.0f))
+	);
+}
+
 bool SnormLinearClampInstance::verifyPixels	(const tcu::PixelBufferAccess& rendered, const tcu::PixelBufferAccess& reference, const ReferenceParams& samplerParams, const std::vector<float>& texCoords) const
 {
 	tcu::LodPrecision				lodPrec;
@@ -144,6 +159,7 @@
 	const int						width			(m_renderer.getRenderWidth());
 	const int						height			(m_renderer.getRenderHeight());
 
+	const tcu::IVec4				colorDistance	(computeColorDistance());
 	std::unique_ptr<deUint8[]>		errorMaskData	(new deUint8[width * height * 4 * 4]);
 	tcu::PixelBufferAccess			errorMask		(mapVkFormat(m_outFormat), width, height, 1, errorMaskData.get());
 
@@ -154,10 +170,10 @@
 	lookupPrec.uvwBits				= tcu::IVec3(5,5,0);
 	lookupPrec.coordBits			= tcu::IVec3(20,20,0);
 	lookupPrec.colorMask			= tcu::BVec4(nuc >= 1, nuc >= 2, nuc >=3, nuc >= 4);
-	lookupPrec.colorThreshold		= tcu::Vec4(0.9f/float(-lim(m_inFormat, 0)),
-												0.9f/float(-lim(m_inFormat, 1)),
-												0.9f/float(-lim(m_inFormat, 2)),
-												0.9f/float(-lim(m_inFormat, 3)));
+	lookupPrec.colorThreshold		= tcu::Vec4(0.9f/float(colorDistance[0]),
+												0.9f/float(colorDistance[1]),
+												0.9f/float(colorDistance[2]),
+												0.9f/float(colorDistance[3]));
 
 	const int numFailedPixels		= glu::TextureTestUtil::computeTextureLookupDiff(rendered, reference, errorMask,
 																					 m_swTexture, texCoords.data(), samplerParams,
