// SPDX-License-Identifier: MPL-2.0 // Copyright © 2021 Skyline Team and Contributors (https://github.com/skyline-emu/) #include "quirk_manager.h" namespace skyline::gpu { QuirkManager::QuirkManager(const vk::PhysicalDeviceProperties &properties, const DeviceFeatures2 &deviceFeatures2, DeviceFeatures2 &enabledFeatures2, const std::vector &deviceExtensions, std::vector> &enabledExtensions) { for (auto &extension : deviceExtensions) { #define EXT_SET(name, property) \ case util::Hash(name): \ if (name == extensionName) { \ property = true; \ enabledExtensions.push_back(std::array{name}); \ } \ break #define EXT_SET_V(name, property, version) \ case util::Hash(name): \ if (name == extensionName && extensionVersion >= version) { \ property = true; \ enabledExtensions.push_back(std::array{name}); \ } \ break std::string_view extensionName{extension.extensionName}; auto extensionVersion{extension.specVersion}; switch (util::Hash(extensionName)) { EXT_SET("VK_EXT_provoking_vertex", supportsLastProvokingVertex); EXT_SET("VK_EXT_vertex_attribute_divisor", supportsVertexAttributeDivisor); } #undef EXT_SET #undef EXT_SET_V } #define FEAT_SET(structName, feature, property) \ if (deviceFeatures2.get().feature) { \ property = true; \ enabledFeatures2.get().feature = true; \ } FEAT_SET(vk::PhysicalDeviceFeatures2, features.logicOp, supportsLogicOp) FEAT_SET(vk::PhysicalDeviceFeatures2, features.multiViewport, supportsMultipleViewports) if (supportsVertexAttributeDivisor) { FEAT_SET(vk::PhysicalDeviceVertexAttributeDivisorFeaturesEXT, vertexAttributeInstanceRateDivisor, supportsVertexAttributeDivisor) FEAT_SET(vk::PhysicalDeviceVertexAttributeDivisorFeaturesEXT, vertexAttributeInstanceRateZeroDivisor, supportsVertexAttributeZeroDivisor) } else { enabledFeatures2.unlink(); } #undef FEAT_SET } std::string QuirkManager::Summary() { return fmt::format("\n* Supports Last Provoking Vertex: {}\n* Supports Logical Operations: {}\n* Supports Vertex Attribute Divisor: {}\n* Supports Vertex Attribute Zero Divisor: {}\n* Supports Multiple Viewports: {}", supportsLastProvokingVertex, supportsLogicOp, supportsVertexAttributeDivisor, supportsVertexAttributeZeroDivisor, supportsMultipleViewports); } }