amd/vpelib: complete 16bpc RGBA format mapping for 10/12bpc msb/lsb support

RGBA 16bpc channel-order variants (BGRA/RGBA/ABGR/ARGB, UNORM/SNORM)
were not fully covered across VPE format programming and SPL translation.
This can lead to wrong format/crossbar selection for 10/12bpc MSB/LSB use cases

Acked-by: Peyton Lee <peytolee@amd.com>
Signed-off-by: Mike Han <SzuChih.Han@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/42033>
This commit is contained in:
Han, Mike 2026-04-17 15:02:48 +08:00 committed by Marge Bot
parent 84c893a000
commit 791eaa2cb2
9 changed files with 65 additions and 11 deletions

View file

@ -282,10 +282,14 @@ enum vpe_surface_pixel_format {
VPE_SURFACE_PIXEL_FORMAT_GRPH_BGR101111_FLOAT, /**< Swapped Floating point RGB 32 bpp
R11 G11 B10 */
VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBE, /**< Shared Exponent RGB 32 bpp R9 G9 B9 E5 */
VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_UNORM, /**< RGB 64 bpp UNORM A16 R16 G16 B16 */
VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_UNORM, /**< RGB 64 bpp UNORM R16 G16 B16 A16 */
VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_SNORM, /**< RGB 64 bpp SNORM A16 R16 G16 B16 */
VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_SNORM, /**< RGB 64 bpp SNORM R16 G16 B16 A16 */
VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_UNORM, /**< RGB 64 bpp UNORM B16 G16 R16 A16 */
VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_UNORM, /**< RGB 64 bpp UNORM R16 G16 B16 A16 */
VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_UNORM, /**< RGB 64 bpp UNORM A16 B16 G16 R16 */
VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_UNORM, /**< RGB 64 bpp UNORM A16 R16 G16 B16 */
VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_SNORM, /**< RGB 64 bpp SNORM B16 G16 R16 A16 */
VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_SNORM, /**< RGB 64 bpp SNORM R16 G16 B16 A16 */
VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_SNORM, /**< RGB 64 bpp SNORM A16 B16 G16 R16 */
VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_SNORM, /**< RGB 64 bpp SNORM A16 R16 G16 B16 */
VPE_SURFACE_PIXEL_FORMAT_GRPH_R8, /**< Monochrome 8 bpp R8 */
VPE_SURFACE_PIXEL_FORMAT_GRPH_R16, /**< Monochrome 16 bpp R16 */
VPE_SURFACE_PIXEL_FORMAT_VIDEO_BEGIN, /**< Start of YCbCr formats. Used internally.*/

View file

@ -131,18 +131,23 @@ void vpe20_cdc_program_p2b_config(struct cdc_be *cdc_be, enum vpe_surface_pixel_
p2b_format_sel = 20;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616:
p2b_format_sel = 21;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_UNORM:
p2b_format_sel = 26;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_UNORM:
p2b_format_sel = 27;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_SNORM:
p2b_format_sel = 28;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_SNORM:
p2b_format_sel = 29;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F:
@ -307,6 +312,8 @@ void vpe20_cdc_program_p2b_config(struct cdc_be *cdc_be, enum vpe_surface_pixel_
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBX8888:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA1010102:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616F:
case VPE_SURFACE_PIXEL_FORMAT_VIDEO_CrYCbA1010102:
case VPE_SURFACE_PIXEL_FORMAT_VIDEO_CrYCbA12121212:
@ -318,6 +325,7 @@ void vpe20_cdc_program_p2b_config(struct cdc_be *cdc_be, enum vpe_surface_pixel_
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR8888:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_XBGR8888:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_SNORM:
@ -329,6 +337,7 @@ void vpe20_cdc_program_p2b_config(struct cdc_be *cdc_be, enum vpe_surface_pixel_
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA8888:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRX8888:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA1010102:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616F:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_SNORM:
@ -338,17 +347,13 @@ void vpe20_cdc_program_p2b_config(struct cdc_be *cdc_be, enum vpe_surface_pixel_
bar_sel0 = (uint32_t)MUX_SEL_ALPHA;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_SNORM:
bar_sel3 = (uint32_t)MUX_SEL_ALPHA;
bar_sel2 = (uint32_t)MUX_SEL_CR_R;
bar_sel1 = (uint32_t)MUX_SEL_Y_G;
bar_sel0 = (uint32_t)MUX_SEL_CB_B;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616:
bar_sel3 = (uint32_t)MUX_SEL_ALPHA;
bar_sel2 = (uint32_t)MUX_SEL_CB_B;
bar_sel1 = (uint32_t)MUX_SEL_Y_G;
bar_sel0 = (uint32_t)MUX_SEL_CR_R;
break;
case VPE_SURFACE_PIXEL_FORMAT_VIDEO_CrYCbA8888:
bar_sel3 = (uint32_t)MUX_SEL_CR_R;
bar_sel2 = (uint32_t)MUX_SEL_Y_G;

View file

@ -97,6 +97,7 @@ void vpe20_cdc_program_crossbar_config(struct cdc_fe *cdc_fe, enum vpe_surface_p
format == VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA8888 ||
format == VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRX8888 ||
format == VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA1010102 ||
format == VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616 ||
format == VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616F ||
format == VPE_SURFACE_PIXEL_FORMAT_VIDEO_422_YCbYCr ||
format == VPE_SURFACE_PIXEL_FORMAT_VIDEO_422_CbYCrY ||
@ -106,7 +107,9 @@ void vpe20_cdc_program_crossbar_config(struct cdc_fe *cdc_fe, enum vpe_surface_p
format == VPE_SURFACE_PIXEL_FORMAT_VIDEO_422_12bpc_CbYCrY ||
format == VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616 ||
format == VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_UNORM ||
format == VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_UNORM ||
format == VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_SNORM ||
format == VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_SNORM ||
format == VPE_SURFACE_PIXEL_FORMAT_VIDEO_AYCbCr8888 ||
format == VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBE) {
red_bar = MUX_SEL_CB_B;

View file

@ -689,15 +689,20 @@ static enum VPE_PLANE_CFG_ELEMENT_SIZE vpe_get_element_size(
case VPE_SURFACE_PIXEL_FORMAT_VIDEO_422_12bpc_CbYCrY:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: /* RGB 16BPE */
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616F:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616F:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_VIDEO_ACrYCb12121212: /* Packed YUV444 16BPE (Y416) */
case VPE_SURFACE_PIXEL_FORMAT_VIDEO_CrYCbA12121212:
return VPE_PLANE_CFG_ELEMENT_SIZE_64BPE;

View file

@ -225,6 +225,7 @@ void vpe20_dpp_program_cnv(
alpha_en = 0;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616: /* use crossbar */
pixel_format = 21;
break;
case VPE_SURFACE_PIXEL_FORMAT_PLANAR_16bpc_RGB_FLOAT:
@ -260,15 +261,19 @@ void vpe20_dpp_program_cnv(
pixel_format = 15;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_UNORM:
pixel_format = 26;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_UNORM:
pixel_format = 27;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_SNORM:
pixel_format = 28;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_SNORM:
pixel_format = 29;
break;
case VPE_SURFACE_PIXEL_FORMAT_PLANAR_16bpc_YCbCr:

View file

@ -2411,6 +2411,7 @@ uint32_t vpe20_get_hw_surface_format(enum vpe_surface_pixel_format format)
surf_format = 20;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616:
surf_format = 21;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F:
@ -2422,15 +2423,19 @@ uint32_t vpe20_get_hw_surface_format(enum vpe_surface_pixel_format format)
surf_format = 25;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_UNORM:
surf_format = 26;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_UNORM:
surf_format = 27;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_SNORM:
surf_format = 28;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_SNORM:
surf_format = 29;
break;
case VPE_SURFACE_PIXEL_FORMAT_VIDEO_ACrYCb12121212:

View file

@ -939,6 +939,11 @@ enum vpe_status vpe_color_setup_dma_lut(struct vpe_3dlut *lut3d_func, struct str
lut3d_func->dma_params.format = VPE_3DLUT_MEM_FORMAT_16161616_UNORM_12MSB;
break;
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616:
lut3d_func->dma_params.crossbar_b = VPE_3DLUT_CROSSBAR_BIT_SLICE_48_63;
lut3d_func->dma_params.crossbar_g = VPE_3DLUT_CROSSBAR_BIT_SLICE_32_47;
lut3d_func->dma_params.crossbar_r = VPE_3DLUT_CROSSBAR_BIT_SLICE_16_31;
lut3d_func->dma_params.format = VPE_3DLUT_MEM_FORMAT_16161616_UNORM_12MSB;
break;
default:
lut3d_func->dma_params.crossbar_b = VPE_3DLUT_CROSSBAR_BIT_SLICE_48_63;
lut3d_func->dma_params.crossbar_g = VPE_3DLUT_CROSSBAR_BIT_SLICE_32_47;

View file

@ -144,10 +144,16 @@ bool vpe_is_rgb16(enum vpe_surface_pixel_format format)
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_SNORM:
return true;
case VPE_SURFACE_PIXEL_FORMAT_PLANAR_16bpc_RGB:
return true;
default:
@ -440,11 +446,16 @@ uint8_t vpe_get_element_size_in_bytes(enum vpe_surface_pixel_format format, int
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616F:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616F:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_VIDEO_ACrYCb12121212:
case VPE_SURFACE_PIXEL_FORMAT_VIDEO_CrYCbA12121212:
return 8;
@ -527,10 +538,15 @@ enum color_depth vpe_get_color_depth(enum vpe_surface_pixel_format format)
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616F:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_PLANAR_16bpc_RGB_FLOAT:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_R16:
// RGBE is technically 9bpc per component + 5 shared, using 16 here instead of default 8

View file

@ -101,12 +101,18 @@ static enum spl_pixel_format get_spl_format(enum vpe_surface_pixel_format fmt)
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA8888:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_R8:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_R16:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_UNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616_SNORM:
case VPE_SURFACE_PIXEL_FORMAT_PLANAR_8bpc_RGB:
case VPE_SURFACE_PIXEL_FORMAT_PLANAR_16bpc_RGB:
return SPL_PIXEL_FORMAT_ARGB8888;