Op 20-10-17 om 12:02 schreef Mika Kahola:
> On Thu, 2017-10-12 at 17:33 +0200, Maarten Lankhorst wrote:
>> Now that we can set individual properties through the igt_kms api,
>> we no longer need to duplicate functionality from igt_kms. Set
>> invalid
>> properties directly, and rewrite kms_atomic.c to use igt_display.
>> This will allow us to remove a lot of code in kms_atomic.c,
>> and benefit from how igt_kms can set up a valid configuration,
>> instead of having to inherit it from fbcon.
>>
>> Changes since v1:
>> - Fix test failure when atomic_invalid_params is run standalone.
>>
>> Signed-off-by: Maarten Lankhorst <maarten.lankho...@linux.intel.com>
>> Cc: Daniel Stone <dani...@collabora.com>
>> ---
>>  tests/kms_atomic.c | 1668 ++++++++++++++++------------------------
>> ------------
>>  1 file changed, 512 insertions(+), 1156 deletions(-)
>>
>> diff --git a/tests/kms_atomic.c b/tests/kms_atomic.c
>> index 042a7c263aab..e0fc324eab61 100644
>> --- a/tests/kms_atomic.c
>> +++ b/tests/kms_atomic.c
>> @@ -46,10 +46,6 @@
>>  #include "igt_aux.h"
>>  #include "sw_sync.h"
>>  
>> -#ifndef DRM_CLIENT_CAP_ATOMIC
>> -#define DRM_CLIENT_CAP_ATOMIC 3
>> -#endif
>> -
>>  #ifndef DRM_CAP_CURSOR_WIDTH
>>  #define DRM_CAP_CURSOR_WIDTH 0x8
>>  #endif
>> @@ -58,23 +54,6 @@
>>  #define DRM_CAP_CURSOR_HEIGHT 0x9
>>  #endif
>>  
>> -#ifndef DRM_MODE_ATOMIC_TEST_ONLY
>> -#define DRM_MODE_ATOMIC_TEST_ONLY 0x0100
>> -#define DRM_MODE_ATOMIC_NONBLOCK 0x0200
>> -#define DRM_MODE_ATOMIC_ALLOW_MODESET 0x0400
>> -
>> -struct drm_mode_atomic {
>> -    __u32 flags;
>> -    __u32 count_objs;
>> -    __u64 objs_ptr;
>> -    __u64 count_props_ptr;
>> -    __u64 props_ptr;
>> -    __u64 prop_values_ptr;
>> -    __u64 reserved;
>> -    __u64 user_data;
>> -};
>> -#endif
>> -
>>  IGT_TEST_DESCRIPTION("Test atomic modesetting API");
>>  
>>  enum kms_atomic_check_relax {
>> @@ -83,1259 +62,652 @@ enum kms_atomic_check_relax {
>>      PLANE_RELAX_FB = (1 << 1)
>>  };
>>  
>> -/**
>> - * KMS plane type enum
>> - *
>> - * KMS plane types are represented by enums, which do not have
>> stable numeric
>> - * values, but must be looked up by their string value each time.
>> - *
>> - * To make the code more simple, we define a plane_type enum which
>> maps to
>> - * each KMS enum value. These values must be looked up through the
>> map, and
>> - * cannot be passed directly to KMS functions.
>> - */
>> -enum plane_type {
>> -    PLANE_TYPE_PRIMARY = 0,
>> -    PLANE_TYPE_OVERLAY,
>> -    PLANE_TYPE_CURSOR,
>> -    NUM_PLANE_TYPE_PROPS
>> -};
>> -
>> -static const char *plane_type_prop_names[NUM_PLANE_TYPE_PROPS] = {
>> -    "Primary",
>> -    "Overlay",
>> -    "Cursor"
>> -};
>> -
>> -struct kms_atomic_blob {
>> -    uint32_t id; /* 0 if not already allocated */
>> -    size_t len;
>> -    void *data;
>> -};
>> -
>> -struct kms_atomic_connector_state {
>> -    struct kms_atomic_state *state;
>> -    uint32_t obj;
>> -    uint32_t crtc_id;
>> -};
>> -
>> -struct kms_atomic_plane_state {
>> -    struct kms_atomic_state *state;
>> -    uint32_t obj;
>> -    enum plane_type type;
>> -    uint32_t crtc_mask;
>> -    uint32_t crtc_id; /* 0 to disable */
>> -    uint32_t fb_id; /* 0 to disable */
>> -    uint32_t src_x, src_y, src_w, src_h; /* 16.16 fixed-point */
>> -    uint32_t crtc_x, crtc_y, crtc_w, crtc_h; /* normal integers
>> */
>> -    int32_t fence_fd;
>> -};
>> -
>> -struct kms_atomic_crtc_state {
>> -    struct kms_atomic_state *state;
>> -    uint32_t obj;
>> -    int idx;
>> -    bool active;
>> -    int32_t *out_fence_ptr;
>> -    struct kms_atomic_blob mode;
>> -};
>> -
>> -struct kms_atomic_state {
>> -    struct kms_atomic_connector_state *connectors;
>> -    int num_connectors;
>> -    struct kms_atomic_crtc_state *crtcs;
>> -    int num_crtcs;
>> -    struct kms_atomic_plane_state *planes;
>> -    int num_planes;
>> -    struct kms_atomic_desc *desc;
>> -};
>> -
>> -struct kms_atomic_desc {
>> -    int fd;
>> -    uint32_t props_connector[IGT_NUM_CONNECTOR_PROPS];
>> -    uint32_t props_crtc[IGT_NUM_CRTC_PROPS];
>> -    uint32_t props_plane[IGT_NUM_PLANE_PROPS];
>> -    uint64_t props_plane_type[NUM_PLANE_TYPE_PROPS];
>> -};
>> -
>> -static uint32_t blob_duplicate(int fd, uint32_t id_orig)
>> +static bool plane_filter(enum igt_atomic_plane_properties prop)
>>  {
>> -    drmModePropertyBlobPtr orig = drmModeGetPropertyBlob(fd,
>> id_orig);
>> -    uint32_t id_new;
>> -
>> -    igt_assert(orig);
>> -    do_or_die(drmModeCreatePropertyBlob(fd, orig->data, orig-
>>> length,
>> -                                        &id_new));
>> -    drmModeFreePropertyBlob(orig);
>> +    if ((1 << prop) & IGT_PLANE_COORD_CHANGED_MASK)
>> +            return false;
>>  
>> -    return id_new;
>> -}
>> -
>> -#define crtc_set_prop(req, crtc, prop, value) \
>> -    igt_assert_lt(0, drmModeAtomicAddProperty(req, crtc->obj, \
>> -                                              crtc->state->desc-
>>> props_crtc[prop], \
>> -                                              value));
>> -
>> -#define plane_set_prop(req, plane, prop, value) \
>> -    igt_assert_lt(0, drmModeAtomicAddProperty(req, plane->obj, \
>> -                                              plane->state-
>>> desc->props_plane[prop], \
>> -                                              value));
>> -
>> -#define do_atomic_commit(fd, req, flags) \
>> -    do_or_die(drmModeAtomicCommit(fd, req, flags, NULL));
>> +    if (prop == IGT_PLANE_CRTC_ID || prop == IGT_PLANE_FB_ID)
>> +            return false;
>>  
>> -#define do_atomic_commit_err(fd, req, flags, err) { \
>> -    igt_assert_neq(drmModeAtomicCommit(fd, req, flags, NULL),
>> 0); \
>> -    igt_assert_eq(errno, err); \
>> -}
>> -
>> -#define crtc_commit_atomic(crtc, plane, req, relax, flags) { \
>> -    drmModeAtomicSetCursor(req, 0); \
>> -    crtc_populate_req(crtc, req); \
>> -    plane_populate_req(plane, req); \
>> -    do_atomic_commit((crtc)->state->desc->fd, req, flags); \
>> -    if (!(flags & DRM_MODE_ATOMIC_TEST_ONLY)) { \
>> -            crtc_check_current_state(crtc, plane, relax); \
>> -            plane_check_current_state(plane, relax); \
>> -    } \
>> -}
>> +    if (prop == IGT_PLANE_IN_FENCE_FD)
>> +            return false;
>>  
>> -#define crtc_commit_atomic_err(crtc, plane, crtc_old, plane_old,
>> req, flags, relax, e) { \
>> -    drmModeAtomicSetCursor(req, 0); \
>> -    crtc_populate_req(crtc, req); \
>> -    plane_populate_req(plane, req); \
>> -    do_atomic_commit_err((crtc)->state->desc->fd, req, flags,
>> e); \
>> -    crtc_check_current_state(crtc_old, plane_old, relax); \
>> -    plane_check_current_state(plane_old, relax); \
>> +    /* Don't care about other properties */
>> +    return true;
>>  }
>>  
>> -#define plane_commit_atomic(plane, req, relax) { \
>> -    drmModeAtomicSetCursor(req, 0); \
>> -    plane_populate_req(plane, req); \
>> -    do_atomic_commit((plane)->state->desc->fd, req, 0); \
>> -    plane_check_current_state(plane, relax); \
>> -}
>> -
>> -#define plane_commit_atomic_err(plane, plane_old, req, relax, e) { \
>> -    drmModeAtomicSetCursor(req, 0); \
>> -    plane_populate_req(plane, req); \
>> -    do_atomic_commit_err((plane)->state->desc->fd, req, 0, e); \
>> -    plane_check_current_state(plane_old, relax); \
>> -}
>> -
>> -static void
>> -connector_get_current_state(struct kms_atomic_connector_state
>> *connector)
>> -{
>> -    drmModeObjectPropertiesPtr props;
>> -    int i;
>> -
>> -    props = drmModeObjectGetProperties(connector->state->desc-
>>> fd,
>> -                                       connector->obj,
>> -                                       DRM_MODE_OBJECT_CONNECTOR
>> );
>> -    igt_assert(props);
>> -
>> -    for (i = 0; i < props->count_props; i++) {
>> -            uint32_t *prop_ids = connector->state->desc-
>>> props_connector;
>> -
>> -            if (props->props[i] ==
>> prop_ids[IGT_CONNECTOR_CRTC_ID])
>> -                    connector->crtc_id = props->prop_values[i];
>> -    }
>> -    drmModeFreeObjectProperties(props);
>> -}
>> -
>> -#if 0
>> -/* XXX: Checking this repeatedly actually hangs the GPU. I have
>> literally no
>> - *      idea why. */
>> -static void
>> -connector_check_current_state(struct kms_atomic_connector_state
>> *connector)
>> -{
>> -    struct kms_atomic_connector_state connector_kernel;
>> -    drmModeConnectorPtr legacy;
>> -    uint32_t crtc_id;
>> -
>> -    legacy = drmModeGetConnectorCurrent(connector->state->desc-
>>> fd,
>> -                                        connector->obj);
>> -    igt_assert(legacy);
>> -
>> -    if (legacy->encoder_id) {
>> -            drmModeEncoderPtr legacy_enc;
>> -
>> -            legacy_enc = drmModeGetEncoder(connector->state-
>>> desc->fd,
>> -                                           legacy->encoder_id);
>> -            igt_assert(legacy_enc);
>> -
>> -            crtc_id = legacy_enc->crtc_id;
>> -            drmModeFreeEncoder(legacy_enc);
>> -    } else {
>> -            crtc_id = 0;
>> -    }
>> -
>> -    igt_assert_eq_u32(crtc_id, connector->crtc_id);
>> -
>> -    memcpy(&connector_kernel, connector,
>> sizeof(connector_kernel));
>> -    connector_get_current_state(&connector_kernel);
>> -    do_or_die(memcmp(&connector_kernel, connector,
>> -                     sizeof(connector_kernel)));
>> -
>> -    drmModeFreeConnector(legacy);
>> -}
>> -#endif
>> -
>> -static struct kms_atomic_connector_state *
>> -find_connector(struct kms_atomic_state *state,
>> -           struct kms_atomic_crtc_state *crtc)
>> +static void plane_get_current_state(igt_plane_t *plane, uint64_t
>> *values)
>>  {
>>      int i;
>>  
>> -    for (i = 0; i < state->num_connectors; i++) {
>> -            struct kms_atomic_connector_state *connector =
>> -                    &state->connectors[i];
>> -
>> -            if (!connector->obj)
>> +    for (i = 0; i < IGT_NUM_PLANE_PROPS; i++) {
>> +            if (plane_filter(i)) {
>> +                    values[i] = 0;
>>                      continue;
>> -            if (crtc && connector->crtc_id != crtc->obj)
>> -                    continue;
>> -
>> -            return connector;
>> -    }
>> -
>> -    return NULL;
>> -}
>> -
>> -static void plane_populate_req(struct kms_atomic_plane_state *plane,
>> -                           drmModeAtomicReq *req)
>> -{
>> -    if (plane->fence_fd)
>> -            plane_set_prop(req, plane, IGT_PLANE_IN_FENCE_FD,
>> plane->fence_fd);
>> -
>> -    plane_set_prop(req, plane, IGT_PLANE_CRTC_ID, plane-
>>> crtc_id);
>> -    plane_set_prop(req, plane, IGT_PLANE_FB_ID, plane->fb_id);
>> -    plane_set_prop(req, plane, IGT_PLANE_SRC_X, plane->src_x);
>> -    plane_set_prop(req, plane, IGT_PLANE_SRC_Y, plane->src_y);
>> -    plane_set_prop(req, plane, IGT_PLANE_SRC_W, plane->src_w);
>> -    plane_set_prop(req, plane, IGT_PLANE_SRC_H, plane->src_h);
>> -    plane_set_prop(req, plane, IGT_PLANE_CRTC_X, plane->crtc_x);
>> -    plane_set_prop(req, plane, IGT_PLANE_CRTC_Y, plane->crtc_y);
>> -    plane_set_prop(req, plane, IGT_PLANE_CRTC_W, plane->crtc_w);
>> -    plane_set_prop(req, plane, IGT_PLANE_CRTC_H, plane->crtc_h);
>> -}
>> -
>> -static void plane_get_current_state(struct kms_atomic_plane_state
>> *plane)
>> -{
>> -    struct kms_atomic_desc *desc = plane->state->desc;
>> -    drmModeObjectPropertiesPtr props;
>> -    int i;
>> -
>> -    props = drmModeObjectGetProperties(desc->fd, plane->obj,
>> -                                       DRM_MODE_OBJECT_PLANE);
>> -    igt_assert(props);
>> -
>> -    for (i = 0; i < props->count_props; i++) {
>> -            uint32_t *prop_ids = desc->props_plane;
>> -
>> -            if (props->props[i] == prop_ids[IGT_PLANE_CRTC_ID])
>> -                    plane->crtc_id = props->prop_values[i];
>> -            else if (props->props[i] ==
>> prop_ids[IGT_PLANE_FB_ID])
>> -                    plane->fb_id = props->prop_values[i];
>> -            else if (props->props[i] ==
>> prop_ids[IGT_PLANE_CRTC_X])
>> -                    plane->crtc_x = props->prop_values[i];
>> -            else if (props->props[i] ==
>> prop_ids[IGT_PLANE_CRTC_Y])
>> -                    plane->crtc_y = props->prop_values[i];
>> -            else if (props->props[i] ==
>> prop_ids[IGT_PLANE_CRTC_W])
>> -                    plane->crtc_w = props->prop_values[i];
>> -            else if (props->props[i] ==
>> prop_ids[IGT_PLANE_CRTC_H])
>> -                    plane->crtc_h = props->prop_values[i];
>> -            else if (props->props[i] ==
>> prop_ids[IGT_PLANE_SRC_X])
>> -                    plane->src_x = props->prop_values[i];
>> -            else if (props->props[i] ==
>> prop_ids[IGT_PLANE_SRC_Y])
>> -                    plane->src_y = props->prop_values[i];
>> -            else if (props->props[i] ==
>> prop_ids[IGT_PLANE_SRC_W])
>> -                    plane->src_w = props->prop_values[i];
>> -            else if (props->props[i] ==
>> prop_ids[IGT_PLANE_SRC_H])
>> -                    plane->src_h = props->prop_values[i];
>> -            else if (props->props[i] ==
>> prop_ids[IGT_PLANE_TYPE]) {
>> -                    int j;
>> -
>> -                    for (j = 0; j < ARRAY_SIZE(desc-
>>> props_plane_type); j++) {
>> -                            if (props->prop_values[i] == desc-
>>> props_plane_type[j]) {
>> -                                    plane->type = j;
>> -                                    break;
>> -                            }
>> -                    }
>>              }
>> -    }
>>  
>> -    drmModeFreeObjectProperties(props);
>> +            values[i] = igt_plane_get_prop(plane, i);
>> +    }
>>  }
>>  
>> -static void plane_check_current_state(struct kms_atomic_plane_state
>> *plane,
>> +static void plane_check_current_state(igt_plane_t *plane, const
>> uint64_t *values,
>>                                    enum kms_atomic_check_relax
>> relax)
>>  {
>>      drmModePlanePtr legacy;
>> -    struct kms_atomic_plane_state plane_kernel;
>> +    uint64_t current_values[IGT_NUM_PLANE_PROPS];
>> +    int i;
>>  
>> -    legacy = drmModeGetPlane(plane->state->desc->fd, plane-
>>> obj);
>> +    legacy = drmModeGetPlane(plane->pipe->display->drm_fd,
>> plane->drm_plane->plane_id);
>>      igt_assert(legacy);
>>  
>> -    igt_assert_eq_u32(legacy->crtc_id, plane->crtc_id);
>> +    igt_assert_eq_u32(legacy->crtc_id,
>> values[IGT_PLANE_CRTC_ID]);
>>  
>>      if (!(relax & PLANE_RELAX_FB))
>> -            igt_assert_eq_u32(legacy->fb_id, plane->fb_id);
>> +            igt_assert_eq_u32(legacy->fb_id,
>> values[IGT_PLANE_FB_ID]);
>>  
>> -    memcpy(&plane_kernel, plane, sizeof(plane_kernel));
>> -    plane_get_current_state(&plane_kernel);
>> +    plane_get_current_state(plane, current_values);
>>  
>>      /* Legacy cursor ioctls create their own, unknowable,
>> internal
>>       * framebuffer which we can't reason about. */
>>      if (relax & PLANE_RELAX_FB)
>> -            plane_kernel.fb_id = plane->fb_id;
>> -    do_or_die(memcmp(&plane_kernel, plane,
>> sizeof(plane_kernel)));
>> +            current_values[IGT_PLANE_FB_ID] =
>> values[IGT_PLANE_FB_ID];
>> +
>> +    for (i = 0; i < IGT_NUM_PLANE_PROPS; i++)
>> +            if (!plane_filter(i))
>> +                    igt_assert_eq_u64(current_values[i],
>> values[i]);
>>  
>>      drmModeFreePlane(legacy);
>>  }
>>  
>> -static void plane_commit_legacy(struct kms_atomic_plane_state
>> *plane,
>> +static void plane_commit(igt_plane_t *plane, enum igt_commit_style
>> s,
>>                                  enum kms_atomic_check_relax relax)
>>  {
>> -    do_or_die(drmModeSetPlane(plane->state->desc->fd, plane-
>>> obj,
>> -                              plane->crtc_id,
>> -                              plane->fb_id, 0,
>> -                              plane->crtc_x, plane->crtc_y,
>> -                              plane->crtc_w, plane->crtc_h,
>> -                              plane->src_x, plane->src_y,
>> -                              plane->src_w, plane->src_h));
>> -    plane_check_current_state(plane, relax);
>> +    igt_display_commit2(plane->pipe->display, s);
>> +    plane_check_current_state(plane, plane->values, relax);
>>  }
>>  
>> -static struct kms_atomic_plane_state *
>> -find_plane(struct kms_atomic_state *state, enum plane_type type,
>> -       struct kms_atomic_crtc_state *crtc)
>> +static void plane_commit_atomic_err(igt_plane_t *plane,
>> +                                enum kms_atomic_check_relax
>> relax,
>> +                                int err)
>>  {
>> -    struct kms_atomic_plane_state *ret = NULL;
>> -    int i;
>> -
>> -    for (i = 0; i < state->num_planes; i++) {
>> -            struct kms_atomic_plane_state *plane = &state-
>>> planes[i];
>> -
>> -            if (!plane->obj)
>> -                    continue;
>> -            if (type != NUM_PLANE_TYPE_PROPS && plane->type !=
>> type)
>> -                    continue;
>> -            if (crtc && !(plane->crtc_mask & (1 << crtc->idx)))
>> -                    continue;
>> +    uint64_t current_values[IGT_NUM_PLANE_PROPS];
>>  
>> -            plane_get_current_state(plane);
>> +    plane_get_current_state(plane, current_values);
>>  
>> -            /* Try to find a plane that's already on this CRTC.
>> In
>> -             * particular, this ensures that for special
>> (primary/cursor)
>> -             * planes that can be on multiple CRTCs, we find the
>> same
>> -             * one that the legacy ioctls will. */
>> -            if (!crtc || plane->crtc_id == crtc->obj)
>> -                    return plane;
>> -
>> -            ret = plane;
>> -    }
>> +    igt_assert_eq(-err, igt_display_try_commit2(plane->pipe-
>>> display, COMMIT_ATOMIC));
>>  
>> -    return ret;
>> +    plane_check_current_state(plane, current_values, relax);
>>  }
>>  
>> -static void crtc_populate_req(struct kms_atomic_crtc_state *crtc,
>> -                          drmModeAtomicReq *req)
>> +static bool crtc_filter(enum igt_atomic_crtc_properties prop)
>>  {
>> -    if (crtc->out_fence_ptr)
>> -            crtc_set_prop(req, crtc, IGT_CRTC_OUT_FENCE_PTR,
>> -                          to_user_pointer(crtc->out_fence_ptr));
>> +    if (prop == IGT_CRTC_MODE_ID || prop == IGT_CRTC_ACTIVE)
>> +            return false;
>>  
>> -    crtc_set_prop(req, crtc, IGT_CRTC_MODE_ID, crtc->mode.id);
>> -    crtc_set_prop(req, crtc, IGT_CRTC_ACTIVE, crtc->active);
>> +    return true;
>>  }
>>  
>> -static void crtc_get_current_state(struct kms_atomic_crtc_state
>> *crtc)
>> +static void crtc_get_current_state(igt_pipe_t *pipe, uint64_t
>> *values)
>>  {
>> -    drmModeObjectPropertiesPtr props;
>>      int i;
>>  
>> -    props = drmModeObjectGetProperties(crtc->state->desc->fd,
>> crtc->obj,
>> -                                       DRM_MODE_OBJECT_CRTC);
>> -    igt_assert(props);
>> -
>> -    for (i = 0; i < props->count_props; i++) {
>> -            uint32_t *prop_ids = crtc->state->desc->props_crtc;
>> -
>> -            if (props->props[i] == prop_ids[IGT_CRTC_MODE_ID]) {
>> -                    drmModePropertyBlobPtr blob;
>> -
>> -                    crtc->mode.id = props->prop_values[i];
>> -                    if (!crtc->mode.id) {
>> -                            crtc->mode.len = 0;
>> -                            continue;
>> -                    }
>> -
>> -                    blob = drmModeGetPropertyBlob(crtc->state-
>>> desc->fd,
>> -                                                  crtc-
>>> mode.id);
>> -                    igt_assert(blob);
>> -                    igt_assert_eq_u32(blob->length,
>> -                                      sizeof(struct
>> drm_mode_modeinfo));
>> -
>> -                    if (!crtc->mode.data ||
>> -                        memcmp(crtc->mode.data, blob->data,
>> blob->length) != 0)
>> -                            crtc->mode.data = blob->data;
>> -                    crtc->mode.len = blob->length;
>> -            }
>> -            else if (props->props[i] ==
>> prop_ids[IGT_CRTC_ACTIVE]) {
>> -                    crtc->active = props->prop_values[i];
>> +    for (i = 0; i < IGT_NUM_CRTC_PROPS; i++) {
>> +            if (crtc_filter(i)) {
>> +                    values[i] = 0;
>> +                    continue;
>>              }
>> -    }
>>  
>> -    drmModeFreeObjectProperties(props);
>> +            values[i] = igt_pipe_obj_get_prop(pipe, i);
>> +    }
>>  }
>>  
>> -static void crtc_check_current_state(struct kms_atomic_crtc_state
>> *crtc,
>> -                                 struct kms_atomic_plane_state
>> *primary,
>> +static void crtc_check_current_state(igt_pipe_t *pipe,
>> +                                 const uint64_t *pipe_values,
>> +                                 const uint64_t *primary_values,
>>                                   enum kms_atomic_check_relax
>> relax)
>>  {
>> -    struct kms_atomic_crtc_state crtc_kernel;
>> +    uint64_t current_pipe_values[IGT_NUM_CRTC_PROPS];
>>      drmModeCrtcPtr legacy;
>> +    drmModePropertyBlobRes *mode_prop = NULL;
>> +    struct drm_mode_modeinfo *mode = NULL;
>>  
>> -    legacy = drmModeGetCrtc(crtc->state->desc->fd, crtc->obj);
>> -    igt_assert(legacy);
>> -
>> -    igt_assert_eq_u32(legacy->crtc_id, crtc->obj);
>> -    igt_assert_eq_u32(legacy->x, primary->src_x >> 16);
>> -    igt_assert_eq_u32(legacy->y, primary->src_y >> 16);
>> -
>> -    if (crtc->active)
>> -            igt_assert_eq_u32(legacy->buffer_id, primary-
>>> fb_id);
>> -    else
>> -            igt_assert_eq_u32(legacy->buffer_id, 0);
>> +    if (pipe_values[IGT_CRTC_MODE_ID]) {
>> +            mode_prop = drmModeGetPropertyBlob(pipe->display-
>>> drm_fd,
>> +                                               pipe_values[IGT_C
>> RTC_MODE_ID]);
>>  
>> -    if (legacy->mode_valid) {
>> -            igt_assert_neq(legacy->mode_valid, 0);
>> -            igt_assert_eq(crtc->mode.len,
>> -                          sizeof(struct drm_mode_modeinfo));
>> -            do_or_die(memcmp(&legacy->mode, crtc->mode.data,
>> -                             crtc->mode.len));
>> -            igt_assert_eq(legacy->width, legacy->mode.hdisplay);
>> -            igt_assert_eq(legacy->height, legacy-
>>> mode.vdisplay);
>> -    } else {
>> -            igt_assert_eq(legacy->mode_valid, 0);
>> -    }
>> +            igt_assert(mode_prop);
>>  
>> -    memcpy(&crtc_kernel, crtc, sizeof(crtc_kernel));
>> -    crtc_get_current_state(&crtc_kernel);
>> -
>> -    if (crtc_kernel.mode.id != 0)
>> -            igt_assert_eq(crtc_kernel.mode.len,
>> +            igt_assert_eq(mode_prop->length,
>>                            sizeof(struct drm_mode_modeinfo));
>> -
>> -    /* Optionally relax the check for MODE_ID: using the legacy
>> SetCrtc
>> -     * API can potentially change MODE_ID even if the mode
>> itself remains
>> -     * unchanged. */
>> -    if (((relax & CRTC_RELAX_MODE) &&
>> -        (crtc_kernel.mode.id != crtc->mode.id &&
>> -         crtc_kernel.mode.id != 0 && crtc->mode.id != 0)) &&
>> -        memcmp(crtc_kernel.mode.data, crtc->mode.data,
>> -               sizeof(struct drm_mode_modeinfo)) == 0) {
>> -            crtc_kernel.mode.id = crtc->mode.id;
>> -            crtc_kernel.mode.data = crtc->mode.data;
>> -    }
>> -
>> -    do_or_die(memcmp(&crtc_kernel, crtc, sizeof(crtc_kernel)));
>> -
>> -    drmModeFreeCrtc(legacy);
>> -}
>> -
>> -static void crtc_commit_legacy(struct kms_atomic_crtc_state *crtc,
>> -                           struct kms_atomic_plane_state *plane,
>> -                           enum kms_atomic_check_relax relax)
>> -{
>> -    drmModeObjectPropertiesPtr props;
>> -    uint32_t *connectors;
>> -    int num_connectors = 0;
>> -    int i;
>> -
>> -    if (!crtc->active) {
>> -            do_or_die(drmModeSetCrtc(crtc->state->desc->fd,
>> -                                     crtc->obj, 0, 0, 0, NULL,
>> 0, NULL));
>> -            return;
>> -    }
>> -
>> -    connectors = calloc(crtc->state->num_connectors,
>> -                        sizeof(*connectors));
>> -    igt_assert(connectors);
>> -
>> -    igt_assert_neq_u32(crtc->mode.id, 0);
>> -
>> -    for (i = 0; i < crtc->state->num_connectors; i++) {
>> -            struct kms_atomic_connector_state *connector =
>> -                    &crtc->state->connectors[i];
>> -
>> -            if (connector->crtc_id != crtc->obj)
>> -                    continue;
>> -
>> -            connectors[num_connectors++] = connector->obj;
>> +            mode = mode_prop->data;
>>      }
>>  
>> -    do_or_die(drmModeSetCrtc(crtc->state->desc->fd, crtc->obj,
>> -                             plane->fb_id,
>> -                             plane->src_x >> 16, plane->src_y >>
>> 16,
>> -                             (num_connectors) ? connectors :
>> NULL,
>> -                             num_connectors,
>> -                             crtc->mode.data));
>> -    /* When doing a legacy commit, the core may update MODE_ID
>> to be a new
>> -     * blob implicitly created by the legacy request. Hence we
>> backfill
>> -     * the value in the state object to ensure they match. */
>> -    props = drmModeObjectGetProperties(crtc->state->desc->fd,
>> crtc->obj,
>> -                                       DRM_MODE_OBJECT_CRTC);
>> -    igt_assert(props);
>> -
>> -    for (i = 0; i < props->count_props; i++) {
>> -            if (props->props[i] !=
>> -                crtc->state->desc->props_crtc[IGT_CRTC_MODE_ID])
>> -                    continue;
>> -            crtc->mode.id = props->prop_values[i];
>> -            break;
>> -    }
>> +    legacy = drmModeGetCrtc(pipe->display->drm_fd, pipe-
>>> crtc_id);
>> +    igt_assert(legacy);
>>  
>> -    drmModeFreeObjectProperties(props);
>> +    igt_assert_eq_u32(legacy->crtc_id, pipe->crtc_id);
>> +    igt_assert_eq_u32(legacy->x, primary_values[IGT_PLANE_SRC_X]
>>>> 16);
>> +    igt_assert_eq_u32(legacy->y, primary_values[IGT_PLANE_SRC_Y]
>>>> 16);
>>  
>> -    crtc_check_current_state(crtc, plane, relax);
>> -    plane_check_current_state(plane, relax);
>> -}
>> +    igt_assert_eq_u32(legacy->buffer_id,
>> primary_values[IGT_PLANE_FB_ID]);
>>  
>> -static struct kms_atomic_crtc_state *find_crtc(struct
>> kms_atomic_state *state,
>> -                                           bool must_be_enabled)
>> -{
>> -    int i;
>> +    if (legacy->mode_valid) {
>> +            igt_assert(mode_prop);
>>  
>> -    for (i = 0; i < state->num_crtcs; i++) {
>> -            struct kms_atomic_crtc_state *crtc = &state-
>>> crtcs[i];
>> +            do_or_die(memcmp(&legacy->mode, mode,
>> sizeof(*mode)));
>>  
>> -            if (!crtc->obj)
>> -                    continue;
>> -            if (must_be_enabled && !crtc->active)
>> -                    continue;
>> +            igt_assert_eq(legacy->width, legacy->mode.hdisplay);
>> +            igt_assert_eq(legacy->height, legacy-
>>> mode.vdisplay);
>>  
>> -            crtc_get_current_state(crtc);
>> -            return crtc;
>> +            igt_assert_neq(pipe_values[IGT_CRTC_MODE_ID], 0);
>> +    } else {
>> +            igt_assert(!mode_prop);
>>      }
>>  
>> -    return NULL;
>> -}
>> +    crtc_get_current_state(pipe, current_pipe_values);
>>  
>> -static void fill_obj_props(int fd, uint32_t id, int type, int
>> num_props,
>> -                       const char **prop_names, uint32_t
>> *prop_ids)
>> -{
>> -    drmModeObjectPropertiesPtr props;
>> -    int i, j;
>> -
>> -    props = drmModeObjectGetProperties(fd, id, type);
>> -    igt_assert(props);
>> +    /* Optionally relax the check for MODE_ID: using the legacy
>> SetCrtc
>> +     * API can potentially change MODE_ID even if the mode
>> itself remains
>> +     * unchanged. */
>> +    if (relax & CRTC_RELAX_MODE && mode &&
>> current_pipe_values[IGT_CRTC_MODE_ID] &&
>> +        current_pipe_values[IGT_CRTC_MODE_ID] !=
>> pipe_values[IGT_CRTC_MODE_ID]) {
>> +            drmModePropertyBlobRes *cur_prop =
>> +                    drmModeGetPropertyBlob(pipe->display-
>>> drm_fd,
>> +                                           current_pipe_values[I
>> GT_CRTC_MODE_ID]);
>>  
>> -    for (i = 0; i < props->count_props; i++) {
>> -            drmModePropertyPtr prop =
>> -                    drmModeGetProperty(fd, props->props[i]);
>> +            igt_assert(cur_prop);
>> +            igt_assert_eq(cur_prop->length, sizeof(struct
>> drm_mode_modeinfo));
>>  
>> -            for (j = 0; j < num_props; j++) {
>> -                    if (strcmp(prop->name, prop_names[j]) != 0)
>> -                            continue;
>> -                    prop_ids[j] = props->props[i];
>> -                    break;
>> -            }
>> +            if (!memcmp(cur_prop->data, mode, sizeof(*mode)))
>> +                    current_pipe_values[IGT_CRTC_MODE_ID] =
>> pipe_values[IGT_CRTC_MODE_ID];
>>  
>> -            drmModeFreeProperty(prop);
>> +            drmModeFreePropertyBlob(cur_prop);
>>      }
>>  
>> -    drmModeFreeObjectProperties(props);
>> -}
>> +    do_or_die(memcmp(pipe_values, current_pipe_values,
>> sizeof(current_pipe_values)));
>>  
>> -static void fill_obj_prop_map(int fd, uint32_t id, int type, const
>> char *name,
>> -                          int num_enums, const char
>> **enum_names,
>> -                          uint64_t *enum_ids)
>> -{
>> -    drmModeObjectPropertiesPtr props;
>> -    int i, j, k;
>> -
>> -    props = drmModeObjectGetProperties(fd, id, type);
>> -    igt_assert(props);
>> -
>> -    for (i = 0; i < props->count_props; i++) {
>> -            drmModePropertyPtr prop =
>> -                    drmModeGetProperty(fd, props->props[i]);
>> -
>> -            igt_assert(prop);
>> -
>> -            if (strcmp(prop->name, name) != 0) {
>> -                    drmModeFreeProperty(prop);
>> -                    continue;
>> -            }
>> -
>> -            for (j = 0; j < prop->count_enums; j++) {
>> -                    struct drm_mode_property_enum *e = &prop-
>>> enums[j];
>> -
>> -                    for (k = 0; k < num_enums; k++) {
>> -                            if (strcmp(e->name, enum_names[k])
>> != 0)
>> -                                    continue;
>> -
>> -                            enum_ids[k] = e->value;
>> -                            break;
>> -                    }
>> -            }
>> -
>> -            drmModeFreeProperty(prop);
>> -    }
>> +    drmModeFreeCrtc(legacy);
>> +    drmModeFreePropertyBlob(mode_prop);
>>  }
>>  
>> -static void atomic_setup(struct kms_atomic_state *state)
>> +static void crtc_commit(igt_pipe_t *pipe, igt_plane_t *plane,
>> +                    enum igt_commit_style s,
>> +                    enum kms_atomic_check_relax relax)
>>  {
>> -    struct kms_atomic_desc *desc = state->desc;
>> -    drmModeResPtr res;
>> -    drmModePlaneResPtr res_plane;
>> -    int i;
>> -
>> -    desc->fd = drm_open_driver_master(DRIVER_ANY);
>> -    igt_assert_fd(desc->fd);
>> -
>> -    igt_skip_on(drmSetClientCap(desc->fd, DRM_CLIENT_CAP_ATOMIC,
>> 1));
>> -
>> -    res = drmModeGetResources(desc->fd);
>> -    res_plane = drmModeGetPlaneResources(desc->fd);
>> -    igt_assert(res);
>> -    igt_assert(res_plane);
>> -
>> -    igt_assert_lt(0, res->count_crtcs);
>> -    state->num_crtcs = res->count_crtcs;
>> -    state->crtcs = calloc(state->num_crtcs, sizeof(*state-
>>> crtcs));
>> -    igt_assert(state->crtcs);
>> -
>> -    igt_assert_lt(0, res_plane->count_planes);
>> -    state->num_planes = res_plane->count_planes;
>> -    state->planes = calloc(state->num_planes, sizeof(*state-
>>> planes));
>> -    igt_assert(state->planes);
>> -
>> -    igt_assert_lt(0, res->count_connectors);
>> -    state->num_connectors = res->count_connectors;
>> -    state->connectors = calloc(state->num_connectors,
>> -                               sizeof(*state->connectors));
>> -    igt_assert(state->connectors);
>> -
>> -    fill_obj_props(desc->fd, res->crtcs[0],
>> -                   DRM_MODE_OBJECT_CRTC, IGT_NUM_CRTC_PROPS,
>> -                   igt_crtc_prop_names, desc->props_crtc);
>> -
>> -    fill_obj_props(desc->fd, res_plane->planes[0],
>> -                   DRM_MODE_OBJECT_PLANE, IGT_NUM_PLANE_PROPS,
>> -                   igt_plane_prop_names, desc->props_plane);
>> -    fill_obj_prop_map(desc->fd, res_plane->planes[0],
>> -                      DRM_MODE_OBJECT_PLANE, "type",
>> -                      NUM_PLANE_TYPE_PROPS,
>> plane_type_prop_names,
>> -                      desc->props_plane_type);
>> -
>> -    fill_obj_props(desc->fd, res->connectors[0],
>> -                   DRM_MODE_OBJECT_CONNECTOR,
>> IGT_NUM_CONNECTOR_PROPS,
>> -                   igt_connector_prop_names, desc-
>>> props_connector);
>> -
>> -    for (i = 0; i < state->num_crtcs; i++) {
>> -            struct kms_atomic_crtc_state *crtc = &state-
>>> crtcs[i];
>> -
>> -            crtc->state = state;
>> -            crtc->obj = res->crtcs[i];
>> -            crtc->idx = i;
>> -            crtc_get_current_state(crtc);
>> -
>> -            /* The blob pointed to by MODE_ID could well be
>> transient,
>> -             * and lose its last reference as we switch away
>> from it.
>> -             * Duplicate the blob here so we have a reference we
>> know we
>> -             * own. */
>> -            if (crtc->mode.id != 0)
>> -                crtc->mode.id = blob_duplicate(desc->fd, crtc-
>>> mode.id);
>> -    }
>> +    igt_display_commit2(pipe->display, s);
>>  
>> -    for (i = 0; i < state->num_planes; i++) {
>> -            drmModePlanePtr plane =
>> -                    drmModeGetPlane(desc->fd, res_plane-
>>> planes[i]);
>> -            igt_assert(plane);
>> -
>> -            state->planes[i].state = state;
>> -            state->planes[i].obj = res_plane->planes[i];
>> -            state->planes[i].crtc_mask = plane->possible_crtcs;
>> -            plane_get_current_state(&state->planes[i]);
>> -    }
>> -
>> -    for (i = 0; i < state->num_connectors; i++) {
>> -            state->connectors[i].state = state;
>> -            state->connectors[i].obj = res->connectors[i];
>> -            connector_get_current_state(&state->connectors[i]);
>> -    }
>> -
>> -    drmModeFreePlaneResources(res_plane);
>> -    drmModeFreeResources(res);
>> +    crtc_check_current_state(pipe, pipe->values, plane->values,
>> relax);
>> +    plane_check_current_state(plane, plane->values, relax);
>>  }
>>  
>> -static struct kms_atomic_state *
>> -atomic_state_dup(const struct kms_atomic_state *state)
>> +static void crtc_commit_atomic_flags_err(igt_pipe_t *pipe,
>> igt_plane_t *plane,
>> +                                     unsigned flags,
>> +                                     enum kms_atomic_check_relax
>> relax,
>> +                                     int err)
>>  {
>> -    struct kms_atomic_state *ret = calloc(1, sizeof(*ret));
>> -
>> -    igt_assert(ret);
>> -    *ret = *state;
>> +    uint64_t current_pipe_values[IGT_NUM_CRTC_PROPS];
>> +    uint64_t current_plane_values[IGT_NUM_PLANE_PROPS];
>>  
>> -    ret->crtcs = calloc(ret->num_crtcs, sizeof(*ret->crtcs));
>> -    igt_assert(ret->crtcs);
>> -    memcpy(ret->crtcs, state->crtcs, ret->num_crtcs *
>> sizeof(*ret->crtcs));
>> +    crtc_get_current_state(pipe, current_pipe_values);
>> +    plane_get_current_state(plane, current_plane_values);
>>  
>> -    ret->planes = calloc(ret->num_planes, sizeof(*ret->planes));
>> -    igt_assert(ret->planes);
>> -    memcpy(ret->planes, state->planes,
>> -           ret->num_planes * sizeof(*ret->planes));
>> +    igt_assert_eq(-err, igt_display_try_commit_atomic(pipe-
>>> display, flags, NULL));
>>  
>> -    ret->connectors = calloc(ret->num_connectors, sizeof(*ret-
>>> connectors));
>> -    igt_assert(ret->connectors);
>> -    memcpy(ret->connectors, state->connectors,
>> -           ret->num_connectors * sizeof(*ret->connectors));
>> -
>> -    return ret;
>> +    crtc_check_current_state(pipe, current_pipe_values,
>> current_plane_values, relax);
>> +    plane_check_current_state(plane, current_plane_values,
>> relax);
>>  }
>>  
>> -static void atomic_state_free(struct kms_atomic_state *state)
>> -{
>> -    free(state->crtcs);
>> -    free(state->planes);
>> -    free(state->connectors);
>> -    free(state);
>> -}
>> +#define crtc_commit_atomic_err(pipe, plane, relax, err) \
>> +    crtc_commit_atomic_flags_err(pipe, plane,
>> DRM_MODE_ATOMIC_ALLOW_MODESET, relax, err)
>>  
>> -static uint32_t plane_get_igt_format(struct kms_atomic_plane_state
>> *plane)
>> +static uint32_t plane_get_igt_format(igt_plane_t *plane)
>>  {
>>      drmModePlanePtr plane_kms;
>>      const uint32_t *igt_formats;
>> -    uint32_t ret = 0;
>>      int num_igt_formats;
>>      int i;
>>  
>> -    plane_kms = drmModeGetPlane(plane->state->desc->fd, plane-
>>> obj);
>> -    igt_assert(plane_kms);
>> +    plane_kms = plane->drm_plane;
>>  
>>      igt_get_all_cairo_formats(&igt_formats, &num_igt_formats);
>>      for (i = 0; i < num_igt_formats; i++) {
>>              int j;
>>  
>>              for (j = 0; j < plane_kms->count_formats; j++) {
>> -                    if (plane_kms->formats[j] == igt_formats[i])
>> {
>> -                            ret = plane_kms->formats[j];
>> -                            break;
>> -                    }
>> +                    if (plane_kms->formats[j] == igt_formats[i])
>> +                            return plane_kms->formats[j];
>>              }
>>      }
>>  
>> -    drmModeFreePlane(plane_kms);
>> -    return ret;
>> +    return 0;
>>  }
>>  
>>  static void
>> -set_dpms(int fd, int mode)
>> +set_dpms(igt_output_t *output, int mode)
>>  {
>> -    int i;
>> -    drmModeConnector *connector;
>> -    uint32_t id;
>> -    drmModeRes *resources = drmModeGetResources(fd);
>> -
>> -    for (i = 0; i < resources->count_connectors; i++) {
>> -            id = resources->connectors[i];
>> -
>> -            connector = drmModeGetConnectorCurrent(fd, id);
>> -
>> -            kmstest_set_connector_dpms(fd, connector, mode);
>> -
>> -            drmModeFreeConnector(connector);
>> -    }
>> +    do_or_die(drmModeConnectorSetProperty(output->display-
>>> drm_fd, output->id,
>> +                                          output-
>>> props[IGT_CONNECTOR_DPMS], mode));
>>  }
>>  
>> -static void plane_overlay(struct kms_atomic_crtc_state *crtc,
>> -                      struct kms_atomic_plane_state *plane_old)
>> +static void plane_overlay(igt_pipe_t *pipe, igt_output_t *output,
>> igt_plane_t *plane)
>>  {
>> -    struct drm_mode_modeinfo *mode = crtc->mode.data;
>> -    struct kms_atomic_plane_state plane = *plane_old;
>> -    uint32_t format = plane_get_igt_format(&plane);
>> -    drmModeAtomicReq *req = drmModeAtomicAlloc();
>> +    drmModeModeInfo *mode = igt_output_get_mode(output);
>> +    uint32_t format = plane_get_igt_format(plane);
>>      struct igt_fb fb;
>> +    uint32_t w = mode->hdisplay / 2;
>> +    uint32_t h = mode->vdisplay / 2;
>>  
>> -    igt_require(req);
>>      igt_require(format != 0);
>>  
>> -    plane.src_x = 0;
>> -    plane.src_y = 0;
>> -    plane.src_w = (mode->hdisplay / 2) << 16;
>> -    plane.src_h = (mode->vdisplay / 2) << 16;
>> -    plane.crtc_x = mode->hdisplay / 4;
>> -    plane.crtc_y = mode->vdisplay / 4;
>> -    plane.crtc_w = mode->hdisplay / 2;
>> -    plane.crtc_h = mode->vdisplay / 2;
>> -    plane.crtc_id = crtc->obj;
>> -    plane.fb_id = igt_create_pattern_fb(plane.state->desc->fd,
>> -                                        plane.crtc_w,
>> plane.crtc_h,
>> -                                        format,
>> I915_TILING_NONE, &fb);
>> +    igt_create_pattern_fb(pipe->display->drm_fd, w, h,
>> +                          format, I915_TILING_NONE, &fb);
>> +
>> +    igt_plane_set_fb(plane, &fb);
>> +    igt_plane_set_position(plane, w/2, h/2);
>>  
>>      /* Enable the overlay plane using the atomic API, and
>> double-check
>>       * state is what we think it should be. */
>> -    plane_commit_atomic(&plane, req, ATOMIC_RELAX_NONE);
>> +    plane_commit(plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
>>  
>>      /* Disable the plane and check the state matches the old. */
>> -    plane_commit_atomic(plane_old, req, ATOMIC_RELAX_NONE);
>> +    igt_plane_set_fb(plane, NULL);
>> +    igt_plane_set_position(plane, 0, 0);
>> +    plane_commit(plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
>>  
>>      /* Re-enable the plane through the legacy plane API, and
>> verify through
>>       * atomic. */
>> -    plane_commit_legacy(&plane, ATOMIC_RELAX_NONE);
>> +    igt_plane_set_fb(plane, &fb);
>> +    igt_plane_set_position(plane, w/2, h/2);
>> +    plane_commit(plane, COMMIT_LEGACY, ATOMIC_RELAX_NONE);
>>  
>>      /* Restore the plane to its original settings through the
>> legacy plane
>>       * API, and verify through atomic. */
>> -    plane_commit_legacy(plane_old, ATOMIC_RELAX_NONE);
>> +    igt_plane_set_fb(plane, NULL);
>> +    igt_plane_set_position(plane, 0, 0);
>> +    plane_commit(plane, COMMIT_LEGACY, ATOMIC_RELAX_NONE);
>>  
>> -    drmModeAtomicFree(req);
>> +    igt_remove_fb(pipe->display->drm_fd, &fb);
>>  }
>>  
>> -static void plane_primary(struct kms_atomic_crtc_state *crtc,
>> -                      struct kms_atomic_plane_state *plane_old)
>> +static void plane_primary(igt_pipe_t *pipe, igt_plane_t *plane,
>> struct igt_fb *fb)
>>  {
>> -    struct drm_mode_modeinfo *mode = crtc->mode.data;
>> -    struct kms_atomic_plane_state plane = *plane_old;
>> -    uint32_t format = plane_get_igt_format(&plane);
>> -    drmModeAtomicReq *req = drmModeAtomicAlloc();
>> -    struct igt_fb fb;
>> -    uint32_t flags = 0;
>> -    int ret;
>> -
>> -    igt_require(format != 0);
>> +    struct igt_fb fb2;
>>  
>> -    plane.src_x = 0;
>> -    plane.src_y = 0;
>> -    plane.src_w = mode->hdisplay << 16;
>> -    plane.src_h = mode->vdisplay << 16;
>> -    plane.crtc_x = 0;
>> -    plane.crtc_y = 0;
>> -    plane.crtc_w = mode->hdisplay;
>> -    plane.crtc_h = mode->vdisplay;
>> -    plane.crtc_id = crtc->obj;
>> -    plane.fb_id = igt_create_pattern_fb(plane.state->desc->fd,
>> -                                        plane.crtc_w,
>> plane.crtc_h,
>> -                                        format,
>> I915_TILING_NONE, &fb);
>> -
>> -    drmModeAtomicSetCursor(req, 0);
>> -    crtc_populate_req(crtc, req);
>> -    plane_populate_req(&plane, req);
>> -    ret = drmModeAtomicCommit(crtc->state->desc->fd, req,
>> -                              DRM_MODE_ATOMIC_TEST_ONLY, NULL);
>> -    /* Try harder in case the failure is caused by disallowing
>> modeset. */
>> -    if (ret == -EINVAL)
>> -            flags |= DRM_MODE_ATOMIC_ALLOW_MODESET;
>> +    igt_create_color_pattern_fb(pipe->display->drm_fd,
>> +                                fb->width, fb->height,
>> +                                fb->drm_format,
>> I915_TILING_NONE,
>> +                                0.2, 0.2, 0.2, &fb2);
>>  
>>      /* Flip the primary plane using the atomic API, and double-
>> check
>>       * state is what we think it should be. */
>> -    crtc_commit_atomic(crtc, &plane, req, ATOMIC_RELAX_NONE,
>> flags);
>> +    igt_plane_set_fb(plane, &fb2);
>> +    crtc_commit(pipe, plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
>>  
>>      /* Restore the primary plane and check the state matches the
>> old. */
>> -    crtc_commit_atomic(crtc, plane_old, req, ATOMIC_RELAX_NONE,
>> flags);
>> +    igt_plane_set_fb(plane, fb);
>> +    crtc_commit(pipe, plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
>>  
>> -    /* Re-enable the plane through the legacy CRTC/primary-plane 
>> API, and
>> +    /* Set the plane through the legacy CRTC/primary-plane API,
>> and
>>       * verify through atomic. */
>> -    crtc_commit_legacy(crtc, &plane, CRTC_RELAX_MODE);
>> +    igt_plane_set_fb(plane, &fb2);
>> +    crtc_commit(pipe, plane, COMMIT_LEGACY, CRTC_RELAX_MODE);
>>  
>>      /* Restore the plane to its original settings through the
>> legacy CRTC
>>       * API, and verify through atomic. */
>> -    crtc_commit_legacy(crtc, plane_old, CRTC_RELAX_MODE);
>> -
>> -    /* Finally, restore to the original state. */
>> -    crtc_commit_atomic(crtc, plane_old, req, ATOMIC_RELAX_NONE,
>> flags);
>> +    igt_plane_set_fb(plane, fb);
>> +    crtc_commit(pipe, plane, COMMIT_LEGACY, CRTC_RELAX_MODE);
>>  
>> -    drmModeAtomicFree(req);
>> +    /* Set the plane through the universal setplane API, and
>> +     * verify through atomic. */
>> +    igt_plane_set_fb(plane, &fb2);
>> +    plane_commit(plane, COMMIT_UNIVERSAL, ATOMIC_RELAX_NONE);
>>  }
>>  
>>  /* test to ensure that DRM_MODE_ATOMIC_TEST_ONLY really only touches
>> the
>>   * free-standing state objects and nothing else.
>>   */
>> -static void test_only(struct kms_atomic_crtc_state *crtc,
>> -                  struct kms_atomic_plane_state *plane_old)
>> +static void test_only(igt_pipe_t *pipe_obj,
>> +                  igt_plane_t *primary,
>> +                  igt_output_t *output)
>>  {
>> -    struct drm_mode_modeinfo *mode = crtc->mode.data;
>> -    struct kms_atomic_plane_state plane = *plane_old;
>> -    uint32_t format = plane_get_igt_format(&plane);
>> -    drmModeAtomicReq *req = drmModeAtomicAlloc();
>> +    drmModeModeInfo *mode = igt_output_get_mode(output);
>> +    uint32_t format = plane_get_igt_format(primary);
>>      struct igt_fb fb;
>> -    int ret;
>> +    uint64_t old_plane_values[IGT_NUM_PLANE_PROPS],
>> old_crtc_values[IGT_NUM_CRTC_PROPS];
>>  
>>      igt_require(format != 0);
>>  
>> -    plane.src_x = 0;
>> -    plane.src_y = 0;
>> -    plane.src_w = mode->hdisplay << 16;
>> -    plane.src_h = mode->vdisplay << 16;
>> -    plane.crtc_x = 0;
>> -    plane.crtc_y = 0;
>> -    plane.crtc_w = mode->hdisplay;
>> -    plane.crtc_h = mode->vdisplay;
>> -    plane.crtc_id = crtc->obj;
>> -    plane.fb_id = igt_create_pattern_fb(plane.state->desc->fd,
>> -                                        plane.crtc_w,
>> plane.crtc_h,
>> -                                        format,
>> I915_TILING_NONE, &fb);
>> -
>> -    drmModeAtomicSetCursor(req, 0);
>> -    crtc_populate_req(crtc, req);
>> -    plane_populate_req(&plane, req);
>> -    ret = drmModeAtomicCommit(crtc->state->desc->fd, req,
>> -                              DRM_MODE_ATOMIC_TEST_ONLY, NULL);
>> -
>> -    igt_assert_eq(ret, 0);
>> -
>> -    /* go through dpms off/on cycle */
>> -    set_dpms(crtc->state->desc->fd, DRM_MODE_DPMS_OFF);
>> -    set_dpms(crtc->state->desc->fd, DRM_MODE_DPMS_ON);
>> -
>> -    /* check the state */
>> -    crtc_check_current_state(crtc, plane_old,
>> ATOMIC_RELAX_NONE);
>> -    plane_check_current_state(plane_old, ATOMIC_RELAX_NONE);
>> -
>> -    /* Re-enable the plane through the legacy CRTC/primary-plane 
>> API, and
>> -     * verify through atomic. */
>> -    crtc_commit_legacy(crtc, plane_old, CRTC_RELAX_MODE);
>> +    plane_get_current_state(primary, old_plane_values);
>> +    crtc_get_current_state(pipe_obj, old_crtc_values);
>> +
>> +    igt_assert(!old_crtc_values[IGT_CRTC_MODE_ID]);
>> +
>> +    igt_create_pattern_fb(pipe_obj->display->drm_fd,
>> +                         mode->hdisplay, mode->vdisplay,
>> +                         format, I915_TILING_NONE, &fb);
>> +    igt_plane_set_fb(primary, &fb);
>> +    igt_output_set_pipe(output, pipe_obj->pipe);
>> +
>> +    igt_display_commit_atomic(pipe_obj->display,
>> DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
>> +
>> +    /* check the state, should still be old state */
>> +    crtc_check_current_state(pipe_obj, old_crtc_values,
>> old_plane_values, ATOMIC_RELAX_NONE);
>> +    plane_check_current_state(primary, old_plane_values,
>> ATOMIC_RELAX_NONE);
>> +
>> +    /*
>> +     * Enable the plane through the legacy CRTC/primary-plane
>> API, and
>> +     * verify through atomic.
>> +     */
>> +    crtc_commit(pipe_obj, primary, COMMIT_LEGACY,
>> CRTC_RELAX_MODE);
>> +
>> +    /* Same for disable.. */
>> +    plane_get_current_state(primary, old_plane_values);
>> +    crtc_get_current_state(pipe_obj, old_crtc_values);
>> +
>> +    igt_plane_set_fb(primary, NULL);
>> +    igt_output_set_pipe(output, PIPE_NONE);
>> +
>> +    igt_display_commit_atomic(pipe_obj->display,
>> DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
>>  
>> -    drmModeAtomicFree(req);
>> +    /* for extra stress, go through dpms off/on cycle */
>> +    set_dpms(output, DRM_MODE_DPMS_OFF);
>> +    set_dpms(output, DRM_MODE_DPMS_ON);
> There is this library function 'kmstest_set_connector_dpms()'. Could we
> utilize this function here instead?
Sure, I never understood what the dpms call was supposed to expose though..

Want me to resend or is replacing the call with kmstest_set_connector_dpms(s, 
output->config.connector, DRM_MODE_DPMS_OFF); enough?
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to