diff --git a/framegen/include/core/device.hpp b/framegen/include/core/device.hpp index d03a89c..ac8ee5a 100644 --- a/framegen/include/core/device.hpp +++ b/framegen/include/core/device.hpp @@ -34,6 +34,8 @@ namespace LSFG::Core { [[nodiscard]] uint32_t getComputeFamilyIdx() const { return this->computeFamilyIdx; } /// Get the compute queue. [[nodiscard]] VkQueue getComputeQueue() const { return this->computeQueue; } + /// Check if the device supports FP16. + [[nodiscard]] bool getFP16Support() const { return this->supportsFP16; } // Trivially copyable, moveable and destructible Device(const Core::Device&) noexcept = default; @@ -46,6 +48,7 @@ namespace LSFG::Core { VkPhysicalDevice physicalDevice{}; uint32_t computeFamilyIdx{0}; + bool supportsFP16{false}; VkQueue computeQueue{}; }; diff --git a/framegen/src/core/device.cpp b/framegen/src/core/device.cpp index b4474da..f57547f 100644 --- a/framegen/src/core/device.cpp +++ b/framegen/src/core/device.cpp @@ -1,3 +1,4 @@ +#include #include #include @@ -15,7 +16,7 @@ using namespace LSFG::Core; const std::vector requiredExtensions = { "VK_KHR_external_memory_fd", "VK_KHR_external_semaphore_fd", - "VK_EXT_robustness2", + "VK_EXT_robustness2" }; Device::Device(const Instance& instance, uint64_t deviceUUID) { @@ -62,11 +63,26 @@ Device::Device(const Instance& instance, uint64_t deviceUUID) { if (!computeFamilyIdx) throw LSFG::vulkan_error(VK_ERROR_INITIALIZATION_FAILED, "No compute queue family found"); + // check if physical device supports float16 + VkPhysicalDeviceVulkan12Features supported12Features{ + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES + }; + VkPhysicalDeviceFeatures2 supportedFeatures{ + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, + .pNext = &supported12Features + }; + vkGetPhysicalDeviceFeatures2(*physicalDevice, &supportedFeatures); + this->supportsFP16 = supported12Features.shaderFloat16; + if (this->supportsFP16) + std::cerr << "lsfg-vk: Using FP16 acceleration" << '\n'; + else + std::cerr << "lsfg-vk: FP16 acceleration not supported, using FP32" << '\n'; + // create logical device const float queuePriority{1.0F}; // highest priority VkPhysicalDeviceRobustness2FeaturesEXT robustness2{ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, - .nullDescriptor = VK_TRUE, + .nullDescriptor = VK_TRUE }; VkPhysicalDeviceVulkan13Features features13{ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, @@ -76,6 +92,7 @@ Device::Device(const Instance& instance, uint64_t deviceUUID) { const VkPhysicalDeviceVulkan12Features features12{ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, .pNext = &features13, + .shaderFloat16 = this->supportsFP16, .timelineSemaphore = VK_TRUE, .vulkanMemoryModel = VK_TRUE };