From 17df75d47d706232b30b34baeeb43a15311777db Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Fri, 7 Apr 2023 15:45:45 +0200 Subject: [PATCH] vulkan: Sanitize pSampleMask in CmdSetSampleMaskEXT ms.sample_mask is only 16b, while VkSampleMask is 32b and it is allowed to have all of them set even if maximum 16 samples are supported. E.g. happens with Zink running supertuxkart: supertuxkart: ../../../source/mesa/src/vulkan/runtime/vk_graphics_state.c:2346: vk_common_CmdSetSampleMaskEXT: Assertion `(dyn)->ms.sample_mask == (*pSampleMask)' failed. vk_common_CmdSetSampleMaskEXT (commandBuffer=0x5556e903f0, samples=VK_SAMPLE_COUNT_1_BIT, pSampleMask=0x5556819ccc) at vk_graphics_state.c:2346 zink_draw<(zink_multidraw)1, (zink_dynamic_state)5, true, false> (...) at zink_draw.cpp:639 zink_draw_vbo<(zink_multidraw)1, (zink_dynamic_state)5, true> (...) at zink_draw.cpp:922 Signed-off-by: Danylo Piliaiev Reviewed-by: Faith Ekstrand Part-of: --- src/vulkan/runtime/vk_graphics_state.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vulkan/runtime/vk_graphics_state.c b/src/vulkan/runtime/vk_graphics_state.c index 444cb17..3078d54 100644 --- a/src/vulkan/runtime/vk_graphics_state.c +++ b/src/vulkan/runtime/vk_graphics_state.c @@ -2222,8 +2222,9 @@ vk_common_CmdSetSampleMaskEXT(VkCommandBuffer commandBuffer, struct vk_dynamic_graphics_state *dyn = &cmd->dynamic_graphics_state; assert(samples <= MESA_VK_MAX_SAMPLES); + VkSampleMask sample_mask = *pSampleMask & BITFIELD_MASK(MESA_VK_MAX_SAMPLES); - SET_DYN_VALUE(dyn, MS_SAMPLE_MASK, ms.sample_mask, *pSampleMask); + SET_DYN_VALUE(dyn, MS_SAMPLE_MASK, ms.sample_mask, sample_mask); } VKAPI_ATTR void VKAPI_CALL -- 2.7.4