blob: 125efe8971f0906c143ada189c9d98a18e204a93 [file] [log] [blame]
/*
* Copyright (c) 2023 The Khronos Group Inc.
* Copyright (c) 2023 Valve Corporation
* Copyright (c) 2023 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 "utils/cast_utils.h"
#include "../framework/layer_validation_tests.h"
#include "../framework/pipeline_helper.h"
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);
RETURN_IF_SKIP(InitFramework())
RETURN_IF_SKIP(InitState())
{
CreateComputePipelineHelper pipe(*this);
pipe.InitState();
VkPipelineRobustnessCreateInfoEXT pipeline_robustness_info = vku::InitStructHelper();
pipeline_robustness_info.storageBuffers = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT;
pipe.cp_ci_.pNext = &pipeline_robustness_info;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPipelineRobustnessCreateInfoEXT-pipelineRobustness-06926");
pipe.CreateComputePipeline();
m_errorMonitor->VerifyFound();
}
{
CreateComputePipelineHelper pipe(*this);
pipe.InitState();
VkPipelineRobustnessCreateInfoEXT pipeline_robustness_info = vku::InitStructHelper();
pipeline_robustness_info.uniformBuffers = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT;
pipe.cp_ci_.pNext = &pipeline_robustness_info;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPipelineRobustnessCreateInfoEXT-pipelineRobustness-06927");
pipe.CreateComputePipeline();
m_errorMonitor->VerifyFound();
}
{
CreateComputePipelineHelper pipe(*this);
pipe.InitState();
VkPipelineRobustnessCreateInfoEXT pipeline_robustness_info = vku::InitStructHelper();
pipeline_robustness_info.vertexInputs = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT;
pipe.cp_ci_.pNext = &pipeline_robustness_info;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPipelineRobustnessCreateInfoEXT-pipelineRobustness-06928");
pipe.CreateComputePipeline();
m_errorMonitor->VerifyFound();
}
{
CreateComputePipelineHelper pipe(*this);
pipe.InitState();
VkPipelineRobustnessCreateInfoEXT pipeline_robustness_info = vku::InitStructHelper();
pipeline_robustness_info.images = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2_EXT;
pipe.cp_ci_.pNext = &pipeline_robustness_info;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPipelineRobustnessCreateInfoEXT-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);
RETURN_IF_SKIP(InitFramework())
RETURN_IF_SKIP(InitState())
CreateComputePipelineHelper pipe(*this);
pipe.InitState();
pipe.LateBindPipelineInfo();
VkPipelineRobustnessCreateInfoEXT pipeline_robustness_info = vku::InitStructHelper();
pipeline_robustness_info.storageBuffers = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT;
pipe.cp_ci_.stage.pNext = &pipeline_robustness_info;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPipelineRobustnessCreateInfoEXT-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);
RETURN_IF_SKIP(InitFramework())
VkPhysicalDevicePipelineCreationCacheControlFeatures shader_cache_control_features = vku::InitStructHelper();
VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT shader_module_id_features =
vku::InitStructHelper(&shader_cache_control_features);
GetPhysicalDeviceFeatures2(shader_module_id_features);
RETURN_IF_SKIP(InitState(nullptr, &shader_module_id_features));
CreateComputePipelineHelper pipe(*this);
pipe.InitState();
pipe.LateBindPipelineInfo();
VkPipelineShaderStageModuleIdentifierCreateInfoEXT sm_id_create_info = vku::InitStructHelper();
VkShaderObj cs(this, kMinimalShaderGlsl, VK_SHADER_STAGE_COMPUTE_BIT);
VkShaderModuleIdentifierEXT get_identifier = vku::InitStructHelper();
vk::GetShaderModuleIdentifierEXT(device(), cs.handle(), &get_identifier);
sm_id_create_info.identifierSize = get_identifier.identifierSize;
sm_id_create_info.pIdentifier = get_identifier.identifier;
VkPipelineRobustnessCreateInfoEXT pipeline_robustness_info = vku::InitStructHelper(&sm_id_create_info);
pipeline_robustness_info.storageBuffers = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT;
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->SetDesiredFailureMsg(kErrorBit, "VUID-VkPipelineRobustnessCreateInfoEXT-pipelineRobustness-06926");
pipe.CreateComputePipeline(false);
m_errorMonitor->VerifyFound();
}
// Need to fix check to check if feature is exposed
// TODO - https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/5657
TEST_F(NegativeRobustness, DISABLED_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_EXT_ROBUSTNESS_2_EXTENSION_NAME);
RETURN_IF_SKIP(InitFramework())
if (IsExtensionsEnabled(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME)) {
VkPhysicalDeviceRobustness2FeaturesEXT 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))
{
CreateComputePipelineHelper pipe(*this);
pipe.InitState();
VkPipelineRobustnessCreateInfoEXT pipeline_robustness_info = vku::InitStructHelper();
pipeline_robustness_info.storageBuffers = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT;
pipe.cp_ci_.pNext = &pipeline_robustness_info;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPipelineRobustnessCreateInfoEXT-robustBufferAccess2-06931");
pipe.CreateComputePipeline();
m_errorMonitor->VerifyFound();
}
{
CreateComputePipelineHelper pipe(*this);
pipe.InitState();
VkPipelineRobustnessCreateInfoEXT pipeline_robustness_info = vku::InitStructHelper();
pipeline_robustness_info.uniformBuffers = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT;
pipe.cp_ci_.pNext = &pipeline_robustness_info;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPipelineRobustnessCreateInfoEXT-robustBufferAccess2-06932");
pipe.CreateComputePipeline();
m_errorMonitor->VerifyFound();
}
{
CreateComputePipelineHelper pipe(*this);
pipe.InitState();
VkPipelineRobustnessCreateInfoEXT pipeline_robustness_info = vku::InitStructHelper();
pipeline_robustness_info.vertexInputs = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT;
pipe.cp_ci_.pNext = &pipeline_robustness_info;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPipelineRobustnessCreateInfoEXT-robustBufferAccess2-06933");
pipe.CreateComputePipeline();
m_errorMonitor->VerifyFound();
}
}
// Need to fix check to check if feature is exposed
// TODO - https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/5657
TEST_F(NegativeRobustness, DISABLED_PipelineRobustnessRobustImageAccess2Unsupported) {
TEST_DESCRIPTION("Create a pipeline using VK_EXT_pipeline_robustness with robustImageAccess2 being unsupported");
AddRequiredExtensions(VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME);
AddOptionalExtensions(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
SetTargetApiVersion(VK_API_VERSION_1_1);
RETURN_IF_SKIP(InitFramework())
if (IsExtensionsEnabled(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME)) {
VkPhysicalDeviceRobustness2FeaturesEXT 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))
CreateComputePipelineHelper pipe(*this);
pipe.InitState();
VkPipelineRobustnessCreateInfoEXT pipeline_robustness_info = vku::InitStructHelper();
pipeline_robustness_info.images = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2_EXT;
pipe.cp_ci_.pNext = &pipeline_robustness_info;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPipelineRobustnessCreateInfoEXT-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);
RETURN_IF_SKIP(InitFramework())
if (DeviceValidationVersion() > VK_API_VERSION_1_2) {
GTEST_SKIP() << "version 1.3 enables extensions which we don't want";
}
VkPhysicalDevicePipelineRobustnessFeaturesEXT pipeline_robustness_features = vku::InitStructHelper();
GetPhysicalDeviceFeatures2(pipeline_robustness_features);
if (!pipeline_robustness_features.pipelineRobustness) {
GTEST_SKIP() << "pipelineRobustness is not supported";
}
RETURN_IF_SKIP(InitState(nullptr, &pipeline_robustness_features));
if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME)) {
GTEST_SKIP() << "VK_EXT_image_robustness is supported";
}
CreateComputePipelineHelper pipe(*this);
pipe.InitState();
VkPipelineRobustnessCreateInfoEXT pipeline_robustness_info = vku::InitStructHelper();
pipeline_robustness_info.images = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_EXT;
pipe.cp_ci_.pNext = &pipeline_robustness_info;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPipelineRobustnessCreateInfoEXT-robustImageAccess-06930");
pipe.CreateComputePipeline();
m_errorMonitor->VerifyFound();
}