From 228d75e5acee942eceb4564b95f203c3e7dc6c96 Mon Sep 17 00:00:00 2001 From: Gregory Wells Date: Fri, 19 Sep 2025 10:12:10 -0400 Subject: [PATCH] finish query functions in Vulkan --- .../vulkan/loader/vulkan_instance_loader.c | 2 + .../output_device/vulkan_physical_device.c | 175 +++++++++++++----- .../output_device/vulkan_physical_device.h | 6 +- 3 files changed, 138 insertions(+), 45 deletions(-) diff --git a/projects/apis/vulkan/loader/vulkan_instance_loader.c b/projects/apis/vulkan/loader/vulkan_instance_loader.c index 487fa78..a69ceec 100644 --- a/projects/apis/vulkan/loader/vulkan_instance_loader.c +++ b/projects/apis/vulkan/loader/vulkan_instance_loader.c @@ -11,6 +11,8 @@ gryphnInstanceFunctionLayers loadVulkanAPILayer(void) { .destroyInstance = vulkanDestroyInstance, .queryDevices = vulkanQueryDevices, .getPhysicalDeviceProperties = vulkanQueryPhysicalDeviceProperties, + .getPhysicalDeviceFeatures = vulkanQueryPhysicalDeviceFeatures, + .getPhysicalDeviceLimits = vulkanQueryPhysicalDeviceLimits, .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 3978e25..575c4cc 100644 --- a/projects/apis/vulkan/src/output_device/vulkan_physical_device.c +++ b/projects/apis/vulkan/src/output_device/vulkan_physical_device.c @@ -25,8 +25,99 @@ gnPhysicalDeviceProperties vulkanQueryPhysicalDeviceProperties(gnInstance instan }; } -gnMultisampleCountFlags vkSampleCountToGryphn(VkSampleCountFlags counts) { - gnMultisampleCountFlags sampleCount = 0; +gnPhysicalDeviceFeatures vulkanQueryPhysicalDeviceFeatures(gnInstance instance, gnPhysicalDeviceHandle device, gryphnInstanceFunctionLayers* layers) { + VkPhysicalDeviceFeatures features; + vkGetPhysicalDeviceFeatures((VkPhysicalDevice)device, &features); + return (gnPhysicalDeviceFeatures){ + .uint32Index = features.fullDrawIndexUint32, + .geometryShader = features.geometryShader, + .tessellationShader = features.tessellationShader, + .multiDrawIndirect = features.multiDrawIndirect, + .drawIndirectFirstInstance = features.drawIndirectFirstInstance, + .fillModeNonSolid = features.fillModeNonSolid, + .wideLines = features.wideLines, + .largePoints = features.largePoints, + .samplerAnisotropy = features.samplerAnisotropy + }; +} +gnPhysicalDeviceLimits vulkanQueryPhysicalDeviceLimits(gnInstance instance, gnPhysicalDeviceHandle device, gryphnInstanceFunctionLayers* layers) { + VkPhysicalDeviceProperties properties; + vkGetPhysicalDeviceProperties((VkPhysicalDevice)device, &properties); + VkPhysicalDeviceLimits limits = properties.limits; + return (gnPhysicalDeviceLimits) { + .maxImageExtent1D = limits.maxImageDimension1D, + .maxImageExtent2D = limits.maxImageDimension2D, + .maxImageExtent3D = limits.maxImageDimension3D, + .maxImageExtentCube = limits.maxImageDimensionCube, + .maxImageArrayLayers = limits.maxImageArrayLayers, + .maxTexelBufferElements = limits.maxTexelBufferElements, + .maxUniformBufferRange = limits.maxUniformBufferRange, + .maxStorageBufferRange = limits.maxStorageBufferRange, + .maxPushConstantsSize = limits.maxPushConstantsSize, + .maxMemoryAllocationCount = limits.maxMemoryAllocationCount, + .maxSamplerAllocationCount = limits.maxSamplerAllocationCount, + .maxBoundUniforms = limits.maxBoundDescriptorSets, + .maxPerStageUniformSamplers = limits.maxPerStageDescriptorSamplers, + .maxPerStageUniformUniformBuffers = limits.maxPerStageDescriptorUniformBuffers, + .maxPerStageUniformStorageBuffers = limits.maxPerStageDescriptorStorageBuffers, + .maxPerStageUniformSampledImages = limits.maxPerStageDescriptorSampledImages, + .maxPerStageUniformStorageImages = limits.maxPerStageDescriptorStorageBuffers, + .maxPerStageUniformInputAttachments = limits.maxPerStageDescriptorInputAttachments, + .maxPerStageResources = limits.maxPerStageResources, + .maxUniformSamplers = limits.maxPerStageDescriptorSamplers, + .maxUniformUniformBuffers = limits.maxDescriptorSetUniformBuffers, + .maxUniformUniformBuffersDynamic = limits.maxDescriptorSetUniformBuffersDynamic, + .maxUniformStorageBuffers = limits.maxDescriptorSetStorageBuffers, + .maxUniformStorageBuffersDynamic = limits.maxDescriptorSetStorageBuffersDynamic, + .maxUniformSampledImages = limits.maxDescriptorSetSampledImages, + .maxUniformStorageImages = limits.maxPerStageDescriptorStorageImages, + .maxUniformInputAttachments = limits.maxDescriptorSetInputAttachments, + .maxVertexInputAttributes = limits.maxVertexInputAttributes, + .maxVertexInputBindings = limits.maxVertexInputBindings, + .maxVertexInputAttributeOffset = limits.maxVertexInputAttributeOffset, + .maxVertexInputBindingStride = limits.maxVertexInputBindingStride, + .maxVertexOutputComponents = limits.maxVertexOutputComponents, + .maxTessellationGenerationLevel = limits.maxTessellationGenerationLevel, + .maxTessellationPatchSize = limits.maxTessellationPatchSize, + .maxTessellationControlPerVertexInputComponents = limits.maxTessellationControlPerVertexInputComponents, + .maxTessellationControlPerVertexOutputComponents = limits.maxTessellationControlPerVertexOutputComponents, + .maxTessellationControlPerPatchOutputComponents = limits.maxTessellationControlPerPatchOutputComponents, + .maxTessellationControlTotalOutputComponents = limits.maxTessellationControlTotalOutputComponents, + .maxTessellationEvaluationInputComponents = limits.maxTessellationEvaluationInputComponents, + .maxTessellationEvaluationOutputComponents = limits.maxTessellationControlPerVertexOutputComponents, + .maxGeometryShaderInvocations = limits.maxGeometryShaderInvocations, + .maxGeometryInputComponents = limits.maxGeometryInputComponents, + .maxGeometryOutputComponents = limits.maxGeometryOutputComponents, + .maxGeometryOutputVertices = limits.maxGeometryOutputVertices, + .maxGeometryTotalOutputComponents = limits.maxGeometryTotalOutputComponents, + .maxFragmentInputComponents = limits.maxFragmentInputComponents, + .maxFragmentOutputAttachments = limits.maxFragmentOutputAttachments, + .maxFragmentDualSrcAttachments = limits.maxFragmentDualSrcAttachments, + .maxFragmentCombinedOutputResources = limits.maxFragmentCombinedOutputResources, + .maxDrawIndexedIndexValue = limits.maxDrawIndexedIndexValue, + .maxDrawIndirectCount = limits.maxDrawIndirectCount, + .maxSamplerLodBias = limits.maxSamplerLodBias, + .maxSamplerAnisotropy = limits.maxSamplerAnisotropy, + .maxViewports = limits.maxViewports, + .maxViewportExtents = { limits.maxViewportDimensions[0], limits.maxViewportDimensions[1] }, + .viewportBoundsRange = { limits.viewportBoundsRange[0], limits.viewportBoundsRange[1] }, + .maxFramebufferExtent = {limits.maxFramebufferWidth, limits.maxFramebufferHeight}, + .maxFramebufferLayers = limits.maxFramebufferLayers, + .framebufferColorSampleCounts = vkSampleCountToGryphn(limits.framebufferColorSampleCounts), + .framebufferDepthSampleCounts = vkSampleCountToGryphn(limits.framebufferDepthSampleCounts), + .framebufferStencilSampleCounts = vkSampleCountToGryphn(limits.framebufferStencilSampleCounts), + .framebufferNoAttachmentsSampleCounts = vkSampleCountToGryphn(limits.framebufferNoAttachmentsSampleCounts), + .maxColorAttachments = limits.maxColorAttachments, + .pointSizeRange = { limits.pointSizeRange[0], limits.pointSizeRange[1] }, + .lineWidthRange = { limits.lineWidthRange[0], limits.lineWidthRange[1] }, + .pointSizeGranularity = limits.pointSizeGranularity, + .lineWidthGranularity = limits.lineWidthGranularity, + .strictLines = limits.strictLines + }; +} + +gnSampleCountFlags vkSampleCountToGryphn(VkSampleCountFlags counts) { + gnSampleCountFlags sampleCount = 0; if ((counts & VK_SAMPLE_COUNT_64_BIT) == VK_SAMPLE_COUNT_64_BIT) { sampleCount |= GN_SAMPLE_BIT_64; } if ((counts & VK_SAMPLE_COUNT_32_BIT) == VK_SAMPLE_COUNT_32_BIT) { sampleCount |= GN_SAMPLE_BIT_32; } if ((counts & VK_SAMPLE_COUNT_16_BIT) == VK_SAMPLE_COUNT_16_BIT) { sampleCount |= GN_SAMPLE_BIT_16; } @@ -37,9 +128,7 @@ gnMultisampleCountFlags vkSampleCountToGryphn(VkSampleCountFlags counts) { return sampleCount; } -#include - -VkSampleCountFlags gnSampleCountToVulkan(gnMultisampleCountFlags counts) { +VkSampleCountFlags gnSampleCountToVulkan(gnSampleCountFlags counts) { VkSampleCountFlags sampleCount = 0; if ((counts & GN_SAMPLE_BIT_64) == GN_SAMPLE_BIT_64) { sampleCount |= VK_SAMPLE_COUNT_64_BIT; } @@ -53,50 +142,50 @@ VkSampleCountFlags gnSampleCountToVulkan(gnMultisampleCountFlags counts) { return sampleCount; } -void vulkanLoadNeededQueues(gnPhysicalDevice physicalDevice) { - vulkanPhysicalDevice* device = (vulkanPhysicalDevice*)physicalDevice; +// void vulkanLoadNeededQueues(gnPhysicalDevice physicalDevice) { +// VkPhysicalDevice device = (VkPhysicalDevice)physicalDevice; - uint32_t queueFamilyCount = 0; - vkGetPhysicalDeviceQueueFamilyProperties(device->device, &queueFamilyCount, NULL); - VkQueueFamilyProperties* queueFamilies = malloc(sizeof(VkQueueFamilyProperties) * queueFamilyCount); - vkGetPhysicalDeviceQueueFamilyProperties(device->device, &queueFamilyCount, queueFamilies); +// uint32_t queueFamilyCount = 0; +// vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, NULL); +// VkQueueFamilyProperties* queueFamilies = malloc(sizeof(VkQueueFamilyProperties) * queueFamilyCount); +// vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies); - device->neededQueues = malloc(sizeof(vulkanNeededQueue) * queueFamilyCount); - for (uint32_t c = 0; c < queueFamilyCount; c++) { - gnBool hasNeededQueue = GN_FALSE; +// device->neededQueues = malloc(sizeof(vulkanNeededQueue) * queueFamilyCount); +// for (uint32_t c = 0; c < queueFamilyCount; c++) { +// gnBool hasNeededQueue = GN_FALSE; - if ((queueFamilies[c].queueFlags & VK_QUEUE_GRAPHICS_BIT) == VK_QUEUE_GRAPHICS_BIT) - hasNeededQueue = GN_TRUE; - if ((queueFamilies[c].queueFlags & VK_QUEUE_TRANSFER_BIT) == VK_QUEUE_TRANSFER_BIT) - hasNeededQueue = GN_TRUE; +// if ((queueFamilies[c].queueFlags & VK_QUEUE_GRAPHICS_BIT) == VK_QUEUE_GRAPHICS_BIT) +// hasNeededQueue = GN_TRUE; +// if ((queueFamilies[c].queueFlags & VK_QUEUE_TRANSFER_BIT) == VK_QUEUE_TRANSFER_BIT) +// hasNeededQueue = GN_TRUE; - if (hasNeededQueue) { - vulkanNeededQueue neededQueue = { - .queueIndex = c, - .createFlags = 0, - .usedForPresent = GN_FALSE - }; - if ((queueFamilies[c].queueFlags & VK_QUEUE_GRAPHICS_BIT)) neededQueue.createFlags |= VK_QUEUE_GRAPHICS_BIT; - if ((queueFamilies[c].queueFlags & VK_QUEUE_TRANSFER_BIT)) neededQueue.createFlags |= VK_QUEUE_TRANSFER_BIT; +// if (hasNeededQueue) { +// vulkanNeededQueue neededQueue = { +// .queueIndex = c, +// .createFlags = 0, +// .usedForPresent = GN_FALSE +// }; +// if ((queueFamilies[c].queueFlags & VK_QUEUE_GRAPHICS_BIT)) neededQueue.createFlags |= VK_QUEUE_GRAPHICS_BIT; +// if ((queueFamilies[c].queueFlags & VK_QUEUE_TRANSFER_BIT)) neededQueue.createFlags |= VK_QUEUE_TRANSFER_BIT; - device->neededQueues[device->neededQueueCount] = neededQueue; - device->neededQueueCount++; - } - } +// device->neededQueues[device->neededQueueCount] = neededQueue; +// device->neededQueueCount++; +// } +// } - free(queueFamilies); -} +// free(queueFamilies); +// } -gnBool deviceCanPresentToSurface(gnPhysicalDevice physicalDevice, gnWindowSurface surface) { - vulkanPhysicalDevice* device = (vulkanPhysicalDevice*)physicalDevice; +// gnBool deviceCanPresentToSurface(gnPhysicalDevice physicalDevice, gnWindowSurface surface) { +// vulkanPhysicalDevice* device = (vulkanPhysicalDevice*)physicalDevice; - uint32_t queueFamilyCount = 0; - vkGetPhysicalDeviceQueueFamilyProperties(device->device, &queueFamilyCount, NULL); - for (uint32_t i = 0; i < queueFamilyCount; i++) { - VkBool32 supportsPresent; - vkGetPhysicalDeviceSurfaceSupportKHR(device->device, i, surface->windowSurface->surface, &supportsPresent); - if (supportsPresent) return GN_TRUE; - } - return GN_FALSE; -} +// uint32_t queueFamilyCount = 0; +// vkGetPhysicalDeviceQueueFamilyProperties(device->device, &queueFamilyCount, NULL); +// for (uint32_t i = 0; i < queueFamilyCount; i++) { +// VkBool32 supportsPresent; +// vkGetPhysicalDeviceSurfaceSupportKHR(device->device, i, surface->windowSurface->surface, &supportsPresent); +// if (supportsPresent) return GN_TRUE; +// } +// return GN_FALSE; +// } 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 52cb7ef..ccd137d 100644 --- a/projects/apis/vulkan/src/output_device/vulkan_physical_device.h +++ b/projects/apis/vulkan/src/output_device/vulkan_physical_device.h @@ -10,7 +10,9 @@ typedef struct vulkanNeededQueue { } vulkanNeededQueue; gnPhysicalDeviceProperties vulkanQueryPhysicalDeviceProperties(gnInstance instance, gnPhysicalDeviceHandle device, gryphnInstanceFunctionLayers* layers); +gnPhysicalDeviceFeatures vulkanQueryPhysicalDeviceFeatures(gnInstance instance, gnPhysicalDeviceHandle device, gryphnInstanceFunctionLayers* layers); +gnPhysicalDeviceLimits vulkanQueryPhysicalDeviceLimits(gnInstance instance, gnPhysicalDeviceHandle device, gryphnInstanceFunctionLayers* layers); gnBool deviceCanPresentToSurface(gnPhysicalDevice device, gnWindowSurface surface); -gnMultisampleCountFlags vkSampleCountToGryphn(VkSampleCountFlags counts); -VkSampleCountFlags gnSampleCountToVulkan(gnMultisampleCountFlags counts); +gnSampleCountFlags vkSampleCountToGryphn(VkSampleCountFlags counts); +VkSampleCountFlags gnSampleCountToVulkan(gnSampleCountFlags counts);