-static VkResult
-radv_wsi_create_prime_command_buffers(struct radv_device *device,
- const VkAllocationCallbacks *alloc,
- struct wsi_swapchain *swapchain)
-{
- const int num_pools = NUM_PRIME_POOLS;
- const int num_images = swapchain->image_count;
- int num_cmd_buffers = num_images * num_pools; //TODO bump to MAX_QUEUE_FAMILIES
- VkResult result;
- int i, j;
-
- swapchain->cmd_buffers = vk_alloc(alloc, (sizeof(VkCommandBuffer) * num_cmd_buffers), 8,
- VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
- if (!swapchain->cmd_buffers)
- return VK_ERROR_OUT_OF_HOST_MEMORY;
-
- memset(swapchain->cmd_buffers, 0, sizeof(VkCommandBuffer) * num_cmd_buffers);
- memset(swapchain->cmd_pools, 0, sizeof(VkCommandPool) * num_pools);
- for (i = 0; i < num_pools; i++) {
- VkCommandPoolCreateInfo pool_create_info;
-
- pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
- pool_create_info.pNext = NULL;
- pool_create_info.flags = 0;
- pool_create_info.queueFamilyIndex = i;
-
- result = radv_CreateCommandPool(radv_device_to_handle(device),
- &pool_create_info, alloc,
- &swapchain->cmd_pools[i]);
- if (result != VK_SUCCESS)
- goto fail;
-
- VkCommandBufferAllocateInfo cmd_buffer_info;
- cmd_buffer_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
- cmd_buffer_info.pNext = NULL;
- cmd_buffer_info.commandPool = swapchain->cmd_pools[i];
- cmd_buffer_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
- cmd_buffer_info.commandBufferCount = num_images;
-
- result = radv_AllocateCommandBuffers(radv_device_to_handle(device),
- &cmd_buffer_info,
- &swapchain->cmd_buffers[i * num_images]);
- if (result != VK_SUCCESS)
- goto fail;
- for (j = 0; j < num_images; j++) {
- VkImage image, linear_image;
- int idx = (i * num_images) + j;
-
- swapchain->get_image_and_linear(swapchain, j, &image, &linear_image);
- VkCommandBufferBeginInfo begin_info = {0};
-
- begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
-
- radv_BeginCommandBuffer(swapchain->cmd_buffers[idx], &begin_info);
-
- radv_blit_to_prime_linear(radv_cmd_buffer_from_handle(swapchain->cmd_buffers[idx]),
- radv_image_from_handle(image),
- radv_image_from_handle(linear_image));
-
- radv_EndCommandBuffer(swapchain->cmd_buffers[idx]);
- }
- }
- return VK_SUCCESS;
-fail:
- radv_wsi_free_prime_command_buffers(device, swapchain);
- return result;