From 2b2cb6fefd35355b6ce4db3d46ca04949e4fad4e Mon Sep 17 00:00:00 2001 From: grovesNL Date: Mon, 9 Apr 2018 23:23:58 -0600 Subject: [PATCH] Return VK_INCOMPLETE for partial physical device enumeration --- libportability-gfx/src/impls.rs | 16 ++++++++++++---- libportability-gfx/src/lib.rs | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/libportability-gfx/src/impls.rs b/libportability-gfx/src/impls.rs index 1ef1cd6..1f23f17 100644 --- a/libportability-gfx/src/impls.rs +++ b/libportability-gfx/src/impls.rs @@ -69,18 +69,26 @@ pub extern "C" fn gfxEnumeratePhysicalDevices( pPhysicalDeviceCount: *mut u32, pPhysicalDevices: *mut VkPhysicalDevice, ) -> VkResult { + let num_adapters = instance.adapters.len(); + // If NULL, number of devices is returned. if pPhysicalDevices.is_null() { - unsafe { *pPhysicalDeviceCount = instance.adapters.len() as _ }; + unsafe { *pPhysicalDeviceCount = num_adapters as _ }; return VkResult::VK_SUCCESS; } let output = unsafe { slice::from_raw_parts_mut(pPhysicalDevices, *pPhysicalDeviceCount as _) }; - let count = cmp::min(instance.adapters.len(), output.len()); + let num_output = output.len(); + let (code, count) = if num_output < num_adapters { + (VkResult::VK_INCOMPLETE, num_output) + } else { + (VkResult::VK_SUCCESS, num_adapters) + }; + output.copy_from_slice(&instance.adapters[..count]); - unsafe { *pPhysicalDeviceCount = count as _ }; - VkResult::VK_SUCCESS + + code } #[inline] diff --git a/libportability-gfx/src/lib.rs b/libportability-gfx/src/lib.rs index 5acbad7..669a1b6 100644 --- a/libportability-gfx/src/lib.rs +++ b/libportability-gfx/src/lib.rs @@ -25,7 +25,7 @@ mod impls; use back::Backend as B; use handle::{DispatchHandle, Handle}; -use std::{cmp, slice}; +use std::{slice}; use std::collections::HashMap; pub use impls::*;