Temporary patch for OOB read issue

There's an open VK-GL-CTS issue:
https://gitlab.khronos.org/Tracker/vk-gl-cts/-/issues/3974
regarding tests which cause SwiftShader to perform an OOB read
operation. There's also a proposed fix:
https://gerrit.khronos.org/c/vk-gl-cts/+/10260
for this issue. Since this is causing an OOB read issue in
SwiftShader by performing a buffer to image copy from a buffer
which is too small, there's no possible workaround for it in
SwiftShader, so, for now, we temporarily apply this patch until
the issue is properly resolved in VK-GL-CTS.

Tests: dEQP-VK.spirv_assembly.instruction.graphics.image_sampler.imagesample_dref_*optypeimage_mismatch*
Bug: b/247637093
Change-Id: I66fc9cdf2b592a45e740787f192f6924b711e0a7
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/68448
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
Presubmit-Ready: Alexis Hétu <sugoi@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Commit-Queue: Alexis Hétu <sugoi@google.com>
diff --git a/tests/regres/deqp-patches/deqp-oob-read-fix.patch b/tests/regres/deqp-patches/deqp-oob-read-fix.patch
new file mode 100644
index 0000000..35335e9
--- /dev/null
+++ b/tests/regres/deqp-patches/deqp-oob-read-fix.patch
@@ -0,0 +1,61 @@
+ .../spirv_assembly/vktSpvAsmImageSamplerTests.cpp   | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmImageSamplerTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmImageSamplerTests.cpp
+index 9b8c1da7a..d81109d33 100644
+--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmImageSamplerTests.cpp
++++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmImageSamplerTests.cpp
+@@ -1146,14 +1146,16 @@ void addGraphicsImageSamplerTest (tcu::TestCaseGroup* group)
+ 	vector<tcu::Vec4>			inputDataBase		(numDataPoints);
+ 	for (deUint32 numIdx = 0; numIdx < numDataPoints; ++numIdx)
+ 		inputDataBase[numIdx] = tcu::randomVec4(rnd);
++	// Depth only has 1 component
++	vector<tcu::Vec4>			inputDataBaseDepth	= inputDataBase;
++	inputDataBaseDepth.resize(numDataPoints / 4);
+ 
+ 	for (deUint32 opNdx = 0u; opNdx < READOP_LAST; opNdx++)
+ 	{
+ 		de::MovePtr<tcu::TestCaseGroup>	readOpGroup	(new tcu::TestCaseGroup(testCtx, getReadOpName((ReadOp)opNdx), ""));
+ 
+-		vector<tcu::Vec4>				inputData	= inputDataBase;
+-		if (opNdx > READOP_IMAGESAMPLE)
+-			inputData.resize(numDataPoints / 4u);
++		const VkFormat					imageFormat			= getImageFormat((ReadOp)opNdx);
++		const bool						hasDepthComponent	= tcu::hasDepthComponent(vk::mapVkFormat(imageFormat).order);
+ 
+ 		for (deUint32 descNdx = 0u; descNdx < DESCRIPTOR_TYPE_LAST; descNdx++)
+ 		{
+@@ -1176,7 +1178,7 @@ void addGraphicsImageSamplerTest (tcu::TestCaseGroup* group)
+ 					// optypeimage_mismatch uses an additional level of test hierarchy
+ 					const char *groupname = testNdx == TESTTYPE_OPTYPEIMAGE_MISMATCH ? optypeimageFormatMismatchCase[formatIndex] : getTestTypeName((TestType)testNdx);
+ 					de::MovePtr<tcu::TestCaseGroup>	typeGroup(new tcu::TestCaseGroup(testCtx, groupname, ""));
+-
++					vector<Vec4>&					inputData = hasDepthComponent && testNdx != TESTTYPE_OPTYPEIMAGE_MISMATCH ? inputDataBaseDepth : inputDataBase;
+ 					GraphicsResources				resources;
+ 
+ 					resources.inputs.push_back(Resource(BufferSp(new Vec4Buffer(inputData)), getVkDescriptorType((DescriptorType)descNdx)));
+@@ -1202,12 +1204,6 @@ void addGraphicsImageSamplerTest (tcu::TestCaseGroup* group)
+ 
+ 					getDefaultColors(defaultColors);
+ 
+-					if (opNdx > READOP_IMAGESAMPLE)
+-					{
+-						resources.verifyIO		= verifyDepthCompareResult;
+-						resources.inputFormat	= getImageFormat((ReadOp)opNdx);
+-					}
+-
+ 					// If testing for mismatched optypeimage, ignore the rendered
+ 					// result (we're only interested to see if we crash)
+ 					if (testNdx == TESTTYPE_OPTYPEIMAGE_MISMATCH)
+@@ -1215,6 +1211,11 @@ void addGraphicsImageSamplerTest (tcu::TestCaseGroup* group)
+ 						resources.verifyIO		= nopVerifyFunction;
+ 						resources.inputFormat	= optypeimageFormatMismatchVkFormat[formatIndex];
+ 					}
++					else if (hasDepthComponent)
++					{
++						resources.verifyIO		= verifyDepthCompareResult;
++						resources.inputFormat	= getImageFormat((ReadOp)opNdx);
++					}
+ 
+ 					de::MovePtr<tcu::TestCaseGroup> depthGroup (new tcu::TestCaseGroup(testCtx, "depth_property", ""));
+ 					for (deUint32 propertyNdx = 0u; propertyNdx < DEPTH_PROPERTY_LAST; propertyNdx++)
diff --git a/tests/regres/deqp.json b/tests/regres/deqp.json
index 226553e..91de37a 100644
--- a/tests/regres/deqp.json
+++ b/tests/regres/deqp.json
@@ -3,6 +3,7 @@
     "branch": "",
     "sha": "7bbdc916a41493523c9f28d8bce725ca9a2fdc6b",
     "patches": [
-        "tests/regres/deqp-patches/deqp-x11.patch"
+        "tests/regres/deqp-patches/deqp-x11.patch",
+        "tests/regres/deqp-patches/deqp-oob-read-fix.patch"
     ]
 }