<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Aug 8, 2017 at 9:16 AM, Daniel Stone <span dir="ltr"><<a href="mailto:daniels@collabora.com" target="_blank">daniels@collabora.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Make sure the CCS modifier is supported on our plane, before we try to<br>
use it on that plane.<br>
<br>
Signed-off-by: Daniel Stone <<a href="mailto:daniels@collabora.com">daniels@collabora.com</a>><br>
---<br>
 tests/kms_ccs.c | 117 ++++++++++++++++++++++++++++++<wbr>+++++++++++++++++++++++++-<br>
 1 file changed, 116 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/tests/kms_ccs.c b/tests/kms_ccs.c<br>
index 1a5cdcd4..e74a68af 100644<br>
--- a/tests/kms_ccs.c<br>
+++ b/tests/kms_ccs.c<br>
@@ -54,6 +54,118 @@ typedef struct {<br>
 #define CCS_UNCOMPRESSED       0x0<br>
 #define CCS_COMPRESSED         0x55<br>
<br>
+struct local_drm_format_modifier {<br>
+       /* Bitmask of formats in get_plane format list this info applies to. The<br>
+       * offset allows a sliding window of which 64 formats (bits).<br>
+       *<br>
+       * Some examples:<br>
+       * In today's world with < 65 formats, and formats 0, and 2 are<br>
+       * supported<br>
+       * 0x0000000000000005<br>
+       *                 ^-offset = 0, formats = 5<br>
+       *<br>
+       * If the number formats grew to 128, and formats 98-102 are<br>
+       * supported with the modifier:<br>
+       *<br>
+       * 0x0000003c00000000 0000000000000000<br>
+       *                 ^<br>
+       *                 |__offset = 64, formats = 0x3c00000000<br>
+       *<br>
+       */<br>
+       uint64_t formats;<br>
+       uint32_t offset;<br>
+       uint32_t pad;<br>
+<br>
+       /* This modifier can be used with the format for this plane. */<br>
+       uint64_t modifier;<br>
+};<br>
+<br>
+struct local_drm_format_modifier_blob {<br>
+#define LOCAL_FORMAT_BLOB_CURRENT 1<br>
+       /* Version of this blob format */<br>
+       uint32_t version;<br>
+<br>
+       /* Flags */<br>
+       uint32_t flags;<br>
+<br>
+       /* Number of fourcc formats supported */<br>
+       uint32_t count_formats;<br>
+<br>
+       /* Where in this blob the formats exist (in bytes) */<br>
+       uint32_t formats_offset;<br>
+<br>
+       /* Number of drm_format_modifiers */<br>
+       uint32_t count_modifiers;<br>
+<br>
+       /* Where in this blob the modifiers exist (in bytes) */<br>
+       uint32_t modifiers_offset;<br>
+<br>
+       /* u32 formats[] */<br>
+       /* struct drm_format_modifier modifiers[] */<br>
+};<br>
+<br>
+static inline uint32_t *<br>
+formats_ptr(struct local_drm_format_modifier_blob *blob)<br>
+{<br>
+       return (uint32_t *)(((char *)blob) + blob->formats_offset);<br>
+}<br>
+<br>
+static inline struct local_drm_format_modifier *<br>
+modifiers_ptr(struct local_drm_format_modifier_blob *blob)<br>
+{<br>
+       return (struct local_drm_format_modifier *)(((char *)blob) + blob->modifiers_offset);<br>
+}<br>
+<br>
+static void plane_require_ccs(data_t *data, igt_plane_t *plane, uint32_t format)<br>
+{<br>
+       drmModePropertyBlobPtr blob;<br>
+       struct local_drm_format_modifier_blob *blob_data;<br>
+       struct local_drm_format_modifier *modifiers;<br>
+       uint32_t *formats;<br>
+       uint64_t blob_id;<br>
+       bool ret;<br>
+       int fmt_idx = -1;<br>
+<br>
+       ret = kmstest_get_property(data-><wbr>drm_fd, plane->drm_plane->plane_id,<br>
+                                  DRM_MODE_OBJECT_PLANE, "IN_FORMATS",<br>
+                                  NULL, &blob_id, NULL);<br>
+       igt_skip_on_f(ret == false, "IN_FORMATS not supported by kernel\n");<br>
+       igt_skip_on_f(blob_id == 0, "IN_FORMATS not supported by plane\n");<br>
+       blob = drmModeGetPropertyBlob(data-><wbr>drm_fd, blob_id);<br>
+       igt_assert(blob);<br>
+       igt_assert_lte(sizeof(struct local_drm_format_modifier_<wbr>blob),<br>
+                      blob->length);<br>
+<br>
+       blob_data = (struct local_drm_format_modifier_blob *) blob->data;<br>
+       formats = formats_ptr(blob_data);<br></blockquote><div><br></div><div>might consider an assert:<br><br>igt_assert(formats + blob_data->count_formats <= blob->length)<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+       for (int i = 0; i < blob_data->count_formats; i++) {<br>
+               if (formats[i] == format) {<br>
+                       fmt_idx = i;<br>
+                       break;<br>
+               }<br>
+       }<br>
+<br>
+       igt_skip_on_f(fmt_idx == -1,<br>
+                     "Format 0x%x not supported by plane\n", format);<br>
+<br>
+       modifiers = modifiers_ptr(blob_data);<br></blockquote><div><br>igt_assert(modifiers + blob_data->count_modifiers <= blob->length)<br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+       for (int i = 0; i < blob_data->count_modifiers; i++) {<br>
+               if (modifiers[i].modifier != LOCAL_I915_FORMAT_MOD_Y_TILED_<wbr>CCS)<br>
+                       continue;<br>
+<br>
+               if (modifiers[i].offset > fmt_idx ||<br>
+                   fmt_idx > modifiers[i].offset + 63)<br>
+                       continue;<br>
+<br>
+               if (modifiers[i].formats &<br>
+                   (1UL << (fmt_idx - modifiers[i].offset)))<br>
+                       return;<br>
+<br>
+               igt_skip("i915 CCS modifier not supported for format\n");<br>
+       }<br>
+<br>
+       igt_skip("i915 CCS modifier not supported by kernel for plane\n");<br>
+}<br>
<br>
 static void render_fb(data_t *data, uint32_t gem_handle, unsigned int size,<br>
                      enum test_fb_flags fb_flags,<br>
@@ -222,12 +334,15 @@ static void try_config(data_t *data, enum test_fb_flags fb_flags)<br>
        else<br>
                commit = COMMIT_UNIVERSAL;<br>
<br>
+       primary = igt_output_get_plane_type(<wbr>data->output,<br>
+                                           DRM_PLANE_TYPE_PRIMARY);<br>
+       plane_require_ccs(data, primary, DRM_FORMAT_XRGB8888);<br>
+<br>
        generate_fb(data, &data->fb, drm_mode->hdisplay, drm_mode->vdisplay,<br>
                    fb_flags);<br>
        if (data->flags & TEST_BAD_PIXEL_FORMAT)<br>
                return;<br>
<br>
-       primary = igt_output_get_plane_type(<wbr>data->output, DRM_PLANE_TYPE_PRIMARY);<br>
        igt_plane_set_position(<wbr>primary, 0, 0);<br>
        igt_plane_set_size(primary, drm_mode->hdisplay, drm_mode->vdisplay);<br>
        igt_plane_set_fb(primary, &data->fb);<br>
<span class="gmail-HOEnZb"><font color="#888888">--<br>
2.13.4<br>
<br>
</font></span></blockquote></div><br></div></div>