diff options
-rw-r--r-- | src/amd/vulkan/radv_device.c | 4 | ||||
-rw-r--r-- | src/amd/vulkan/radv_entrypoints_gen.py | 1 | ||||
-rw-r--r-- | src/amd/vulkan/radv_wsi.c | 11 |
3 files changed, 15 insertions, 1 deletions
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 24219e4ec4f..a0d640718a3 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -92,6 +92,10 @@ static const VkExtensionProperties instance_extensions[] = { static const VkExtensionProperties common_device_extensions[] = { { + .extensionName = VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME, + .specVersion = 1, + }, + { .extensionName = VK_KHR_MAINTENANCE1_EXTENSION_NAME, .specVersion = 1, }, diff --git a/src/amd/vulkan/radv_entrypoints_gen.py b/src/amd/vulkan/radv_entrypoints_gen.py index b7b2bcf97e4..bee29dc1202 100644 --- a/src/amd/vulkan/radv_entrypoints_gen.py +++ b/src/amd/vulkan/radv_entrypoints_gen.py @@ -31,6 +31,7 @@ supported_extensions = [ 'VK_AMD_draw_indirect_count', 'VK_NV_dedicated_allocation', 'VK_KHR_get_physical_device_properties2', + 'VK_KHR_incremental_present', 'VK_KHR_maintenance1', 'VK_KHR_sampler_mirror_clamp_to_edge', 'VK_KHR_shader_draw_parameters', diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c index 8b66095b263..b8999f4eb02 100644 --- a/src/amd/vulkan/radv_wsi.c +++ b/src/amd/vulkan/radv_wsi.c @@ -26,6 +26,7 @@ #include "radv_private.h" #include "radv_meta.h" #include "wsi_common.h" +#include "util/vk_util.h" static const struct wsi_callbacks wsi_cbs = { .get_phys_device_format_properties = radv_GetPhysicalDeviceFormatProperties, @@ -452,9 +453,14 @@ VkResult radv_QueuePresentKHR( RADV_FROM_HANDLE(radv_queue, queue, _queue); VkResult result = VK_SUCCESS; + const VkPresentRegionsKHR *regions = + vk_find_struct_const(pPresentInfo->pNext, PRESENT_REGIONS_KHR); + for (uint32_t i = 0; i < pPresentInfo->swapchainCount; i++) { RADV_FROM_HANDLE(wsi_swapchain, swapchain, pPresentInfo->pSwapchains[i]); struct radeon_winsys_cs *cs; + const VkPresentRegionKHR *region = NULL; + assert(radv_device_from_handle(swapchain->device) == queue->device); if (swapchain->fences[0] == VK_NULL_HANDLE) { result = radv_CreateFence(radv_device_to_handle(queue->device), @@ -484,9 +490,12 @@ VkResult radv_QueuePresentKHR( pPresentInfo->waitSemaphoreCount, NULL, 0, false, base_fence); fence->submitted = true; + if (regions && regions->pRegions) + region = ®ions->pRegions[i]; + result = swapchain->queue_present(swapchain, pPresentInfo->pImageIndices[i], - NULL); + region); /* TODO: What if one of them returns OUT_OF_DATE? */ if (result != VK_SUCCESS) return result; |