Fix issues for angle immediate mode 49/318449/3
authorXuelian Bai <xuelian.bai@samsung.com>
Mon, 30 Sep 2024 03:11:44 +0000 (11:11 +0800)
committerXuelian Bai <xuelian.bai@samsung.com>
Tue, 29 Oct 2024 02:04:07 +0000 (10:04 +0800)
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 <xuelian.bai@samsung.com>
src/tpl_display.c
src/tpl_wl_vk_thread.c

index fe7dbaf69ec90473972396b93cd35869a46719c5..c49b2b815ba887a41fe756110fd2a28c15100400 100644 (file)
@@ -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);
 }
index 9c96a3ecd77c590b042ff5132077d955d082e6b6..fc950015bebf2d11d1b4cfa7ec4a0116fdee60cb 100644 (file)
@@ -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 */