diff options
author | Hyesoo Yu <hyesoo.yu@samsung.com> | 2019-06-18 18:19:34 +0900 |
---|---|---|
committer | Cho KyongHo <pullip.cho@samsung.com> | 2020-02-24 18:21:34 -0800 |
commit | 17f8f939b4537c20ff45093a43faec4038cdbf79 (patch) | |
tree | 97b7fa8223d06a443938c95881d06d05af8bd853 | |
parent | 25e86f1564fa93b1315f93bf02c6d33c864cfd5f (diff) |
libacryl: support sbwc lossy format for G2D
Change-Id: I017d3662eb53ee47b923cffab1cd68f144c78f58
Signed-off-by: Hyesoo Yu <hyesoo.yu@samsung.com>
-rw-r--r-- | libacryl/acrylic_factory.cpp | 59 | ||||
-rw-r--r-- | libacryl/acrylic_g2d9810.cpp | 70 | ||||
-rw-r--r-- | libacryl/local_include/uapi/g2d9810.h | 2 |
3 files changed, 107 insertions, 24 deletions
diff --git a/libacryl/acrylic_factory.cpp b/libacryl/acrylic_factory.cpp index c6030b4..a052122 100644 --- a/libacryl/acrylic_factory.cpp +++ b/libacryl/acrylic_factory.cpp @@ -70,6 +70,38 @@ static uint32_t all_fimg2d_hdr_formats[] = { HAL_PIXEL_FORMAT_EXYNOS_YCbCr_P010_M, }; +static uint32_t all_fimg2d_sbwc_lossy_formats[] = { + HAL_PIXEL_FORMAT_RGBA_8888, + HAL_PIXEL_FORMAT_BGRA_8888, + HAL_PIXEL_FORMAT_RGBA_1010102, + HAL_PIXEL_FORMAT_RGBX_8888, + HAL_PIXEL_FORMAT_RGB_888, + HAL_PIXEL_FORMAT_RGB_565, + HAL_PIXEL_FORMAT_YCrCb_420_SP, // NV21 (YVU420 semi-planar) + HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M, // NV21 on multi-buffer + HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M_FULL, // NV21 on multi-buffer + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP, // NV12 (YUV420 semi-planar) + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN, // NV12 with MFC alignment constraints + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M, // NV12M with MFC alignment constraints on multi-buffer + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_PRIV, // NV12M with MFC alignment constraints on multi-buffer + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN_S10B, // NV12 10-bit with MFC alignment constraints + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_S10B, // NV12 10-bit multi-buffer + HAL_PIXEL_FORMAT_YCbCr_422_I, // YUYV + HAL_PIXEL_FORMAT_EXYNOS_YCrCb_422_I, // YVYU + HAL_PIXEL_FORMAT_YCbCr_422_SP, // YUV422 2P (YUV422 semi-planar) + HAL_PIXEL_FORMAT_YCBCR_P010, + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_P010_M, + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_SBWC, + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN_SBWC, + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_10B_SBWC, + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN_10B_SBWC, + HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M_SBWC, + HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M_10B_SBWC, + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_SBWC_L50, // SBWC Lossy 64 block + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_10B_SBWC_L40, // SBWC Lossy 64 block with 10 bit + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_10B_SBWC_L80, // SBWC Lossy 128 block with 10 bit +}; + static uint32_t all_fimg2d_sbwc_formats[] = { HAL_PIXEL_FORMAT_RGBA_8888, HAL_PIXEL_FORMAT_BGRA_8888, @@ -330,6 +362,30 @@ const static stHW2DCapability __capability_fimg2d_9830 = { .base_align = 1, }; +const static stHW2DCapability __capability_fimg2d_9630 = { + .max_upsampling_num = {32767, 32767}, + .max_downsampling_factor = {31767, 32767}, + .max_upsizing_num = {32767, 32767}, + .max_downsizing_factor = {32767, 32767}, + .min_src_dimension = {1, 1}, + .max_src_dimension = {8192, 8192}, + .min_dst_dimension = {1, 1}, + .max_dst_dimension = {8192, 8192}, + .min_pix_align = {1, 1}, + .rescaling_count = 0, + .compositing_mode = HW2DCapability::BLEND_NONE | HW2DCapability::BLEND_SRC_COPY | HW2DCapability::BLEND_SRC_OVER, + .transform_type = HW2DCapability::TRANSFORM_ALL, + .auxiliary_feature = HW2DCapability::FEATURE_PLANE_ALPHA | HW2DCapability::FEATURE_UORDER_WRITE + | HW2DCapability::FEATURE_AFBC_ENCODE | HW2DCapability::FEATURE_AFBC_DECODE + | HW2DCapability::FEATURE_OTF_WRITE | HW2DCapability::FEATURE_SOLIDCOLOR, + .num_formats = ARRSIZE(all_fimg2d_sbwc_lossy_formats), + .num_dataspaces = ARRSIZE(all_hwc_dataspaces), + .max_layers = 8, + .pixformats = all_fimg2d_sbwc_lossy_formats, + .dataspaces = all_hwc_dataspaces, + .base_align = 1, +}; + const static stHW2DCapability __capability_fimg2d_8890 = { .max_upsampling_num = {32767, 32767}, .max_downsampling_factor = {2, 2}, @@ -403,6 +459,7 @@ static const HW2DCapability capability_fimg2d_8890(__capability_fimg2d_8890); static const HW2DCapability capability_fimg2d_9610(__capability_fimg2d_9610); static const HW2DCapability capability_fimg2d_9810(__capability_fimg2d_9810); static const HW2DCapability capability_fimg2d_9830(__capability_fimg2d_9830); +static const HW2DCapability capability_fimg2d_9630(__capability_fimg2d_9630); static const HW2DCapability capability_fimg2d_9810_blter(__capability_fimg2d_9810_blter); static const HW2DCapability capability_mscl_9810(__capability_mscl_9810); static const HW2DCapability capability_mscl_9830(__capability_mscl_9830); @@ -427,6 +484,8 @@ Acrylic *Acrylic::createInstance(const char *spec) compositor = new AcrylicCompositorG2D9810(capability_fimg2d_9810, true); } else if (strcmp(spec, "fimg2d_9830") == 0) { compositor = new AcrylicCompositorG2D9810(capability_fimg2d_9830, true); + } else if (strcmp(spec, "fimg2d_9630") == 0) { + compositor = new AcrylicCompositorG2D9810(capability_fimg2d_9630, true); } else if (strcmp(spec, "mscl_9810") == 0) { compositor = new AcrylicCompositorMSCL9810(capability_mscl_9810); } else if (strcmp(spec, "mscl_9830") == 0) { diff --git a/libacryl/acrylic_g2d9810.cpp b/libacryl/acrylic_g2d9810.cpp index 4ab65f8..e118b90 100644 --- a/libacryl/acrylic_g2d9810.cpp +++ b/libacryl/acrylic_g2d9810.cpp @@ -323,6 +323,9 @@ static g2d_fmt __halfmt_to_g2dfmt_9820[] = { {HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN_10B_SBWC, G2D_FMT_NV12_SBWC_10B, 1, 0}, {HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M_SBWC, G2D_FMT_NV21_SBWC, 2, 0}, {HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M_10B_SBWC, G2D_FMT_NV21_SBWC_10B, 2, 0}, + {HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_SBWC_L50, G2D_FMT_NV12_SBWC, 2, 0}, + {HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_10B_SBWC_L40, G2D_FMT_NV12_SBWC_10B, 2, 0}, + {HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_10B_SBWC_L80, G2D_FMT_NV12_SBWC_10B, 2, 0}, }; static g2d_fmt *halfmt_to_g2dfmt(struct g2d_fmt *tbl, size_t tbl_len, uint32_t halfmt) @@ -377,6 +380,10 @@ AcrylicCompositorG2D9810::~AcrylicCompositorG2D9810() ALIGN(((w) / SBWC_BLOCK_WIDTH) * SBWC_BLOCK_SIZE(dep), \ SBWC_PAYLOAD_ALIGN) +#define SBWC_LOSSY_PAYLOAD_STRIDE(w, block_byte) \ + ALIGN(((w) / SBWC_BLOCK_WIDTH) * (block_byte), \ + SBWC_PAYLOAD_ALIGN) + static uint32_t mfc_stride_formats[] = { HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN, HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN_S10B, @@ -389,6 +396,12 @@ static uint32_t mfc_stride_formats[] = { HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M_10B_SBWC, }; +static unsigned int sbwc_lossy_formats[] = { + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_SBWC_L50, + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_10B_SBWC_L40, + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_10B_SBWC_L80, +}; + bool AcrylicCompositorG2D9810::prepareImage(AcrylicCanvas &layer, struct g2d_layer &image, uint32_t cmd[], int index) { image.flags = 0; @@ -460,36 +473,44 @@ bool AcrylicCompositorG2D9810::prepareImage(AcrylicCanvas &layer, struct g2d_lay cmd[G2DSFR_IMG_STRIDE] = g2dfmt->rgb_bpp * xy.hori; } + unsigned int payload = 0, header = 0, lossyByteNum = 0; + if (g2dfmt->g2dfmt & G2D_DATAFORMAT_SBWC) { - int dep = (g2dfmt->g2dfmt & G2D_FMT_YCBCR_10BIT) ? 10 : 8; - unsigned int header = SBWC_HEADER_STRIDE(xy.hori); - unsigned int payload = SBWC_PAYLOAD_STRIDE(xy.hori, dep); - - if (index < 0) { - cmd[G2DSFR_DST_Y_HEADER_STRIDE] = header; - cmd[G2DSFR_DST_C_HEADER_STRIDE] = header; - cmd[G2DSFR_DST_Y_PAYLOAD_STRIDE] = payload; - cmd[G2DSFR_DST_C_PAYLOAD_STRIDE] = payload; - } else { - cmd[G2DSFR_SRC_Y_HEADER_STRIDE] = header; - cmd[G2DSFR_SRC_C_HEADER_STRIDE] = header; - cmd[G2DSFR_SRC_Y_PAYLOAD_STRIDE] = payload; - cmd[G2DSFR_SRC_C_PAYLOAD_STRIDE] = payload; + unsigned int blocksize; + unsigned int isLossy = 0; + unsigned int format = layer.getFormat(); + + for (unsigned int i = 0; i < ARRSIZE(sbwc_lossy_formats); i++) { + if (format == sbwc_lossy_formats[i]) { + isLossy = 1; + blocksize = (i < 2) ? 64 : 128; + break; + } } - } else { - if (index < 0) { - cmd[G2DSFR_DST_Y_HEADER_STRIDE] = 0; - cmd[G2DSFR_DST_C_HEADER_STRIDE] = 0; - cmd[G2DSFR_DST_Y_PAYLOAD_STRIDE] = 0; - cmd[G2DSFR_DST_C_PAYLOAD_STRIDE] = 0; + + if (isLossy) { + lossyByteNum = (blocksize >> 1) | isLossy; + payload = SBWC_LOSSY_PAYLOAD_STRIDE(xy.hori, blocksize); } else { - cmd[G2DSFR_SRC_Y_HEADER_STRIDE] = 0; - cmd[G2DSFR_SRC_C_HEADER_STRIDE] = 0; - cmd[G2DSFR_SRC_Y_PAYLOAD_STRIDE] = 0; - cmd[G2DSFR_SRC_C_PAYLOAD_STRIDE] = 0; + payload = SBWC_PAYLOAD_STRIDE(xy.hori, (g2dfmt->g2dfmt & G2D_FMT_YCBCR_10BIT) ? 10 : 8); + header = SBWC_HEADER_STRIDE(xy.hori); } } + if (index < 0) { + cmd[G2DSFR_DST_Y_HEADER_STRIDE] = header; + cmd[G2DSFR_DST_C_HEADER_STRIDE] = header; + cmd[G2DSFR_DST_Y_PAYLOAD_STRIDE] = payload; + cmd[G2DSFR_DST_C_PAYLOAD_STRIDE] = payload; + cmd[G2DSFR_DST_SBWCINFO] = lossyByteNum; + } else { + cmd[G2DSFR_SRC_Y_HEADER_STRIDE] = header; + cmd[G2DSFR_SRC_C_HEADER_STRIDE] = header; + cmd[G2DSFR_SRC_Y_PAYLOAD_STRIDE] = payload; + cmd[G2DSFR_SRC_C_PAYLOAD_STRIDE] = payload; + cmd[G2DSFR_SRC_SBWCINFO] = lossyByteNum; + } + cmd[G2DSFR_IMG_LEFT] = 0; cmd[G2DSFR_IMG_TOP] = 0; cmd[G2DSFR_IMG_RIGHT] = xy.hori; @@ -529,6 +550,7 @@ static void setSolidLayer(struct g2d_layer &image, uint32_t cmd[], hw2d_coord_t cmd[G2DSFR_SRC_C_HEADER_STRIDE] = 0; cmd[G2DSFR_SRC_Y_PAYLOAD_STRIDE] = 0; cmd[G2DSFR_SRC_C_PAYLOAD_STRIDE] = 0; + cmd[G2DSFR_SRC_SBWCINFO] = 0; } bool AcrylicCompositorG2D9810::prepareSolidLayer(AcrylicCanvas &canvas, struct g2d_layer &image, uint32_t cmd[]) diff --git a/libacryl/local_include/uapi/g2d9810.h b/libacryl/local_include/uapi/g2d9810.h index 0fa4e2a..a20eca4 100644 --- a/libacryl/local_include/uapi/g2d9810.h +++ b/libacryl/local_include/uapi/g2d9810.h @@ -178,6 +178,7 @@ enum g2dsfr_src_register { G2DSFR_SRC_Y_PAYLOAD_STRIDE, G2DSFR_SRC_C_HEADER_STRIDE, G2DSFR_SRC_C_PAYLOAD_STRIDE, + G2DSFR_SRC_SBWCINFO, G2DSFR_SRC_FIELD_COUNT }; @@ -191,6 +192,7 @@ enum g2dsfr_dst_register { G2DSFR_DST_Y_PAYLOAD_STRIDE, G2DSFR_DST_C_HEADER_STRIDE, G2DSFR_DST_C_PAYLOAD_STRIDE, + G2DSFR_DST_SBWCINFO, G2DSFR_DST_FIELD_COUNT, }; |