+
+/* LCOV_EXCL_START */
+failed:
+ if (bo_data)
+ free(bo_data);
+
+ return NULL;
+/* LCOV_EXCL_STOP */
+}
+
+int
+tbm_module_compare_bo_data(tbm_module *module, tbm_bo_data *bo_data1, tbm_bo_data *bo_data2)
+{
+ TBM_RETURN_VAL_IF_FAIL(module, 0);
+
+ switch (module->type) {
+ case TBM_MODULE_TYPE_HAL_TBM:
+ return (bo_data1->hal_bo == bo_data2->hal_bo);
+ break;
+/* LCOV_EXCL_START */
+ case TBM_MODULE_TYPE_TBM_BACKEND:
+ return (bo_data1->backend_bo_data == bo_data2->backend_bo_data);
+ break;
+ case TBM_MODULE_TYPE_BUFMGR_BACKEND:
+ TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
+ return (bo_data1->priv == bo_data2->priv);
+ break;
+ default:
+ TBM_ERR("Wrong module type:%d", module->type);
+ break;
+/* LCOV_EXCL_STOP */
+ }
+
+ return 0;
+}
+
+void
+tbm_surface_data_free(tbm_surface_data *surface_data)
+{
+ TBM_RETURN_IF_FAIL(surface_data);
+ TBM_RETURN_IF_FAIL(surface_data->module);
+ TBM_RETURN_IF_FAIL(surface_data->module->type == TBM_MODULE_TYPE_HAL_TBM);
+
+ surface_data->module = NULL;
+
+ hal_tbm_surface_free(surface_data->hal_surface);
+ surface_data->hal_surface = NULL;
+
+ free(surface_data);
+}
+
+tbm_error_e
+tbm_surface_data_get_plane_data(tbm_surface_data *surface_data, int plane_idx, uint32_t *size, uint32_t *offset, uint32_t *pitch, int *bo_idx)
+{
+ tbm_error_e error;
+
+ TBM_RETURN_VAL_IF_FAIL(surface_data, TBM_ERROR_INVALID_PARAMETER);
+ TBM_RETURN_VAL_IF_FAIL(surface_data->hal_surface, TBM_ERROR_NOT_SUPPORTED);
+
+ error = (tbm_error_e)hal_tbm_surface_get_plane_data(surface_data->hal_surface, plane_idx, size, offset, pitch, bo_idx);
+ TBM_RETURN_VAL_IF_FAIL(error == TBM_ERROR_NONE, error);
+
+ return TBM_ERROR_NONE;
+}
+
+tbm_bo_data **
+tbm_surface_data_get_bo_data_array(tbm_surface_data *surface_data, int *num_bos, int *memory_types, tbm_error_e *error)
+{
+ tbm_bo_data **bo_data_array = NULL;
+ hal_tbm_bo **hal_bos = NULL;
+ int i;
+
+ TBM_RETURN_VAL_SET_ERR_IF_FAIL(surface_data, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
+ TBM_RETURN_VAL_SET_ERR_IF_FAIL(surface_data->hal_surface, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
+
+ hal_bos = hal_tbm_surface_get_bos(surface_data->hal_surface, num_bos, (hal_tbm_error *)error);
+ TBM_RETURN_VAL_IF_FAIL(hal_bos, NULL);
+
+ bo_data_array = calloc(*num_bos, sizeof(tbm_bo_data *));
+ TBM_RETURN_VAL_IF_FAIL(bo_data_array, NULL);
+
+ for (i = 0; i < *num_bos; i++) {
+ bo_data_array[i] = calloc(*num_bos, sizeof(struct _tbm_bo_data));
+ TBM_GOTO_VAL_SET_ERR_IF_FAIL(bo_data_array[i], failed, *error, TBM_ERROR_OUT_OF_MEMORY);
+ }
+
+ for (i = 0; i < *num_bos; i++) {
+ bo_data_array[i]->hal_bo = hal_bos[i];
+ bo_data_array[i]->module = surface_data->module;
+ }
+
+ // get memory_types(bo flags)
+ *memory_types = tbm_bo_data_get_memory_types(bo_data_array[0], error);
+ TBM_GOTO_VAL_IF_FAIL(*error == TBM_ERROR_NONE, failed);
+
+ return bo_data_array;
+
+/* LCOV_EXCL_START */
+failed:
+ for (i = 0; i < *num_bos; i++) {
+ if (bo_data_array[i])
+ free(bo_data_array[i]);
+ }
+ free(bo_data_array);
+
+ return NULL;
+/* LCOV_EXCL_STOP */
+}
+
+tbm_surface_buffer_data *
+tbm_surface_data_export(tbm_surface_data *surface_data, tbm_error_e *error)
+{
+ tbm_surface_buffer_data *buffer_data;
+
+ TBM_RETURN_VAL_SET_ERR_IF_FAIL(surface_data, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
+ TBM_RETURN_VAL_SET_ERR_IF_FAIL(surface_data->hal_surface, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
+
+ buffer_data = (tbm_surface_buffer_data *)hal_tbm_surface_export((hal_tbm_surface *)surface_data->hal_surface,
+ (hal_tbm_error *)error);
+ TBM_RETURN_VAL_IF_FAIL(buffer_data, NULL);
+
+ return buffer_data;