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 <[email protected]> > --- > 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 > _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
