add static functions for controlling the hal_tbm_surface 81/258281/3
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 13 May 2021 05:40:37 +0000 (14:40 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Wed, 23 Jun 2021 23:52:01 +0000 (08:52 +0900)
Change-Id: I77e4870e84d830cdb8cc43fcdd342983118c0122

src/libhal-backend-tbm-vc4/tbm_backend_vc4.c

index 38f85bf..7f45e83 100644 (file)
@@ -208,6 +208,13 @@ static uint32_t tbm_vc4_color_format_list[TBM_COLOR_FORMAT_COUNT] = {
                                                                                HAL_TBM_FORMAT_NV12,
                                                                                HAL_TBM_FORMAT_YUV420
                                                                        };
+
+static hal_tbm_bo *tbm_vc4_bufmgr_alloc_bo(hal_tbm_bufmgr *bufmgr, unsigned int size,
+                                       hal_tbm_bo_memory_type flags, hal_tbm_error *error);
+static void tbm_vc4_bo_free(hal_tbm_bo *bo);
+static hal_tbm_bo *tbm_vc4_bufmgr_import_fd(hal_tbm_bufmgr *bufmgr, hal_tbm_fd key, hal_tbm_error *error);
+static hal_tbm_fd tbm_vc4_bo_export_fd(hal_tbm_bo *bo, hal_tbm_error *error);
+
 #undef  ENABLE_CACHECRTL
 #ifdef ENABLE_CACHECRTL
 #ifdef TGL_GET_VERSION
@@ -1065,6 +1072,87 @@ tbm_vc4_bufmgr_alloc_bo_with_tiled_format(hal_tbm_bufmgr *bufmgr, int width, int
 }
 #endif
 
+static int
+_tbm_vc4_bufmgr_get_num_planes(hal_tbm_format format)
+{
+       int num_planes = 0;
+
+       switch (format) {
+       case HAL_TBM_FORMAT_C8:
+       case HAL_TBM_FORMAT_RGB332:
+       case HAL_TBM_FORMAT_BGR233:
+       case HAL_TBM_FORMAT_XRGB4444:
+       case HAL_TBM_FORMAT_XBGR4444:
+       case HAL_TBM_FORMAT_RGBX4444:
+       case HAL_TBM_FORMAT_BGRX4444:
+       case HAL_TBM_FORMAT_ARGB4444:
+       case HAL_TBM_FORMAT_ABGR4444:
+       case HAL_TBM_FORMAT_RGBA4444:
+       case HAL_TBM_FORMAT_BGRA4444:
+       case HAL_TBM_FORMAT_XRGB1555:
+       case HAL_TBM_FORMAT_XBGR1555:
+       case HAL_TBM_FORMAT_RGBX5551:
+       case HAL_TBM_FORMAT_BGRX5551:
+       case HAL_TBM_FORMAT_ARGB1555:
+       case HAL_TBM_FORMAT_ABGR1555:
+       case HAL_TBM_FORMAT_RGBA5551:
+       case HAL_TBM_FORMAT_BGRA5551:
+       case HAL_TBM_FORMAT_RGB565:
+       case HAL_TBM_FORMAT_BGR565:
+       case HAL_TBM_FORMAT_RGB888:
+       case HAL_TBM_FORMAT_BGR888:
+       case HAL_TBM_FORMAT_XRGB8888:
+       case HAL_TBM_FORMAT_XBGR8888:
+       case HAL_TBM_FORMAT_RGBX8888:
+       case HAL_TBM_FORMAT_BGRX8888:
+       case HAL_TBM_FORMAT_ARGB8888:
+       case HAL_TBM_FORMAT_ABGR8888:
+       case HAL_TBM_FORMAT_RGBA8888:
+       case HAL_TBM_FORMAT_BGRA8888:
+       case HAL_TBM_FORMAT_XRGB2101010:
+       case HAL_TBM_FORMAT_XBGR2101010:
+       case HAL_TBM_FORMAT_RGBX1010102:
+       case HAL_TBM_FORMAT_BGRX1010102:
+       case HAL_TBM_FORMAT_ARGB2101010:
+       case HAL_TBM_FORMAT_ABGR2101010:
+       case HAL_TBM_FORMAT_RGBA1010102:
+       case HAL_TBM_FORMAT_BGRA1010102:
+       case HAL_TBM_FORMAT_YUYV:
+       case HAL_TBM_FORMAT_YVYU:
+       case HAL_TBM_FORMAT_UYVY:
+       case HAL_TBM_FORMAT_VYUY:
+       case HAL_TBM_FORMAT_AYUV:
+               num_planes = 1;
+               break;
+       case HAL_TBM_FORMAT_NV12:
+       case HAL_TBM_FORMAT_NV12MT:
+       case HAL_TBM_FORMAT_NV21:
+       case HAL_TBM_FORMAT_NV16:
+       case HAL_TBM_FORMAT_NV61:
+               num_planes = 2;
+               break;
+       case HAL_TBM_FORMAT_YUV410:
+       case HAL_TBM_FORMAT_YVU410:
+       case HAL_TBM_FORMAT_YUV411:
+       case HAL_TBM_FORMAT_YVU411:
+       case HAL_TBM_FORMAT_YUV420:
+       case HAL_TBM_FORMAT_YVU420:
+       case HAL_TBM_FORMAT_YUV422:
+       case HAL_TBM_FORMAT_YVU422:
+       case HAL_TBM_FORMAT_YUV444:
+       case HAL_TBM_FORMAT_YVU444:
+               num_planes = 3;
+               break;
+
+       default:
+               num_planes = 0;
+               TBM_BACKEND_ERR("Invalid format : %d", format);
+               break;
+       }
+
+       return num_planes;
+}
+
 static hal_tbm_error
 tbm_vc4_bufmgr_get_plane_data(hal_tbm_bufmgr *bufmgr,
                                                        hal_tbm_format format, int plane_idx, int width,
@@ -1365,6 +1453,56 @@ tbm_vc4_bufmgr_get_plane_data(hal_tbm_bufmgr *bufmgr,
        return HAL_TBM_ERROR_NONE;
 }
 
+static void
+_tbm_vc4_surface_data_set_bo_data(tbm_vc4_surface *surface_data, tbm_vc4_bo *bo_data)
+{
+       surface_data->bo_data = bo_data;
+       surface_data->num_bos++;
+}
+
+static void
+_tbm_vc4_surface_data_destroy(tbm_vc4_surface *surface_data)
+{
+       surface_data->refcnt--;
+       if (surface_data->refcnt > 0) {
+               TBM_BACKEND_INFO("surface_data->refcnt:%d", surface_data->refcnt);
+               return;
+       }
+
+       TBM_BACKEND_INFO("surface_data destroy");
+
+       if (surface_data->bo_data) {
+               tbm_vc4_bo_free((hal_tbm_bo *)surface_data->bo_data);
+               surface_data->bo_data = NULL;
+       }
+
+       LIST_DEL(&surface_data->link);
+       free(surface_data);
+}
+
+static tbm_vc4_surface *
+_tbm_vc4_surface_data_create(tbm_vc4_bufmgr *bufmgr_data, uint32_t width, uint32_t height, hal_tbm_format format, hal_tbm_error *error)
+{
+       tbm_vc4_surface *surface_data;
+
+       surface_data = calloc(1, sizeof(struct _tbm_vc4_surface));
+       if (!surface_data) {
+               TBM_BACKEND_ERR("fail to allocate the surface_data");
+               if (error)
+                       *error = HAL_TBM_ERROR_OUT_OF_MEMORY;
+               return NULL;
+       }
+       surface_data->width = width;
+       surface_data->height = height;
+       surface_data->format = format;
+       surface_data->bufmgr_data = bufmgr_data;
+       surface_data->refcnt = 1;
+
+       LIST_ADDTAIL(&surface_data->link, &bufmgr_data->surface_data_list);
+
+       return surface_data;
+}
+
 static hal_tbm_surface *
 tbm_vc4_bufmgr_alloc_surface(hal_tbm_bufmgr *bufmgr, uint32_t width, uint32_t height, hal_tbm_format format,
                        hal_tbm_bo_memory_type mem_types, uint64_t *modifiers, uint32_t num_modifiers, hal_tbm_error *error)