chain->allocator = allocator;
chain->surface = info->surface;
chain->buffers = NULL;
+ chain->oldSwapchain = (vk_swapchain_t *)(uintptr_t)info->oldSwapchain;
+ chain->is_retired = VK_FALSE;
format = get_tbm_format(info->imageFormat, info->compositeAlpha);
VK_CHECK(format, return VK_ERROR_SURFACE_LOST_KHR, "Not supported image format.\n");
{
uint32_t i;
vk_icd_t *icd = vk_get_icd();
+ VkResult res = VK_SUCCESS;
for (i = 0; i < info->swapchainCount; i++) {
- VkResult res = VK_SUCCESS;
int sync_fd = -1;
vk_swapchain_t *chain = (vk_swapchain_t *)(uintptr_t)info->pSwapchains[i];
info->pResults[i] = res;
}
- return VK_SUCCESS;
+ return res;
}
#include "wsi.h"
#include <string.h>
+#include <unistd.h>
typedef struct vk_swapchain_tpl vk_swapchain_tpl_t;
tpl_result_t res;
vk_swapchain_tpl_t *swapchain_tpl = chain->backend_data;
+ if (chain->is_retired == VK_TRUE) {
+ res = tpl_surface_cancel_dequeued_buffer(swapchain_tpl->tpl_surface, tbm_surface);
+ if (res != TPL_ERROR_NONE)
+ VK_ERROR("failed to cancel_dequeued_buffer. tpl_surface(%p) tbm_surface(%p)\n",
+ swapchain_tpl->tpl_surface, tbm_surface);
+ close(sync_fd);
+ return VK_ERROR_OUT_OF_DATE_KHR;
+ }
+
res = tpl_surface_enqueue_buffer_with_damage_and_sync(swapchain_tpl->tpl_surface,
tbm_surface, 0, NULL, sync_fd);
+ if (res == TPL_ERROR_NONE && chain->oldSwapchain != VK_NULL_HANDLE) {
+ chain->oldSwapchain->is_retired = VK_TRUE;
+ chain->oldSwapchain = VK_NULL_HANDLE;
+ }
+
return res == TPL_ERROR_NONE ? VK_SUCCESS : VK_ERROR_DEVICE_LOST;
}
swapchain_tpl = vk_alloc(chain->allocator, sizeof(vk_swapchain_tpl_t),
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
- VK_CHECK(swapchain_tpl, return VK_ERROR_OUT_OF_HOST_MEMORY, "vk_alloc() failed.\n");
+ VK_CHECK(swapchain_tpl, goto error, "vk_alloc() failed.\n");
memset(swapchain_tpl, 0x00, sizeof(*swapchain_tpl));
chain->backend_data = swapchain_tpl;
swapchain_tpl->tpl_surface = tpl_surface_get(swapchain_tpl->tpl_display,
native_window);
- if (swapchain_tpl->tpl_surface)
+ if (swapchain_tpl->tpl_surface && chain->oldSwapchain == VK_NULL_HANDLE)
tpl_object_reference((tpl_object_t *)swapchain_tpl->tpl_surface);
else
swapchain_tpl->tpl_surface = tpl_surface_create(swapchain_tpl->tpl_display,
return VK_SUCCESS;
error:
- if (swapchain_tpl->tpl_display)
- tpl_object_unreference((tpl_object_t *)swapchain_tpl->tpl_display);
+ if (swapchain_tpl) {
+ if (swapchain_tpl->tpl_display)
+ tpl_object_unreference((tpl_object_t *)swapchain_tpl->tpl_display);
+
+ if (swapchain_tpl->tpl_surface)
+ tpl_object_unreference((tpl_object_t *)swapchain_tpl->tpl_surface);
- if (swapchain_tpl->tpl_surface)
- tpl_object_unreference((tpl_object_t *)swapchain_tpl->tpl_surface);
+ vk_free(chain->allocator, swapchain_tpl);
+ } else {
+ error = VK_ERROR_OUT_OF_HOST_MEMORY;
+ }
return error;
}