[Mesa-dev] [PATCH 1/2] vulkan/wsi/x11: Fix behavior of vkGetPhysicalDeviceSurfacePresentModesKHR

Eric Engestrom eric.engestrom at imgtec.com
Fri Oct 28 13:26:22 UTC 2016


On Friday, 2016-10-28 14:55:00 +0200, Eduardo Lima Mitev wrote:
> x11_surface_get_present_modes() is currently asserting that the number of
> elements in pPresentModeCount must be greater than or equal to the number
> of present modes available. This is buggy because pPresentModeCount
> elements are later copied from the internal modes' array, so if
> pPresentModeCount is greater, it will overflow it.
> 
> On top of that, this assertion violates the spec. From the Vulkan 1.0
> (revision 32, with KHR extensions), page 581 of the PDF:
> 
>     "If the value of pPresentModeCount is less than the number of
>      presentation modes supported, at most pPresentModeCount values will be
>      written. If pPresentModeCount is smaller than the number of
>      presentation modes supported for the given surface, VK_INCOMPLETE
>      will be returned instead of VK_SUCCESS to indicate that not all the
>      available values were returned."
> 
> So, the correct behavior is: if pPresentModeCount is greater than the
> internal number of formats, it is clamped to that many present modes. But
> if it is lesser than that, then pPresentModeCount elements are copied,
> and the call returns VK_INCOMPLETE.
> 
> This fix is similar (but simpler and more readable) than the one I provided
> in 750d8cad72a for vkGetPhysicalDeviceSurfaceFormatsKHR, which was suffering
> from the same problem.

Series is:
Reviewed-by: Eric Engestrom <eric.engestrom at imgtec.com>

> ---
>  src/vulkan/wsi/wsi_common_x11.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
> index efd3fb5..4a232f5 100644
> --- a/src/vulkan/wsi/wsi_common_x11.c
> +++ b/src/vulkan/wsi/wsi_common_x11.c
> @@ -418,11 +418,11 @@ x11_surface_get_present_modes(VkIcdSurfaceBase *surface,
>        return VK_SUCCESS;
>     }
>  
> -   assert(*pPresentModeCount >= ARRAY_SIZE(present_modes));
> +   *pPresentModeCount = MIN2(*pPresentModeCount, ARRAY_SIZE(present_modes));
>     typed_memcpy(pPresentModes, present_modes, *pPresentModeCount);
> -   *pPresentModeCount = ARRAY_SIZE(present_modes);
>  
> -   return VK_SUCCESS;
> +   return *pPresentModeCount < ARRAY_SIZE(present_modes) ?
> +      VK_INCOMPLETE : VK_SUCCESS;
>  }
>  
>  VkResult wsi_create_xcb_surface(const VkAllocationCallbacks *pAllocator,
> -- 
> 2.8.1
> 


More information about the mesa-dev mailing list