[Mesa-dev] [PATCH] vulkan/wsi/x11: Fix behavior of vkGetPhysicalDeviceSurfaceFormatsKHR
Eduardo Lima Mitev
elima at igalia.com
Tue Oct 25 09:55:44 UTC 2016
On 10/25/2016 11:25 AM, Dave Airlie wrote:
> Reviewed-by : Dave Airlie <airlied at redhat.com <mailto:airlied at redhat.com>>
>
Thanks Dave. I will merge the patch later in the afternoon.
Eduardo
> On 25 Oct. 2016 18:39, "Eduardo Lima Mitev" <elima at igalia.com
> <mailto:elima at igalia.com>> wrote:
>>
>> x11_surface_get_formats() is currently assering that the number of
>> elements in pSurfaceFormats must be greater or equal than the number
>> of formats available. This is buggy because later that number of
>> elements is copied from the internal formats' array, so if
>> pSurfaceFormatCount 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 579 of the PDF:
>>
>> "If pSurfaceFormats is NULL, then the number of format pairs supported
>> for the given surface is returned in pSurfaceFormatCount. Otherwise,
>> pSurfaceFormatCount must point to a variable set by the user to the
>> number of elements in the pSurfaceFormats array, and on return the
>> variable is overwritten with the number of structures actually
> written
>> to pSurfaceFormats. If the value of pSurfaceFormatCount is less than
>> the number of format pairs supported, at most pSurfaceFormatCount
>> structures will be written. If pSurfaceFormatCount is smaller than
>> the number of format pairs 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 pSurfaceFormatCount is greater than the
>> internal number of formats, then it is clamped to that many formats. But
>> if it is lesser than it, then pSurfaceFormatCount formats are returned,
>> and the call returns VK_INCOMPLETE.
>> ---
>> src/vulkan/wsi/wsi_common_x11.c | 11 ++++++++---
>> 1 file changed, 8 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/vulkan/wsi/wsi_common_x11.c
> b/src/vulkan/wsi/wsi_common_x11.c
>> index b5832c6..548352e 100644
>> --- a/src/vulkan/wsi/wsi_common_x11.c
>> +++ b/src/vulkan/wsi/wsi_common_x11.c
>> @@ -394,11 +394,16 @@ x11_surface_get_formats(VkIcdSurfaceBase *surface,
>> return VK_SUCCESS;
>> }
>>
>> - assert(*pSurfaceFormatCount >= ARRAY_SIZE(formats));
>> + VkResult result = VK_SUCCESS;
>> +
>> + if (*pSurfaceFormatCount > ARRAY_SIZE(formats))
>> + *pSurfaceFormatCount = ARRAY_SIZE(formats);
>> + else if (*pSurfaceFormatCount < ARRAY_SIZE(formats))
>> + result = VK_INCOMPLETE;
>> +
>> typed_memcpy(pSurfaceFormats, formats, *pSurfaceFormatCount);
>> - *pSurfaceFormatCount = ARRAY_SIZE(formats);
>>
>> - return VK_SUCCESS;
>> + return result;
>> }
>>
>> static VkResult
>> --
>> 2.8.1
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org <mailto:mesa-dev at lists.freedesktop.org>
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list