From: Junkyeong Kim Date: Mon, 1 Feb 2021 05:36:04 +0000 (+0900) Subject: init hal-api-tbm X-Git-Tag: accepted/tizen/unified/20210208.032901~7 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b0b979d2189e2a866195fb611e3479ce5b7323cd;p=platform%2Fhal%2Fapi%2Ftbm.git init hal-api-tbm Change-Id: Idb21c79adfffeea257bc21fd3e9f10b061f98c68 Signed-off-by: Junkyeong Kim --- diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..c5cd8c0 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,52 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(hal-api-tbm C) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(EXEC_PREFIX "${CMAKE_INSTALL_PREFIX}/bin") +SET(INCLUDEDIR "${CMAKE_INSTALL_PREFIX}/include") +SET(LIBDIR ${CMAKE_LIBDIR_PREFIX}) +SET(VERSION_MAJOR 0) +SET(VERSION "${VERSION_MAJOR}.1.0") + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(EXEC_PREFIX "${PREFIX}/bin") +SET(INCLUDEDIR "${PREFIX}/include") +SET(LIBDIR ${CMAKE_LIBDIR_PREFIX}) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) + +SET(PKG_MODULES + hal-api-common + dlog +) + +INCLUDE(FindPkgConfig) +pkg_check_modules(pkgs REQUIRED ${PKG_MODULES}) + +FOREACH(flag ${pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden -fPIE") +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -fno-omit-frame-pointer -finstrument-functions") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -lrt") +SET(CMAKE_EXE_LINKER_FLAGS "-pie") + +ADD_DEFINITIONS("-DLOG_TAG=\"HALAPI_TBM\"") + +SET(SRCS + src/hal-api-tbm.c) + +ADD_LIBRARY( ${PROJECT_NAME} SHARED ${SRCS}) +TARGET_LINK_LIBRARIES( ${PROJECT_NAME} ${pkgs_LDFLAGS} -ldl -lm -Wl,-z,nodelete,--no-undefined) +SET_TARGET_PROPERTIES( ${PROJECT_NAME} PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES( ${PROJECT_NAME} PROPERTIES VERSION ${VERSION}) + +CONFIGURE_FILE( ${PROJECT_NAME}.pc ${PROJECT_NAME}.pc @ONLY) +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${LIBDIR}/hal) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/hal-tbm-types.h DESTINATION ${INCLUDEDIR}/hal) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/hal-tbm.h DESTINATION ${INCLUDEDIR}/hal) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/hal-tbm-interface.h DESTINATION ${INCLUDEDIR}/hal) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc DESTINATION ${LIBDIR}/pkgconfig) diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..ccee209 --- /dev/null +++ b/COPYING @@ -0,0 +1,21 @@ +Copyright 2021 Samsung Electronics co., Ltd. All Rights Reserved. + +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f87d5cc --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +hal api tbm diff --git a/hal-api-tbm.pc b/hal-api-tbm.pc new file mode 100644 index 0000000..b143b84 --- /dev/null +++ b/hal-api-tbm.pc @@ -0,0 +1,16 @@ +# Package Information for pkg-config + +package_name=hal-api-tbm +prefix=@PREFIX@ +exec_prefix=@EXEC_PREFIX@/hal +libdir=@LIBDIR@/hal +includedir=@INCLUDEDIR@/hal + +Name: ${package_name} +Description: ${package_name} interface +Version: @VERSION@ + +Requires: +Libs: -L${libdir} -l${package_name} +Cflags: -I${includedir} +CXXflags: -I${includedir} diff --git a/include/hal-tbm-interface.h b/include/hal-tbm-interface.h new file mode 100644 index 0000000..6a045f3 --- /dev/null +++ b/include/hal-tbm-interface.h @@ -0,0 +1,83 @@ +/************************************************************************** + * + * hal-api-tbm + * + * Copyright 2021 Samsung Electronics co., Ltd. All Rights Reserved. + * + * Contact: SooChan Lim , + * Junkyeong Kim , + * 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 __HAL_TBM_INTERFACE__ +#define __HAL_TBM_INTERFACE__ + +#include +#include "hal-tbm-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _hal_tbm_bufmgr_func { + /* tbm_bufmgr_func */ + hal_tbm_bufmgr_capability (*bufmgr_get_capabilities)(hal_tbm_bufmgr_data *bufmgr_data, hal_tbm_error *error); + hal_tbm_error (*bufmgr_bind_native_display)(hal_tbm_bufmgr_data *bufmgr_data, hal_tbm_native_display *native_display); + hal_tbm_error (*bufmgr_get_supported_formats)(hal_tbm_bufmgr_data *bufmgr_data, uint32_t **formats, uint32_t *num); + hal_tbm_error (*bufmgr_get_plane_data)(hal_tbm_bufmgr_data *bufmgr_data, hal_tbm_format format, int plane_idx, int width, int height, + uint32_t *size, uint32_t *offset, uint32_t *pitch, int *bo_idx); + hal_tbm_bo_data *(*bufmgr_alloc_bo)(hal_tbm_bufmgr_data *bufmgr_data, unsigned int size, hal_tbm_bo_memory_type mem_types, hal_tbm_error *error); + hal_tbm_bo_data *(*bufmgr_alloc_bo_with_format)(hal_tbm_bufmgr_data *bufmgr_data, int format, int bo_idx, int width, int height, + hal_tbm_bo_memory_type mem_types, hal_tbm_error *error); + hal_tbm_bo_data *(*bufmgr_alloc_bo_with_tiled_format)(hal_tbm_bufmgr_data *bufmgr_data, int width, int height, int bpp, int format, + hal_tbm_bo_memory_type flags, int bo_idx, hal_tbm_error *error); + hal_tbm_bo_data *(*bufmgr_import_fd)(hal_tbm_bufmgr_data *bufmgr_data, hal_tbm_fd fd, hal_tbm_error *error); + hal_tbm_bo_data *(*bufmgr_import_key)(hal_tbm_bufmgr_data *bufmgr_data, hal_tbm_key key, hal_tbm_error *error); +} hal_tbm_bufmgr_func; + +typedef struct _hal_tbm_bo_func { + void (*bo_free)(hal_tbm_bo_data *bo_data); + int (*bo_get_size)(hal_tbm_bo_data *bo_data, hal_tbm_error *error); + hal_tbm_bo_memory_type (*bo_get_memory_types)(hal_tbm_bo_data *bo_data, hal_tbm_error *error); + hal_tbm_bo_handle (*bo_get_handle)(hal_tbm_bo_data *bo_data, tbm_bo_device_type device, hal_tbm_error *error); + hal_tbm_bo_handle (*bo_map)(hal_tbm_bo_data *bo_data, tbm_bo_device_type device, tbm_bo_access_option opt, hal_tbm_error *error); + hal_tbm_error (*bo_unmap)(hal_tbm_bo_data *bo_data); + hal_tbm_error (*bo_lock)(hal_tbm_bo_data *bo_data, tbm_bo_device_type device, tbm_bo_access_option opt); + hal_tbm_error (*bo_unlock)(hal_tbm_bo_data *bo_data); + hal_tbm_fd (*bo_export_fd)(hal_tbm_bo_data *bo_data, hal_tbm_error *error); + hal_tbm_key (*bo_export_key)(hal_tbm_bo_data *bo_data, hal_tbm_error *error); +} hal_tbm_bo_func; + +int hal_tbm_query_display_server(hal_tbm_error *error); +hal_tbm_bufmgr_func *hal_tbm_alloc_bufmgr_func(hal_tbm_error *error); +void hal_tbm_free_bufmgr_func(hal_tbm_bufmgr_func *func); +hal_tbm_error hal_tbm_register_bufmgr_func(hal_tbm_bufmgr_func *func); +hal_tbm_bo_func *hal_tbm_alloc_bo_func(hal_tbm_error *error); +void hal_tbm_free_bo_func(hal_tbm_bo_func *func); +hal_tbm_error hal_tbm_register_bo_func(hal_tbm_bo_func *func); + +#ifdef __cplusplus +} +#endif +#endif /* __HAL_TBM_INTERFACE__ */ diff --git a/include/hal-tbm-types.h b/include/hal-tbm-types.h new file mode 100755 index 0000000..5bfbdc0 --- /dev/null +++ b/include/hal-tbm-types.h @@ -0,0 +1,457 @@ +/************************************************************************** + * + * hal-api-tbm + * + * Copyright 2021 Samsung Electronics co., Ltd. All Rights Reserved. + * + * Contact: SooChan Lim , + * Junkyeong Kim , + * 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 _HAL_TBM_TYPES_H_ +#define _HAL_TBM_TYPES_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* hal tbm error base : this error base is same as TIZEN_ERROR_TBM in tizen_error.h */ +#ifndef HAL_TBM_ERROR_BASE // CAUTION :: This MUST be the same as TBM_ERROR_BASE. +#define HAL_TBM_ERROR_BASE -0x02830000 +#endif + +/** + * @brief Enumeration for hal tbm error type. + */ +typedef enum { + /* HAL_TBM_ERROR_XXX. start from (HAL_TBM_ERROR_BASE | 0x0001) to (HAL_TBM_ERROR_BASE | 0x0099) */ + HAL_TBM_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successful */ + HAL_TBM_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */ + HAL_TBM_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid function parameter */ + HAL_TBM_ERROR_INVALID_OPERATION = TIZEN_ERROR_INVALID_OPERATION, /**< Function not implemented */ + HAL_TBM_ERROR_NOT_SUPPORTED = TIZEN_ERROR_NOT_SUPPORTED, /**< Not supported */ + + /* HAL_TBM_BO_ERROR_XXX. start from (HAL_TBM_ERROR_BASE | 0x0101) to (HAL_TBM_ERROR_BASE | 0x0199) */ + HAL_TBM_BO_ERROR_GET_FD_FAILED = HAL_TBM_ERROR_BASE | 0x0101, /**< failed to get fd in bo (DEPRECATED) */ + HAL_TBM_BO_ERROR_HEAP_ALLOC_FAILED = HAL_TBM_ERROR_OUT_OF_MEMORY, /**< failed to allocate the heap memory in bo (DEPRECATED) */ + HAL_TBM_BO_ERROR_LOAD_MODULE_FAILED = HAL_TBM_ERROR_BASE | 0x0103, /**< failed to load module (DEPRECATED) */ + HAL_TBM_BO_ERROR_THREAD_INIT_FAILED = HAL_TBM_ERROR_BASE | 0x0104, /**< failed to initialize the pthread (DEPRECATED) */ + HAL_TBM_BO_ERROR_BO_ALLOC_FAILED = HAL_TBM_ERROR_OUT_OF_MEMORY, /**< failed to allocate hal_tbm_bo (DEPRECATED) */ + HAL_TBM_BO_ERROR_INIT_STATE_FAILED = HAL_TBM_ERROR_BASE | 0x0106, /**< failed to initialize the state of hal_tbm_bo (DEPRECATED) */ + HAL_TBM_BO_ERROR_IMPORT_FAILED = HAL_TBM_ERROR_BASE | 0x0107, /**< failed to import the handle of hal_tbm_bo (DEPRECATED) */ + HAL_TBM_BO_ERROR_IMPORT_FD_FAILED = HAL_TBM_ERROR_BASE | 0x0108, /**< failed to import fd of hal_tbm_bo (DEPRECATED) */ + HAL_TBM_BO_ERROR_EXPORT_FAILED = HAL_TBM_ERROR_BASE | 0x0109, /**< failed to export the handle of the hal_tbm_bo (DEPRECATED) */ + HAL_TBM_BO_ERROR_EXPORT_FD_FAILED = HAL_TBM_ERROR_BASE | 0x0110, /**< failed to export fd of hal_tbm_bo (DEPRECATED) */ + HAL_TBM_BO_ERROR_GET_HANDLE_FAILED = HAL_TBM_ERROR_BASE | 0x0111, /**< failed to get the hal_tbm_bo_handle (DEPRECATED) */ + HAL_TBM_BO_ERROR_LOCK_FAILED = HAL_TBM_ERROR_BASE | 0x0112, /**< failed to lock the hal_tbm_bo (DEPRECATED) */ + HAL_TBM_BO_ERROR_MAP_FAILED = HAL_TBM_ERROR_BASE | 0x0113, /**< failed to map the hal_tbm_bo to get the hal_tbm_bo_handle (DEPRECATED) */ + HAL_TBM_BO_ERROR_UNMAP_FAILED = HAL_TBM_ERROR_BASE | 0x0114, /**< failed to unmap the hal_tbm_bo (DEPRECATED) */ + HAL_TBM_BO_ERROR_SWAP_FAILED = HAL_TBM_ERROR_BASE | 0x0115, /**< failed to swap the tbm_bos (DEPRECATED) */ + HAL_TBM_BO_ERROR_DUP_FD_FAILED = HAL_TBM_ERROR_BASE | 0x0116, /**< failed to duplicate fd (DEPRECATED) */ +} hal_tbm_error; + +/** + * @brief Enumeration of tbm buffer manager capability. + */ +typedef enum { + HAL_TBM_BUFMGR_CAPABILITY_NONE = 0, /**< Not Support capability*/ + HAL_TBM_BUFMGR_CAPABILITY_SHARE_KEY = (1 << 0), /**< Support sharing buffer by tbm key */ + HAL_TBM_BUFMGR_CAPABILITY_SHARE_FD = (1 << 1), /**< Support sharing buffer by tbm fd */ + HAL_TBM_BUFMGR_CAPABILITY_TBM_SYNC = (1 << 2), /**< Support timeline sync */ + HAL_TBM_BUFMGR_CAPABILITY_TILED_MEMORY = (1 << 3), /**< Support tiled memory */ +} hal_tbm_bufmgr_capability; + +/** + * @brief Enumeration of bo memory type + */ +typedef enum { + HAL_TBM_BO_DEFAULT = 0, /**< default memory: it depends on the backend */ + HAL_TBM_BO_SCANOUT = (1 << 0), /**< scanout memory */ + HAL_TBM_BO_NONCACHABLE = (1 << 1), /**< non-cachable memory */ + HAL_TBM_BO_WC = (1 << 2), /**< write-combine memory */ + HAL_TBM_BO_TILED = (1 << 3), /**< tiled memory */ + HAL_TBM_BO_VENDOR = (0xffff0000), /**< vendor specific memory: it depends on the backend */ +} hal_tbm_bo_memory_type; + +/** + * @brief Definition for the device type to access hal_tbm_bo + */ +typedef enum { + HAL_TBM_DEVICE_DEFAULT = 0, /**< the device type to get the default handle */ + HAL_TBM_DEVICE_CPU, /**< the device type to get the virtual memory */ + HAL_TBM_DEVICE_2D, /**< the device type to get the 2D memory handle */ + HAL_TBM_DEVICE_3D, /**< the device type to get the 3D memory handle */ + HAL_TBM_DEVICE_MM, /**< the device type to get the the multimedia handle */ + +} tbm_bo_device_type; + +/** + * @brief Definition for the optoin to access hal_tbm_bo + */ +typedef enum { + HAL_TBM_OPTION_NONE = (1 << 0), /**< the option is none */ + HAL_TBM_OPTION_READ = (1 << 0), /**< the option to access to read the bo */ + HAL_TBM_OPTION_WRITE = (1 << 1), /**< the option to access to write the bo */ + HAL_TBM_OPTION_VENDOR = (0xffff0000), /**< the the vendor specific option that depends on the backend */ +} tbm_bo_access_option; + +/** + * @brief hal_tbm_bo_handle abstraction of the memory handle by HAL_TBM_DEVICE_TYPE + */ +typedef union _hal_tbm_bo_handle { + void *ptr; + int32_t s32; + uint32_t u32; + int64_t s64; + uint64_t u64; +} hal_tbm_bo_handle; + +/** + * @brief Definition for hal_tbm_bufmgr handle + */ +typedef struct _hal_tbm_bufmgr hal_tbm_bufmgr; + +/** + * @brief Definition for hal_tbm_bufmgr_data handle created by hal tbm backend + */ +typedef void hal_tbm_bufmgr_data; + +/** + * @brief Definition for the tizen buffer object + */ +typedef void hal_tbm_bo_data; + +/** + * @brief Definition for native display (wl_display in tizen) + */ +typedef void hal_tbm_native_display; + +/** + * @brief Definition for the file descripter of the system buffer manager + */ +typedef int32_t hal_tbm_fd; + +/** + * @brief Definition for the key associated with the buffer object + */ +typedef uint32_t hal_tbm_key; + +/** + * @brief Definition for the Tizen buffer surface. + */ +typedef struct _hal_tbm_surface *hal_tbm_surface_h; +/** + * @brief Definition for the Tizen buffer surface format. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +typedef uint32_t hal_tbm_format; + +#define __hal_tbm_fourcc_code(a, b, c, d) ((uint32_t)(a) | ((uint32_t)(b) << 8) | \ + ((uint32_t)(c) << 16) | ((uint32_t)(d) << 24)) + +/* color index */ +/** + * @brief Definition for the TBM surface format C8 ([7:0] C). + */ +#define HAL_TBM_FORMAT_C8 __hal_tbm_fourcc_code('C', '8', ' ', ' ') + +/* 8 bpp RGB */ +/** + * @brief Definition for the TBM surface format RGB322 ([7:0] R:G:B 3:3:2). + */ +#define HAL_TBM_FORMAT_RGB332 __hal_tbm_fourcc_code('R', 'G', 'B', '8') +/** + * @brief Definition for the TBM surface format RGB233 ([7:0] B:G:R 2:3:3). + */ +#define HAL_TBM_FORMAT_BGR233 __hal_tbm_fourcc_code('B', 'G', 'R', '8') + +/* 16 bpp RGB */ +/** + * @brief Definition for the TBM surface format XRGB4444 ([15:0] x:R:G:B 4:4:4:4 little endian). + */ +#define HAL_TBM_FORMAT_XRGB4444 __hal_tbm_fourcc_code('X', 'R', '1', '2') +/** + * @brief Definition for the TBM surface format XBRG4444 ([15:0] x:B:G:R 4:4:4:4 little endian). + */ +#define HAL_TBM_FORMAT_XBGR4444 __hal_tbm_fourcc_code('X', 'B', '1', '2') +/** + * @brief Definition for the TBM surface format RGBX4444 ([15:0] R:G:B:x 4:4:4:4 little endian). + */ +#define HAL_TBM_FORMAT_RGBX4444 __hal_tbm_fourcc_code('R', 'X', '1', '2') +/** + * @brief Definition for the TBM surface format BGRX4444 ([15:0] B:G:R:x 4:4:4:4 little endian). + */ +#define HAL_TBM_FORMAT_BGRX4444 __hal_tbm_fourcc_code('B', 'X', '1', '2') + +/** + * @brief Definition for the TBM surface format ARGB4444 ([15:0] A:R:G:B 4:4:4:4 little endian). + */ +#define HAL_TBM_FORMAT_ARGB4444 __hal_tbm_fourcc_code('A', 'R', '1', '2') +/** + * @brief Definition for the TBM surface format ABGR4444 ([15:0] A:B:G:R 4:4:4:4 little endian). + */ +#define HAL_TBM_FORMAT_ABGR4444 __hal_tbm_fourcc_code('A', 'B', '1', '2') +/** + * @brief Definition for the TBM surface format RGBA4444 ([15:0] R:G:B:A 4:4:4:4 little endian). + */ +#define HAL_TBM_FORMAT_RGBA4444 __hal_tbm_fourcc_code('R', 'A', '1', '2') +/** + * @brief Definition for the TBM surface format BGRA4444 ([15:0] B:G:R:A 4:4:4:4 little endian). + */ +#define HAL_TBM_FORMAT_BGRA4444 __hal_tbm_fourcc_code('B', 'A', '1', '2') + +/** + * @brief Definition for the TBM surface format XRGB1555 ([15:0] x:R:G:B 1:5:5:5 little endian). + */ +#define HAL_TBM_FORMAT_XRGB1555 __hal_tbm_fourcc_code('X', 'R', '1', '5') +/** + * @brief Definition for the TBM surface format XBGR1555 ([15:0] x:B:G:R 1:5:5:5 little endian). + */ +#define HAL_TBM_FORMAT_XBGR1555 __hal_tbm_fourcc_code('X', 'B', '1', '5') +/** + * @brief Definition for the TBM surface format RGBX5551 ([15:0] R:G:B:x 5:5:5:1 little endian). + */ +#define HAL_TBM_FORMAT_RGBX5551 __hal_tbm_fourcc_code('R', 'X', '1', '5') +/** + * @brief Definition for the TBM surface format BGRX5551 ([15:0] B:G:R:x 5:5:5:1 little endian). + */ +#define HAL_TBM_FORMAT_BGRX5551 __hal_tbm_fourcc_code('B', 'X', '1', '5') + +/** + * @brief Definition for the TBM surface format ARGB1555 ([15:0] A:R:G:B 1:5:5:5 little endian). + */ +#define HAL_TBM_FORMAT_ARGB1555 __hal_tbm_fourcc_code('A', 'R', '1', '5') +/** + * @brief Definition for the TBM surface format ABGR1555 ([15:0] A:B:G:R 1:5:5:5 little endian). + */ +#define HAL_TBM_FORMAT_ABGR1555 __hal_tbm_fourcc_code('A', 'B', '1', '5') +/** + * @brief Definition for the TBM surface format RGBA5551 ([15:0] R:G:B:A 5:5:5:1 little endian). + */ +#define HAL_TBM_FORMAT_RGBA5551 __hal_tbm_fourcc_code('R', 'A', '1', '5') +/** + * @brief Definition for the TBM surface format BGRA5551 ([15:0] B:G:R:A 5:5:5:1 little endian). + */ +#define HAL_TBM_FORMAT_BGRA5551 __hal_tbm_fourcc_code('B', 'A', '1', '5') + +/** + * @brief Definition for the TBM surface format RGB565 ([15:0] R:G:B 5:6:5 little endian). + */ +#define HAL_TBM_FORMAT_RGB565 __hal_tbm_fourcc_code('R', 'G', '1', '6') +/** + * @brief Definition for the TBM surface format BGR565 ([15:0] B:G:R 5:6:5 little endian). + */ +#define HAL_TBM_FORMAT_BGR565 __hal_tbm_fourcc_code('B', 'G', '1', '6') + +/* 24 bpp RGB */ +/** + * @brief Definition for the TBM surface format RGB888 ([23:0] R:G:B little endian). + */ +#define HAL_TBM_FORMAT_RGB888 __hal_tbm_fourcc_code('R', 'G', '2', '4') +/** + * @brief Definition for the TBM surface format BGR888 ([23:0] B:G:R little endian). + */ +#define HAL_TBM_FORMAT_BGR888 __hal_tbm_fourcc_code('B', 'G', '2', '4') + +/* 32 bpp RGB */ +/** + * @brief Definition for the TBM surface format XRGB8888 ([31:0] x:R:G:B 8:8:8:8 little endian). + */ +#define HAL_TBM_FORMAT_XRGB8888 __hal_tbm_fourcc_code('X', 'R', '2', '4') +/** + * @brief Definition for the TBM surface format XBGR8888 ([31:0] x:B:G:R 8:8:8:8 little endian). + */ +#define HAL_TBM_FORMAT_XBGR8888 __hal_tbm_fourcc_code('X', 'B', '2', '4') +/** + * @brief Definition for the TBM surface format RGBX8888 ([31:0] R:G:B:x 8:8:8:8 little endian). + */ +#define HAL_TBM_FORMAT_RGBX8888 __hal_tbm_fourcc_code('R', 'X', '2', '4') +/** + * @brief Definition for the TBM surface format BGRX8888 ([31:0] B:G:R:x 8:8:8:8 little endian). + */ +#define HAL_TBM_FORMAT_BGRX8888 __hal_tbm_fourcc_code('B', 'X', '2', '4') + +/** + * @brief Definition for the TBM surface format ARGB8888 ([31:0] A:R:G:B 8:8:8:8 little endian). + */ +#define HAL_TBM_FORMAT_ARGB8888 __hal_tbm_fourcc_code('A', 'R', '2', '4') +/** + * @brief Definition for the TBM surface format ABGR8888 ([31:0] [31:0] A:B:G:R 8:8:8:8 little endian). + */ +#define HAL_TBM_FORMAT_ABGR8888 __hal_tbm_fourcc_code('A', 'B', '2', '4') +/** + * @brief Definition for the TBM surface format RGBA8888 ([31:0] R:G:B:A 8:8:8:8 little endian). + */ +#define HAL_TBM_FORMAT_RGBA8888 __hal_tbm_fourcc_code('R', 'A', '2', '4') +/** + * @brief Definition for the TBM surface format BGRA8888 ([31:0] B:G:R:A 8:8:8:8 little endian). + */ +#define HAL_TBM_FORMAT_BGRA8888 __hal_tbm_fourcc_code('B', 'A', '2', '4') + +/** + * @brief Definition for the TBM surface format XRGB2101010 ([31:0] x:R:G:B 2:10:10:10 little endian). + */ +#define HAL_TBM_FORMAT_XRGB2101010 __hal_tbm_fourcc_code('X', 'R', '3', '0') +/** + * @brief Definition for the TBM surface format XBGR2101010 ([31:0] x:B:G:R 2:10:10:10 little endian). + */ +#define HAL_TBM_FORMAT_XBGR2101010 __hal_tbm_fourcc_code('X', 'B', '3', '0') +/** + * @brief Definition for the TBM surface format RGBX1010102 ([31:0] R:G:B:x 10:10:10:2 little endian). + */ +#define HAL_TBM_FORMAT_RGBX1010102 __hal_tbm_fourcc_code('R', 'X', '3', '0') +/** + * @brief Definition for the TBM surface format BGRX1010102 ([31:0] B:G:R:x 10:10:10:2 little endian). + */ +#define HAL_TBM_FORMAT_BGRX1010102 __hal_tbm_fourcc_code('B', 'X', '3', '0') + +/** + * @brief Definition for the TBM surface format ARGB2101010 ([31:0] A:R:G:B 2:10:10:10 little endian). + */ +#define HAL_TBM_FORMAT_ARGB2101010 __hal_tbm_fourcc_code('A', 'R', '3', '0') +/** + * @brief Definition for the TBM surface format ABGR2101010 ([31:0] A:B:G:R 2:10:10:10 little endian). + */ +#define HAL_TBM_FORMAT_ABGR2101010 __hal_tbm_fourcc_code('A', 'B', '3', '0') +/** + * @brief Definition for the TBM surface format RGBA1010102 ([31:0] R:G:B:A 10:10:10:2 little endian). + */ +#define HAL_TBM_FORMAT_RGBA1010102 __hal_tbm_fourcc_code('R', 'A', '3', '0') +/** + * @brief Definition for the TBM surface format BGRA1010102 ([31:0] B:G:R:A 10:10:10:2 little endian). + */ +#define HAL_TBM_FORMAT_BGRA1010102 __hal_tbm_fourcc_code('B', 'A', '3', '0') + +/* packed YCbCr */ +/** + * @brief Definition for the TBM surface format YUYV ([31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian). + */ +#define HAL_TBM_FORMAT_YUYV __hal_tbm_fourcc_code('Y', 'U', 'Y', 'V') +/** + * @brief Definition for the TBM surface format YVYU ([31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian). + */ +#define HAL_TBM_FORMAT_YVYU __hal_tbm_fourcc_code('Y', 'V', 'Y', 'U') +/** + * @brief Definition for the TBM surface format UYVY ([31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian). + */ +#define HAL_TBM_FORMAT_UYVY __hal_tbm_fourcc_code('U', 'Y', 'V', 'Y') +/** + * @brief Definition for the TBM surface format VYUY ([31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian). + */ +#define HAL_TBM_FORMAT_VYUY __hal_tbm_fourcc_code('V', 'Y', 'U', 'Y') + +/** + * @brief Definition for the TBM surface format AYUV ([31:0] A:Y:Cb:Cr 8:8:8:8 little endian). + */ +#define HAL_TBM_FORMAT_AYUV __hal_tbm_fourcc_code('A', 'Y', 'U', 'V') + +/* + * 2 plane YCbCr + * index 0 = Y plane, [7:0] Y + * index 1 = Cr:Cb plane, [15:0] Cr:Cb little endian + * or + * index 1 = Cb:Cr plane, [15:0] Cb:Cr little endian + */ +/** + * @brief Definition for the TBM surface format NV12 (2x2 subsampled Cr:Cb plane). + */ +#define HAL_TBM_FORMAT_NV12 __hal_tbm_fourcc_code('N', 'V', '1', '2') +/** + * @brief Definition for the TBM surface format NV21 (2x2 subsampled Cb:Cr plane). + */ +#define HAL_TBM_FORMAT_NV21 __hal_tbm_fourcc_code('N', 'V', '2', '1') +/** + * @brief Definition for the TBM surface format NV16 (2x1 subsampled Cr:Cb plane). + */ +#define HAL_TBM_FORMAT_NV16 __hal_tbm_fourcc_code('N', 'V', '1', '6') +/** + * @brief Definition for the TBM surface format NV61 (2x1 subsampled Cb:Cr plane). + */ +#define HAL_TBM_FORMAT_NV61 __hal_tbm_fourcc_code('N', 'V', '6', '1') + +/* + * 3 plane YCbCr + * index 0: Y plane, [7:0] Y + * index 1: Cb plane, [7:0] Cb + * index 2: Cr plane, [7:0] Cr + * or + * index 1: Cr plane, [7:0] Cr + * index 2: Cb plane, [7:0] Cb + */ +/** + * @brief Definition for the TBM surface format YUV410 (4x4 subsampled Cb (1) and Cr (2) planes). + */ +#define HAL_TBM_FORMAT_YUV410 __hal_tbm_fourcc_code('Y', 'U', 'V', '9') +/** + * @brief Definition for the TBM surface format YVU410 (4x4 subsampled Cr (1) and Cb (2) planes). + */ +#define HAL_TBM_FORMAT_YVU410 __hal_tbm_fourcc_code('Y', 'V', 'U', '9') +/** + * @brief Definition for the TBM surface format YUV411 (4x1 subsampled Cb (1) and Cr (2) planes). + */ +#define HAL_TBM_FORMAT_YUV411 __hal_tbm_fourcc_code('Y', 'U', '1', '1') +/** + * @brief Definition for the TBM surface format YVU411 (4x1 subsampled Cr (1) and Cb (2) planes). + */ +#define HAL_TBM_FORMAT_YVU411 __hal_tbm_fourcc_code('Y', 'V', '1', '1') +/** + * @brief Definition for the TBM surface format YUV420 (2x2 subsampled Cb (1) and Cr (2) planes). + */ +#define HAL_TBM_FORMAT_YUV420 __hal_tbm_fourcc_code('Y', 'U', '1', '2') +/** + * @brief Definition for the TBM surface format YVU420 (2x2 subsampled Cr (1) and Cb (2) planes). + */ +#define HAL_TBM_FORMAT_YVU420 __hal_tbm_fourcc_code('Y', 'V', '1', '2') +/** + * @brief Definition for the TBM surface format YUV422 (2x1 subsampled Cb (1) and Cr (2) planes). + */ +#define HAL_TBM_FORMAT_YUV422 __hal_tbm_fourcc_code('Y', 'U', '1', '6') +/** + * @brief Definition for the TBM surface format YVU422 (2x1 subsampled Cr (1) and Cb (2) planes). + */ +#define HAL_TBM_FORMAT_YVU422 __hal_tbm_fourcc_code('Y', 'V', '1', '6') +/** + * @brief Definition for the TBM surface format YUV444 (non-subsampled Cb (1) and Cr (2) planes). + */ +#define HAL_TBM_FORMAT_YUV444 __hal_tbm_fourcc_code('Y', 'U', '2', '4') +/** + * @brief Definition for the TBM surface format YVU444 (non-subsampled Cr (1) and Cb (2) planes). + */ +#define HAL_TBM_FORMAT_YVU444 __hal_tbm_fourcc_code('Y', 'V', '2', '4') + +/* 2 plane YCbCr */ +/** + * @brief Definition for the TBM surface format NV12MT (tiled '64x32' & multi-plane version of NV12). + */ +#define HAL_TBM_FORMAT_NV12MT __hal_tbm_fourcc_code('T', 'M', '1', '2') + +#ifdef __cplusplus +} +#endif + +#endif /* _HAL_TBM_TYPES_H_ */ diff --git a/include/hal-tbm.h b/include/hal-tbm.h new file mode 100644 index 0000000..a9e0570 --- /dev/null +++ b/include/hal-tbm.h @@ -0,0 +1,74 @@ +/************************************************************************** + * + * hal-api-tbm + * + * Copyright 2021 Samsung Electronics co., Ltd. All Rights Reserved. + * + * Contact: SooChan Lim , + * Junkyeong Kim , + * 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 __HAL_TBM__ +#define __HAL_TBM__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +hal_tbm_error hal_tbm_get_backend(hal_tbm_bufmgr_data *bufmgr_data); +void hal_tbm_put_backend(void); + +/* hal_tbm_bufmgr_func */ +hal_tbm_bufmgr_capability hal_tbm_bufmgr_get_capabilities(hal_tbm_bufmgr_data *bufmgr_data, hal_tbm_error *error); +hal_tbm_error hal_tbm_bufmgr_bind_native_display(hal_tbm_bufmgr_data *bufmgr_data, hal_tbm_native_display *native_display); +hal_tbm_error hal_tbm_bufmgr_get_supported_formats(hal_tbm_bufmgr_data *bufmgr_data, uint32_t **formats, uint32_t *num); +hal_tbm_error hal_tbm_bufmgr_get_plane_data(hal_tbm_bufmgr_data *bufmgr_data, hal_tbm_format format, int plane_idx, int width, int height, + uint32_t *size, uint32_t *offset, uint32_t *pitch, int *bo_idx); +hal_tbm_bo_data *hal_tbm_bufmgr_alloc_bo(hal_tbm_bufmgr_data *bufmgr_data, unsigned int size, hal_tbm_bo_memory_type mem_types, hal_tbm_error *error); +hal_tbm_bo_data *hal_tbm_bufmgr_alloc_bo_with_format(hal_tbm_bufmgr_data *bufmgr_data, int format, int bo_idx, int width, int height, + hal_tbm_bo_memory_type mem_types, hal_tbm_error *error); +hal_tbm_bo_data *hal_tbm_bufmgr_alloc_bo_with_tiled_format(hal_tbm_bufmgr_data *bufmgr_data, int width, int height, int bpp, int format, + hal_tbm_bo_memory_type flags, int bo_idx, hal_tbm_error *error); +hal_tbm_bo_data *hal_tbm_bufmgr_import_fd(hal_tbm_bufmgr_data *bufmgr_data, hal_tbm_fd fd, hal_tbm_error *error); +hal_tbm_bo_data *hal_tbm_bufmgr_import_key(hal_tbm_bufmgr_data *bufmgr_data, hal_tbm_key key, hal_tbm_error *error); + +/* hal_tbm_bo_func*/ +void hal_tbm_bo_free(hal_tbm_bo_data *bo_data); +int hal_tbm_bo_get_size(hal_tbm_bo_data *bo_data, hal_tbm_error *error); +hal_tbm_bo_memory_type hal_tbm_bo_get_memory_types(hal_tbm_bo_data *bo_data, hal_tbm_error *error); +hal_tbm_bo_handle hal_tbm_bo_get_handle(hal_tbm_bo_data *bo_data, tbm_bo_device_type device, hal_tbm_error *error); +hal_tbm_bo_handle hal_tbm_bo_map(hal_tbm_bo_data *bo_data, tbm_bo_device_type device, tbm_bo_access_option opt, hal_tbm_error *error); +hal_tbm_error hal_tbm_bo_unmap(hal_tbm_bo_data *bo_data); +hal_tbm_error hal_tbm_bo_lock(hal_tbm_bo_data *bo_data, tbm_bo_device_type device, tbm_bo_access_option opt); +hal_tbm_error hal_tbm_bo_unlock(hal_tbm_bo_data *bo_data); +hal_tbm_fd hal_tbm_bo_export_fd(hal_tbm_bo_data *bo_data, hal_tbm_error *error); +hal_tbm_key hal_tbm_bo_export_key(hal_tbm_bo_data *bo_data, hal_tbm_error *error); + +#ifdef __cplusplus +} +#endif +#endif /* __HAL_TBM__ */ diff --git a/packaging/hal-api-tbm-devel.manifest b/packaging/hal-api-tbm-devel.manifest new file mode 100644 index 0000000..81ace0c --- /dev/null +++ b/packaging/hal-api-tbm-devel.manifest @@ -0,0 +1,6 @@ + + + + + + diff --git a/packaging/hal-api-tbm.manifest b/packaging/hal-api-tbm.manifest new file mode 100644 index 0000000..81ace0c --- /dev/null +++ b/packaging/hal-api-tbm.manifest @@ -0,0 +1,6 @@ + + + + + + diff --git a/packaging/hal-api-tbm.spec b/packaging/hal-api-tbm.spec new file mode 100644 index 0000000..fea3626 --- /dev/null +++ b/packaging/hal-api-tbm.spec @@ -0,0 +1,70 @@ +%define module_name tbm +%define name hal-api-tbm +%define devel_name hal-api-tbm-devel + +### main package ######### +Name: %{name} +Summary: %{name} interface +Version: 0.0.1 +Release: 1 +Group: Development/Libraries +License: MIT +Source0: %{name}-%{version}.tar.gz +Source1: %{name}.manifest +Source2: %{devel_name}.manifest + +Requires(post): /sbin/ldconfig +Requires(postun): /sbin/ldconfig +BuildRequires: cmake +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(gmock) +BuildRequires: pkgconfig(hal-api-common) + +%description +%{name} interface + +### devel package ######### +%package -n %{devel_name} +Summary: %{name} interface +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description -n %{devel_name} +%{name} Interface for product vendor developer + +### build and install ######### +%prep +%setup -q + +cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DCMAKE_LIBDIR_PREFIX=%{_libdir}/ + +%build +cp %{SOURCE1} . +cp %{SOURCE2} . +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +%make_install + +%clean +rm -rf %{buildroot} + +%post +/sbin/ldconfig + +%postun +/sbin/ldconfig + +### contain files to package ######### +%files -n %{name} +%manifest %{name}.manifest +%license COPYING +%defattr(-,root,root,-) +%{_libdir}/hal/*.so* + +%files -n %{devel_name} +%defattr(-,root,root,-) +%manifest %{devel_name}.manifest +%{_includedir}/hal/*.h +%{_libdir}/pkgconfig/%{name}.pc diff --git a/src/common.h b/src/common.h new file mode 100644 index 0000000..0375a00 --- /dev/null +++ b/src/common.h @@ -0,0 +1,42 @@ +/************************************************************************** + * + * hal-api-tbm + * + * Copyright 2021 Samsung Electronics co., Ltd. All Rights Reserved. + * + * Contact: SooChan Lim , + * Junkyeong Kim , + * 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 __COMMON_H__ +#define __COMMON_H__ + +#include +#define _D(fmt, args...) SLOGD(fmt, ##args) +#define _I(fmt, args...) SLOGI(fmt, ##args) +#define _W(fmt, args...) SLOGW(fmt, ##args) +#define _E(fmt, args...) SLOGE(fmt, ##args) + +#endif /* __COMMON_H__ */ diff --git a/src/hal-api-tbm.c b/src/hal-api-tbm.c new file mode 100644 index 0000000..2cf0368 --- /dev/null +++ b/src/hal-api-tbm.c @@ -0,0 +1,450 @@ +/************************************************************************** + * + * hal-api-tbm + * + * Copyright 2021 Samsung Electronics co., Ltd. All Rights Reserved. + * + * Contact: SooChan Lim , + * Junkyeong Kim , + * 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. + * +**************************************************************************/ + +#include +#include +#include + +#include +#include "common.h" +#include "hal-tbm-types.h" +#include "hal-tbm.h" +#include "hal-tbm-interface.h" + +#if defined(__GNUC__) && __GNUC__ >= 4 +#define EXTERN __attribute__ ((visibility("default"))) +#else +#define EXTERN +#endif + +#if defined(__GNUC__) && __GNUC__ >= 4 +#define INTERN __attribute__ ((visibility("hidden"))) +#else +#define INTERN +#endif + +#define ARRAY_SIZE(name) (sizeof(name)/sizeof(name[0])) + +#define BUFMGR_ENTRY() \ + hal_tbm_bufmgr_func *bufmgr_func; \ + if (!g_hal_tbm_bufmgr) return HAL_TBM_ERROR_NOT_SUPPORTED; + +#define BUFMGR_ENTRY_NULL() \ + hal_tbm_bufmgr_func *bufmgr_func; \ + if (!g_hal_tbm_bufmgr) { if (error) *error = HAL_TBM_ERROR_NOT_SUPPORTED; return NULL; } + +#define BUFMGR_ENTRY_VOID() \ + hal_tbm_bufmgr_func *bufmgr_func; \ + if (!g_hal_tbm_bufmgr) return; + +#define BUFMGR_ENTRY_GOTO(__goto__) \ + hal_tbm_bufmgr_func *bufmgr_func; \ + if (!g_hal_tbm_bufmgr) goto __goto__; + +#define BUFMGR_FUNC_ENTRY(__func__) \ + hal_tbm_bufmgr_func *bufmgr_func; \ + if (!g_hal_tbm_bufmgr || !g_hal_tbm_bufmgr->bufmgr_func) return HAL_TBM_ERROR_NOT_SUPPORTED; \ + bufmgr_func = g_hal_tbm_bufmgr->bufmgr_func; \ + if (!bufmgr_func->__func__) return HAL_TBM_ERROR_NOT_SUPPORTED; + +#define BUFMGR_FUNC_ENTRY_NULL(__func__) \ + hal_tbm_bufmgr_func *bufmgr_func; \ + if (!g_hal_tbm_bufmgr || !g_hal_tbm_bufmgr->bufmgr_func) { if (error) *error = HAL_TBM_ERROR_NOT_SUPPORTED; return NULL; } \ + bufmgr_func = g_hal_tbm_bufmgr->bufmgr_func; \ + if (!bufmgr_func->__func__) { if (error) *error = HAL_TBM_ERROR_NOT_SUPPORTED; return NULL; }; + +#define BUFMGR_FUNC_ENTRY_GOTO(__func__, __goto__) \ + hal_tbm_bufmgr_func *bufmgr_func; \ + if (!g_hal_tbm_bufmgr || !g_hal_tbm_bufmgr->bufmgr_func) goto __goto__; \ + bufmgr_func = g_hal_tbm_bufmgr->bufmgr_func; \ + if (!bufmgr_func->__func__) goto __goto__; + +#define BO_FUNC_ENTRY(__func__) \ + hal_tbm_bo_func *bo_func; \ + if (!g_hal_tbm_bufmgr || !g_hal_tbm_bufmgr->bo_func) return HAL_TBM_ERROR_NOT_SUPPORTED; \ + bo_func = g_hal_tbm_bufmgr->bo_func; \ + if (!bo_func->__func__) return HAL_TBM_ERROR_NOT_SUPPORTED; + +#define BO_FUNC_ENTRY_VOID(__func__) \ + hal_tbm_bo_func *bo_func; \ + if (!g_hal_tbm_bufmgr || !g_hal_tbm_bufmgr->bo_func) return; \ + bo_func = g_hal_tbm_bufmgr->bo_func; \ + if (!bo_func->__func__) return; + +#define BO_FUNC_ENTRY_GOTO(__func__, __goto__) \ + hal_tbm_bo_func *bo_func; \ + if (!g_hal_tbm_bufmgr || !g_hal_tbm_bufmgr->bo_func) goto __goto__; \ + bo_func = g_hal_tbm_bufmgr->bo_func; \ + if (!bo_func->__func__) goto __goto__; + +typedef struct _hal_tbm_bufmgr +{ + hal_tbm_bufmgr_func *bufmgr_func; + hal_tbm_bo_func *bo_func; +} hal_tbm_bufmgr; + +static hal_tbm_bufmgr *g_hal_tbm_bufmgr = NULL; + +EXTERN hal_tbm_error +hal_tbm_get_backend(hal_tbm_bufmgr_data *bufmgr_data) +{ + int ret; + + if (g_hal_tbm_bufmgr) + return HAL_TBM_ERROR_INVALID_OPERATION; + + g_hal_tbm_bufmgr = calloc(1, sizeof(hal_tbm_bufmgr)); + if (!g_hal_tbm_bufmgr) + return HAL_TBM_ERROR_OUT_OF_MEMORY; + + ret = hal_common_get_backend(HAL_MODULE_TBM, (void **)&bufmgr_data); + if (ret < 0) { + _E("Failed to get backend\n"); + free(g_hal_tbm_bufmgr); + g_hal_tbm_bufmgr = NULL; + return HAL_TBM_ERROR_NOT_SUPPORTED; + } + + _I("hal_tbm_get_backend"); + + return HAL_TBM_ERROR_NONE; +} + +EXTERN void +hal_tbm_put_backend(void) +{ + if (!g_hal_tbm_bufmgr) + return; + + hal_common_put_backend(HAL_MODULE_TBM, NULL); + free(g_hal_tbm_bufmgr); + g_hal_tbm_bufmgr = NULL; + + _I("hal_tbm_put_backend"); +} + + +/* tbm_bufmgr_func */ +EXTERN hal_tbm_bufmgr_capability +hal_tbm_bufmgr_get_capabilities(hal_tbm_bufmgr_data *bufmgr_data, hal_tbm_error *error) +{ + BUFMGR_FUNC_ENTRY_GOTO(bufmgr_get_capabilities, fail); + + return bufmgr_func->bufmgr_get_capabilities((hal_tbm_bufmgr_data *)bufmgr_data, error); + +fail: + if (error) + *error = HAL_TBM_ERROR_NOT_SUPPORTED; + + return HAL_TBM_BUFMGR_CAPABILITY_NONE; +} + +EXTERN hal_tbm_error +hal_tbm_bufmgr_bind_native_display(hal_tbm_bufmgr_data *bufmgr_data, hal_tbm_native_display *native_display) +{ + BUFMGR_FUNC_ENTRY(bufmgr_bind_native_display); + + return bufmgr_func->bufmgr_bind_native_display((hal_tbm_bufmgr_data *)bufmgr_data, native_display); +} + +EXTERN hal_tbm_error +hal_tbm_bufmgr_get_supported_formats(hal_tbm_bufmgr_data *bufmgr_data, uint32_t **formats, uint32_t *num) +{ + BUFMGR_FUNC_ENTRY(bufmgr_get_supported_formats); + + return bufmgr_func->bufmgr_get_supported_formats((hal_tbm_bufmgr_data *)bufmgr_data, formats, num); +} + +EXTERN hal_tbm_error +hal_tbm_bufmgr_get_plane_data(hal_tbm_bufmgr_data *bufmgr_data, hal_tbm_format format, int plane_idx, int width, int height, + uint32_t *size, uint32_t *offset, uint32_t *pitch, int *bo_idx) +{ + BUFMGR_FUNC_ENTRY(bufmgr_get_plane_data); + + return bufmgr_func->bufmgr_get_plane_data((hal_tbm_bufmgr_data *)bufmgr_data, format, plane_idx, width, height, size, offset, pitch, bo_idx); +} + +EXTERN hal_tbm_bo_data * +hal_tbm_bufmgr_alloc_bo(hal_tbm_bufmgr_data *bufmgr_data, unsigned int size, hal_tbm_bo_memory_type mem_types, hal_tbm_error *error) +{ + BUFMGR_FUNC_ENTRY_NULL(bufmgr_alloc_bo); + + return bufmgr_func->bufmgr_alloc_bo((hal_tbm_bufmgr_data *)bufmgr_data, size, mem_types, error); +} + +EXTERN hal_tbm_bo_data * +hal_tbm_bufmgr_alloc_bo_with_format(hal_tbm_bufmgr_data *bufmgr_data, int format, int bo_idx, int width, int height, + hal_tbm_bo_memory_type mem_types, hal_tbm_error *error) +{ + BUFMGR_FUNC_ENTRY_NULL(bufmgr_alloc_bo_with_format); + + return bufmgr_func->bufmgr_alloc_bo_with_format((hal_tbm_bufmgr_data *)bufmgr_data, format, bo_idx, width, height, mem_types, error); +} + +EXTERN hal_tbm_bo_data * +hal_tbm_bufmgr_alloc_bo_with_tiled_format(hal_tbm_bufmgr_data *bufmgr_data, int width, int height, int bpp, int format, + hal_tbm_bo_memory_type flags, int bo_idx, hal_tbm_error *error) +{ + BUFMGR_FUNC_ENTRY_NULL(bufmgr_alloc_bo_with_tiled_format); + + return bufmgr_func->bufmgr_alloc_bo_with_tiled_format((hal_tbm_bufmgr_data *)bufmgr_data, width, height, bpp, format, flags, bo_idx, error); +} + +EXTERN hal_tbm_bo_data * +hal_tbm_bufmgr_import_fd(hal_tbm_bufmgr_data *bufmgr_data, hal_tbm_fd fd, hal_tbm_error *error) +{ + BUFMGR_FUNC_ENTRY_NULL(bufmgr_import_fd); + + return bufmgr_func->bufmgr_import_fd((hal_tbm_bufmgr_data *)bufmgr_data, fd, error); +} + +EXTERN hal_tbm_bo_data * +hal_tbm_bufmgr_import_key(hal_tbm_bufmgr_data *bufmgr_data, hal_tbm_key key, hal_tbm_error *error) +{ + BUFMGR_FUNC_ENTRY_NULL(bufmgr_import_key); + + return bufmgr_func->bufmgr_import_key((hal_tbm_bufmgr_data *)bufmgr_data, key, error); +} + + +/* tbm_bo_func*/ +EXTERN void +hal_tbm_bo_free(hal_tbm_bo_data *bo_data) +{ + BO_FUNC_ENTRY_VOID(bo_free); + bo_func->bo_free((hal_tbm_bo_data *)bo_data); +} + +EXTERN int +hal_tbm_bo_get_size(hal_tbm_bo_data *bo_data, hal_tbm_error *error) +{ + BO_FUNC_ENTRY_GOTO(bo_get_size, fail); + + return bo_func->bo_get_size((hal_tbm_bo_data *)bo_data, error); + +fail: + if (error) + *error = HAL_TBM_ERROR_NOT_SUPPORTED; + + return 0; +} + +EXTERN hal_tbm_bo_memory_type +hal_tbm_bo_get_memory_types(hal_tbm_bo_data *bo_data, hal_tbm_error *error) +{ + BO_FUNC_ENTRY_GOTO(bo_get_memory_types, fail); + + return bo_func->bo_get_memory_types((hal_tbm_bo_data *)bo_data, error); + +fail: + if (error) + *error = HAL_TBM_ERROR_NOT_SUPPORTED; + + return HAL_TBM_BO_DEFAULT; +} + +EXTERN hal_tbm_bo_handle +hal_tbm_bo_get_handle(hal_tbm_bo_data *bo_data, tbm_bo_device_type device, hal_tbm_error *error) +{ + BO_FUNC_ENTRY_GOTO(bo_get_handle, fail); + + return bo_func->bo_get_handle((hal_tbm_bo_data *)bo_data, device, error); + +fail: + if (error) + *error = HAL_TBM_ERROR_NOT_SUPPORTED; + + return (hal_tbm_bo_handle)NULL; +} + +EXTERN hal_tbm_bo_handle +hal_tbm_bo_map(hal_tbm_bo_data *bo_data, tbm_bo_device_type device, tbm_bo_access_option opt, hal_tbm_error *error) +{ + BO_FUNC_ENTRY_GOTO(bo_map, fail); + + return bo_func->bo_map((hal_tbm_bo_data *)bo_data, device, opt, error); + +fail: + if (error) + *error = HAL_TBM_ERROR_NOT_SUPPORTED; + + return (hal_tbm_bo_handle)NULL; +} + +EXTERN hal_tbm_error +hal_tbm_bo_unmap(hal_tbm_bo_data *bo_data) +{ + BO_FUNC_ENTRY(bo_unmap); + + return bo_func->bo_unmap((hal_tbm_bo_data *)bo_data); +} + +EXTERN hal_tbm_error +hal_tbm_bo_lock(hal_tbm_bo_data *bo_data, tbm_bo_device_type device, tbm_bo_access_option opt) +{ + BO_FUNC_ENTRY(bo_unmap); + + return bo_func->bo_lock((hal_tbm_bo_data *)bo_data, device, opt); +} + +EXTERN hal_tbm_error +hal_tbm_bo_unlock(hal_tbm_bo_data *bo_data) +{ + BO_FUNC_ENTRY(bo_unmap); + + return bo_func->bo_unlock((hal_tbm_bo_data *)bo_data); +} + +EXTERN hal_tbm_fd +hal_tbm_bo_export_fd(hal_tbm_bo_data *bo_data, hal_tbm_error *error) +{ + BO_FUNC_ENTRY_GOTO(bo_export_fd, fail); + + return bo_func->bo_export_fd((hal_tbm_bo_data *)bo_data, error); + +fail: + if (error) + *error = HAL_TBM_ERROR_NOT_SUPPORTED; + + return -1; +} + +EXTERN hal_tbm_key +hal_tbm_bo_export_key(hal_tbm_bo_data *bo_data, hal_tbm_error *error) +{ + BO_FUNC_ENTRY_GOTO(bo_export_key, fail); + + return bo_func->bo_export_key((hal_tbm_bo_data *)bo_data, error); + +fail: + if (error) + *error = HAL_TBM_ERROR_NOT_SUPPORTED; + + return 0; +} + + +/* tbm_func*/ +EXTERN int +hal_tbm_query_display_server(hal_tbm_error *error) +{ +// BUFMGR_ENTRY_NULL(); + + //TODO: + return 0; +} + +EXTERN hal_tbm_bufmgr_func * +hal_tbm_alloc_bufmgr_func(hal_tbm_error *error) +{ + BUFMGR_ENTRY_NULL(); + + bufmgr_func = calloc(1, sizeof(hal_tbm_bufmgr_func)); + if (!bufmgr_func) { + _E("error: fail to allocate the tbm_bufmgr_func\n"); + if (error) + *error = HAL_TBM_ERROR_OUT_OF_MEMORY; + + return NULL; + } + + if (error) + *error = HAL_TBM_ERROR_NONE; + + return bufmgr_func; +} + +EXTERN void +hal_tbm_free_bufmgr_func(hal_tbm_bufmgr_func *func) +{ + BUFMGR_ENTRY_VOID(); + + if (func) + free(func); + + g_hal_tbm_bufmgr->bufmgr_func = NULL; +} + +EXTERN hal_tbm_error +hal_tbm_register_bufmgr_func(hal_tbm_bufmgr_func *func) +{ + if (!g_hal_tbm_bufmgr) return HAL_TBM_ERROR_INVALID_OPERATION; + if (g_hal_tbm_bufmgr->bufmgr_func) return HAL_TBM_ERROR_INVALID_OPERATION; + if (!func) return HAL_TBM_ERROR_INVALID_PARAMETER; + g_hal_tbm_bufmgr->bufmgr_func = func; + + return HAL_TBM_ERROR_NONE; +} + +EXTERN hal_tbm_bo_func * +hal_tbm_alloc_bo_func(hal_tbm_error *error) +{ + BUFMGR_ENTRY_NULL(); + + hal_tbm_bo_func *bo_func; + + bo_func = calloc(1, sizeof(hal_tbm_bo_func)); + if (!bo_func) { + _E("error: fail to allocate the tbm_bufmgr_func\n"); + if (error) + *error = HAL_TBM_ERROR_OUT_OF_MEMORY; + + return NULL; + } + + if (error) + *error = HAL_TBM_ERROR_NONE; + + return bo_func; +} + +EXTERN void +hal_tbm_free_bo_func(hal_tbm_bo_func *func) +{ + BUFMGR_ENTRY_VOID(); + + if (func) + free(func); + + g_hal_tbm_bufmgr->bo_func = NULL; +} + +EXTERN hal_tbm_error +hal_tbm_register_bo_func(hal_tbm_bo_func *func) +{ + if (!g_hal_tbm_bufmgr) return HAL_TBM_ERROR_INVALID_OPERATION; + if (g_hal_tbm_bufmgr->bo_func) return HAL_TBM_ERROR_INVALID_OPERATION; + if (!func) return HAL_TBM_ERROR_INVALID_PARAMETER; + g_hal_tbm_bufmgr->bo_func = func; + + return HAL_TBM_ERROR_NONE; +} \ No newline at end of file