[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