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()) {