- ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface);
- struct wsi_interface *iface = device->wsi_device.wsi[surface->platform];
-
- return iface->get_present_modes(surface, pPresentModeCount,
- pPresentModes);
-}
-
-
-static VkResult
-anv_wsi_image_create(VkDevice device_h,
- const VkSwapchainCreateInfoKHR *pCreateInfo,
- const VkAllocationCallbacks* pAllocator,
- bool different_gpu,
- bool linear,
- VkImage *image_p,
- VkDeviceMemory *memory_p,
- uint32_t *size,
- uint32_t *offset,
- 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->planes[0].surface.isl.size,
- .memoryTypeIndex = 0,
- },
- NULL /* XXX: pAllocator */,
- &memory_h);
- if (result != VK_SUCCESS)
- goto fail_create_image;
-
- memory = anv_device_memory_from_handle(memory_h);
-
- /* We need to set the WRITE flag on window system buffers so that GEM will
- * know we're writing to them and synchronize uses on other rings (eg if
- * the display server uses the blitter ring).
- */
- memory->bo->flags &= ~EXEC_OBJECT_ASYNC;
- memory->bo->flags |= EXEC_OBJECT_WRITE;
-
- anv_BindImageMemory(device_h, image_h, memory_h, 0);
-
- struct anv_surface *surface = &image->planes[0].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(device->instance, device,
- 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(device->instance, device,
- 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->planes[0].surface.isl.size;
- *offset = image->planes[0].surface.offset;
- 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
-anv_wsi_image_free(VkDevice device,
- const VkAllocationCallbacks* pAllocator,
- VkImage image_h,
- VkDeviceMemory memory_h)
-{
- anv_DestroyImage(device, image_h, pAllocator);