From fc57a24db9dd6b84f280a6810ed93473dfd0c649 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Tue, 6 Aug 2024 20:07:06 +0900 Subject: [PATCH] tbm_surface_queue: Add tbm_surface_queue_internal header Change-Id: I341d4a3eabb58d9bdc09600ea1efffce1a343f53 --- doc/doxygen/libtbm.doxygen | 1 + include/Makefile.am | 1 + include/tbm_surface_queue.h | 204 +++--------------------- include/tbm_surface_queue_internal.h | 229 +++++++++++++++++++++++++++ src/tbm_bufmgr_int.h | 1 + src/tbm_surface_queue.c | 1 + 6 files changed, 258 insertions(+), 179 deletions(-) create mode 100644 include/tbm_surface_queue_internal.h diff --git a/doc/doxygen/libtbm.doxygen b/doc/doxygen/libtbm.doxygen index ac88a0d..8cfbf87 100644 --- a/doc/doxygen/libtbm.doxygen +++ b/doc/doxygen/libtbm.doxygen @@ -782,6 +782,7 @@ INPUT = \ include/tbm_surface.h \ include/tbm_surface_internal.h \ include/tbm_surface_queue.h \ + include/tbm_surface_queue_internal.h \ include/tbm_sync.h \ include/tbm_drm_helper.h \ include/tbm_bufmgr_backend.h \ diff --git a/include/Makefile.am b/include/Makefile.am index 6d9f4f4..e8dc11b 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -10,6 +10,7 @@ libtbminclude_HEADERS = \ tbm_surface.h \ tbm_surface_internal.h \ tbm_surface_queue.h \ + tbm_surface_queue_internal.h \ tbm_sync.h \ tbm_drm_helper.h \ tbm_bufmgr_backend.h \ diff --git a/include/tbm_surface_queue.h b/include/tbm_surface_queue.h index d067688..d565dbb 100644 --- a/include/tbm_surface_queue.h +++ b/include/tbm_surface_queue.h @@ -60,15 +60,6 @@ typedef struct _tbm_surface_queue *tbm_surface_queue_h; typedef void (*tbm_surface_queue_notify_cb)(tbm_surface_queue_h surface_queue, void *data); -typedef tbm_surface_h (*tbm_surface_alloc_cb)(tbm_surface_queue_h surface_queue, - void *data); - -typedef tbm_surface_h (*tbm_surface_alloc_cb2)(tbm_surface_queue_h surface_queue, - int width, int height, int format, int flags, void *data); - -typedef void (*tbm_surface_free_cb)(tbm_surface_queue_h surface_queue, - void *data, tbm_surface_h surface); - typedef void (*tbm_surface_queue_trace_cb)(tbm_surface_queue_h surface_queue, tbm_surface_h surface, tbm_surface_queue_trace trace, void *data); @@ -164,50 +155,6 @@ tbm_surface_queue_h tbm_surface_queue_sequence_create(int queue_size, int width, */ void tbm_surface_queue_destroy(tbm_surface_queue_h surface_queue); -/** - * @brief Sets allocate callback to the tbm_surface_queue. - * alloc_cb is called when the tbm_surface_queue try to allocate the tbm_surface and - * the tbm_surface_queue dequeue the tbm_surface returned in alloc_cb - * free_cb is called when the tbm_surface_queue unreference the tbm_surface. - * - * @remarks You must use either tbm_surface_queue_set_alloc_cb or tbm_surface_queue_set_alloc_cb2 - * - * @param[in] surface_queue The #tbm_surface_queue_h - * @param[in] alloc_cb The callback of allocate - * @param[in] free_cb The callback of free - * @param[in] data The user data - * - * @return #TBM_SURFACE_QUEUE_ERROR_NONE on success, - * otherwise an error status value - */ -tbm_surface_queue_error_e tbm_surface_queue_set_alloc_cb( - tbm_surface_queue_h surface_queue, - tbm_surface_alloc_cb alloc_cb, - tbm_surface_free_cb free_cb, - void *data); - -/** - * @brief Sets allocate callback to the tbm_surface_queue. - * alloc_cb2 is called when the tbm_surface_queue try to allocate the tbm_surface and - * the tbm_surface_queue dequeue the tbm_surface returned in alloc_cb2 - * free_cb is called when the tbm_surface_queue unreference the tbm_surface. - * - * @remarks You must use either tbm_surface_queue_set_alloc_cb or tbm_surface_queue_set_alloc_cb2 - * - * @param[in] surface_queue The #tbm_surface_queue_h - * @param[in] alloc_cb2 The callback of allocate - * @param[in] free_cb The callback of free - * @param[in] data The user data - * - * @return #TBM_SURFACE_QUEUE_ERROR_NONE on success, - * otherwise an error status value - */ -tbm_surface_queue_error_e tbm_surface_queue_set_alloc_cb2( - tbm_surface_queue_h surface_queue, - tbm_surface_alloc_cb2 alloc_cb2, - tbm_surface_free_cb free_cb, - void *data); - /** * @brief Gets the width of the tbm_surface_queue. * @@ -292,49 +239,11 @@ tbm_surface_queue_error_e tbm_surface_queue_get_surfaces( tbm_surface_queue_h surface_queue, tbm_surface_h *surfaces, int *num); -tbm_surface_queue_error_e tbm_surface_queue_get_acquirable_surfaces( - tbm_surface_queue_h surface_queue, - tbm_surface_h *surfaces, int *num); - /** - * @brief Gets number of the tbm_surfaces by tbm_surface_queue_trace. - * - * @param[in] surface_queue The #tbm_surface_queue_h - * @param[in] trace The #tbm_surface_queue_trace - * @param[out] num The number of the surfaces - * - * @return #TBM_SURFACE_ERROR_NONE on success, - * otherwise an error status value - * - * - * @par Example - @code - #include - - tbm_surface_queue_h surface_queue; - int num; - tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE; - - ... - - tsq_err = tbm_surface_queue_get_trace_surface_num(surface_queue, TBM_SURFACE_QUEUE_TRACE_DEQUEUE, &num); - if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE) { - ... - } - - ... - - @endcode - */ -tbm_surface_queue_error_e tbm_surface_queue_get_trace_surface_num( - tbm_surface_queue_h surface_queue, tbm_surface_queue_trace trace, int *num); - -/** - * @brief Sets size of the tbm_surface_queue. + * @brief Sets modes of the tbm_surface_queue. * * @param[in] surface_queue The #tbm_surface_queue_h - * @param[in] queue_size The size of the tbm_surface_queue - * @param[in] flush flush the tbm_surface_queue + * @param[in] modes modes of The #tbm_surface_queue_mode * * @return #TBM_SURFACE_ERROR_NONE on success, * otherwise an error status value @@ -347,9 +256,11 @@ tbm_surface_queue_error_e tbm_surface_queue_get_trace_surface_num( tbm_surface_queue_h surface_queue; tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE; + surface_queue = tbm_surface_queue_create(3, 128, 128, TBM_FORMAT_ARGB888, TBM_BO_DEFAULT); + ... - tsq_err = tbm_surface_queue_set_size(surface_queue, 2, 1); + tsq_err = tbm_surface_queue_set_modes(surface_queue, TBM_SURFACE_QUEUE_MODE_GUARANTEE_CYCLE); if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE) { ... } @@ -358,17 +269,18 @@ tbm_surface_queue_error_e tbm_surface_queue_get_trace_surface_num( @endcode */ -tbm_surface_queue_error_e tbm_surface_queue_set_size( - tbm_surface_queue_h surface_queue, int queue_size, int flush); +tbm_surface_queue_error_e tbm_surface_queue_set_modes( + tbm_surface_queue_h surface_queue, int modes); /** - * @brief Sets modes of the tbm_surface_queue. + * @brief Check the tbm_surface_queue can dequeue the tbm_surface. + * if wait is 1, this function isn't return until another thread release + * the tbm_surface to the tbm_surface_queue * * @param[in] surface_queue The #tbm_surface_queue_h - * @param[in] modes modes of The #tbm_surface_queue_mode - * - * @return #TBM_SURFACE_ERROR_NONE on success, - * otherwise an error status value + * @param[in] wait wait releasing the tbm_surface + * + * @return 1 if it can it, otherwise 0. * * * @par Example @@ -376,56 +288,41 @@ tbm_surface_queue_error_e tbm_surface_queue_set_size( #include tbm_surface_queue_h surface_queue; - tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE; - - surface_queue = tbm_surface_queue_create(3, 128, 128, TBM_FORMAT_ARGB888, TBM_BO_DEFAULT); ... - tsq_err = tbm_surface_queue_set_modes(surface_queue, TBM_SURFACE_QUEUE_MODE_GUARANTEE_CYCLE); - if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE) { - ... + if (tbm_surface_queue_can_dequeue(surface_queue, 0)) { + } ... @endcode */ -tbm_surface_queue_error_e tbm_surface_queue_set_modes( - tbm_surface_queue_h surface_queue, int modes); - -/** - * @brief Sets sync count of the tbm_surface_queue. - * - * @param[in] surface_queue The #tbm_surface_queue_h - * @param[in] sync_count The sync count - * - * @return #TBM_SURFACE_ERROR_NONE on success, - * otherwise an error status value - */ -tbm_surface_queue_error_e tbm_surface_queue_set_sync_count( - tbm_surface_queue_h surface_queue, unsigned int sync_count); +int tbm_surface_queue_can_dequeue(tbm_surface_queue_h surface_queue, int wait); /** * @brief Check the tbm_surface_queue can dequeue the tbm_surface. - * if wait is 1, this function isn't return until another thread release + * this function wait for ms_timeout untill another thread release * the tbm_surface to the tbm_surface_queue * * @param[in] surface_queue The #tbm_surface_queue_h - * @param[in] wait wait releasing the tbm_surface - * - * @return 1 if it can it, otherwise 0. + * @param[in] ms_timeout milisecond time for waiting releasing the tbm_surface * + * @return #TBM_SURFACE_QUEUE_ERROR_NONE if it can it, + * otherwise an error status value * * @par Example @code #include tbm_surface_queue_h surface_queue; + tbm_surface_queue_error_e err; ... - if (tbm_surface_queue_can_dequeue(surface_queue, 0)) { + err = tbm_surface_queue_can_dequeue_wait_timeout(surface_queue, 10000); + if (err == TBM_SURFACE_QUEUE_ERROR_NONE) { } @@ -433,7 +330,8 @@ tbm_surface_queue_error_e tbm_surface_queue_set_sync_count( @endcode */ -int tbm_surface_queue_can_dequeue(tbm_surface_queue_h surface_queue, int wait); +tbm_surface_queue_error_e tbm_surface_queue_can_dequeue_wait_timeout( + tbm_surface_queue_h surface_queue, int ms_timeout); /** * @brief Check the tbm_surface_queue can acquire the tbm_surface. @@ -777,26 +675,6 @@ tbm_surface_queue_error_e tbm_surface_queue_flush(tbm_surface_queue_h surface_qu */ tbm_surface_queue_error_e tbm_surface_queue_free_flush(tbm_surface_queue_h surface_queue); -/** - * @brief Notify reset of the tbm_surface_queue. - * - * @param[in] surface_queue The #tbm_surface_queue_h - * - * @return #TBM_SURFACE_ERROR_NONE on success, - * otherwise an error status value - */ -tbm_surface_queue_error_e tbm_surface_queue_notify_reset(tbm_surface_queue_h surface_queue); - -/** - * @brief Notify dequeuable of the tbm_surface_queue. - * - * @param[in] surface_queue The #tbm_surface_queue_h - * - * @return #TBM_SURFACE_ERROR_NONE on success, - * otherwise an error status value - */ -tbm_surface_queue_error_e tbm_surface_queue_notify_dequeuable(tbm_surface_queue_h surface_queue); - /** * @brief Add callback of destroy to the tbm_surface_queue. * @@ -909,34 +787,6 @@ tbm_surface_queue_error_e tbm_surface_queue_remove_dequeue_cb( tbm_surface_queue_h surface_queue, tbm_surface_queue_notify_cb dequeue_cb, void *data); -/** - * @brief Add callback of can_dequeue to the tbm_surface_queue. - * - * @param[in] surface_queue The #tbm_surface_queue_h - * @param[in] can_dequeue_cb The callback of can_dequeue - * @param[in] data The user data - * - * @return #TBM_SURFACE_ERROR_NONE on success, - * otherwise an error status value - */ -tbm_surface_queue_error_e tbm_surface_queue_add_can_dequeue_cb( - tbm_surface_queue_h surface_queue, tbm_surface_queue_notify_cb can_dequeue_cb, - void *data); - -/** - * @brief Remove callback of can_dequeue from the tbm_surface_queue. - * - * @param[in] surface_queue The #tbm_surface_queue_h - * @param[in] can_dequeue_cb The callback of can_dequeue - * @param[in] data The user data - * - * @return #TBM_SURFACE_ERROR_NONE on success, - * otherwise an error status value - */ -tbm_surface_queue_error_e tbm_surface_queue_remove_can_dequeue_cb( - tbm_surface_queue_h surface_queue, tbm_surface_queue_notify_cb can_dequeue_cb, - void *data); - /** * @brief Add callback of acquirable to the tbm_surface_queue. * @@ -993,10 +843,6 @@ tbm_surface_queue_error_e tbm_surface_queue_remove_trace_cb( tbm_surface_queue_h surface_queue, tbm_surface_queue_trace_cb trace_cb, void *data); -tbm_surface_queue_error_e -tbm_surface_queue_can_dequeue_wait_timeout( - tbm_surface_queue_h surface_queue, int ms_timeout); - #ifdef __cplusplus } #endif diff --git a/include/tbm_surface_queue_internal.h b/include/tbm_surface_queue_internal.h new file mode 100644 index 0000000..816ccc6 --- /dev/null +++ b/include/tbm_surface_queue_internal.h @@ -0,0 +1,229 @@ +/************************************************************************** + +libtbm + +Copyright 2014 Samsung Electronics co., Ltd. All Rights Reserved. + +Contact: SooChan Lim , Sangjin Lee +Boram Park , Changyeon Lee + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sub license, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice (including the +next paragraph) shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +#ifndef _TBM_SURFACE_QUEUE_INTERNAL_H_ +#define _TBM_SURFACE_QUEUE_INTERNAL_H_ + +#include +#include +#include +#include + +typedef tbm_surface_h (*tbm_surface_alloc_cb)(tbm_surface_queue_h surface_queue, + void *data); + +typedef tbm_surface_h (*tbm_surface_alloc_cb2)(tbm_surface_queue_h surface_queue, + int width, int height, int format, int flags, void *data); + +typedef void (*tbm_surface_free_cb)(tbm_surface_queue_h surface_queue, + void *data, tbm_surface_h surface); + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Sets allocate callback to the tbm_surface_queue. + * alloc_cb is called when the tbm_surface_queue try to allocate the tbm_surface and + * the tbm_surface_queue dequeue the tbm_surface returned in alloc_cb + * free_cb is called when the tbm_surface_queue unreference the tbm_surface. + * + * @remarks You must use either tbm_surface_queue_set_alloc_cb or tbm_surface_queue_set_alloc_cb2 + * + * @param[in] surface_queue The #tbm_surface_queue_h + * @param[in] alloc_cb The callback of allocate + * @param[in] free_cb The callback of free + * @param[in] data The user data + * + * @return #TBM_SURFACE_QUEUE_ERROR_NONE on success, + * otherwise an error status value + */ +tbm_surface_queue_error_e tbm_surface_queue_set_alloc_cb( + tbm_surface_queue_h surface_queue, + tbm_surface_alloc_cb alloc_cb, + tbm_surface_free_cb free_cb, + void *data); + +/** + * @brief Sets allocate callback to the tbm_surface_queue. + * alloc_cb2 is called when the tbm_surface_queue try to allocate the tbm_surface and + * the tbm_surface_queue dequeue the tbm_surface returned in alloc_cb2 + * free_cb is called when the tbm_surface_queue unreference the tbm_surface. + * + * @remarks You must use either tbm_surface_queue_set_alloc_cb or tbm_surface_queue_set_alloc_cb2 + * + * @param[in] surface_queue The #tbm_surface_queue_h + * @param[in] alloc_cb2 The callback of allocate + * @param[in] free_cb The callback of free + * @param[in] data The user data + * + * @return #TBM_SURFACE_QUEUE_ERROR_NONE on success, + * otherwise an error status value + */ +tbm_surface_queue_error_e tbm_surface_queue_set_alloc_cb2( + tbm_surface_queue_h surface_queue, + tbm_surface_alloc_cb2 alloc_cb2, + tbm_surface_free_cb free_cb, + void *data); + +tbm_surface_queue_error_e tbm_surface_queue_get_acquirable_surfaces( + tbm_surface_queue_h surface_queue, + tbm_surface_h *surfaces, int *num); + +/** + * @brief Gets number of the tbm_surfaces by tbm_surface_queue_trace. + * + * @param[in] surface_queue The #tbm_surface_queue_h + * @param[in] trace The #tbm_surface_queue_trace + * @param[out] num The number of the surfaces + * + * @return #TBM_SURFACE_ERROR_NONE on success, + * otherwise an error status value + * + * + * @par Example + @code + #include + + tbm_surface_queue_h surface_queue; + int num; + tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE; + + ... + + tsq_err = tbm_surface_queue_get_trace_surface_num(surface_queue, TBM_SURFACE_QUEUE_TRACE_DEQUEUE, &num); + if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE) { + ... + } + + ... + + @endcode + */ +tbm_surface_queue_error_e tbm_surface_queue_get_trace_surface_num( + tbm_surface_queue_h surface_queue, tbm_surface_queue_trace trace, int *num); + +/** + * @brief Sets size of the tbm_surface_queue. + * + * @param[in] surface_queue The #tbm_surface_queue_h + * @param[in] queue_size The size of the tbm_surface_queue + * @param[in] flush flush the tbm_surface_queue + * + * @return #TBM_SURFACE_ERROR_NONE on success, + * otherwise an error status value + * + * + * @par Example + @code + #include + + tbm_surface_queue_h surface_queue; + tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE; + + ... + + tsq_err = tbm_surface_queue_set_size(surface_queue, 2, 1); + if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE) { + ... + } + + ... + + @endcode + */ +tbm_surface_queue_error_e tbm_surface_queue_set_size( + tbm_surface_queue_h surface_queue, int queue_size, int flush); + +/** + * @brief Sets sync count of the tbm_surface_queue. + * + * @param[in] surface_queue The #tbm_surface_queue_h + * @param[in] sync_count The sync count + * + * @return #TBM_SURFACE_ERROR_NONE on success, + * otherwise an error status value + */ +tbm_surface_queue_error_e tbm_surface_queue_set_sync_count( + tbm_surface_queue_h surface_queue, unsigned int sync_count); + +/** + * @brief Notify reset of the tbm_surface_queue. + * + * @param[in] surface_queue The #tbm_surface_queue_h + * + * @return #TBM_SURFACE_ERROR_NONE on success, + * otherwise an error status value + */ +tbm_surface_queue_error_e tbm_surface_queue_notify_reset(tbm_surface_queue_h surface_queue); + +/** + * @brief Notify dequeuable of the tbm_surface_queue. + * + * @param[in] surface_queue The #tbm_surface_queue_h + * + * @return #TBM_SURFACE_ERROR_NONE on success, + * otherwise an error status value + */ +tbm_surface_queue_error_e tbm_surface_queue_notify_dequeuable(tbm_surface_queue_h surface_queue); + +/** + * @brief Add callback of can_dequeue to the tbm_surface_queue. + * + * @param[in] surface_queue The #tbm_surface_queue_h + * @param[in] can_dequeue_cb The callback of can_dequeue + * @param[in] data The user data + * + * @return #TBM_SURFACE_ERROR_NONE on success, + * otherwise an error status value + */ +tbm_surface_queue_error_e tbm_surface_queue_add_can_dequeue_cb( + tbm_surface_queue_h surface_queue, tbm_surface_queue_notify_cb can_dequeue_cb, + void *data); + +/** + * @brief Remove callback of can_dequeue from the tbm_surface_queue. + * + * @param[in] surface_queue The #tbm_surface_queue_h + * @param[in] can_dequeue_cb The callback of can_dequeue + * @param[in] data The user data + * + * @return #TBM_SURFACE_ERROR_NONE on success, + * otherwise an error status value + */ +tbm_surface_queue_error_e tbm_surface_queue_remove_can_dequeue_cb( + tbm_surface_queue_h surface_queue, tbm_surface_queue_notify_cb can_dequeue_cb, + void *data); + +#ifdef __cplusplus +} +#endif +#endif /* _TBM_SURFACE_INTERNAL_H_ */ diff --git a/src/tbm_bufmgr_int.h b/src/tbm_bufmgr_int.h index e605438..4b1fe37 100644 --- a/src/tbm_bufmgr_int.h +++ b/src/tbm_bufmgr_int.h @@ -57,6 +57,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include #include +#include #include #include #include "tbm_module.h" diff --git a/src/tbm_surface_queue.c b/src/tbm_surface_queue.c index 5d90f8f..4c7f26e 100644 --- a/src/tbm_surface_queue.c +++ b/src/tbm_surface_queue.c @@ -32,6 +32,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "config.h" #include "tbm_bufmgr_int.h" +#include "tbm_surface_queue_internal.h" #include "list.h" #include -- 2.34.1