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"
]
}