diff options
Diffstat (limited to 'src/intel/vulkan/anv_wsi_x11.c')
-rw-r--r-- | src/intel/vulkan/anv_wsi_x11.c | 139 |
1 files changed, 17 insertions, 122 deletions
diff --git a/src/intel/vulkan/anv_wsi_x11.c b/src/intel/vulkan/anv_wsi_x11.c index 8f9f7418090..54fe05701b9 100644 --- a/src/intel/vulkan/anv_wsi_x11.c +++ b/src/intel/vulkan/anv_wsi_x11.c @@ -439,6 +439,7 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *surface, struct anv_device *device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, + const struct anv_wsi_image_fns *image_fns, struct anv_swapchain **swapchain); VkResult anv_CreateXcbSurfaceKHR( @@ -652,115 +653,6 @@ x11_queue_present(struct anv_swapchain *anv_chain, } static VkResult -x11_anv_create_image(VkDevice device_h, - struct x11_swapchain *chain, - const VkSwapchainCreateInfoKHR *pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkImage *image_p, - VkDeviceMemory *memory_p, - uint32_t *size, - uint32_t *row_pitch, int *fd_p) -{ - struct anv_device *device = anv_device_from_handle(device_h); - VkImage image_h; - struct anv_image *image; - - VkResult result; - result = anv_image_create(anv_device_to_handle(device), - &(struct anv_image_create_info) { - .isl_tiling_flags = ISL_TILING_X_BIT, - .stride = 0, - .vk_info = - &(VkImageCreateInfo) { - .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, - .imageType = VK_IMAGE_TYPE_2D, - .format = pCreateInfo->imageFormat, - .extent = { - .width = pCreateInfo->imageExtent.width, - .height = pCreateInfo->imageExtent.height, - .depth = 1 - }, - .mipLevels = 1, - .arrayLayers = 1, - .samples = 1, - /* FIXME: Need a way to use X tiling to allow scanout */ - .tiling = VK_IMAGE_TILING_OPTIMAL, - .usage = (pCreateInfo->imageUsage | - VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT), - .flags = 0, - }}, - NULL, - &image_h); - if (result != VK_SUCCESS) - return result; - - image = anv_image_from_handle(image_h); - assert(vk_format_is_color(image->vk_format)); - - VkDeviceMemory memory_h; - struct anv_device_memory *memory; - result = anv_AllocateMemory(anv_device_to_handle(device), - &(VkMemoryAllocateInfo) { - .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, - .allocationSize = image->size, - .memoryTypeIndex = 0, - }, - NULL /* XXX: pAllocator */, - &memory_h); - if (result != VK_SUCCESS) - goto fail_create_image; - - memory = anv_device_memory_from_handle(memory_h); - memory->bo.is_winsys_bo = true; - - anv_BindImageMemory(VK_NULL_HANDLE, image_h, memory_h, 0); - - struct anv_surface *surface = &image->color_surface; - assert(surface->isl.tiling == ISL_TILING_X); - - *row_pitch = surface->isl.row_pitch; - int ret = anv_gem_set_tiling(device, memory->bo.gem_handle, - surface->isl.row_pitch, I915_TILING_X); - if (ret) { - /* FINISHME: Choose a better error. */ - result = vk_errorf(VK_ERROR_OUT_OF_DEVICE_MEMORY, - "set_tiling failed: %m"); - goto fail_alloc_memory; - } - - int fd = anv_gem_handle_to_fd(device, memory->bo.gem_handle); - if (fd == -1) { - /* FINISHME: Choose a better error. */ - result = vk_errorf(VK_ERROR_OUT_OF_DEVICE_MEMORY, - "handle_to_fd failed: %m"); - goto fail_alloc_memory; - } - - *image_p = image_h; - *memory_p = memory_h; - *fd_p = fd; - *size = image->size; - return VK_SUCCESS; -fail_alloc_memory: - anv_FreeMemory(device_h, memory_h, pAllocator); - -fail_create_image: - anv_DestroyImage(device_h, image_h, pAllocator); - return result; -} - -static void -x11_anv_free_image(VkDevice device, - const VkAllocationCallbacks* pAllocator) - VkImage image_h, - VkDeviceMemory memory_h) -{ - anv_DestroyImage(device, image_h, pAllocator); - - anv_FreeMemory(device, memory_h, pAllocator); -} - -static VkResult x11_image_init(VkDevice device_h, struct x11_swapchain *chain, const VkSwapchainCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks* pAllocator, @@ -769,19 +661,21 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain, xcb_void_cookie_t cookie; VkResult result; uint32_t row_pitch; + uint32_t offset; uint32_t bpp = 32; uint32_t depth = 24; int fd; uint32_t size; - result = x11_anv_create_image(device_h, - pCreateInfo, - pAllocator, - &image->image, - &image->memory, - &size, - &row_pitch, - &fd); + result = chain->base.image_fns->create_wsi_image(device_h, + pCreateInfo, + pAllocator, + &image->image, + &image->memory, + &size, + &offset, + &row_pitch, + &fd); if (result != VK_SUCCESS) return result; @@ -825,8 +719,8 @@ fail_pixmap: cookie = xcb_free_pixmap(chain->conn, image->pixmap); xcb_discard_reply(chain->conn, cookie.sequence); - x11_anv_free_image(device_h, pAllocator, - image->image, image->memory); + chain->base.image_fns->free_wsi_image(device_h, pAllocator, + image->image, image->memory); return result; } @@ -844,8 +738,8 @@ x11_image_finish(struct x11_swapchain *chain, cookie = xcb_free_pixmap(chain->conn, image->pixmap); xcb_discard_reply(chain->conn, cookie.sequence); - x11_anv_free_image(chain->base.device, pAllocator, - image->image, image->memory); + chain->base.image_fns->free_wsi_image(chain->base.device, pAllocator, + image->image, image->memory); } static VkResult @@ -869,6 +763,7 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, struct anv_device *device, const VkSwapchainCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks* pAllocator, + const struct anv_wsi_image_fns *image_fns, struct anv_swapchain **swapchain_out) { struct x11_swapchain *chain; @@ -899,7 +794,7 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, chain->base.get_images = x11_get_images; chain->base.acquire_next_image = x11_acquire_next_image; chain->base.queue_present = x11_queue_present; - + chain->base.image_fns = image_fns; chain->conn = x11_surface_get_connection(icd_surface); chain->window = x11_surface_get_window(icd_surface); chain->extent = pCreateInfo->imageExtent; |