From ffabffed95a424f3a6b180304076e750c79aa859 Mon Sep 17 00:00:00 2001 From: Xuelian Bai Date: Mon, 30 Sep 2024 11:11:44 +0800 Subject: [PATCH] Fix issues for angle immediate mode 1. Add three supported present mode 2. Increment ref_cnt only when new swapchain is created, or swapchain ref_cnt when recreation will always be set to 0 Change-Id: I9c94721c86676bc72b0965ede8fa9467a97e1061 Signed-off-by: Xuelian Bai --- src/tpl_display.c | 3 +-- src/tpl_wl_vk_thread.c | 20 ++++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/tpl_display.c b/src/tpl_display.c index fe7dbaf..c49b2b8 100644 --- a/src/tpl_display.c +++ b/src/tpl_display.c @@ -229,6 +229,5 @@ tpl_display_query_supported_present_modes_from_native_window(tpl_display_t *disp return TPL_ERROR_INVALID_OPERATION; } - return display->backend.query_window_supported_present_modes(display, window, - modes); + return display->backend.query_window_supported_present_modes(display, window, modes); } diff --git a/src/tpl_wl_vk_thread.c b/src/tpl_wl_vk_thread.c index 9c96a3e..fc95001 100644 --- a/src/tpl_wl_vk_thread.c +++ b/src/tpl_wl_vk_thread.c @@ -75,7 +75,7 @@ struct _tpl_wl_vk_display { /* device surface capabilities */ int min_buffer; int max_buffer; - int present_modes; + int supported_present_modes; #if TIZEN_FEATURE_ENABLE struct zwp_linux_explicit_synchronization_v1 *explicit_sync; /* for explicit fence sync */ #endif @@ -769,7 +769,9 @@ __tpl_wl_vk_display_init(tpl_display_t *display) /* Vulkan specific surface capabilities */ wl_vk_display->min_buffer = 2; wl_vk_display->max_buffer = VK_CLIENT_QUEUE_SIZE; - wl_vk_display->present_modes = TPL_DISPLAY_PRESENT_MODE_FIFO; + wl_vk_display->supported_present_modes |= TPL_DISPLAY_PRESENT_MODE_IMMEDIATE; + wl_vk_display->supported_present_modes |= TPL_DISPLAY_PRESENT_MODE_MAILBOX; + wl_vk_display->supported_present_modes |= TPL_DISPLAY_PRESENT_MODE_FIFO; wl_vk_display->use_wait_vblank = TPL_TRUE; // default enabled { @@ -999,9 +1001,8 @@ __tpl_wl_vk_display_query_window_supported_present_modes( wl_vk_display = (tpl_wl_vk_display_t *)display->backend.data; TPL_CHECK_ON_NULL_RETURN_VAL(wl_vk_display, TPL_ERROR_INVALID_PARAMETER); - if (present_modes) { - *present_modes = wl_vk_display->present_modes; - } + if (present_modes) + *present_modes = wl_vk_display->supported_present_modes; return TPL_ERROR_NONE; } @@ -1187,7 +1188,6 @@ _thread_wl_vk_surface_init(tpl_wl_vk_surface_t *wl_vk_surface) } } #endif - wl_vk_surface->vblank_enable = (wl_vk_surface->vblank != NULL && wl_vk_surface->post_interval > 0); } @@ -1536,6 +1536,7 @@ __cb_tbm_queue_reset_callback(tbm_surface_queue_h tbm_queue, } wl_vk_surface->reset = TPL_TRUE; + _tpl_wl_vk_surface_buffer_clear(wl_vk_surface); if (surface->reset_cb) surface->reset_cb(surface->reset_data); @@ -1589,7 +1590,7 @@ _thread_swapchain_create_tbm_queue(tpl_wl_vk_surface_t *wl_vk_surface) return TPL_ERROR_INVALID_PARAMETER; } - if (!(swapchain->properties.present_mode & wl_vk_display->present_modes)) { + if (!(swapchain->properties.present_mode & wl_vk_display->supported_present_modes)) { TPL_ERR("Unsupported present_mode(%d)", swapchain->properties.present_mode); swapchain->result = TPL_ERROR_INVALID_PARAMETER; @@ -1733,11 +1734,15 @@ __tpl_wl_vk_surface_create_swapchain(tpl_surface_t *surface, swapchain = wl_vk_surface->swapchain; + if (swapchain != NULL && (swapchain->properties.present_mode != present_mode)) { + _tpl_wl_vk_surface_buffer_clear(wl_vk_surface); + } if (swapchain == NULL) { swapchain = (tpl_wl_vk_swapchain_t *)calloc(1, sizeof(tpl_wl_vk_swapchain_t)); TPL_CHECK_ON_NULL_RETURN_VAL(swapchain, TPL_ERROR_OUT_OF_MEMORY); swapchain->tbm_queue = NULL; + __tpl_util_atomic_set(&swapchain->ref_cnt, 1); } swapchain->properties.buffer_count = buffer_count; @@ -1754,7 +1759,6 @@ __tpl_wl_vk_surface_create_swapchain(tpl_surface_t *surface, wl_vk_surface->swapchain = swapchain; - __tpl_util_atomic_set(&swapchain->ref_cnt, 1); tpl_gmutex_lock(&wl_vk_surface->surf_mutex); /* send swapchain create tbm_queue message */ -- 2.34.1