Fix BufferView access tests for scaled types

The way in which these tests were written assumes the input and output
to the shaders are of the same type; however, for scaled types they are
converted from integral to floating point before being processed in the
shader. This change corrects that issue as well as adds the two missing
scaled types to the framework.

Affected tests:
dEQP-VK.api.buffer_view.access.uniform_texel_buffer.*

VK-GL-CTS Issue: 4239

Components: Vulkan

Change-Id: I84f904648c6f2cf301111250dba28feabf782788
(cherry picked from commit 9145d71d6f8461c23af15ae09d8e846279270f44)
diff --git a/external/vulkancts/framework/vulkan/vkImageUtil.cpp b/external/vulkancts/framework/vulkan/vkImageUtil.cpp
index 3fcbeeb..52f3df4 100644
--- a/external/vulkancts/framework/vulkan/vkImageUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkImageUtil.cpp
@@ -64,6 +64,46 @@
 	return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
 }
 
+bool isScaledFormat (VkFormat format)
+{
+	// update this mapping if VkFormat changes
+	DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
+
+	switch (format)
+	{
+		case VK_FORMAT_R8_USCALED:
+		case VK_FORMAT_R8_SSCALED:
+		case VK_FORMAT_R8G8_USCALED:
+		case VK_FORMAT_R8G8_SSCALED:
+		case VK_FORMAT_R8G8B8_USCALED:
+		case VK_FORMAT_R8G8B8_SSCALED:
+		case VK_FORMAT_R8G8B8A8_USCALED:
+		case VK_FORMAT_R8G8B8A8_SSCALED:
+		case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
+		case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
+		case VK_FORMAT_R16_USCALED:
+		case VK_FORMAT_R16_SSCALED:
+		case VK_FORMAT_R16G16_USCALED:
+		case VK_FORMAT_R16G16_SSCALED:
+		case VK_FORMAT_R16G16B16_USCALED:
+		case VK_FORMAT_R16G16B16_SSCALED:
+		case VK_FORMAT_R16G16B16A16_USCALED:
+		case VK_FORMAT_R16G16B16A16_SSCALED:
+		case VK_FORMAT_B8G8R8_USCALED:
+		case VK_FORMAT_B8G8R8_SSCALED:
+		case VK_FORMAT_B8G8R8A8_USCALED:
+		case VK_FORMAT_B8G8R8A8_SSCALED:
+		case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
+		case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
+		case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
+		case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
+			return true;
+
+		default:
+			return false;
+	}
+}
+
 bool isDepthStencilFormat (VkFormat format)
 {
 	if (isCompressedFormat(format))
@@ -3276,44 +3316,6 @@
 	}
 }
 
-static bool isScaledFormat (VkFormat format)
-{
-	// update this mapping if VkFormat changes
-	DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
-
-	switch (format)
-	{
-		case VK_FORMAT_R8_USCALED:
-		case VK_FORMAT_R8_SSCALED:
-		case VK_FORMAT_R8G8_USCALED:
-		case VK_FORMAT_R8G8_SSCALED:
-		case VK_FORMAT_R8G8B8_USCALED:
-		case VK_FORMAT_R8G8B8_SSCALED:
-		case VK_FORMAT_R8G8B8A8_USCALED:
-		case VK_FORMAT_R8G8B8A8_SSCALED:
-		case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
-		case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
-		case VK_FORMAT_R16_USCALED:
-		case VK_FORMAT_R16_SSCALED:
-		case VK_FORMAT_R16G16_USCALED:
-		case VK_FORMAT_R16G16_SSCALED:
-		case VK_FORMAT_R16G16B16_USCALED:
-		case VK_FORMAT_R16G16B16_SSCALED:
-		case VK_FORMAT_R16G16B16A16_USCALED:
-		case VK_FORMAT_R16G16B16A16_SSCALED:
-		case VK_FORMAT_B8G8R8_USCALED:
-		case VK_FORMAT_B8G8R8_SSCALED:
-		case VK_FORMAT_B8G8R8A8_USCALED:
-		case VK_FORMAT_B8G8R8A8_SSCALED:
-		case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
-		case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
-			return true;
-
-		default:
-			return false;
-	}
-}
-
 static bool fullTextureFormatRoundTripSupported (VkFormat format)
 {
 	if (isScaledFormat(format))
diff --git a/external/vulkancts/framework/vulkan/vkImageUtil.hpp b/external/vulkancts/framework/vulkan/vkImageUtil.hpp
index 1124193..1b4106c 100644
--- a/external/vulkancts/framework/vulkan/vkImageUtil.hpp
+++ b/external/vulkancts/framework/vulkan/vkImageUtil.hpp
@@ -45,6 +45,7 @@
 bool						isSnormFormat				(VkFormat format);
 bool						isIntFormat					(VkFormat format);
 bool						isUintFormat				(VkFormat format);
+bool						isScaledFormat				(VkFormat format);
 bool						isDepthStencilFormat		(VkFormat format);
 bool						isCompressedFormat			(VkFormat format);
 bool						isSrgbFormat				(VkFormat format);
diff --git a/external/vulkancts/modules/vulkan/api/vktApiBufferViewAccessTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiBufferViewAccessTests.cpp
index 39b4f0a..7427d8f 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiBufferViewAccessTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiBufferViewAccessTests.cpp
@@ -1011,11 +1011,12 @@
 	const char* const	fmtLayout		= isUniform ? "" : stringFmtLayout.c_str();
 	const char* const	opName			= isUniform ? "texelFetch" : "imageLoad";
 	const char* const	outFormat		= isIntFmt  ? "i"			   : isUintFmt ? "u" : "";
+	const char* const	inFormat		= vk::isScaledFormat(m_bufferViewTestInfo.format)? "" : outFormat;
 
 	buf << "#version 440\n"
 		<< "#extension GL_EXT_texture_buffer : require\n"
 		<< "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
-		<< "layout(set = 0, binding = 1" << fmtLayout << ") uniform highp " << extraOption << outFormat << storageType << " texelBuffer;\n"
+		<< "layout(set = 0, binding = 1" << fmtLayout << ") uniform highp " << extraOption << inFormat << storageType << " texelBuffer;\n"
 		<< "layout(set = 0, binding = 0, std140) writeonly buffer OutBuf\n"
 		<< "{\n"
 		<< "	highp " << outFormat << "vec4 read_colors[4];\n"
@@ -1026,13 +1027,13 @@
 		<< "	highp " << outFormat << "vec4 result_color;\n"
 		<< "	result_color = " << outFormat << "vec4(0);\n"
 		<< "	if (quadrant_id == 0)\n"
-		<< "		result_color += " << opName << "(texelBuffer, 6);\n"
+		<< "		result_color += " << outFormat << "vec4(" << opName << "(texelBuffer, 6));\n"
 		<< "	else if (quadrant_id == 1)\n"
-		<< "		result_color += " << opName << "(texelBuffer, 51);\n"
+		<< "		result_color += " << outFormat << "vec4(" << opName << "(texelBuffer, 51));\n"
 		<< "	else if (quadrant_id == 2)\n"
-		<< "		result_color += " << opName << "(texelBuffer, 42);\n"
+		<< "		result_color += " << outFormat << "vec4(" << opName << "(texelBuffer, 42));\n"
 		<< "	else\n"
-		<< "		result_color += " << opName << "(texelBuffer, 25);\n"
+		<< "		result_color += " << outFormat << "vec4(" << opName << "(texelBuffer, 25));\n"
 		<< "	b_out.read_colors[gl_WorkGroupID.x] = result_color;\n"
 		<< "}\n";