[PATCH libdrm] modetest: Decode IN_FORMATS plane blob property
Kristian Høgsberg
hoegsberg at gmail.com
Wed Oct 18 19:36:18 UTC 2017
On Thu, Sep 28, 2017 at 4:44 PM, Kristian H. Kristensen
<hoegsberg at gmail.com> wrote:
> This teaches modetest about the new IN_FORMATS blob and decodes the
> blob to show supported formats and modifiers.
>
> Signed-off-by: Kristian H. Kristensen <hoegsberg at chromium.org>
I went ahead and pushed this.
Kristian
> ---
> tests/modetest/modetest.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 86 insertions(+)
>
> diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c
> index b8891ff5..8ad4766f 100644
> --- a/tests/modetest/modetest.c
> +++ b/tests/modetest/modetest.c
> @@ -251,6 +251,89 @@ static void dump_blob(struct device *dev, uint32_t blob_id)
> drmModeFreePropertyBlob(blob);
> }
>
> +static const char *modifier_to_string(uint64_t modifier)
> +{
> + switch (modifier) {
> + case DRM_FORMAT_MOD_INVALID:
> + return "INVALID";
> + case DRM_FORMAT_MOD_LINEAR:
> + return "LINEAR";
> + case I915_FORMAT_MOD_X_TILED:
> + return "X_TILED";
> + case I915_FORMAT_MOD_Y_TILED:
> + return "Y_TILED";
> + case I915_FORMAT_MOD_Yf_TILED:
> + return "Yf_TILED";
> + case I915_FORMAT_MOD_Y_TILED_CCS:
> + return "Y_TILED_CCS";
> + case I915_FORMAT_MOD_Yf_TILED_CCS:
> + return "Yf_TILED_CCS";
> + case DRM_FORMAT_MOD_SAMSUNG_64_32_TILE:
> + return "SAMSUNG_64_32_TILE";
> + case DRM_FORMAT_MOD_VIVANTE_TILED:
> + return "VIVANTE_TILED";
> + case DRM_FORMAT_MOD_VIVANTE_SUPER_TILED:
> + return "VIVANTE_SUPER_TILED";
> + case DRM_FORMAT_MOD_VIVANTE_SPLIT_TILED:
> + return "VIVANTE_SPLIT_TILED";
> + case DRM_FORMAT_MOD_VIVANTE_SPLIT_SUPER_TILED:
> + return "VIVANTE_SPLIT_SUPER_TILED";
> + case NV_FORMAT_MOD_TEGRA_TILED:
> + return "MOD_TEGRA_TILED";
> + case NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(0):
> + return "MOD_TEGRA_16BX2_BLOCK(0)";
> + case NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(1):
> + return "MOD_TEGRA_16BX2_BLOCK(1)";
> + case NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(2):
> + return "MOD_TEGRA_16BX2_BLOCK(2)";
> + case NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(3):
> + return "MOD_TEGRA_16BX2_BLOCK(3)";
> + case NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(4):
> + return "MOD_TEGRA_16BX2_BLOCK(4)";
> + case NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(5):
> + return "MOD_TEGRA_16BX2_BLOCK(5)";
> + case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED:
> + return "MOD_BROADCOM_VC4_T_TILED";
> + default:
> + return "(UNKNOWN MODIFIER)";
> + }
> +}
> +
> +static void dump_in_formats(struct device *dev, uint32_t blob_id)
> +{
> + uint32_t i, j;
> + drmModePropertyBlobPtr blob;
> + struct drm_format_modifier_blob *header;
> + uint32_t *formats;
> + struct drm_format_modifier *modifiers;
> +
> + printf("\t\tin_formats blob decoded:\n");
> + blob = drmModeGetPropertyBlob(dev->fd, blob_id);
> + if (!blob) {
> + printf("\n");
> + return;
> + }
> +
> + header = blob->data;
> + formats = (uint32_t *) ((char *) header + header->formats_offset);
> + modifiers = (struct drm_format_modifier *)
> + ((char *) header + header->modifiers_offset);
> +
> + for (i = 0; i < header->count_formats; i++) {
> + printf("\t\t\t");
> + dump_fourcc(formats[i]);
> + printf(": ");
> + for (j = 0; j < header->count_modifiers; j++) {
> + uint64_t mask = 1ULL << i;
> + if (modifiers[j].formats & mask)
> + printf(" %s", modifier_to_string(modifiers[j].modifier));
> + }
> + printf("\n");
> + }
> +
> + drmModeFreePropertyBlob(blob);
> +}
> +
> static void dump_prop(struct device *dev, drmModePropertyPtr prop,
> uint32_t prop_id, uint64_t value)
> {
> @@ -328,6 +411,9 @@ static void dump_prop(struct device *dev, drmModePropertyPtr prop,
> printf(" %"PRId64"\n", value);
> else
> printf(" %"PRIu64"\n", value);
> +
> + if (strcmp(prop->name, "IN_FORMATS") == 0)
> + dump_in_formats(dev, value);
> }
>
> static void dump_connectors(struct device *dev)
> --
> 2.14.2.822.g60be5d43e6-goog
>
More information about the dri-devel
mailing list