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