video: rockchip: rga3: Fix some formats cannot match core

Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
Change-Id: Ia6f6e43342f7a77d1bcf5e4cd4ed64b4d567d5f8
This commit is contained in:
Yu Qiaowei
2022-07-05 10:42:05 +08:00
committed by Tao Huang
parent 0a58d4293e
commit 004ba6e22a
3 changed files with 88 additions and 63 deletions

View File

@@ -24,7 +24,7 @@ bool rga_is_yuv422p_format(uint32_t format);
bool rga_is_only_y_format(uint32_t format);
int rga_get_format_bits(uint32_t format);
uint32_t rga_get_pixel_stride_from_format(uint32_t format);
int rga_get_pixel_stride_from_format(uint32_t format);
const char *rga_get_format_name(uint32_t format);
const char *rga_get_render_mode_str(uint8_t mode);

View File

@@ -184,61 +184,6 @@ bool rga_is_only_y_format(uint32_t format)
}
}
int rga_get_format_bits(uint32_t format)
{
int bits = 0;
switch (format) {
case RGA_FORMAT_RGBA_8888:
case RGA_FORMAT_RGBX_8888:
case RGA_FORMAT_BGRA_8888:
case RGA_FORMAT_BGRX_8888:
case RGA_FORMAT_ARGB_8888:
case RGA_FORMAT_XRGB_8888:
case RGA_FORMAT_ABGR_8888:
case RGA_FORMAT_XBGR_8888:
bits = 32;
break;
case RGA_FORMAT_RGB_888:
case RGA_FORMAT_BGR_888:
bits = 24;
break;
case RGA_FORMAT_RGB_565:
case RGA_FORMAT_RGBA_5551:
case RGA_FORMAT_RGBA_4444:
case RGA_FORMAT_BGR_565:
case RGA_FORMAT_YCbCr_422_SP:
case RGA_FORMAT_YCbCr_422_P:
case RGA_FORMAT_YCrCb_422_SP:
case RGA_FORMAT_YCrCb_422_P:
case RGA_FORMAT_BGRA_5551:
case RGA_FORMAT_BGRA_4444:
case RGA_FORMAT_ARGB_5551:
case RGA_FORMAT_ARGB_4444:
case RGA_FORMAT_ABGR_5551:
case RGA_FORMAT_ABGR_4444:
bits = 16;
break;
case RGA_FORMAT_YCbCr_420_SP:
case RGA_FORMAT_YCbCr_420_P:
case RGA_FORMAT_YCrCb_420_SP:
case RGA_FORMAT_YCrCb_420_P:
bits = 12;
break;
case RGA_FORMAT_YCbCr_420_SP_10B:
case RGA_FORMAT_YCrCb_420_SP_10B:
case RGA_FORMAT_YCbCr_422_SP_10B:
case RGA_FORMAT_YCrCb_422_SP_10B:
bits = 15;
break;
default:
pr_err("unknown format [%d]\n", format);
return -1;
}
return bits;
}
const char *rga_get_format_name(uint32_t format)
{
switch (format) {
@@ -347,9 +292,86 @@ const char *rga_get_format_name(uint32_t format)
}
}
uint32_t rga_get_pixel_stride_from_format(uint32_t format)
int rga_get_format_bits(uint32_t format)
{
uint32_t pixel_stride = 0;
int bits = 0;
switch (format) {
case RGA_FORMAT_RGBA_8888:
case RGA_FORMAT_RGBX_8888:
case RGA_FORMAT_BGRA_8888:
case RGA_FORMAT_BGRX_8888:
case RGA_FORMAT_ARGB_8888:
case RGA_FORMAT_XRGB_8888:
case RGA_FORMAT_ABGR_8888:
case RGA_FORMAT_XBGR_8888:
bits = 32;
break;
case RGA_FORMAT_RGB_888:
case RGA_FORMAT_BGR_888:
bits = 24;
break;
case RGA_FORMAT_RGB_565:
case RGA_FORMAT_RGBA_5551:
case RGA_FORMAT_RGBA_4444:
case RGA_FORMAT_BGR_565:
case RGA_FORMAT_BGRA_5551:
case RGA_FORMAT_BGRA_4444:
case RGA_FORMAT_ARGB_5551:
case RGA_FORMAT_ARGB_4444:
case RGA_FORMAT_ABGR_5551:
case RGA_FORMAT_ABGR_4444:
case RGA_FORMAT_YCbCr_422_SP:
case RGA_FORMAT_YCbCr_422_P:
case RGA_FORMAT_YCrCb_422_SP:
case RGA_FORMAT_YCrCb_422_P:
case RGA_FORMAT_YUYV_422:
case RGA_FORMAT_YVYU_422:
case RGA_FORMAT_UYVY_422:
case RGA_FORMAT_VYUY_422:
bits = 16;
break;
case RGA_FORMAT_YCbCr_420_SP:
case RGA_FORMAT_YCbCr_420_P:
case RGA_FORMAT_YCrCb_420_SP:
case RGA_FORMAT_YCrCb_420_P:
case RGA_FORMAT_YUYV_420:
case RGA_FORMAT_YVYU_420:
case RGA_FORMAT_UYVY_420:
case RGA_FORMAT_VYUY_420:
bits = 12;
break;
case RGA_FORMAT_YCbCr_420_SP_10B:
case RGA_FORMAT_YCrCb_420_SP_10B:
case RGA_FORMAT_YCbCr_422_SP_10B:
case RGA_FORMAT_YCrCb_422_SP_10B:
bits = 15;
break;
case RGA_FORMAT_YCbCr_400:
case RGA_FORMAT_BPP8:
bits = 8;
break;
case RGA_FORMAT_Y4:
case RGA_FORMAT_BPP4:
bits = 4;
break;
case RGA_FORMAT_BPP2:
bits = 2;
break;
case RGA_FORMAT_BPP1:
bits = 1;
break;
default:
pr_err("unknown format [0x%x]\n", format);
return -1;
}
return bits;
}
int rga_get_pixel_stride_from_format(uint32_t format)
{
int pixel_stride = 0;
switch (format) {
case RGA_FORMAT_RGBA_8888:
@@ -396,6 +418,7 @@ uint32_t rga_get_pixel_stride_from_format(uint32_t format)
case RGA_FORMAT_BPP2:
case RGA_FORMAT_BPP4:
case RGA_FORMAT_BPP8:
case RGA_FORMAT_YCbCr_400:
case RGA_FORMAT_YCbCr_420_SP:
case RGA_FORMAT_YCbCr_420_P:
case RGA_FORMAT_YCrCb_420_SP:

View File

@@ -15,6 +15,7 @@
#define GET_GCD(n1, n2) \
({ \
int i; \
int gcd = 0; \
for (i = 1; i <= (n1) && i <= (n2); i++) { \
if ((n1) % i == 0 && (n2) % i == 0) \
gcd = i; \
@@ -90,7 +91,7 @@ static bool rga_check_format(const struct rga_hw_data *data,
static bool rga_check_align(uint32_t byte_stride_align, uint32_t format, uint16_t w_stride)
{
uint32_t bit_stride = 0, pixel_stride = 0, align = 0, gcd = 0;
int bit_stride, pixel_stride, align, gcd;
pixel_stride = rga_get_pixel_stride_from_format(format);
if (pixel_stride <= 0)
@@ -101,11 +102,12 @@ static bool rga_check_align(uint32_t byte_stride_align, uint32_t format, uint16_
if (bit_stride % (byte_stride_align * 8) == 0)
return true;
gcd = GET_GCD(pixel_stride, byte_stride_align * 8);
align = GET_LCM(pixel_stride, byte_stride_align * 8, gcd) / pixel_stride;
if (DEBUGGER_EN(MSG))
if (DEBUGGER_EN(MSG)) {
gcd = GET_GCD(pixel_stride, byte_stride_align * 8);
align = GET_LCM(pixel_stride, byte_stride_align * 8, gcd) / pixel_stride;
pr_info("unsupported width stride %d, 0x%x should be %d aligned!",
w_stride, format, align);
w_stride, format, align);
}
return false;
}