From 0c1fde956bf9b91182eca9c244ebc8bc63983481 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Sun, 13 Mar 2022 17:27:28 -0400 Subject: [PATCH] panfrost: Add Valhall compressed formats We need to map to the interchange format, since there is no longer a pixel format for the memory layout. Use this new format table on v9. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/panfrost/lib/meson.build | 2 +- src/panfrost/lib/pan_format.c | 108 ++++++++++++++++++++++++++++++++++++++++++ src/panfrost/lib/pan_format.h | 2 + src/panfrost/lib/pan_props.c | 4 +- 4 files changed, 114 insertions(+), 2 deletions(-) diff --git a/src/panfrost/lib/meson.build b/src/panfrost/lib/meson.build index 298229b..0c0f0e6 100644 --- a/src/panfrost/lib/meson.build +++ b/src/panfrost/lib/meson.build @@ -21,7 +21,7 @@ subdir('genxml') -pixel_format_versions = ['6', '7'] +pixel_format_versions = ['6', '7', '9'] libpanfrost_pixel_format = [] foreach ver : pixel_format_versions diff --git a/src/panfrost/lib/pan_format.c b/src/panfrost/lib/pan_format.c index 1d6ba97..387e150 100644 --- a/src/panfrost/lib/pan_format.c +++ b/src/panfrost/lib/pan_format.c @@ -171,6 +171,8 @@ GENX(panfrost_blendable_formats)[PIPE_FORMAT_COUNT] = { const struct panfrost_format GENX(panfrost_pipe_format)[PIPE_FORMAT_COUNT] = { FMT(NONE, CONSTANT, 0000, L, VTR_), + +#if PAN_ARCH <= 7 FMT(ETC1_RGB8, ETC2_RGB8, RGB1, L, _T__), FMT(ETC2_RGB8, ETC2_RGB8, RGB1, L, _T__), FMT(ETC2_SRGB8, ETC2_RGB8, RGB1, S, _T__), @@ -246,6 +248,92 @@ const struct panfrost_format GENX(panfrost_pipe_format)[PIPE_FORMAT_COUNT] = { FMT(ASTC_6x5x5_SRGB, ASTC_3D_LDR, RGBA, S, _T__), FMT(ASTC_6x6x5_SRGB, ASTC_3D_LDR, RGBA, S, _T__), FMT(ASTC_6x6x6_SRGB, ASTC_3D_LDR, RGBA, S, _T__), +#else + /* Map to interchange format, as compression is specified in the plane + * descriptor on Valhall. + */ + FMT(ETC1_RGB8, RGBA8_UNORM, RGB1, L, _T__), + FMT(ETC2_RGB8, RGBA8_UNORM, RGB1, L, _T__), + FMT(ETC2_SRGB8, RGBA8_UNORM, RGB1, S, _T__), + FMT(ETC2_R11_UNORM, R16_UNORM, R001, L, _T__), + FMT(ETC2_RGBA8, RGBA8_UNORM, RGBA, L, _T__), + FMT(ETC2_SRGBA8, RGBA8_UNORM, RGBA, S, _T__), + FMT(ETC2_RG11_UNORM, RG16_UNORM, RG01, L, _T__), + FMT(ETC2_R11_SNORM, R16_SNORM, R001, L, _T__), + FMT(ETC2_RG11_SNORM, RG16_SNORM, RG01, L, _T__), + FMT(ETC2_RGB8A1, RGBA8_UNORM, RGBA, L, _T__), + FMT(ETC2_SRGB8A1, RGBA8_UNORM, RGBA, S, _T__), + FMT(DXT1_RGB, RGBA8_UNORM, RGB1, L, _T__), + FMT(DXT1_RGBA, RGBA8_UNORM, RGBA, L, _T__), + FMT(DXT1_SRGB, RGBA8_UNORM, RGB1, S, _T__), + FMT(DXT1_SRGBA, RGBA8_UNORM, RGBA, S, _T__), + FMT(DXT3_RGBA, RGBA8_UNORM, RGBA, L, _T__), + FMT(DXT3_SRGBA, RGBA8_UNORM, RGBA, S, _T__), + FMT(DXT5_RGBA, RGBA8_UNORM, RGBA, L, _T__), + FMT(DXT5_SRGBA, RGBA8_UNORM, RGBA, S, _T__), + FMT(RGTC1_UNORM, R16_UNORM, R001, L, _T__), + FMT(RGTC1_SNORM, R16_SNORM, R001, L, _T__), + FMT(RGTC2_UNORM, RG16_UNORM, RG01, L, _T__), + FMT(RGTC2_SNORM, RG16_SNORM, RG01, L, _T__), + FMT(BPTC_RGB_FLOAT, RGBA16F, RGB1, L, _T__), + FMT(BPTC_RGB_UFLOAT, RGBA16F, RGB1, L, _T__), + FMT(BPTC_RGBA_UNORM, RGBA8_UNORM, RGBA, L, _T__), + FMT(BPTC_SRGBA, RGBA8_UNORM, RGBA, S, _T__), + + /* Mesa does not yet support astc_decode_mode extensions, so non-sRGB + * formats must be assumed to be wide. + */ + FMT(ASTC_4x4, RGBA16F, RGBA, L, _T__), + FMT(ASTC_5x4, RGBA16F, RGBA, L, _T__), + FMT(ASTC_5x5, RGBA16F, RGBA, L, _T__), + FMT(ASTC_6x5, RGBA16F, RGBA, L, _T__), + FMT(ASTC_6x6, RGBA16F, RGBA, L, _T__), + FMT(ASTC_8x5, RGBA16F, RGBA, L, _T__), + FMT(ASTC_8x6, RGBA16F, RGBA, L, _T__), + FMT(ASTC_8x8, RGBA16F, RGBA, L, _T__), + FMT(ASTC_10x5, RGBA16F, RGBA, L, _T__), + FMT(ASTC_10x6, RGBA16F, RGBA, L, _T__), + FMT(ASTC_10x8, RGBA16F, RGBA, L, _T__), + FMT(ASTC_10x10, RGBA16F, RGBA, L, _T__), + FMT(ASTC_12x10, RGBA16F, RGBA, L, _T__), + FMT(ASTC_12x12, RGBA16F, RGBA, L, _T__), + FMT(ASTC_3x3x3, RGBA16F, RGBA, L, _T__), + FMT(ASTC_4x3x3, RGBA16F, RGBA, L, _T__), + FMT(ASTC_4x4x3, RGBA16F, RGBA, L, _T__), + FMT(ASTC_4x4x4, RGBA16F, RGBA, L, _T__), + FMT(ASTC_5x4x4, RGBA16F, RGBA, L, _T__), + FMT(ASTC_5x5x4, RGBA16F, RGBA, L, _T__), + FMT(ASTC_5x5x5, RGBA16F, RGBA, L, _T__), + FMT(ASTC_6x5x5, RGBA16F, RGBA, L, _T__), + FMT(ASTC_6x6x5, RGBA16F, RGBA, L, _T__), + FMT(ASTC_6x6x6, RGBA16F, RGBA, L, _T__), + + /* By definition, sRGB formats are narrow */ + FMT(ASTC_4x4_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_5x4_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_5x5_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_6x5_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_6x6_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_8x5_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_8x6_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_8x8_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_10x5_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_10x6_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_10x8_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_10x10_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_12x10_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_12x12_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_3x3x3_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_4x3x3_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_4x4x3_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_4x4x4_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_5x4x4_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_5x5x4_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_5x5x5_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_6x5x5_SRGB, RGBA8_UNORM, RGBA, S, _T__), + FMT(ASTC_6x6x5_SRGB, RGBA8_UNORM, RGBA, S, _T__), +#endif + FMT(R5G6B5_UNORM, RGB565, RGB1, L, VTR_), FMT(B5G6R5_UNORM, RGB565, BGR1, L, VTR_), FMT(R5G5B5X1_UNORM, RGB5_A1_UNORM, RGB1, L, VT__), @@ -466,13 +554,33 @@ const struct panfrost_format GENX(panfrost_pipe_format)[PIPE_FORMAT_COUNT] = { FMT(Z24_UNORM_S8_UINT, Z24X8_UNORM, RGBA, L, _T_Z), FMT(Z24X8_UNORM, Z24X8_UNORM, RGBA, L, _T_Z), FMT(Z32_FLOAT, R32F, RGBA, L, _T_Z), + +#if PAN_ARCH >= 9 + /* Specify interchange formats, the actual format for depth/stencil is + * determined by the plane descriptor on Valhall. + * + * On Valhall, S8 logically acts like "X8S8", so "S8 RGBA" is logically + * "0s00" and "S8 GRBA" is logically "s000". For backwards compatibility + * we want stencil in the green channel, so we use the RGBA swizzles on + * Valhall despite the GRBA swizzles on Bifrost. + */ + FMT(Z32_FLOAT_S8X24_UINT, R32F, RGBA, L, _T_Z), + FMT(X32_S8X24_UINT, S8, RGBA, L, _T__), + FMT(X24S8_UINT, S8, RGBA, L, _T_Z), + FMT(S8_UINT, S8, RGBA, L, _T__), + +#else + /* Specify real formats on Bifrost */ FMT(Z32_FLOAT_S8X24_UINT, Z32_X32, RGBA, L, _T_Z), FMT(X32_S8X24_UINT, X32_S8X24, GRBA, L, _T__), FMT(X24S8_UINT, X24S8, GRBA, L, _T_Z), FMT(S8_UINT, S8, GRBA, L, _T__), + /* Obsolete formats removed in Valhall */ FMT(A8_UNORM, A8_UNORM, 000A, L, VTR_), FMT(L8A8_UNORM, R8A8_UNORM, RRRA, L, VTR_), FMT(L8A8_SRGB, R8A8_UNORM, RRRA, S, VTR_), #endif + +#endif }; diff --git a/src/panfrost/lib/pan_format.h b/src/panfrost/lib/pan_format.h index b8a5057..547e009 100644 --- a/src/panfrost/lib/pan_format.h +++ b/src/panfrost/lib/pan_format.h @@ -51,8 +51,10 @@ struct pan_blendable_format { extern const struct pan_blendable_format panfrost_blendable_formats_v6[PIPE_FORMAT_COUNT]; extern const struct pan_blendable_format panfrost_blendable_formats_v7[PIPE_FORMAT_COUNT]; +extern const struct pan_blendable_format panfrost_blendable_formats_v9[PIPE_FORMAT_COUNT]; extern const struct panfrost_format panfrost_pipe_format_v6[PIPE_FORMAT_COUNT]; extern const struct panfrost_format panfrost_pipe_format_v7[PIPE_FORMAT_COUNT]; +extern const struct panfrost_format panfrost_pipe_format_v9[PIPE_FORMAT_COUNT]; /* Helpers to construct swizzles */ diff --git a/src/panfrost/lib/pan_props.c b/src/panfrost/lib/pan_props.c index b5ef6bd..693b475 100644 --- a/src/panfrost/lib/pan_props.c +++ b/src/panfrost/lib/pan_props.c @@ -271,8 +271,10 @@ panfrost_open_device(void *memctx, int fd, struct panfrost_device *dev) if (dev->arch <= 6) dev->formats = panfrost_pipe_format_v6; - else + else if (dev->arch <= 7) dev->formats = panfrost_pipe_format_v7; + else + dev->formats = panfrost_pipe_format_v9; util_sparse_array_init(&dev->bo_map, sizeof(struct panfrost_bo), 512); -- 2.7.4