Partially revert "Pipeline robustness fix" This CL partially reverts: https://swiftshader-review.googlesource.com/c/SwiftShader/+/68331 Some of the changes were unnecessary and caused VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT to no longer be properly supported when specified. This was not uncovered because of the lack of test coverage. This CL fixes the issue by setting inheritRobustBufferAccess to deviceRobustBufferAccess when overrideRobustness IS specified, instead of when it IS NOT specified, which is what the original issue was. Tests: dEQP-VK.robustness.pipeline_robustness_buffer_access.* Bug: b/185122256 Change-Id: I9c09b9dc3a25dacd35e166189eb828f78dd9c422 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/68488 Reviewed-by: Shahbaz Youssefi <syoussefi@google.com> Commit-Queue: Alexis Hétu <sugoi@google.com> Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Antonio Maiorano <amaiorano@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Presubmit-Ready: Alexis Hétu <sugoi@google.com>
diff --git a/src/Vulkan/VkPipeline.cpp b/src/Vulkan/VkPipeline.cpp index 9f573b8..5e0902e 100644 --- a/src/Vulkan/VkPipeline.cpp +++ b/src/Vulkan/VkPipeline.cpp
@@ -270,7 +270,7 @@ } } -bool getRobustBufferAccess(const VkPipelineRobustnessCreateInfoEXT *overrideRobustness, bool inheritRobustBufferAccess) +bool getRobustBufferAccess(const VkPipelineRobustnessCreateInfoEXT *overrideRobustness, bool deviceRobustBufferAccess, bool inheritRobustBufferAccess) { VkPipelineRobustnessBufferBehaviorEXT storageBehavior = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT; VkPipelineRobustnessBufferBehaviorEXT uniformBehavior = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT; @@ -281,6 +281,7 @@ storageBehavior = overrideRobustness->storageBuffers; uniformBehavior = overrideRobustness->uniformBuffers; vertexBehavior = overrideRobustness->vertexInputs; + inheritRobustBufferAccess = deviceRobustBufferAccess; } bool storageRobustBufferAccess = getRobustBufferAccess(storageBehavior, inheritRobustBufferAccess); @@ -300,14 +301,15 @@ // For pipelines, there's no robustBufferAccess to inherit from. Default and no-override // both lead to using the device's robustBufferAccess. - return getRobustBufferAccess(overrideRobustness, deviceRobustBufferAccess); + return getRobustBufferAccess(overrideRobustness, deviceRobustBufferAccess, deviceRobustBufferAccess); } -bool getPipelineStageRobustBufferAccess(const void *pNext, bool pipelineRobustBufferAccess) +bool getPipelineStageRobustBufferAccess(const void *pNext, vk::Device *device, bool pipelineRobustBufferAccess) { const VkPipelineRobustnessCreateInfoEXT *overrideRobustness = vk::GetExtendedStruct<VkPipelineRobustnessCreateInfoEXT>(pNext, VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO_EXT); + const bool deviceRobustBufferAccess = device->getEnabledFeatures().robustBufferAccess; - return getRobustBufferAccess(overrideRobustness, pipelineRobustBufferAccess); + return getRobustBufferAccess(overrideRobustness, deviceRobustBufferAccess, pipelineRobustBufferAccess); } } // anonymous namespace @@ -452,7 +454,7 @@ } } - const bool stageRobustBufferAccess = getPipelineStageRobustBufferAccess(stageInfo.pNext, robustBufferAccess); + const bool stageRobustBufferAccess = getPipelineStageRobustBufferAccess(stageInfo.pNext, device, robustBufferAccess); // TODO(b/201798871): use allocator. auto shader = std::make_shared<sw::SpirvShader>(stageInfo.stage, stageInfo.pName, spirv, @@ -528,7 +530,7 @@ } } - const bool stageRobustBufferAccess = getPipelineStageRobustBufferAccess(stage.pNext, robustBufferAccess); + const bool stageRobustBufferAccess = getPipelineStageRobustBufferAccess(stage.pNext, device, robustBufferAccess); // TODO(b/201798871): use allocator. shader = std::make_shared<sw::SpirvShader>(stage.stage, stage.pName, spirv,