tbm: implement backend display functions to support vk wsi
authorJoonbum Ko <joonbum.ko@samsung.com>
Fri, 13 Dec 2024 05:12:18 +0000 (14:12 +0900)
committerJoonbum Ko <joonbum.ko@samsung.com>
Fri, 13 Dec 2024 05:12:24 +0000 (14:12 +0900)
 __tpl_tbm_display_query_supported_buffer_count
 - min buffer : 2
 - max buffer : this value should be equal to tbm_surface_queue_size()

 __tpl_tbm_display_query_supported_present_modes
 - supported_present_modes : only support FIFO

Change-Id: Iebf0f54c5a7b4489cf45fb7ebc5adc22fb5a06bc
Signed-off-by: Joonbum Ko <joonbum.ko@samsung.com>
src/tpl_tbm.c

index 1a66f17b31142687cd80076a7e77d8465fd298ae..886cf862438b5dfed01529a197b2471d54964d1b 100644 (file)
 typedef struct _tpl_tbm_display tpl_tbm_display_t;
 typedef struct _tpl_tbm_surface tpl_tbm_surface_t;
 
+#define MIN_BUFFER 2
+#define MAX_BUFFER 4
+
 struct _tpl_tbm_display {
        int need_dpy_deinit;
        int dummy;
+
+       /* for vulkan wsi */
+       int min_buffer;
+       int max_buffer;
+       int supported_present_modes;
 };
 
 struct _tpl_tbm_surface {
@@ -46,6 +54,11 @@ __tpl_tbm_display_init(tpl_display_t *display)
        display->backend.data = tbm_display;
        display->bufmgr_fd = -1;
 
+       tbm_display->min_buffer = MIN_BUFFER;
+       tbm_display->max_buffer = MAX_BUFFER;
+
+       tbm_display->supported_present_modes = TPL_DISPLAY_PRESENT_MODE_FIFO; /* only FIFO mode */
+
        TPL_LOG_B("TBM", "[INIT] tpl_display(%p) tpl_tbm_display_t(%p) tbm_bufmgr(%p)",
                          display, tbm_display, display->native_handle);
 
@@ -166,6 +179,40 @@ __tpl_tbm_display_get_buffer_from_native_pixmap(tpl_handle_t pixmap)
        return (tbm_surface_h)pixmap;
 }
 
+static tpl_result_t
+__tpl_tbm_display_query_supported_buffer_count(tpl_display_t *display,
+                                                                                          tpl_handle_t window,
+                                                                                          int *min, int *max)
+{
+       TPL_ASSERT(display);
+       TPL_ASSERT(window);
+
+       tpl_tbm_display_t *tbm_display = (tpl_tbm_display_t *)display->backend.data;
+       TPL_CHECK_ON_NULL_RETURN_VAL(tbm_display, TPL_ERROR_INVALID_PARAMETER);
+
+       tbm_surface_queue_h tbm_queue = (tbm_surface_queue_h)window;
+       int queue_size = tbm_surface_queue_get_size(tbm_queue);
+
+       if (min) *min = MIN_BUFFER;
+       if (max) *max = (queue_size > MAX_BUFFER ? queue_size : MAX_BUFFER);
+}
+
+static tpl_result_t
+__tpl_tbm_display_query_supported_present_modes(tpl_display_t *display,
+                                                                       tpl_handle_t window, int *present_modes)
+{
+       TPL_ASSERT(display);
+       TPL_ASSERT(window);
+
+       tpl_tbm_display_t *tbm_display = (tpl_tbm_display_t *)display->backend.data;
+       TPL_CHECK_ON_NULL_RETURN_VAL(tbm_display, TPL_ERROR_INVALID_PARAMETER);
+
+       if (present_modes)
+               *present_modes = tbm_display->supported_present_modes;
+
+       return TPL_ERROR_NONE;
+}
+
 static void
 __cb_tbm_queue_reset_callback(tbm_surface_queue_h tbm_queue,
                                                          void *data)
@@ -364,6 +411,10 @@ __tpl_display_init_backend_tbm(tpl_display_backend_t *backend,
        backend->get_pixmap_info = __tpl_tbm_display_get_pixmap_info;
        backend->get_buffer_from_native_pixmap =
                __tpl_tbm_display_get_buffer_from_native_pixmap;
+       backend->query_window_supported_buffer_count =
+               __tpl_tbm_display_query_supported_buffer_count;
+       backend->query_window_supported_present_modes =
+               __tpl_tbm_display_query_supported_present_modes;
 }
 
 void