From 17b7970aa0e3fabf3249f0e52829f6533601e7f3 Mon Sep 17 00:00:00 2001 From: Gregory Wells Date: Wed, 17 Sep 2025 13:24:30 -0400 Subject: [PATCH] vulkan physical device get properties --- .../vulkan/loader/vulkan_instance_loader.c | 1 + .../output_device/vulkan_physical_device.c | 22 +++++++++++++++++++ .../output_device/vulkan_physical_device.h | 6 ++--- .../output_device/gryphn_physical_device.c | 7 +++--- .../output_device/gryphn_physical_device.h | 14 ++---------- .../loader/src/gryphn_instance_functions.h | 2 +- projects/loader/src/gryphn_loader.h | 1 + 7 files changed, 34 insertions(+), 19 deletions(-) diff --git a/projects/apis/vulkan/loader/vulkan_instance_loader.c b/projects/apis/vulkan/loader/vulkan_instance_loader.c index fe5f69c..487fa78 100644 --- a/projects/apis/vulkan/loader/vulkan_instance_loader.c +++ b/projects/apis/vulkan/loader/vulkan_instance_loader.c @@ -10,6 +10,7 @@ gryphnInstanceFunctionLayers loadVulkanAPILayer(void) { .isSuitable = vulkanIsInstanceSuitable, .destroyInstance = vulkanDestroyInstance, .queryDevices = vulkanQueryDevices, + .getPhysicalDeviceProperties = vulkanQueryPhysicalDeviceProperties, .next = NULL }; } diff --git a/projects/apis/vulkan/src/output_device/vulkan_physical_device.c b/projects/apis/vulkan/src/output_device/vulkan_physical_device.c index 65fa2a0..3978e25 100644 --- a/projects/apis/vulkan/src/output_device/vulkan_physical_device.c +++ b/projects/apis/vulkan/src/output_device/vulkan_physical_device.c @@ -3,6 +3,28 @@ #include #include +inline gnPhysicalDeviceType vulkanDeviceTypeToGryphn(VkPhysicalDeviceType type) { + switch (type) { + case VK_PHYSICAL_DEVICE_TYPE_OTHER: return GN_PHYSICAL_DEVICE_TYPE_FAKED_GPU; + case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU: return GN_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU; + case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU: return GN_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU; + case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU: return GN_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU; + case VK_PHYSICAL_DEVICE_TYPE_CPU: return GN_PHYSICAL_DEVICE_TYPE_CPU; + case VK_PHYSICAL_DEVICE_TYPE_MAX_ENUM: return GN_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU; // WE SHOULD NEVER HAVE TO DEAL WITH THIS ERROR + } +} + +gnPhysicalDeviceProperties vulkanQueryPhysicalDeviceProperties(gnInstance instance, gnPhysicalDeviceHandle device, gryphnInstanceFunctionLayers* layers) { + VkPhysicalDeviceProperties properties; + vkGetPhysicalDeviceProperties((VkPhysicalDevice)device, &properties); + return (gnPhysicalDeviceProperties){ + .deviceID = properties.deviceID, + .deviceName = gnCreateString(properties.deviceName), + .deviceType = vulkanDeviceTypeToGryphn(properties.deviceType), + .driverVersion = properties.driverVersion + }; +} + gnMultisampleCountFlags vkSampleCountToGryphn(VkSampleCountFlags counts) { gnMultisampleCountFlags sampleCount = 0; if ((counts & VK_SAMPLE_COUNT_64_BIT) == VK_SAMPLE_COUNT_64_BIT) { sampleCount |= GN_SAMPLE_BIT_64; } diff --git a/projects/apis/vulkan/src/output_device/vulkan_physical_device.h b/projects/apis/vulkan/src/output_device/vulkan_physical_device.h index dfdf6ec..52cb7ef 100644 --- a/projects/apis/vulkan/src/output_device/vulkan_physical_device.h +++ b/projects/apis/vulkan/src/output_device/vulkan_physical_device.h @@ -1,4 +1,5 @@ #pragma once +#include "loader/src/gryphn_instance_functions.h" #include #include @@ -8,9 +9,8 @@ typedef struct vulkanNeededQueue { uint32_t queueIndex; } vulkanNeededQueue; -gnPhysicalDevice* getPhysicalDevices(gnInstanceHandle instance, uint32_t* deviceCount); +gnPhysicalDeviceProperties vulkanQueryPhysicalDeviceProperties(gnInstance instance, gnPhysicalDeviceHandle device, gryphnInstanceFunctionLayers* layers); + gnBool deviceCanPresentToSurface(gnPhysicalDevice device, gnWindowSurface surface); - - gnMultisampleCountFlags vkSampleCountToGryphn(VkSampleCountFlags counts); VkSampleCountFlags gnSampleCountToVulkan(gnMultisampleCountFlags counts); diff --git a/projects/core/src/output_device/gryphn_physical_device.c b/projects/core/src/output_device/gryphn_physical_device.c index 9f3638e..8910726 100644 --- a/projects/core/src/output_device/gryphn_physical_device.c +++ b/projects/core/src/output_device/gryphn_physical_device.c @@ -2,9 +2,10 @@ #include "instance/gryphn_instance.h" #include "loader/src/gryphn_instance_functions.h" +gnPhysicalDeviceProperties gnQueryPhysicalDeviceProperties(gnInstanceHandle instance, gnPhysicalDeviceHandle device) { + return instance->functions->getPhysicalDeviceProperties(instance, device, instance->functions->next); +} + gnBool gnPhysicalDeviceCanPresentToSurface(gnInstanceHandle instance, gnPhysicalDeviceHandle device, gnWindowSurfaceHandle windowSurface) { return instance->callingLayer->instanceFunctions._gnPhysicalDeviceCanPresentToSurface(device, windowSurface); } - -// gnPhysicalDeviceProperties gnGetPhysicalDeviceProperties(gnPhysicalDeviceHandle device) { return device->properties; } -// gnPhysicalDeviceFeatures gnGetPhysicalDeviceFeatures(gnPhysicalDeviceHandle device) { return device->features; } diff --git a/projects/core/src/output_device/gryphn_physical_device.h b/projects/core/src/output_device/gryphn_physical_device.h index 61edb2e..04779ce 100644 --- a/projects/core/src/output_device/gryphn_physical_device.h +++ b/projects/core/src/output_device/gryphn_physical_device.h @@ -34,17 +34,7 @@ typedef struct gnPhysicalDeviceFeatures { uint32_t maxPushConstantSize; } gnPhysicalDeviceFeatures; -// #ifdef GN_REVEAL_IMPL -// typedef struct gnPhysicalDevice_t { -// struct gnPlatformPhysicalDevice_t* physicalDevice; -// gnPhysicalDeviceProperties properties; -// gnPhysicalDeviceFeatures features; - -// gnInstanceHandle instance; -// } gnPhysicalOutputDevice_t; -// #endif +// gnPhysicalDeviceProperties gnQueryPhysicalDeviceFeatures(gnInstanceHandle instance, gn); +gnPhysicalDeviceProperties gnQueryPhysicalDeviceProperties(gnInstanceHandle instance, gnPhysicalDeviceHandle handle); gnBool gnPhysicalDeviceCanPresentToSurface(gnInstance instance, gnPhysicalDeviceHandle device, gnWindowSurfaceHandle windowSurface); - -gnPhysicalDeviceProperties gnGetPhysicalDeviceProperties(gnPhysicalDeviceHandle device); -gnPhysicalDeviceFeatures gnGetPhysicalDeviceFeatures(gnPhysicalDeviceHandle device); diff --git a/projects/loader/src/gryphn_instance_functions.h b/projects/loader/src/gryphn_instance_functions.h index 84c5522..3cfa865 100644 --- a/projects/loader/src/gryphn_instance_functions.h +++ b/projects/loader/src/gryphn_instance_functions.h @@ -26,7 +26,7 @@ typedef gnBool (*PFN_gnIsInstanceSuitable)(gnInstanceHandle, gnSuitableField, gr typedef gnReturnCode (*PFN_gnInstanceQueryDevices)(gnInstanceHandle, uint32_t*, gnPhysicalDeviceHandle*, gryphnInstanceFunctionLayers*); typedef void (*PFN_gnDestroyInstance)(gnInstanceHandle, gryphnInstanceFunctionLayers*, gnAllocators*); -typedef gnPhysicalDeviceProperties (*PFN_gnQueryPhysicalDeviceProperties)(gnInstance, gnPhysicalDeviceHandle); +typedef gnPhysicalDeviceProperties (*PFN_gnQueryPhysicalDeviceProperties)(gnInstance, gnPhysicalDeviceHandle, gryphnInstanceFunctionLayers*); typedef struct gnInstanceFunctions { gnBool (*_gnPhysicalDeviceCanPresentToSurface)(gnPhysicalDevice device, gnWindowSurfaceHandle windowSurface); diff --git a/projects/loader/src/gryphn_loader.h b/projects/loader/src/gryphn_loader.h index fb0ffb4..fb09213 100644 --- a/projects/loader/src/gryphn_loader.h +++ b/projects/loader/src/gryphn_loader.h @@ -18,6 +18,7 @@ typedef struct gryphnInstanceFunctionLayers { PFN_gnIsInstanceSuitable isSuitable; PFN_gnInstanceQueryDevices queryDevices; PFN_gnDestroyInstance destroyInstance; + PFN_gnQueryPhysicalDeviceProperties getPhysicalDeviceProperties; struct gryphnInstanceFunctionLayers* next; } gryphnInstanceFunctionLayers;