diff options
author | hyesoo.yu <hyesoo.yu@samsung.com> | 2019-03-14 14:18:09 +0900 |
---|---|---|
committer | Cho KyongHo <pullip.cho@samsung.com> | 2020-02-24 18:21:34 -0800 |
commit | 10a50b9a23878574da6dd0635256e0b8ecd60d1d (patch) | |
tree | 2495d04ad1c10535ba912776179777e17675ae1b /libacryl | |
parent | 63687088b37bc2164b8c1a38d698861827952bb2 (diff) |
libacryl: support sbwc format on 2020 version
Change-Id: I6201f79430f71bc943744279ab899486194ebe79
Signed-off-by: hyesoo.yu <hyesoo.yu@samsung.com>
Diffstat (limited to 'libacryl')
-rw-r--r-- | libacryl/acrylic_factory.cpp | 56 | ||||
-rw-r--r-- | libacryl/acrylic_g2d9810.cpp | 87 | ||||
-rw-r--r-- | libacryl/acrylic_g2d9810.h | 2 | ||||
-rw-r--r-- | libacryl/local_include/uapi/g2d9810.h | 13 |
4 files changed, 143 insertions, 15 deletions
diff --git a/libacryl/acrylic_factory.cpp b/libacryl/acrylic_factory.cpp index 0e12a5b..6f215e0 100644 --- a/libacryl/acrylic_factory.cpp +++ b/libacryl/acrylic_factory.cpp @@ -70,6 +70,35 @@ static uint32_t all_fimg2d_hdr_formats[] = { HAL_PIXEL_FORMAT_EXYNOS_YCbCr_P010_M, }; +static uint32_t all_fimg2d_sbwc_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, +}; + static uint32_t all_mscl_formats[] = { HAL_PIXEL_FORMAT_RGBA_8888, HAL_PIXEL_FORMAT_BGRA_8888, @@ -244,6 +273,30 @@ const static stHW2DCapability __capability_fimg2d_9810_blter = { .base_align = 1, }; +const static stHW2DCapability __capability_fimg2d_9830 = { + .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, + .num_formats = ARRSIZE(all_fimg2d_sbwc_formats), + .num_dataspaces = ARRSIZE(all_hwc_dataspaces), + .max_layers = 16, + .pixformats = all_fimg2d_sbwc_formats, + .dataspaces = all_hwc_dataspaces, + .base_align = 1, +}; + const static stHW2DCapability __capability_fimg2d_8890 = { .max_upsampling_num = {32767, 32767}, .max_downsampling_factor = {2, 2}, @@ -293,6 +346,7 @@ static const HW2DCapability capability_fimg2d_8895(__capability_fimg2d_8895); 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_9810_blter(__capability_fimg2d_9810_blter); static const HW2DCapability capability_mscl_9810(__capability_mscl_9810); @@ -314,6 +368,8 @@ Acrylic *Acrylic::createInstance(const char *spec) compositor = new AcrylicCompositorG2D9810(capability_fimg2d_9810_blter, false); } else if (strcmp(spec, "fimg2d_9820") == 0) { 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, "mscl_9810") == 0) { compositor = new AcrylicCompositorMSCL9810(capability_mscl_9810); } else if (strcmp(spec, "dummy") == 0) { diff --git a/libacryl/acrylic_g2d9810.cpp b/libacryl/acrylic_g2d9810.cpp index e811d2c..935a143 100644 --- a/libacryl/acrylic_g2d9810.cpp +++ b/libacryl/acrylic_g2d9810.cpp @@ -317,7 +317,12 @@ static g2d_fmt __halfmt_to_g2dfmt_9820[] = { {HAL_PIXEL_FORMAT_YCbCr_422_I, G2D_FMT_YUYV, 1, 0}, {HAL_PIXEL_FORMAT_EXYNOS_YCrCb_422_I, G2D_FMT_YVYU, 1, 0}, {HAL_PIXEL_FORMAT_YCbCr_422_SP, G2D_FMT_NV16, 1, 0}, - // TODO: add p010 + {HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_SBWC, G2D_FMT_NV12_SBWC, 2, 0}, + {HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN_SBWC, G2D_FMT_NV12_SBWC, 1, 0}, + {HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_10B_SBWC, G2D_FMT_NV12_SBWC_10B, 2, 0}, + {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}, }; static g2d_fmt *halfmt_to_g2dfmt(struct g2d_fmt *tbl, size_t tbl_len, uint32_t halfmt) @@ -359,7 +364,32 @@ AcrylicCompositorG2D9810::~AcrylicCompositorG2D9810() ALOGD_TEST("Deleting Acrylic for G2D 9810 on %p", this); } -bool AcrylicCompositorG2D9810::prepareImage(AcrylicCanvas &layer, struct g2d_layer &image, uint32_t cmd[]) +#define SBWC_BLOCK_WIDTH 32 +#define SBWC_BLOCK_HEIGHT 4 +#define SBWC_BLOCK_SIZE(bit) (SBWC_BLOCK_WIDTH * SBWC_BLOCK_HEIGHT * (bit) / 8) + +#define SBWC_HEADER_ALIGN 16 +#define SBWC_PAYLOAD_ALIGN 32 + +#define SBWC_HEADER_STRIDE(w) \ + ALIGN(((w) / SBWC_BLOCK_WIDTH / 2), SBWC_HEADER_ALIGN) +#define SBWC_PAYLOAD_STRIDE(w, dep)\ + ALIGN(((w) / SBWC_BLOCK_WIDTH) * SBWC_BLOCK_SIZE(dep), \ + SBWC_PAYLOAD_ALIGN) + +static uint32_t mfc_stride_formats[] = { + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN, + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN_S10B, + HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_S10B, + 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, +}; + +bool AcrylicCompositorG2D9810::prepareImage(AcrylicCanvas &layer, struct g2d_layer &image, uint32_t cmd[], int index) { image.flags = 0; @@ -375,8 +405,13 @@ bool AcrylicCompositorG2D9810::prepareImage(AcrylicCanvas &layer, struct g2d_lay if (!g2dfmt) return false; - if (g2dfmt->halfmt == HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN) - image.flags |= G2D_LAYERFLAG_MFC_STRIDE; + image.flags &= ~G2D_LAYERFLAG_MFC_STRIDE; + for (size_t i = 0; i < ARRSIZE(mfc_stride_formats); i++) { + if (layer.getFormat() == mfc_stride_formats[i]) { + image.flags |= G2D_LAYERFLAG_MFC_STRIDE; + break; + } + } if (layer.getBufferType() == AcrylicCanvas::MT_OTF) { image.buffer_type = G2D_BUFTYPE_EMPTY; @@ -419,10 +454,42 @@ bool AcrylicCompositorG2D9810::prepareImage(AcrylicCanvas &layer, struct g2d_lay cmd[G2DSFR_IMG_COLORMODE] = G2D_FMT_BGR565; cmd[G2DSFR_IMG_COLORMODE] |= G2D_DATAFORMAT_AFBC; cmd[G2DSFR_IMG_STRIDE] = 0; + } else if (g2dfmt->g2dfmt & G2D_DATAFORMAT_SBWC) { + cmd[G2DSFR_IMG_STRIDE] = 0; } else { cmd[G2DSFR_IMG_STRIDE] = g2dfmt->rgb_bpp * xy.hori; } + 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; + } + } 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; + } 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; + } + } + cmd[G2DSFR_IMG_LEFT] = 0; cmd[G2DSFR_IMG_TOP] = 0; cmd[G2DSFR_IMG_RIGHT] = xy.hori; @@ -479,6 +546,10 @@ bool AcrylicCompositorG2D9810::prepareSolidLayer(AcrylicCanvas &canvas, struct g cmd[G2DSFR_SRC_BLEND] = 0; cmd[G2DSFR_SRC_YCBCRMODE] = 0; cmd[G2DSFR_SRC_HDRMODE] = 0; + 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; return true; } @@ -486,7 +557,7 @@ bool AcrylicCompositorG2D9810::prepareSolidLayer(AcrylicCanvas &canvas, struct g bool AcrylicCompositorG2D9810::prepareSource(AcrylicLayer &layer, struct g2d_layer &image, uint32_t cmd[], hw2d_coord_t target_size, int index) { - if (!prepareImage(layer, image, cmd)) + if (!prepareImage(layer, image, cmd, index)) return false; cmd[G2DSFR_SRC_SELECT] = 0; @@ -561,10 +632,6 @@ bool AcrylicCompositorG2D9810::prepareSource(AcrylicLayer &layer, struct g2d_lay cmd[G2DSFR_SRC_COMMAND] |= G2D_LAYERCMD_ALPHABLEND; } - if ((layer.getFormat() == HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN_S10B) || - (layer.getFormat() == HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_S10B)) - image.flags |= G2D_LAYERFLAG_MFC_STRIDE; - cmd[G2DSFR_SRC_YCBCRMODE] = 0; cmd[G2DSFR_SRC_HDRMODE] = 0; @@ -678,7 +745,7 @@ bool AcrylicCompositorG2D9810::executeG2D(int fence[], unsigned int num_fences, mTask.flags = 0; - if (!prepareImage(getCanvas(), mTask.target, mTask.commands.target)) { + if (!prepareImage(getCanvas(), mTask.target, mTask.commands.target, -1)) { ALOGE("Failed to configure the target image"); return false; } diff --git a/libacryl/acrylic_g2d9810.h b/libacryl/acrylic_g2d9810.h index d770166..9baf795 100644 --- a/libacryl/acrylic_g2d9810.h +++ b/libacryl/acrylic_g2d9810.h @@ -125,7 +125,7 @@ public: private: int ioctlG2D(void); bool executeG2D(int fence[], unsigned int num_fences, bool nonblocking); - bool prepareImage(AcrylicCanvas &layer, struct g2d_layer &image, uint32_t cmd[]); + bool prepareImage(AcrylicCanvas &layer, struct g2d_layer &image, uint32_t cmd[], int index); bool prepareSource(AcrylicLayer &layer, struct g2d_layer &image, uint32_t cmd[], hw2d_coord_t target_size, int index); bool prepareSolidLayer(AcrylicCanvas &canvas, struct g2d_layer &image, uint32_t cmd[]); bool reallocLayer(unsigned int layercount); diff --git a/libacryl/local_include/uapi/g2d9810.h b/libacryl/local_include/uapi/g2d9810.h index d527adc..1b36694 100644 --- a/libacryl/local_include/uapi/g2d9810.h +++ b/libacryl/local_include/uapi/g2d9810.h @@ -36,6 +36,10 @@ extern "C" { #define G2D_YUV_YC (0 << 25) #define G2D_YUV_CY (1 << 25) +#define G2D_DATAFORMAT_AFBC (1 << 20) +#define G2D_DATAFORMAT_UORDER (1 << 21) +#define G2D_DATAFORMAT_SBWC (1 << 22) + #define G2D_DATAFMT_SHIFT 16 #define G2D_DATAFMT_MASK (0xF << G2D_DATAFMT_SHIFT) @@ -90,9 +94,10 @@ extern "C" { #define G2D_FMT_NV16_P210_9820 (G2D_DATAFMT_YUV422SP | G2D_FMT_YCBCR_10BIT | G2D_YUV_UV) #define G2D_FMT_NV61_P210_9820 (G2D_DATAFMT_YUV422SP | G2D_FMT_YCBCR_10BIT | G2D_YUV_VU) #define G2D_FMT_ABGR2101010 (G2D_DATAFMT_ABGR2101010 | G2D_SWZ_ABGR) - -#define G2D_DATAFORMAT_AFBC (1 << 20) -#define G2D_DATAFORMAT_UORDER (1 << 21) +#define G2D_FMT_NV12_SBWC (G2D_FMT_NV12 | G2D_DATAFORMAT_SBWC) +#define G2D_FMT_NV21_SBWC (G2D_FMT_NV21 | G2D_DATAFORMAT_SBWC) +#define G2D_FMT_NV12_SBWC_10B (G2D_FMT_NV12_P010_9820 | G2D_DATAFORMAT_SBWC) +#define G2D_FMT_NV21_SBWC_10B (G2D_FMT_NV21_P010_9820 | G2D_DATAFORMAT_SBWC) #define G2D_YCBCRMODE_DITHER (1 << 2) @@ -181,8 +186,8 @@ enum g2dsfr_dst_register { G2DSFR_DST_COMPAT_FIELD_COUNT, G2DSFR_DST_Y_HEADER_STRIDE = G2DSFR_DST_COMPAT_FIELD_COUNT, - G2DSFR_DST_C_HEADER_STRIDE, G2DSFR_DST_Y_PAYLOAD_STRIDE, + G2DSFR_DST_C_HEADER_STRIDE, G2DSFR_DST_C_PAYLOAD_STRIDE, G2DSFR_DST_FIELD_COUNT, |