blob: 4328ed706dc83869d6442b2c8b5398126c3d2812 [file] [log] [blame]
/*
* Copyright (c) 2015-2021 The Khronos Group Inc.
* Copyright (c) 2015-2021 Valve Corporation
* Copyright (c) 2015-2021 LunarG, Inc.
* Copyright (c) 2015-2021 Google, 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
*
* Author: Chia-I Wu <olvaffe@gmail.com>
* Author: Chris Forbes <chrisf@ijw.co.nz>
* Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
* Author: Mark Lobodzinski <mark@lunarg.com>
* Author: Mike Stroyan <mike@LunarG.com>
* Author: Tobin Ehlis <tobine@google.com>
* Author: Tony Barbour <tony@LunarG.com>
* Author: Cody Northrop <cnorthrop@google.com>
* Author: Dave Houlton <daveh@lunarg.com>
* Author: Jeremy Kniager <jeremyk@lunarg.com>
* Author: Shannon McPherson <shannon@lunarg.com>
* Author: John Zulauf <jzulauf@lunarg.com>
*/
#include "../layer_validation_tests.h"
#include "vk_extension_helper.h"
#include <algorithm>
#include <array>
#include <chrono>
#include <memory>
#include <mutex>
#include <thread>
#include "cast_utils.h"
//
// POSITIVE VALIDATION TESTS
//
// These tests do not expect to encounter ANY validation errors pass only if this is true
TEST_F(VkPositiveLayerTest, TwoInstances) {
TEST_DESCRIPTION("Create two instances before destroy");
ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
VkInstance i1, i2, i3;
VkInstanceCreateInfo ici = {};
ici.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
ici.enabledLayerCount = instance_layers_.size();
ici.ppEnabledLayerNames = instance_layers_.data();
ASSERT_VK_SUCCESS(vk::CreateInstance(&ici, nullptr, &i1));
ASSERT_VK_SUCCESS(vk::CreateInstance(&ici, nullptr, &i2));
ASSERT_NO_FATAL_FAILURE(vk::DestroyInstance(i2, nullptr));
ASSERT_VK_SUCCESS(vk::CreateInstance(&ici, nullptr, &i3));
ASSERT_NO_FATAL_FAILURE(vk::DestroyInstance(i3, nullptr));
ASSERT_NO_FATAL_FAILURE(vk::DestroyInstance(i1, nullptr));
}
TEST_F(VkPositiveLayerTest, NullFunctionPointer) {
TEST_DESCRIPTION("On 1_0 instance , call GetDeviceProcAddr on promoted 1_1 device-level entrypoint");
SetTargetApiVersion(VK_API_VERSION_1_0);
ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
if (DeviceExtensionSupported(gpu(), nullptr, "VK_KHR_get_memory_requirements2")) {
m_device_extension_names.push_back("VK_KHR_get_memory_requirements2");
} else {
printf("%s VK_KHR_get_memory_reqirements2 extension not supported, skipping NullFunctionPointer test\n", kSkipPrefix);
return;
}
ASSERT_NO_FATAL_FAILURE(InitState());
m_errorMonitor->ExpectSuccess();
auto fpGetBufferMemoryRequirements =
(PFN_vkGetBufferMemoryRequirements2)vk::GetDeviceProcAddr(m_device->device(), "vkGetBufferMemoryRequirements2");
if (fpGetBufferMemoryRequirements) {
m_errorMonitor->SetError("Null was expected!");
}
m_errorMonitor->VerifyNotFound();
}
TEST_F(VkPositiveLayerTest, ValidationInstanceExtensions) {
ASSERT_NO_FATAL_FAILURE(Init());
std::string layer_name = "VK_LAYER_KHRONOS_validation";
std::vector<std::string> extensions = {VK_EXT_DEBUG_UTILS_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_EXTENSION_NAME,
VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME};
uint32_t property_count;
vk::EnumerateInstanceExtensionProperties(layer_name.c_str(), &property_count, NULL);
std::vector<VkExtensionProperties> properties(property_count);
vk::EnumerateInstanceExtensionProperties(layer_name.c_str(), &property_count, properties.data());
for (size_t i = 0; i < extensions.size(); i++) {
bool found = false;
for (auto props : properties) {
if (!strcmp(props.extensionName, extensions[i].c_str())) {
found = true;
break;
}
}
if (!found) {
FAIL() << "Validation layer is missing extension " << extensions[i].c_str();
}
}
}