blob: a9c1efc6c7f3eab2ab49554317cceee5f3054c8c [file] [log] [blame]
/*
* Copyright (c) 2023-2025 The Khronos Group Inc.
* Copyright (c) 2023-2025 Valve Corporation
* Copyright (c) 2023-2025 LunarG, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*/
#include "../framework/layer_validation_tests.h"
#include "../framework/pipeline_helper.h"
class NegativeRobustness : public VkLayerTest {};
TEST_F(NegativeRobustness, PipelineRobustnessDisabled) {
TEST_DESCRIPTION("Create a pipeline using VK_EXT_pipeline_robustness but with pipelineRobustness == VK_FALSE");
SetTargetApiVersion(VK_API_VERSION_1_1);
AddRequiredExtensions(VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME);
AddRequiredExtensions(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
AddRequiredFeature(vkt::Feature::robustBufferAccess);
AddRequiredFeature(vkt::Feature::robustBufferAccess2);
RETURN_IF_SKIP(Init());
{
VkPipelineRobustnessCreateInfo pipeline_robustness_info = vku::InitStructHelper();
pipeline_robustness_info.storageBuffers = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2;
CreateComputePipelineHelper pipe(*this, &pipeline_robustness_info);
m_errorMonitor->SetDesiredError("VUID-VkPipelineRobustnessCreateInfo-pipelineRobustness-06926");
pipe.CreateComputePipeline();
m_errorMonitor->VerifyFound();
}
{
VkPipelineRobustnessCreateInfo pipeline_robustness_info = vku::InitStructHelper();
pipeline_robustness_info.uniformBuffers = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2;
CreateComputePipelineHelper pipe(*this, &pipeline_robustness_info);
m_errorMonitor->SetDesiredError("VUID-VkPipelineRobustnessCreateInfo-pipelineRobustness-06927");
pipe.CreateComputePipeline();
m_errorMonitor->VerifyFound();
}
{
VkPipelineRobustnessCreateInfo pipeline_robustness_info = vku::InitStructHelper();
pipeline_robustness_info.vertexInputs = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2;
CreateComputePipelineHelper pipe(*this, &pipeline_robustness_info);
m_errorMonitor->SetDesiredError("VUID-VkPipelineRobustnessCreateInfo-pipelineRobustness-06928");
pipe.CreateComputePipeline();
m_errorMonitor->VerifyFound();
}
{
VkPipelineRobustnessCreateInfo pipeline_robustness_info = vku::InitStructHelper();
pipeline_robustness_info.images = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2;
CreateComputePipelineHelper pipe(*this, &pipeline_robustness_info);
m_errorMonitor->SetDesiredError("VUID-VkPipelineRobustnessCreateInfo-pipelineRobustness-06929");
pipe.CreateComputePipeline();
m_errorMonitor->VerifyFound();
}
}
TEST_F(NegativeRobustness, PipelineRobustnessDisabledShaderStage) {
TEST_DESCRIPTION("Use VkPipelineShaderStageCreateInfo to set robustness");
SetTargetApiVersion(VK_API_VERSION_1_1);
AddRequiredExtensions(VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME);
AddRequiredExtensions(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
AddRequiredFeature(vkt::Feature::robustBufferAccess);
AddRequiredFeature(vkt::Feature::robustBufferAccess2);
RETURN_IF_SKIP(Init());
CreateComputePipelineHelper pipe(*this);
pipe.LateBindPipelineInfo();
VkPipelineRobustnessCreateInfo pipeline_robustness_info = vku::InitStructHelper();
pipeline_robustness_info.storageBuffers = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2;
pipe.cp_ci_.stage.pNext = &pipeline_robustness_info;
m_errorMonitor->SetDesiredError("VUID-VkPipelineRobustnessCreateInfo-pipelineRobustness-06926");
pipe.CreateComputePipeline(false);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeRobustness, PipelineRobustnessDisabledShaderStageWithIdentifier) {
TEST_DESCRIPTION("Use VkPipelineShaderStageCreateInfo to set robustness using a shader module identifier");
SetTargetApiVersion(VK_API_VERSION_1_1);
AddRequiredExtensions(VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME);
AddRequiredExtensions(VK_EXT_SHADER_MODULE_IDENTIFIER_EXTENSION_NAME);
AddRequiredExtensions(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
AddRequiredFeature(vkt::Feature::pipelineCreationCacheControl);
AddRequiredFeature(vkt::Feature::shaderModuleIdentifier);
AddRequiredFeature(vkt::Feature::robustBufferAccess);
AddRequiredFeature(vkt::Feature::robustBufferAccess2);
RETURN_IF_SKIP(Init());
CreateComputePipelineHelper pipe(*this);
pipe.LateBindPipelineInfo();
VkPipelineShaderStageModuleIdentifierCreateInfoEXT sm_id_create_info = vku::InitStructHelper();
VkShaderObj cs(*m_device, kMinimalShaderGlsl, VK_SHADER_STAGE_COMPUTE_BIT);
VkShaderModuleIdentifierEXT get_identifier = vku::InitStructHelper();
vk::GetShaderModuleIdentifierEXT(device(), cs, &get_identifier);
sm_id_create_info.identifierSize = get_identifier.identifierSize;
sm_id_create_info.pIdentifier = get_identifier.identifier;
VkPipelineRobustnessCreateInfo pipeline_robustness_info = vku::InitStructHelper(&sm_id_create_info);
pipeline_robustness_info.storageBuffers = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2;
pipe.cp_ci_.stage.module = VK_NULL_HANDLE;
pipe.cp_ci_.stage.pNext = &pipeline_robustness_info;
pipe.cp_ci_.flags |= VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT;
m_errorMonitor->SetDesiredError("VUID-VkPipelineRobustnessCreateInfo-pipelineRobustness-06926");
pipe.CreateComputePipeline(false);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeRobustness, PipelineRobustnessRobustBufferAccess2Unsupported) {
TEST_DESCRIPTION("Create a pipeline using VK_EXT_pipeline_robustness with robustBufferAccess2 being unsupported");
SetTargetApiVersion(VK_API_VERSION_1_1);
AddRequiredExtensions(VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME);
AddOptionalExtensions(VK_KHR_ROBUSTNESS_2_EXTENSION_NAME);
AddOptionalExtensions(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
RETURN_IF_SKIP(InitFramework());
if (IsExtensionsEnabled(VK_KHR_ROBUSTNESS_2_EXTENSION_NAME) || IsExtensionsEnabled(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME)) {
VkPhysicalDeviceRobustness2FeaturesKHR robustness2_features = vku::InitStructHelper();
GetPhysicalDeviceFeatures2(robustness2_features);
if (robustness2_features.robustBufferAccess2) {
GTEST_SKIP() << "robustBufferAccess2 is supported";
}
}
VkPhysicalDevicePipelineRobustnessFeaturesEXT pipeline_robustness_features = vku::InitStructHelper();
auto features2 = GetPhysicalDeviceFeatures2(pipeline_robustness_features);
if (!pipeline_robustness_features.pipelineRobustness) {
GTEST_SKIP() << "pipelineRobustness is not supported";
}
RETURN_IF_SKIP(InitState(nullptr, &features2));
{
VkPipelineRobustnessCreateInfo pipeline_robustness_info = vku::InitStructHelper();
CreateComputePipelineHelper pipe(*this, &pipeline_robustness_info);
pipeline_robustness_info.storageBuffers = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2;
m_errorMonitor->SetDesiredError("VUID-VkPipelineRobustnessCreateInfo-robustBufferAccess2-06931");
pipe.CreateComputePipeline();
m_errorMonitor->VerifyFound();
}
{
VkPipelineRobustnessCreateInfo pipeline_robustness_info = vku::InitStructHelper();
CreateComputePipelineHelper pipe(*this, &pipeline_robustness_info);
pipeline_robustness_info.uniformBuffers = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2;
m_errorMonitor->SetDesiredError("VUID-VkPipelineRobustnessCreateInfo-robustBufferAccess2-06932");
pipe.CreateComputePipeline();
m_errorMonitor->VerifyFound();
}
{
VkPipelineRobustnessCreateInfo pipeline_robustness_info = vku::InitStructHelper();
CreateComputePipelineHelper pipe(*this, &pipeline_robustness_info);
pipeline_robustness_info.vertexInputs = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2;
m_errorMonitor->SetDesiredError("VUID-VkPipelineRobustnessCreateInfo-robustBufferAccess2-06933");
pipe.CreateComputePipeline();
m_errorMonitor->VerifyFound();
}
}
TEST_F(NegativeRobustness, PipelineRobustnessRobustImageAccess2Unsupported) {
TEST_DESCRIPTION("Create a pipeline using VK_EXT_pipeline_robustness with robustImageAccess2 being unsupported");
AddRequiredExtensions(VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME);
AddOptionalExtensions(VK_KHR_ROBUSTNESS_2_EXTENSION_NAME);
AddOptionalExtensions(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
SetTargetApiVersion(VK_API_VERSION_1_1);
RETURN_IF_SKIP(InitFramework());
if (IsExtensionsEnabled(VK_KHR_ROBUSTNESS_2_EXTENSION_NAME) || IsExtensionsEnabled(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME)) {
VkPhysicalDeviceRobustness2FeaturesKHR robustness2_features = vku::InitStructHelper();
GetPhysicalDeviceFeatures2(robustness2_features);
if (robustness2_features.robustImageAccess2) {
GTEST_SKIP() << "robustImageAccess2 is supported";
}
}
VkPhysicalDevicePipelineRobustnessFeaturesEXT pipeline_robustness_features = vku::InitStructHelper();
auto features2 = GetPhysicalDeviceFeatures2(pipeline_robustness_features);
if (!pipeline_robustness_features.pipelineRobustness) {
GTEST_SKIP() << "pipelineRobustness is not supported";
}
RETURN_IF_SKIP(InitState(nullptr, &features2));
VkPipelineRobustnessCreateInfo pipeline_robustness_info = vku::InitStructHelper();
CreateComputePipelineHelper pipe(*this, &pipeline_robustness_info);
pipeline_robustness_info.images = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2;
m_errorMonitor->SetDesiredError("VUID-VkPipelineRobustnessCreateInfo-robustImageAccess2-06934");
pipe.CreateComputePipeline();
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeRobustness, PipelineRobustnessRobustImageAccessNotExposed) {
TEST_DESCRIPTION("Check if VK_EXT_image_robustness is not exposed");
SetTargetApiVersion(VK_API_VERSION_1_2);
AddRequiredExtensions(VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME);
AddRequiredFeature(vkt::Feature::pipelineRobustness);
RETURN_IF_SKIP(Init());
if (DeviceValidationVersion() > VK_API_VERSION_1_2) {
GTEST_SKIP() << "version 1.3 enables extensions which we don't want";
}
if (DeviceExtensionSupported(Gpu(), nullptr, VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME)) {
GTEST_SKIP() << "VK_EXT_image_robustness is supported";
}
VkPipelineRobustnessCreateInfo pipeline_robustness_info = vku::InitStructHelper();
CreateComputePipelineHelper pipe(*this, &pipeline_robustness_info);
pipeline_robustness_info.images = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS;
m_errorMonitor->SetDesiredError("VUID-VkPipelineRobustnessCreateInfo-robustImageAccess-06930");
pipe.CreateComputePipeline();
m_errorMonitor->VerifyFound();
}