diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index d18ca4d9ebd..f1dea2344ed 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -442,6 +442,7 @@ wsi_swapchain_init(const struct wsi_device *wsi, vk_object_base_init(device, &chain->base, VK_OBJECT_TYPE_SWAPCHAIN_KHR); + chain->create_flags = pCreateInfo->flags; chain->wsi = wsi; chain->device = _device; chain->alloc = *pAllocator; @@ -459,6 +460,9 @@ wsi_swapchain_init(const struct wsi_device *wsi, if (!chain->cmd_pools) return VK_ERROR_OUT_OF_HOST_MEMORY; + const VkCommandPoolCreateFlags cmd_pool_flags = + (pCreateInfo->flags & VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR) ? + VK_COMMAND_POOL_CREATE_PROTECTED_BIT : 0; for (uint32_t i = 0; i < cmd_pools_count; i++) { int queue_family_index = i; @@ -476,7 +480,7 @@ wsi_swapchain_init(const struct wsi_device *wsi, const VkCommandPoolCreateInfo cmd_pool_info = { .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, .pNext = NULL, - .flags = 0, + .flags = cmd_pool_flags, .queueFamilyIndex = queue_family_index, }; result = wsi->CreateCommandPool(_device, &cmd_pool_info, &chain->alloc, @@ -613,9 +617,13 @@ wsi_configure_image(const struct wsi_swapchain *chain, for (uint32_t i = 0; i < pCreateInfo->queueFamilyIndexCount; i++) queue_family_indices[i] = pCreateInfo->pQueueFamilyIndices[i]; + const VkImageCreateFlags protected_flag = + (pCreateInfo->flags & VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR) ? + VK_IMAGE_CREATE_PROTECTED_BIT : 0; + info->create = (VkImageCreateInfo) { .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, - .flags = VK_IMAGE_CREATE_ALIAS_BIT, + .flags = VK_IMAGE_CREATE_ALIAS_BIT | protected_flag, .imageType = VK_IMAGE_TYPE_2D, .format = pCreateInfo->imageFormat, .extent = { @@ -1790,6 +1798,9 @@ wsi_create_buffer_blit_context(const struct wsi_swapchain *chain, const struct wsi_device *wsi = chain->wsi; VkResult result; + const VkBufferUsageFlags create_flags = + (chain->create_flags & VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR) ? + VK_BUFFER_CREATE_PROTECTED_BIT : 0; const VkExternalMemoryBufferCreateInfo buffer_external_info = { .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO, .pNext = NULL, @@ -1798,6 +1809,7 @@ wsi_create_buffer_blit_context(const struct wsi_swapchain *chain, const VkBufferCreateInfo buffer_info = { .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, .pNext = &buffer_external_info, + .flags = create_flags, .size = info->linear_size, .usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT, .sharingMode = VK_SHARING_MODE_EXCLUSIVE, diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h index 849bdc6715f..23981db703c 100644 --- a/src/vulkan/wsi/wsi_common_private.h +++ b/src/vulkan/wsi/wsi_common_private.h @@ -173,6 +173,8 @@ struct wsi_swapchain { const struct wsi_device *wsi; + VkSwapchainCreateFlagsKHR create_flags; + VkDevice device; VkAllocationCallbacks alloc; VkFence* fences;