<div dir="ltr"><div>OK. Reviewed-by: Marek Olšák <<a href="mailto:marek.olsak@amd.com">marek.olsak@amd.com</a>></div><div><br></div><div>Marek<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Sep 2, 2020 at 6:31 AM Bas Nieuwenhuizen <<a href="mailto:bas@basnieuwenhuizen.nl">bas@basnieuwenhuizen.nl</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Fri, Aug 7, 2020 at 9:43 PM Marek Olšák <<a href="mailto:maraeo@gmail.com" target="_blank">maraeo@gmail.com</a>> wrote:<br>
><br>
> On Tue, Aug 4, 2020 at 5:32 PM Bas Nieuwenhuizen <<a href="mailto:bas@basnieuwenhuizen.nl" target="_blank">bas@basnieuwenhuizen.nl</a>> wrote:<br>
>><br>
>> This expose modifier support on GFX9+.<br>
>><br>
>> Only modifiers that can be rendered on the current GPU are<br>
>> added. This is to reduce the number of modifiers exposed.<br>
>><br>
>> The HW could expose more, but the best mechanism to decide<br>
>> what to expose without an explosion in modifiers is still<br>
>> to be decided, and in the meantime this should not regress<br>
>> things from pre-modifiers and does not risk regressions as<br>
>> we make up our mind in the future.<br>
>><br>
>> Signed-off-by: Bas Nieuwenhuizen <<a href="mailto:bas@basnieuwenhuizen.nl" target="_blank">bas@basnieuwenhuizen.nl</a>><br>
>> ---<br>
>>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 343 +++++++++++++++++-<br>
>>  1 file changed, 342 insertions(+), 1 deletion(-)<br>
>><br>
>> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c<br>
>> index c38257081868..6594cbe625f9 100644<br>
>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c<br>
>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c<br>
>> @@ -3891,6 +3891,340 @@ fill_gfx9_tiling_info_from_modifier(const struct amdgpu_device *adev,<br>
>>         }<br>
>>  }<br>
>><br>
>> +enum dm_micro_swizzle {<br>
>> +       MICRO_SWIZZLE_Z = 0,<br>
>> +       MICRO_SWIZZLE_S = 1,<br>
>> +       MICRO_SWIZZLE_D = 2,<br>
>> +       MICRO_SWIZZLE_R = 3<br>
>> +};<br>
>> +<br>
>> +static bool dm_plane_format_mod_supported(struct drm_plane *plane,<br>
>> +                                         uint32_t format,<br>
>> +                                         uint64_t modifier)<br>
>> +{<br>
>> +       struct amdgpu_device *adev = plane->dev->dev_private;<br>
>> +       const struct drm_format_info *info = drm_format_info(format);<br>
>> +<br>
>> +       enum dm_micro_swizzle microtile = modifier_gfx9_swizzle_mode(modifier) & 3;<br>
>> +<br>
>> +       if (!info)<br>
>> +               return false;<br>
>> +<br>
>> +       /*<br>
>> +        * We always have to allow this modifier, because core DRM still<br>
>> +        * checks LINEAR support if userspace does not provide modifers.<br>
>> +        */<br>
>> +       if (modifier == DRM_FORMAT_MOD_LINEAR)<br>
>> +               return true;<br>
>> +<br>
>> +       /*<br>
>> +        * The arbitrary tiling support for multiplane formats has not been hooked<br>
>> +        * up.<br>
>> +        */<br>
>> +       if (info->num_planes > 1)<br>
>> +               return false;<br>
>> +<br>
>> +       /*<br>
>> +        * For D swizzle the canonical modifier depends on the bpp, so check<br>
>> +        * it here.<br>
>> +        */<br>
>> +       if (AMD_FMT_MOD_GET(TILE_VERSION, modifier) == AMD_FMT_MOD_TILE_VER_GFX9 &&<br>
>> +           adev->family >= AMDGPU_FAMILY_NV) {<br>
>> +               if (microtile == MICRO_SWIZZLE_D && info->cpp[0] == 4)<br>
>> +                       return false;<br>
>> +       }<br>
>> +<br>
>> +       if (adev->family >= AMDGPU_FAMILY_RV && microtile == MICRO_SWIZZLE_D &&<br>
>> +           info->cpp[0] < 8)<br>
>> +               return false;<br>
>> +<br>
>> +       if (modifier_has_dcc(modifier)) {<br>
>> +               /* Per radeonsi comments 16/64 bpp are more complicated. */<br>
>> +               if (info->cpp[0] != 4)<br>
>> +                       return false;<br>
>> +       }<br>
>> +<br>
>> +       return true;<br>
>> +}<br>
>> +<br>
>> +static void<br>
>> +add_modifier(uint64_t **mods, uint64_t *size, uint64_t *cap, uint64_t mod)<br>
>> +{<br>
>> +       if (!*mods)<br>
>> +               return;<br>
>> +<br>
>> +       if (*cap - *size < 1) {<br>
>> +               uint64_t new_cap = *cap * 2;<br>
>> +               uint64_t *new_mods = kmalloc(new_cap * sizeof(uint64_t), GFP_KERNEL);<br>
>> +<br>
>> +               if (!new_mods) {<br>
>> +                       kfree(*mods);<br>
>> +                       *mods = NULL;<br>
>> +                       return;<br>
>> +               }<br>
>> +<br>
>> +               memcpy(new_mods, *mods, sizeof(uint64_t) * *size);<br>
>> +               kfree(*mods);<br>
>> +               *mods = new_mods;<br>
>> +               *cap = new_cap;<br>
>> +       }<br>
>> +<br>
>> +       (*mods)[*size] = mod;<br>
>> +       *size += 1;<br>
>> +}<br>
>> +<br>
>> +static void<br>
>> +add_gfx9_modifiers(const struct amdgpu_device *adev,<br>
>> +                 uint64_t **mods, uint64_t *size, uint64_t *capacity)<br>
>> +{<br>
>> +       int pipes = ilog2(adev->gfx.config.gb_addr_config_fields.num_pipes);<br>
>> +       int pipe_xor_bits = min(8, pipes +<br>
>> +                               ilog2(adev->gfx.config.gb_addr_config_fields.num_se));<br>
>> +       int bank_xor_bits = min(8 - pipe_xor_bits,<br>
>> +                               ilog2(adev->gfx.config.gb_addr_config_fields.num_banks));<br>
>> +       int rb = ilog2(adev->gfx.config.gb_addr_config_fields.num_se) +<br>
>> +                ilog2(adev->gfx.config.gb_addr_config_fields.num_rb_per_se);<br>
>> +<br>
>> +<br>
>> +       if (adev->family == AMDGPU_FAMILY_RV) {<br>
>> +               /*<br>
>> +                * No _D DCC swizzles yet because we only allow 32bpp, which<br>
>> +                * doesn't support _D on DCN<br>
>> +                */<br>
>> +<br>
>> +               /*<br>
>> +                * Always enable constant encoding, because the only unit that<br>
>> +                * didn't support it was CB. But on texture/display we can<br>
>> +                * always interpret it.<br>
>> +                */<br>
>> +               add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                           AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_S_X) |<br>
>> +                           AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX9) |<br>
>> +                           AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits) |<br>
>> +                           AMD_FMT_MOD_SET(BANK_XOR_BITS, bank_xor_bits) |<br>
>> +                           AMD_FMT_MOD_SET(DCC, 1) |<br>
>> +                           AMD_FMT_MOD_SET(DCC_INDEPENDENT_64B, 1) |<br>
>> +                           AMD_FMT_MOD_SET(DCC_MAX_COMPRESSED_BLOCK, AMD_FMT_MOD_DCC_BLOCK_64B) |<br>
>> +                           AMD_FMT_MOD_SET(DCC_CONSTANT_ENCODE, 1));<br>
><br>
><br>
> I don't think Raven1 can do DCC constant encoding in DCN and GL2.<br>
><br>
>> +<br>
>> +               add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                           AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_S_X) |<br>
>> +                           AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX9) |<br>
>> +                           AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits) |<br>
>> +                           AMD_FMT_MOD_SET(BANK_XOR_BITS, bank_xor_bits) |<br>
>> +                           AMD_FMT_MOD_SET(DCC, 1) |<br>
>> +                           AMD_FMT_MOD_SET(DCC_INDEPENDENT_64B, 1) |<br>
>> +                           AMD_FMT_MOD_SET(DCC_MAX_COMPRESSED_BLOCK, AMD_FMT_MOD_DCC_BLOCK_64B) |<br>
>> +                           AMD_FMT_MOD_SET(DCC_CONSTANT_ENCODE, 0));<br>
>> +<br>
>> +               add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                           AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_S_X) |<br>
>> +                           AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX9) |<br>
>> +                           AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits) |<br>
>> +                           AMD_FMT_MOD_SET(BANK_XOR_BITS, bank_xor_bits) |<br>
>> +                           AMD_FMT_MOD_SET(DCC, 1) |<br>
>> +                           AMD_FMT_MOD_SET(DCC_RETILE, 1) |<br>
>> +                           AMD_FMT_MOD_SET(DCC_INDEPENDENT_64B, 1) |<br>
>> +                           AMD_FMT_MOD_SET(DCC_MAX_COMPRESSED_BLOCK, AMD_FMT_MOD_DCC_BLOCK_64B) |<br>
>> +                           AMD_FMT_MOD_SET(DCC_CONSTANT_ENCODE, 1) |<br>
>> +                           AMD_FMT_MOD_SET(RB, rb) |<br>
>> +                           AMD_FMT_MOD_SET(PIPE, pipes));<br>
>> +<br>
>> +               add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                           AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_S_X) |<br>
>> +                           AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX9) |<br>
>> +                           AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits) |<br>
>> +                           AMD_FMT_MOD_SET(BANK_XOR_BITS, bank_xor_bits) |<br>
>> +                           AMD_FMT_MOD_SET(DCC, 1) |<br>
>> +                           AMD_FMT_MOD_SET(DCC_RETILE, 1) |<br>
>> +                           AMD_FMT_MOD_SET(DCC_INDEPENDENT_64B, 1) |<br>
>> +                           AMD_FMT_MOD_SET(DCC_MAX_COMPRESSED_BLOCK, AMD_FMT_MOD_DCC_BLOCK_64B) |<br>
>> +                           AMD_FMT_MOD_SET(DCC_CONSTANT_ENCODE, 0) |<br>
>> +                           AMD_FMT_MOD_SET(RB, rb) |<br>
>> +                           AMD_FMT_MOD_SET(PIPE, pipes));<br>
>> +       }<br>
>> +<br>
>> +       add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                   AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_D_X) |<br>
>> +                   AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX9) |<br>
>> +                   AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits) |<br>
>> +                   AMD_FMT_MOD_SET(BANK_XOR_BITS, bank_xor_bits));<br>
><br>
><br>
> Addrlib says that D swizzle modes are unsupported for 32bpp in DCN1. They are only supported in DCE12. The swizzle modes between the two have no intersection.<br>
<br>
Right, but we don't have the format here. These get further filtered<br>
by dm_plane_format_mod_supported, which does:<br>
<br>
        if (adev->family >= AMDGPU_FAMILY_RV && microtile == MICRO_SWIZZLE_D &&<br>
            info->cpp[0] < 8)<br>
                return false;<br>
<br>
(cpp is in bytes)<br>
<br>
><br>
>><br>
>> +<br>
>> +       if (adev->family == AMDGPU_FAMILY_RV) {<br>
>> +               add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                           AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_S_X) |<br>
>> +                           AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX9) |<br>
>> +                           AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits) |<br>
>> +                           AMD_FMT_MOD_SET(BANK_XOR_BITS, bank_xor_bits));<br>
>> +       }<br>
>> +<br>
>> +       add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                   AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_D) |<br>
>> +                   AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX9));<br>
>> +<br>
>> +       if (adev->family == AMDGPU_FAMILY_RV) {<br>
>> +               add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                           AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_S) |<br>
>> +                           AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX9));<br>
>> +       }<br>
>> +}<br>
>> +<br>
>> +static void<br>
>> +add_gfx10_1_modifiers(const struct amdgpu_device *adev,<br>
>> +                    uint64_t **mods, uint64_t *size, uint64_t *capacity)<br>
>> +{<br>
>> +       int pipe_xor_bits = ilog2(adev->gfx.config.gb_addr_config_fields.num_pipes);<br>
>> +<br>
>> +       add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                   AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_R_X) |<br>
>> +                   AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX10) |<br>
>> +                   AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits) |<br>
>> +                   AMD_FMT_MOD_SET(DCC, 1) |<br>
>> +                   AMD_FMT_MOD_SET(DCC_CONSTANT_ENCODE, 1) |<br>
>> +                   AMD_FMT_MOD_SET(DCC_INDEPENDENT_64B, 1) |<br>
>> +                   AMD_FMT_MOD_SET(DCC_MAX_COMPRESSED_BLOCK, AMD_FMT_MOD_DCC_BLOCK_64B));<br>
>> +<br>
>> +       add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                   AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_R_X) |<br>
>> +                   AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX10) |<br>
>> +                   AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits) |<br>
>> +                   AMD_FMT_MOD_SET(DCC, 1) |<br>
>> +                   AMD_FMT_MOD_SET(DCC_RETILE, 1) |<br>
>> +                   AMD_FMT_MOD_SET(DCC_CONSTANT_ENCODE, 1) |<br>
>> +                   AMD_FMT_MOD_SET(DCC_INDEPENDENT_64B, 1) |<br>
>> +                   AMD_FMT_MOD_SET(DCC_MAX_COMPRESSED_BLOCK, AMD_FMT_MOD_DCC_BLOCK_64B));<br>
>> +<br>
>> +       add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                   AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_R_X) |<br>
>> +                   AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX10) |<br>
>> +                   AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits));<br>
>> +<br>
>> +       add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                   AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_D_X) |<br>
>> +                   AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX10) |<br>
>> +                   AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits));<br>
><br>
><br>
> D swizzle modes are unsupported according to Addrlib.<br>
<br>
Seems to be supported for DCN2:<br>
<br>
<a href="https://gitlab.freedesktop.org/mesa/mesa/-/blob/master/src/amd/addrlib/src/gfx10/gfx10addrlib.cpp#L1942" rel="noreferrer" target="_blank">https://gitlab.freedesktop.org/mesa/mesa/-/blob/master/src/amd/addrlib/src/gfx10/gfx10addrlib.cpp#L1942</a><br>
<br>
which seems to be both gfx10.1 and gfx10.3 GPUs:<br>
<br>
<a href="https://gitlab.freedesktop.org/mesa/mesa/-/blob/master/src/amd/addrlib/src/gfx10/gfx10addrlib.cpp#L923" rel="noreferrer" target="_blank">https://gitlab.freedesktop.org/mesa/mesa/-/blob/master/src/amd/addrlib/src/gfx10/gfx10addrlib.cpp#L923</a><br>
<br>
><br>
>><br>
>> +<br>
>> +       add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                   AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_S_X) |<br>
>> +                   AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX10) |<br>
>> +                   AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits));<br>
>> +<br>
>> +       add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                   AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_D) |<br>
>> +                   AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX10));<br>
>> +<br>
>> +       add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                   AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_D) |<br>
>> +                   AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX9));<br>
>> +<br>
>> +       add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                   AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_S) |<br>
>> +                   AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX9));<br>
>> +}<br>
>> +<br>
>> +static void<br>
>> +add_gfx10_3_modifiers(const struct amdgpu_device *adev,<br>
>> +                    uint64_t **mods, uint64_t *size, uint64_t *capacity)<br>
>> +{<br>
>> +       int pipe_xor_bits = ilog2(adev->gfx.config.gb_addr_config_fields.num_pipes);<br>
>> +       int pkrs = ilog2(adev->gfx.config.gb_addr_config_fields.num_pkrs);<br>
>> +<br>
>> +       add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                   AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_R_X) |<br>
>> +                   AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX10_RBPLUS) |<br>
>> +                   AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits) |<br>
>> +                   AMD_FMT_MOD_SET(PACKERS, pkrs) |<br>
>> +                   AMD_FMT_MOD_SET(DCC, 1) |<br>
>> +                   AMD_FMT_MOD_SET(DCC_CONSTANT_ENCODE, 1) |<br>
>> +                   AMD_FMT_MOD_SET(DCC_INDEPENDENT_64B, 1) |<br>
>> +                   AMD_FMT_MOD_SET(DCC_INDEPENDENT_128B, 1) |<br>
>> +                   AMD_FMT_MOD_SET(DCC_MAX_COMPRESSED_BLOCK, AMD_FMT_MOD_DCC_BLOCK_128B));<br>
>> +<br>
>> +       add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                   AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_R_X) |<br>
>> +                   AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX10_RBPLUS) |<br>
>> +                   AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits) |<br>
>> +                   AMD_FMT_MOD_SET(PACKERS, pkrs) |<br>
>> +                   AMD_FMT_MOD_SET(DCC, 1) |<br>
>> +                   AMD_FMT_MOD_SET(DCC_RETILE, 1) |<br>
>> +                   AMD_FMT_MOD_SET(DCC_CONSTANT_ENCODE, 1) |<br>
>> +                   AMD_FMT_MOD_SET(DCC_INDEPENDENT_64B, 1) |<br>
>> +                   AMD_FMT_MOD_SET(DCC_INDEPENDENT_128B, 1) |<br>
>> +                   AMD_FMT_MOD_SET(DCC_MAX_COMPRESSED_BLOCK, AMD_FMT_MOD_DCC_BLOCK_128B));<br>
>> +<br>
>> +       add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                   AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_R_X) |<br>
>> +                   AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX10_RBPLUS) |<br>
>> +                   AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits) |<br>
>> +                   AMD_FMT_MOD_SET(PACKERS, pkrs));<br>
>> +<br>
>> +       add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
>> +                   AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_D_X) |<br>
>> +                   AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX10_RBPLUS) |<br>
>> +                   AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits) |<br>
>> +                   AMD_FMT_MOD_SET(PACKERS, pkrs));<br>
><br>
><br>
> D swizzle modes are unsupported.<br>
<br>
Same as above.<br>
><br>
> Marek<br>
><br>
</blockquote></div>