From d26695607b25491ee98384d7f7f17b1f2eab72e1 Mon Sep 17 00:00:00 2001 From: Florian RICHER Date: Sat, 24 May 2025 16:32:09 +0200 Subject: [PATCH] Queue: Respect queueCount of Queue Family Properties --- .../QueueFamilyRequirementsValidator.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/mrdev023/vulkan_java/vk/validators/QueueFamilyRequirementsValidator.java b/src/main/java/fr/mrdev023/vulkan_java/vk/validators/QueueFamilyRequirementsValidator.java index f9ffec7..20df616 100644 --- a/src/main/java/fr/mrdev023/vulkan_java/vk/validators/QueueFamilyRequirementsValidator.java +++ b/src/main/java/fr/mrdev023/vulkan_java/vk/validators/QueueFamilyRequirementsValidator.java @@ -35,25 +35,34 @@ public class QueueFamilyRequirementsValidator { for (int i = 0; i < vkQueueFamilyProps.capacity(); i++) { var vkQueueFamilyProp = vkQueueFamilyProps.get(i); + int availableQueue = vkQueueFamilyProp.queueCount(); - if (hasRequiredFlag(VK10.VK_QUEUE_GRAPHICS_BIT) && queueFlagIsSupported(vkQueueFamilyProp)) { + if (hasRequiredFlag(VK10.VK_QUEUE_GRAPHICS_BIT) && queueFlagIsSupported(vkQueueFamilyProp) + && availableQueue > 0) { queueFamilyIndicesBuilder.withGraphicsQueueFamilyIndex(i); requiredQueueFlags &= ~VK10.VK_QUEUE_GRAPHICS_BIT; // Consume the flag + availableQueue--; } - if (hasRequiredFlag(VK10.VK_QUEUE_COMPUTE_BIT) && queueFlagIsSupported(vkQueueFamilyProp)) { + if (hasRequiredFlag(VK10.VK_QUEUE_COMPUTE_BIT) && queueFlagIsSupported(vkQueueFamilyProp) + && availableQueue > 0) { queueFamilyIndicesBuilder.withComputeQueueFamilyIndex(i); requiredQueueFlags &= ~VK10.VK_QUEUE_COMPUTE_BIT; // Consume the flag + availableQueue--; } - if (hasRequiredFlag(VK10.VK_QUEUE_TRANSFER_BIT) && queueFlagIsSupported(vkQueueFamilyProp)) { + if (hasRequiredFlag(VK10.VK_QUEUE_TRANSFER_BIT) && queueFlagIsSupported(vkQueueFamilyProp) + && availableQueue > 0) { queueFamilyIndicesBuilder.withTransferQueueFamilyIndex(i); requiredQueueFlags &= ~VK10.VK_QUEUE_TRANSFER_BIT; // Consume the flag + availableQueue--; } - if (surface.isPresent() && isSurfaceSupported(surface.get(), physicalDevice, i)) { + if (surface.isPresent() && isSurfaceSupported(surface.get(), physicalDevice, i) + && availableQueue > 0) { queueFamilyIndicesBuilder.withPresentQueueFamilyIndex(i); surface = Optional.empty(); // Consume the surface + availableQueue--; } if (requiredQueueFlags == 0 && surface.isEmpty()) {