Program Listing for File deviceChecker.cpp
↰ Return to documentation for file (PrismEngine/src/deviceChecker.cpp)
#include "deviceChecker.h"
#include "deviceWrapper.h"
#include "utils.h"
#include <set>
#include <string>
bool prism::PGC::DeviceChecker::check(VkPhysicalDevice device, utils::Context* context, utils::Settings* settings)
{
prism::PGC::utils::QueueFamilyIndices indices = DeviceWrapper::findQueueFamilies(device, context->surface);
bool extensionsSupported = checkDeviceExtensionSupport(device, context->deviceExtensions);
bool swapChainAdequate = false;
if (extensionsSupported) {
prism::PGC::utils::SwapChainSupportDetails swapChainSupport = DeviceWrapper::querySwapChainSupport(device, context->surface);
swapChainAdequate = !swapChainSupport.formats.empty() && !swapChainSupport.presentModes.empty();
}
VkPhysicalDeviceFeatures supportedFeatures;
vkGetPhysicalDeviceFeatures(device, &supportedFeatures);
return indices.isComplete() && extensionsSupported && swapChainAdequate && supportedFeatures.samplerAnisotropy;
}
bool prism::PGC::DeviceChecker::checkBindless(VkPhysicalDevice device)
{
VkPhysicalDeviceVulkan12Features vulkan12Features = {};
vulkan12Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
VkPhysicalDeviceFeatures2 deviceFeatures2 = {};
deviceFeatures2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
deviceFeatures2.pNext = &vulkan12Features;
vkGetPhysicalDeviceFeatures2(device, &deviceFeatures2);
if (!vulkan12Features.descriptorBindingSampledImageUpdateAfterBind ||
!vulkan12Features.descriptorBindingPartiallyBound ||
!vulkan12Features.runtimeDescriptorArray ||
!vulkan12Features.shaderSampledImageArrayNonUniformIndexing) {
return false;
}
return true;
}
bool prism::PGC::DeviceChecker::checkDeviceExtensionSupport(VkPhysicalDevice device, const std::vector<const char*> deviceExtensions)
{
uint32_t extensionCount;
vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, nullptr);
std::vector<VkExtensionProperties> availableExtensions(extensionCount);
vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, availableExtensions.data());
std::set<std::string> requiredExtensions(deviceExtensions.begin(), deviceExtensions.end());
for (const auto& extension : availableExtensions) {
requiredExtensions.erase(extension.extensionName);
}
return requiredExtensions.empty();
}