mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
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:
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user