tbm_surface_h *swapchain_buffers;
+ /* [TEMP] To fix dEQP-VK.wsi.wayland.swapchain.modify.resize crash issue
+ * It will be fixed properly using old_swapchain handle */
+ tbm_surface_h *old_swapchain_buffers;
+
tpl_util_atomic_uint ref_cnt;
};
return TPL_ERROR_INVALID_PARAMETER;
}
+ if (swapchain->old_swapchain_buffers) {
+ TPL_ERR("Should be destroy old_swapchain before create");
+ swapchain->result = TPL_ERROR_INVALID_OPERATION;
+ return TPL_ERROR_INVALID_OPERATION;
+ }
+
if (swapchain->tbm_queue) {
int old_width = tbm_surface_queue_get_width(swapchain->tbm_queue);
int old_height = tbm_surface_queue_get_height(swapchain->tbm_queue);
if (swapchain->swapchain_buffers) {
- int i;
- for (i = 0; i < swapchain->properties.buffer_count; i++) {
- if (swapchain->swapchain_buffers[i]) {
- TPL_INFO("[UNTRACK_BUFFERS]", "[%d] wl_vk_surface(%p) sc(%p) tbm_surface(%p) bo(%d)",
- i, wl_vk_surface, swapchain, swapchain->swapchain_buffers[i],
- _get_tbm_surface_bo_name(swapchain->swapchain_buffers[i]));
- tbm_surface_internal_unref(swapchain->swapchain_buffers[i]);
- swapchain->swapchain_buffers[i] = NULL;
- }
- }
-
- free(swapchain->swapchain_buffers);
+ swapchain->old_swapchain_buffers = swapchain->swapchain_buffers;
swapchain->swapchain_buffers = NULL;
}
swapchain->properties.present_mode = present_mode;
swapchain->wl_vk_surface = wl_vk_surface;
swapchain->properties.format = format;
+ swapchain->swapchain_buffers = NULL;
+ swapchain->old_swapchain_buffers = NULL;
swapchain->result = TPL_ERROR_NONE;
swapchain->create_done = TPL_FALSE;
}
}
+void __untrack_swapchain_buffers(tpl_wl_vk_surface_t *wl_vk_surface, tbm_surface_h *sc_buffers)
+{
+ tpl_wl_vk_swapchain_t *swapchain = wl_vk_surface->swapchain;
+
+ for (int i = 0; i < swapchain->properties.buffer_count; i++) {
+ if (sc_buffers[i]) {
+ TPL_INFO("[UNTRACK_BUFFERS]", "[%d] wl_vk_surface(%p) sc(%p) tbm_surface(%p) bo(%d)",
+ i, wl_vk_surface, swapchain, sc_buffers[i],
+ _get_tbm_surface_bo_name(sc_buffers[i]));
+ tbm_surface_internal_unref(sc_buffers[i]);
+ sc_buffers[i] = NULL;
+ }
+ }
+}
+
static tpl_result_t
__tpl_wl_vk_surface_destroy_swapchain(tpl_surface_t *surface)
{
TPL_INFO("[DESTROY_SWAPCHAIN]",
"wl_vk_surface(%p) swapchain(%p) still valid.",
wl_vk_surface, swapchain);
+ if (swapchain->old_swapchain_buffers) {
+ __untrack_swapchain_buffers(wl_vk_surface, swapchain->old_swapchain_buffers);
+ free(swapchain->old_swapchain_buffers);
+ swapchain->old_swapchain_buffers = NULL;
+ }
return TPL_ERROR_NONE;
}
wl_vk_surface, wl_vk_surface->swapchain);
if (swapchain->swapchain_buffers) {
- for (int i = 0; i < swapchain->properties.buffer_count; i++) {
- if (swapchain->swapchain_buffers[i]) {
- TPL_INFO("[UNTRACK_BUFFERS]", "[%d] wl_vk_surface(%p) sc(%p) tbm_surface(%p) bo(%d)",
- i, wl_vk_surface, swapchain, swapchain->swapchain_buffers[i],
- _get_tbm_surface_bo_name(swapchain->swapchain_buffers[i]));
- tbm_surface_internal_unref(swapchain->swapchain_buffers[i]);
- swapchain->swapchain_buffers[i] = NULL;
- }
- }
-
+ __untrack_swapchain_buffers(wl_vk_surface, swapchain->swapchain_buffers);
free(swapchain->swapchain_buffers);
swapchain->swapchain_buffers = NULL;
}