[RFC] drm/amdgpu: Add macros and documentation for format modifiers.

Christian König ckoenig.leichtzumerken at gmail.com
Tue Sep 4 07:10:35 UTC 2018


Am 04.09.2018 um 03:00 schrieb Bas Nieuwenhuizen:
> This is an initial proposal for format modifiers for AMD hardware.
>
> It uses 48 bits including a chip generation, leaving 8 bits for
> a format version number.

I'm absolutely not an expert on this, but as far as I know the major 
problem with this approach was that we couldn't fit all necessary 
parameter into a 64bit identifier.

The last thing I've heard was something like we need at least 128bit, 
better 256. But Marek and Alex certainly know more about that stuff.

Christian.

>
> On gfx6-gfx8 we have all the fields influencing sample locations
> in memory.
>
> Tile split bytes are optional for single sample buffers as no
> hardware reaches the split size with 1 sample and hence the actual
> size does not matter.
>
> The macrotile fields are duplicated for images with multiple planes.
> If the planes have different bitdepth they need different macro
> tile fields and different tile split bytes if multisample.
>
> I could not fit multiple copies in for tile split bytes, but
> multisample & multiplane images are very rare. Overall, I think
> we should punt on multisample for a later format version since
> they are generally not shared on any modifier aware windowing
> system, and we have more issues like fmask & cmask.
>
> We need these copies because the drm modifier of all planes in an
> image needs to be equal, so we need to fit these together.
>
> This adds fields for compression support, using metadata that is
> compatible with AMDVLK and for which radv and radeonsi can
> reasonably be extended.
>
> The big open question for compression is between which generations
> the format changed to see if we can share more.
>
> This explicitly does not try to solve the linear stride alignment
> issue, thoguh we could internally just use the tiling modes for
> the linear modes to indicate linear images with the stride for the
> given chip.
>
> Signed-off-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
> CC: Chad Versace <chadversary at chromium.org>
> CC: Dave Airlie <airlied at redhat.com>
> CC: Marek Olšák <marek.olsak at amd.com>
> CC: Nicolai Hähnle <nicolai.haehnle at amd.com>
> CC: Alex Deucher <alexander.deucher at amd.com>
> CC: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
>   include/uapi/drm/amdgpu_drm.h | 130 ++++++++++++++++++++++++++++++++++
>   1 file changed, 130 insertions(+)
>
> diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h
> index 94444eeba55b..4e1452161dbf 100644
> --- a/include/uapi/drm/amdgpu_drm.h
> +++ b/include/uapi/drm/amdgpu_drm.h
> @@ -990,6 +990,136 @@ struct drm_amdgpu_info_vce_clock_table {
>   #define AMDGPU_FAMILY_AI			141 /* Vega10 */
>   #define AMDGPU_FAMILY_RV			142 /* Raven */
>   
> +#define AMDGPU_CHIP_TAHITI	0
> +#define AMDGPU_CHIP_PITCAIRN	1
> +#define AMDGPU_CHIP_VERDE	2
> +#define AMDGPU_CHIP_OLAND	3
> +#define AMDGPU_CHIP_HAINAN	4
> +#define AMDGPU_CHIP_BONAIRE	5
> +#define AMDGPU_CHIP_KAVERI	6
> +#define AMDGPU_CHIP_KABINI	7
> +#define AMDGPU_CHIP_HAWAII	8
> +#define AMDGPU_CHIP_MULLINS	9
> +#define AMDGPU_CHIP_TOPAZ	10
> +#define AMDGPU_CHIP_TONGA	11
> +#define AMDGPU_CHIP_FIJI	12
> +#define AMDGPU_CHIP_CARRIZO	13
> +#define AMDGPU_CHIP_STONEY	14
> +#define AMDGPU_CHIP_POLARIS10	15
> +#define AMDGPU_CHIP_POLARIS11	16
> +#define AMDGPU_CHIP_POLARIS12	17
> +#define AMDGPU_CHIP_VEGAM	18
> +#define AMDGPU_CHIP_VEGA10	19
> +#define AMDGPU_CHIP_VEGA12	20
> +#define AMDGPU_CHIP_VEGA20	21
> +#define AMDGPU_CHIP_RAVEN	22
> +
> +/* Format for GFX6-GFX8 DRM format modifiers. These are intentionally the same
> + * as AMDGPU_TILING_*. However, the the rules as to when to set them are
> + * different.
> + *
> + * Do not use linear ARRAY_MODEs or SWIZZLE_MODEs. Use DRM_FORMAT_MOD_LINEAR
> + * instead.
> + *
> + * If ARRAY_MODE is 1D, only the micro tile mode and the pipe config should be
> + * set.
> + *
> + * For other ARRAY_MODEs:
> + *  - Only set TILE_SPLIT if the image is multisample.
> + *
> + * We have 1 extra bit for the micro tile mode, as GFX6 and GFX7+ have 1
> + * different value there. The values are
> + *   - depth           : 0
> + *   - displayable     : 1
> + *   - thin            : 2
> + *   - thick (GFX6)    : 3
> + *   - rotated (GFX7+) : 4
> + *
> + * TODO: What to do with multisample multi plane images? More tile split
> + * fields don't fit if we want to keep a few bits for a format version.
> + */
> +#define AMDGPU_MODIFIER_GFX8_ARRAY_MODE_SHIFT		0
> +#define AMDGPU_MODIFIER_GFX8_ARRAY_MODE_MASK		0xf
> +#define AMDGPU_MODIFIER_GFX8_PIPE_CONFIG_SHIFT		4
> +#define AMDGPU_MODIFIER_GFX8_PIPE_CONFIG_MASK		0x1f
> +#define AMDGPU_MODIFIER_GFX8_TILE_SPLIT_SHIFT		9
> +#define AMDGPU_MODIFIER_GFX8_TILE_SPLIT_MASK		0x7
> +#define AMDGPU_MODIFIER_GFX8_MICRO_TILE_MODE_SHIFT	12
> +#define AMDGPU_MODIFIER_GFX8_MICRO_TILE_MODE_MASK	0x7
> +#define AMDGPU_MODIFIER_GFX8_BANK_WIDTH_SHIFT		15
> +#define AMDGPU_MODIFIER_GFX8_BANK_WIDTH_MASK		0x3
> +#define AMDGPU_MODIFIER_GFX8_BANK_HEIGHT_SHIFT		17
> +#define AMDGPU_MODIFIER_GFX8_BANK_HEIGHT_MASK		0x3
> +#define AMDGPU_MODIFIER_GFX8_MACRO_TILE_ASPECT_SHIFT	19
> +#define AMDGPU_MODIFIER_GFX8_MACRO_TILE_ASPECT_MASK	0x3
> +#define AMDGPU_MODIFIER_GFX8_NUM_BANKS_SHIFT		21
> +#define AMDGPU_MODIFIER_GFX8_NUM_BANKS_MASK		0x3
> +
> +/* Macrotile parameters for a second plane if existing */
> +#define AMDGPU_MODIFIER_GFX8_BANK_WIDTH_1_SHIFT		23
> +#define AMDGPU_MODIFIER_GFX8_BANK_WIDTH_1_MASK		0x3
> +#define AMDGPU_MODIFIER_GFX8_BANK_HEIGHT_1_SHIFT	25
> +#define AMDGPU_MODIFIER_GFX8_BANK_HEIGHT_1_MASK		0x3
> +#define AMDGPU_MODIFIER_GFX8_MACRO_TILE_ASPECT_1_SHIFT	27
> +#define AMDGPU_MODIFIER_GFX8_MACRO_TILE_ASPECT_1_MASK	0x3
> +#define AMDGPU_MODIFIER_GFX8_NUM_BANKS_1_SHIFT		29
> +#define AMDGPU_MODIFIER_GFX8_NUM_BANKS_1_MASK		0x3
> +
> +/* Macrotile parameters for a third plane if existing */
> +#define AMDGPU_MODIFIER_GFX8_BANK_WIDTH_2_SHIFT		31
> +#define AMDGPU_MODIFIER_GFX8_BANK_WIDTH_2_MASK		0x3
> +#define AMDGPU_MODIFIER_GFX8_BANK_HEIGHT_2_SHIFT	33
> +#define AMDGPU_MODIFIER_GFX8_BANK_HEIGHT_2_MASK		0x3
> +#define AMDGPU_MODIFIER_GFX8_MACRO_TILE_ASPECT_2_SHIFT	35
> +#define AMDGPU_MODIFIER_GFX8_MACRO_TILE_ASPECT_2_MASK	0x3
> +#define AMDGPU_MODIFIER_GFX8_NUM_BANKS_2_SHIFT		37
> +#define AMDGPU_MODIFIER_GFX8_NUM_BANKS_2_MASK		0x3
> +
> +#define AMDGPU_MODIFIER_GFX9_SWIZZLE_MODE_SHIFT		0
> +#define AMDGPU_MODIFIER_GFX9_SWIZZLE_MODE_MASK		0x1f
> +
> +/* Whether to enable DCC compression.
> + *
> + * If enabled, exporting the surface results in three
> + * planes:
> + *   - color data
> + *   - DCC data
> + *   - a 64-byte block with
> + *     - a 16 byte 0/1 bool as to whether the surface is currently DCC compressed.
> + *     - a 16-byte 0/1 bool as to whether the surface has fastclear data
> + *     - a 8-byte chunk with the current fastclear colors
> + *
> + * To ensure we do not keep compressing and decompressing the surface, once it
> + * has been decompressed no party may recompress again.
> + *
> + * Applications should not hand over images with fastclear data as not
> + * all users can support it, however, to help both Vulkan implementations
> + * with the allocation we keep it in the 64-byte block.
> + *
> + * TODO: Can scanout really not support fastclear data?
> + * TODO: What to do with multiplane images?
> + */
> +#define AMDGPU_MODIFIER_COMPRESSION_SHIFT		39
> +#define AMDGPU_MODIFIER_COMPRESSION_MASK		0x1
> +
> +/* The chip this is compatible with.
> + *
> + * If compression is disabled, use
> + *   - AMDGPU_CHIP_TAHITI for GFX6-GFX8
> + *   - AMDGPU_CHIP_VEGA10 for GFX9+
> + *
> + * With compression enabled please use the exact chip.
> + *
> + * TODO: Do some generations share DCC format?
> + */
> +#define AMDGPU_MODIFIER_CHIP_GEN_SHIFT			40
> +#define AMDGPU_MODIFIER_CHIP_GEN_MASK			0xff
> +
> +#define AMDGPU_MODIFIER_SET(field, value) \
> +	(((__u64)(value) & AMDGPU_MODIFIER_##field##_MASK) << AMDGPU_MODIFIER_##field##_SHIFT)
> +#define AMDGPU_MODIFIER_GET(value, field) \
> +	(((__u64)(value) >> AMDGPU_MODIFIER_##field##_SHIFT) & AMDGPU_MODIFIER_##field##_MASK)
> +
>   /*
>    * Definition of free sync enter and exit signals
>    * We may have more options in the future



More information about the amd-gfx mailing list