[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