X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Famd%2Fvulkan%2Fradv_wsi.c;h=0c9c8593783069556c57ded512e1c59b60d1bf5e;hb=55d8022878fd11093c861a6386734f88454f21b1;hp=2840b6667273d53fb58498f46cf49287218630b6;hpb=da997ebec92942193955386535813374286b7fb1;p=mesa.git diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c index 2840b666727..0c9c8593783 100644 --- a/src/amd/vulkan/radv_wsi.c +++ b/src/amd/vulkan/radv_wsi.c @@ -32,17 +32,37 @@ static PFN_vkVoidFunction radv_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName) { - return radv_lookup_entrypoint_unchecked(pName); + return radv_lookup_entrypoint(pName); +} + +static void +radv_wsi_set_memory_ownership(VkDevice _device, + VkDeviceMemory _mem, + VkBool32 ownership) +{ + RADV_FROM_HANDLE(radv_device, device, _device); + RADV_FROM_HANDLE(radv_device_memory, mem, _mem); + + if (ownership) + radv_bo_list_add(device, mem->bo); + else + radv_bo_list_remove(device, mem->bo); } VkResult radv_init_wsi(struct radv_physical_device *physical_device) { - return wsi_device_init(&physical_device->wsi_device, - radv_physical_device_to_handle(physical_device), - radv_wsi_proc_addr, - &physical_device->instance->alloc, - physical_device->master_fd); + VkResult result = wsi_device_init(&physical_device->wsi_device, + radv_physical_device_to_handle(physical_device), + radv_wsi_proc_addr, + &physical_device->instance->alloc, + physical_device->master_fd, + &physical_device->instance->dri_options); + if (result != VK_SUCCESS) + return result; + + physical_device->wsi_device.set_memory_ownership = radv_wsi_set_memory_ownership; + return VK_SUCCESS; } void @@ -72,10 +92,8 @@ VkResult radv_GetPhysicalDeviceSurfaceSupportKHR( RADV_FROM_HANDLE(radv_physical_device, device, physicalDevice); return wsi_common_get_surface_support(&device->wsi_device, - device->local_fd, queueFamilyIndex, surface, - &device->instance->alloc, pSupported); } @@ -103,6 +121,18 @@ VkResult radv_GetPhysicalDeviceSurfaceCapabilities2KHR( pSurfaceCapabilities); } +VkResult radv_GetPhysicalDeviceSurfaceCapabilities2EXT( + VkPhysicalDevice physicalDevice, + VkSurfaceKHR surface, + VkSurfaceCapabilities2EXT* pSurfaceCapabilities) +{ + RADV_FROM_HANDLE(radv_physical_device, device, physicalDevice); + + return wsi_common_get_surface_capabilities2ext(&device->wsi_device, + surface, + pSurfaceCapabilities); +} + VkResult radv_GetPhysicalDeviceSurfaceFormatsKHR( VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, @@ -156,11 +186,10 @@ VkResult radv_CreateSwapchainKHR( if (pAllocator) alloc = pAllocator; else - alloc = &device->alloc; + alloc = &device->vk.alloc; return wsi_common_create_swapchain(&device->physical_device->wsi_device, radv_device_to_handle(device), - device->physical_device->local_fd, pCreateInfo, alloc, pSwapchain); @@ -177,7 +206,7 @@ void radv_DestroySwapchainKHR( if (pAllocator) alloc = pAllocator; else - alloc = &device->alloc; + alloc = &device->vk.alloc; wsi_common_destroy_swapchain(_device, swapchain, alloc); } @@ -194,31 +223,75 @@ VkResult radv_GetSwapchainImagesKHR( } VkResult radv_AcquireNextImageKHR( - VkDevice _device, + VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, - VkFence _fence, + VkFence fence, + uint32_t* pImageIndex) +{ + VkAcquireNextImageInfoKHR acquire_info = { + .sType = VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR, + .swapchain = swapchain, + .timeout = timeout, + .semaphore = semaphore, + .fence = fence, + .deviceMask = 0, + }; + + return radv_AcquireNextImage2KHR(device, &acquire_info, pImageIndex); +} + +VkResult radv_AcquireNextImage2KHR( + VkDevice _device, + const VkAcquireNextImageInfoKHR* pAcquireInfo, uint32_t* pImageIndex) { RADV_FROM_HANDLE(radv_device, device, _device); struct radv_physical_device *pdevice = device->physical_device; - RADV_FROM_HANDLE(radv_fence, fence, _fence); - - VkResult result = wsi_common_acquire_next_image(&pdevice->wsi_device, - _device, - swapchain, - timeout, - semaphore, - pImageIndex); - - if (fence && (result == VK_SUCCESS || result == VK_SUBOPTIMAL_KHR)) { - fence->submitted = true; - fence->signalled = true; - if (fence->temp_syncobj) { - device->ws->signal_syncobj(device->ws, fence->temp_syncobj); - } else if (fence->syncobj) { - device->ws->signal_syncobj(device->ws, fence->syncobj); + RADV_FROM_HANDLE(radv_fence, fence, pAcquireInfo->fence); + RADV_FROM_HANDLE(radv_semaphore, semaphore, pAcquireInfo->semaphore); + + VkResult result = wsi_common_acquire_next_image2(&pdevice->wsi_device, + _device, + pAcquireInfo, + pImageIndex); + + if (result == VK_SUCCESS || result == VK_SUBOPTIMAL_KHR) { + if (fence) { + struct radv_fence_part *part = + fence->temporary.kind != RADV_FENCE_NONE ? + &fence->temporary : &fence->permanent; + + switch (part->kind) { + case RADV_FENCE_NONE: + break; + case RADV_FENCE_WINSYS: + device->ws->signal_fence(part->fence); + break; + case RADV_FENCE_SYNCOBJ: + device->ws->signal_syncobj(device->ws, part->syncobj, 0); + break; + default: + unreachable("Invalid WSI fence type"); + } + } + if (semaphore) { + struct radv_semaphore_part *part = + semaphore->temporary.kind != RADV_SEMAPHORE_NONE ? + &semaphore->temporary : &semaphore->permanent; + + switch (part->kind) { + case RADV_SEMAPHORE_NONE: + case RADV_SEMAPHORE_WINSYS: + /* Do not need to do anything. */ + break; + case RADV_SEMAPHORE_TIMELINE: + unreachable("WSI only allows binary semaphores."); + case RADV_SEMAPHORE_SYNCOBJ: + device->ws->signal_syncobj(device->ws, part->syncobj, 0); + break; + } } } return result; @@ -231,9 +304,9 @@ VkResult radv_QueuePresentKHR( RADV_FROM_HANDLE(radv_queue, queue, _queue); return wsi_common_queue_present(&queue->device->physical_device->wsi_device, radv_device_to_handle(queue->device), - _queue, - queue->queue_family_index, - pPresentInfo); + _queue, + queue->queue_family_index, + pPresentInfo); } @@ -258,3 +331,16 @@ VkResult radv_GetDeviceGroupSurfacePresentModesKHR( return VK_SUCCESS; } + +VkResult radv_GetPhysicalDevicePresentRectanglesKHR( + VkPhysicalDevice physicalDevice, + VkSurfaceKHR surface, + uint32_t* pRectCount, + VkRect2D* pRects) +{ + RADV_FROM_HANDLE(radv_physical_device, device, physicalDevice); + + return wsi_common_get_present_rectangles(&device->wsi_device, + surface, + pRectCount, pRects); +}