On Thu, 2017-10-12 at 13:54 +0200, Maarten Lankhorst wrote:
> In the future I want to allow tests to commit more properties,
> but for this to work I have to fix all properties to work better
> with atomic commit. Instead of special casing each
> property make a bitmask for all property changed flags, and try to
> commit all properties.
> 
> Changes since v1:
> - Remove special dumping of src and crtc coordinates.
> - Dump all modified coordinates.
> Changes since v2:
> - Move igt_plane_set_prop_changed up slightly.
> Changes since v3:
> - Fix wrong ordering of set_position in kms_plane_lowres causing a
> test failure.
> Changes since v4:
> - Back out resetting crtc position in igt_plane_set_fb() and
>   document it during init. Tests appear to rely on it being
> preserved.
> 
> Signed-off-by: Maarten Lankhorst <maarten.lankho...@linux.intel.com>
> ---
>  lib/igt_kms.c                    | 299 +++++++++++++++++----------
> ------------
>  lib/igt_kms.h                    |  59 ++++----
>  tests/kms_atomic_interruptible.c |  12 +-
>  tests/kms_rotation_crc.c         |   4 +-
>  4 files changed, 165 insertions(+), 209 deletions(-)
> 
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index e6fa8f4af455..e77ae5d696da 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -192,11 +192,11 @@ const char
> *igt_connector_prop_names[IGT_NUM_CONNECTOR_PROPS] = {
>  
>  /*
>   * Retrieve all the properies specified in props_name and store them
> into
> - * plane->atomic_props_plane.
> + * plane->props.
>   */
>  static void
> -igt_atomic_fill_plane_props(igt_display_t *display, igt_plane_t
> *plane,
> -                     int num_props, const char **prop_names)
> +igt_fill_plane_props(igt_display_t *display, igt_plane_t *plane,
> +                  int num_props, const char **prop_names)
>  {
>       drmModeObjectPropertiesPtr props;
>       int i, j, fd;
> @@ -214,7 +214,7 @@ igt_atomic_fill_plane_props(igt_display_t
> *display, igt_plane_t *plane,
>                       if (strcmp(prop->name, prop_names[j]) != 0)
>                               continue;
>  
> -                     plane->atomic_props_plane[j] = props-
> >props[i];
> +                     plane->props[j] = props->props[i];
>                       break;
>               }
>  
> @@ -1659,7 +1659,6 @@ void igt_display_init(igt_display_t *display,
> int drm_fd)
>       drmModeRes *resources;
>       drmModePlaneRes *plane_resources;
>       int i;
> -     int is_atomic = 0;
>  
>       memset(display, 0, sizeof(igt_display_t));
>  
> @@ -1679,7 +1678,9 @@ void igt_display_init(igt_display_t *display,
> int drm_fd)
>       igt_assert_f(display->pipes, "Failed to allocate memory for
> %d pipes\n", display->n_pipes);
>  
>       drmSetClientCap(drm_fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
> -     is_atomic = drmSetClientCap(drm_fd, DRM_CLIENT_CAP_ATOMIC,
> 1);
> +     if (drmSetClientCap(drm_fd, DRM_CLIENT_CAP_ATOMIC, 1) == 0)
> +             display->is_atomic = 1;
> +
>       plane_resources = drmModeGetPlaneResources(display->drm_fd);
>       igt_assert(plane_resources);
>  
> @@ -1776,19 +1777,27 @@ void igt_display_init(igt_display_t *display,
> int drm_fd)
>                       plane->type = type;
>                       plane->pipe = pipe;
>                       plane->drm_plane = drm_plane;
> -                     plane->fence_fd = -1;
> +                     plane->values[IGT_PLANE_IN_FENCE_FD] =
> ~0ULL;
>  
> -                     if (is_atomic == 0) {
> -                             display->is_atomic = 1;
> -                             igt_atomic_fill_plane_props(display,
> plane, IGT_NUM_PLANE_PROPS, igt_plane_prop_names);
> -                     }
> +                     igt_fill_plane_props(display, plane,
> IGT_NUM_PLANE_PROPS, igt_plane_prop_names);
>  
>                       get_plane_property(display->drm_fd,
> drm_plane->plane_id,
>                                          "rotation",
> -                                        &plane-
> >rotation_property,
> -                                        &prop_value,
> +                                        &plane-
> >props[IGT_PLANE_ROTATION],
> +                                        &plane-
> >values[IGT_PLANE_ROTATION],
>                                          NULL);
> -                     plane->rotation =
> (igt_rotation_t)prop_value;
> +
> +                     /* Clear any residual framebuffer info on
> first commit. */
> +                     igt_plane_set_prop_changed(plane,
> IGT_PLANE_FB_ID);
> +                     igt_plane_set_prop_changed(plane,
> IGT_PLANE_CRTC_ID);
> +
> +                     /*
> +                      * CRTC_X/Y are not changed in
> igt_plane_set_fb, so
> +                      * force them to be sanitized in case they
> contain
> +                      * garbage.
> +                      */
> +                     igt_plane_set_prop_changed(plane,
> IGT_PLANE_CRTC_X);
> +                     igt_plane_set_prop_changed(plane,
> IGT_PLANE_CRTC_Y);
>               }
>  
>               /*
> @@ -1805,9 +1814,6 @@ void igt_display_init(igt_display_t *display,
> int drm_fd)
>  
>               pipe->n_planes = n_planes;
>  
> -             for_each_plane_on_pipe(display, i, plane)
> -                     plane->fb_changed = true;
> -
>               pipe->mode_changed = true;
>       }
>  
> @@ -2070,18 +2076,7 @@ bool igt_pipe_get_property(igt_pipe_t *pipe,
> const char *name,
>  
>  static uint32_t igt_plane_get_fb_id(igt_plane_t *plane)
>  {
> -     if (plane->fb)
> -             return plane->fb->fb_id;
> -     else
> -             return 0;
> -}
> -
> -static uint32_t igt_plane_get_fb_gem_handle(igt_plane_t *plane)
> -{
> -     if (plane->fb)
> -             return plane->fb->gem_handle;
> -     else
> -             return 0;
> +     return plane->values[IGT_PLANE_FB_ID];
>  }
>  
>  #define CHECK_RETURN(r, fail) {      \
> @@ -2090,9 +2085,6 @@ static uint32_t
> igt_plane_get_fb_gem_handle(igt_plane_t *plane)
>       igt_assert_eq(r, 0);    \
>  }
>  
> -
> -
> -
>  /*
>   * Add position and fb changes of a plane to the atomic property set
>   */
> @@ -2101,63 +2093,31 @@ igt_atomic_prepare_plane_commit(igt_plane_t
> *plane, igt_pipe_t *pipe,
>       drmModeAtomicReq *req)
>  {
>       igt_display_t *display = pipe->display;
> -     uint32_t fb_id, crtc_id;
> +     int i;
>  
>       igt_assert(plane->drm_plane);
>  
> -     /* it's an error to try an unsupported feature */
> -     igt_assert(igt_plane_supports_rotation(plane) ||
> -                     !plane->rotation_changed);
> -
> -     fb_id = igt_plane_get_fb_id(plane);
> -     crtc_id = pipe->crtc_id;
> -
>       LOG(display,
>           "populating plane data: %s.%d, fb %u\n",
>           kmstest_pipe_name(pipe->pipe),
>           plane->index,
> -         fb_id);
> -
> -     if (plane->fence_fd >= 0) {
> -             uint64_t fence_fd = (int64_t) plane->fence_fd;
> -             igt_atomic_populate_plane_req(req, plane,
> IGT_PLANE_IN_FENCE_FD, fence_fd);
> -     }
> +         igt_plane_get_fb_id(plane));
>  
> -     if (plane->fb_changed) {
> -             igt_atomic_populate_plane_req(req, plane,
> IGT_PLANE_CRTC_ID, fb_id ? crtc_id : 0);
> -             igt_atomic_populate_plane_req(req, plane,
> IGT_PLANE_FB_ID, fb_id);
> -     }
> -
> -     if (plane->position_changed || plane->size_changed) {
> -             uint32_t src_x = IGT_FIXED(plane->src_x, 0); /*
> src_x */
> -             uint32_t src_y = IGT_FIXED(plane->src_y, 0); /*
> src_y */
> -             uint32_t src_w = IGT_FIXED(plane->src_w, 0); /*
> src_w */
> -             uint32_t src_h = IGT_FIXED(plane->src_h, 0); /*
> src_h */
> -             int32_t crtc_x = plane->crtc_x;
> -             int32_t crtc_y = plane->crtc_y;
> -             uint32_t crtc_w = plane->crtc_w;
> -             uint32_t crtc_h = plane->crtc_h;
> +     for (i = 0; i < IGT_NUM_PLANE_PROPS; i++) {
> +             if (!igt_plane_is_prop_changed(plane, i))
> +                     continue;
Could we add a macro here too? Like 'for_each_prop_on_plane()' or
similar?

>  
> -             LOG(display,
> -             "src = (%d, %d) %u x %u "
> -             "dst = (%d, %d) %u x %u\n",
> -             src_x >> 16, src_y >> 16, src_w >> 16, src_h >> 16,
> -             crtc_x, crtc_y, crtc_w, crtc_h);
> +             /* it's an error to try an unsupported feature */
> +             igt_assert(plane->props[i]);
>  
> -             igt_atomic_populate_plane_req(req, plane,
> IGT_PLANE_SRC_X, src_x);
> -             igt_atomic_populate_plane_req(req, plane,
> IGT_PLANE_SRC_Y, src_y);
> -             igt_atomic_populate_plane_req(req, plane,
> IGT_PLANE_SRC_W, src_w);
> -             igt_atomic_populate_plane_req(req, plane,
> IGT_PLANE_SRC_H, src_h);
> +             igt_debug("plane %s.%d: Setting property \"%s\" to
> 0x%"PRIx64"/%"PRIi64"\n",
> +                     kmstest_pipe_name(pipe->pipe), plane->index, 
> igt_plane_prop_names[i],
> +                     plane->values[i], plane->values[i]);
>  
> -             igt_atomic_populate_plane_req(req, plane,
> IGT_PLANE_CRTC_X, crtc_x);
> -             igt_atomic_populate_plane_req(req, plane,
> IGT_PLANE_CRTC_Y, crtc_y);
> -             igt_atomic_populate_plane_req(req, plane,
> IGT_PLANE_CRTC_W, crtc_w);
> -             igt_atomic_populate_plane_req(req, plane,
> IGT_PLANE_CRTC_H, crtc_h);
> +             igt_assert_lt(0, drmModeAtomicAddProperty(req,
> plane->drm_plane->plane_id,
> +                                               plane->props[i],
> +                                               plane-
> >values[i]));
>       }
> -
> -     if (plane->rotation_changed)
> -             igt_atomic_populate_plane_req(req, plane,
> -                     IGT_PLANE_ROTATION, plane->rotation);
>  }
>  
>  
> @@ -2183,17 +2143,20 @@ static int igt_drm_plane_commit(igt_plane_t
> *plane,
>       int32_t crtc_y;
>       uint32_t crtc_w;
>       uint32_t crtc_h;
> +     bool setplane =
> +             igt_plane_is_prop_changed(plane, IGT_PLANE_FB_ID) ||
> +             plane->changed & IGT_PLANE_COORD_CHANGED_MASK;
>  
>       igt_assert(plane->drm_plane);
>  
>       /* it's an error to try an unsupported feature */
>       igt_assert(igt_plane_supports_rotation(plane) ||
> -                !plane->rotation_changed);
> +                !igt_plane_is_prop_changed(plane,
> IGT_PLANE_ROTATION));
>  
>       fb_id = igt_plane_get_fb_id(plane);
>       crtc_id = pipe->crtc_id;
>  
> -     if ((plane->fb_changed || plane->size_changed) && fb_id ==
> 0) {
> +     if (setplane && fb_id == 0) {
>               LOG(display,
>                   "SetPlane pipe %s, plane %d, disabling\n",
>                   kmstest_pipe_name(pipe->pipe),
> @@ -2212,16 +2175,15 @@ static int igt_drm_plane_commit(igt_plane_t
> *plane,
>                                     IGT_FIXED(0,0) /* src_h */);
>  
>               CHECK_RETURN(ret, fail_on_error);
> -     } else if (plane->fb_changed || plane->position_changed ||
> -             plane->size_changed) {
> -             src_x = IGT_FIXED(plane->src_x,0); /* src_x */
> -             src_y = IGT_FIXED(plane->src_y,0); /* src_y */
> -             src_w = IGT_FIXED(plane->src_w,0); /* src_w */
> -             src_h = IGT_FIXED(plane->src_h,0); /* src_h */
> -             crtc_x = plane->crtc_x;
> -             crtc_y = plane->crtc_y;
> -             crtc_w = plane->crtc_w;
> -             crtc_h = plane->crtc_h;
> +     } else if (setplane) {
> +             src_x = plane->values[IGT_PLANE_SRC_X];
> +             src_y = plane->values[IGT_PLANE_SRC_Y];
> +             src_w = plane->values[IGT_PLANE_SRC_W];
> +             src_h = plane->values[IGT_PLANE_SRC_H];
> +             crtc_x = plane->values[IGT_PLANE_CRTC_X];
> +             crtc_y = plane->values[IGT_PLANE_CRTC_Y];
> +             crtc_w = plane->values[IGT_PLANE_CRTC_W];
> +             crtc_h = plane->values[IGT_PLANE_CRTC_H];
>  
>               LOG(display,
>                   "SetPlane %s.%d, fb %u, src = (%d, %d) "
> @@ -2245,9 +2207,10 @@ static int igt_drm_plane_commit(igt_plane_t
> *plane,
>               CHECK_RETURN(ret, fail_on_error);
>       }
>  
> -     if (plane->rotation_changed) {
> -             ret = igt_plane_set_property(plane, plane-
> >rotation_property,
> -                                    plane->rotation);
> +     if (igt_plane_is_prop_changed(plane, IGT_PLANE_ROTATION)) {
> +             ret = igt_plane_set_property(plane,
> +                                          plane-
> >props[IGT_PLANE_ROTATION],
> +                                          plane-
> >values[IGT_PLANE_ROTATION]);
>  
>               CHECK_RETURN(ret, fail_on_error);
>       }
> @@ -2269,35 +2232,30 @@ static int
> igt_cursor_commit_legacy(igt_plane_t *cursor,
>       uint32_t crtc_id = pipe->crtc_id;
>       int ret;
>  
> -     if (cursor->fb_changed) {
> -             uint32_t gem_handle =
> igt_plane_get_fb_gem_handle(cursor);
> -
> -             if (gem_handle) {
> +     if (igt_plane_is_prop_changed(cursor, IGT_PLANE_FB_ID)) {
> +             if (cursor->gem_handle)
>                       LOG(display,
>                           "SetCursor pipe %s, fb %u %dx%d\n",
>                           kmstest_pipe_name(pipe->pipe),
> -                         gem_handle,
> -                         cursor->crtc_w, cursor->crtc_h);
> -
> -                     ret = drmModeSetCursor(display->drm_fd,
> crtc_id,
> -                                            gem_handle,
> -                                            cursor->crtc_w,
> -                                            cursor->crtc_h);
> -             } else {
> +                         cursor->gem_handle,
> +                         (unsigned)cursor-
> >values[IGT_PLANE_CRTC_W],
> +                         (unsigned)cursor-
> >values[IGT_PLANE_CRTC_H]);
> +             else
>                       LOG(display,
>                           "SetCursor pipe %s, disabling\n",
>                           kmstest_pipe_name(pipe->pipe));
>  
> -                     ret = drmModeSetCursor(display->drm_fd,
> crtc_id,
> -                                            0, 0, 0);
> -             }
> -
> +             ret = drmModeSetCursor(display->drm_fd, crtc_id,
> +                                    cursor->gem_handle,
> +                                    cursor-
> >values[IGT_PLANE_CRTC_W],
> +                                    cursor-
> >values[IGT_PLANE_CRTC_H]);
>               CHECK_RETURN(ret, fail_on_error);
>       }
>  
> -     if (cursor->position_changed) {
> -             int x = cursor->crtc_x;
> -             int y = cursor->crtc_y;
> +     if (igt_plane_is_prop_changed(cursor, IGT_PLANE_CRTC_X) ||
> +         igt_plane_is_prop_changed(cursor, IGT_PLANE_CRTC_Y)) {
> +             int x = cursor->values[IGT_PLANE_CRTC_X];
> +             int y = cursor->values[IGT_PLANE_CRTC_Y];
>  
>               LOG(display,
>                   "MoveCursor pipe %s, (%d, %d)\n",
> @@ -2326,13 +2284,14 @@ static int
> igt_primary_plane_commit_legacy(igt_plane_t *primary,
>       int ret;
>  
>       /* Primary planes can't be windowed when using a legacy
> commit */
> -     igt_assert((primary->crtc_x == 0 && primary->crtc_y == 0));
> +     igt_assert((primary->values[IGT_PLANE_CRTC_X] == 0 &&
> primary->values[IGT_PLANE_CRTC_Y] == 0));
>  
>       /* nor rotated */
> -     igt_assert(!primary->rotation_changed);
> +     igt_assert(!igt_plane_is_prop_changed(primary,
> IGT_PLANE_ROTATION));
>  
> -     if (!primary->fb_changed && !primary->position_changed &&
> -         !primary->size_changed && !primary->pipe->mode_changed)
> +     if (!igt_plane_is_prop_changed(primary, IGT_PLANE_FB_ID) &&
> +         !(primary->changed & IGT_PLANE_COORD_CHANGED_MASK) &&
> +         !primary->pipe->mode_changed)
>               return 0;
>  
>       crtc_id = pipe->crtc_id;
> @@ -2343,19 +2302,22 @@ static int
> igt_primary_plane_commit_legacy(igt_plane_t *primary,
>               mode = NULL;
>  
>       if (fb_id) {
> +             uint32_t src_x = primary->values[IGT_PLANE_SRC_X] >>
> 16;
> +             uint32_t src_y = primary->values[IGT_PLANE_SRC_Y] >>
> 16;
> +
>               LOG(display,
>                   "%s: SetCrtc pipe %s, fb %u, src (%d, %d), "
>                   "mode %dx%d\n",
>                   igt_output_name(output),
>                   kmstest_pipe_name(pipe->pipe),
>                   fb_id,
> -                 primary->src_x, primary->src_y,
> +                 src_x, src_y,
>                   mode->hdisplay, mode->vdisplay);
>  
>               ret = drmModeSetCrtc(display->drm_fd,
>                                    crtc_id,
>                                    fb_id,
> -                                  primary->src_x, primary->src_y,
> +                                  src_x, src_y,
>                                    &output->id,
>                                    1,
>                                    mode);
> @@ -2608,18 +2570,27 @@ display_commit_changed(igt_display_t
> *display, enum igt_commit_style s)
>               }
>  
>               for_each_plane_on_pipe(display, pipe, plane) {
> -                     plane->fb_changed = false;
> -                     plane->position_changed = false;
> -                     plane->size_changed = false;
> +                     if (s == COMMIT_ATOMIC) {
> +                             int fd;
> +                             plane->changed = 0;
>  
> -                     if (s != COMMIT_LEGACY ||
> -                         !(plane->type == DRM_PLANE_TYPE_PRIMARY
> ||
> -                           plane->type == DRM_PLANE_TYPE_CURSOR))
> -                             plane->rotation_changed = false;
> +                             fd = plane-
> >values[IGT_PLANE_IN_FENCE_FD];
> +                             if (fd != -1)
> +                                     close(fd);
>  
> -                     if (s == COMMIT_ATOMIC)
>                               /* reset fence_fd to prevent it from
> being set for the next commit */
> -                             igt_plane_set_fence_fd(plane, -1);
> +                             plane->values[IGT_PLANE_IN_FENCE_FD] 
> = -1;
> +                     } else {
> +                             plane->changed &=
> ~IGT_PLANE_COORD_CHANGED_MASK;
> +
> +                             igt_plane_clear_prop_changed(plane,
> IGT_PLANE_CRTC_ID);
> +                             igt_plane_clear_prop_changed(plane,
> IGT_PLANE_FB_ID);
> +
> +                             if (s != COMMIT_LEGACY ||
> +                                 !(plane->type ==
> DRM_PLANE_TYPE_PRIMARY ||
> +                                   plane->type ==
> DRM_PLANE_TYPE_CURSOR))
> +                                     igt_plane_clear_prop_changed
> (plane, IGT_PLANE_ROTATION);
> +                     }
>               }
>       }
>  
> @@ -2913,30 +2884,29 @@ void igt_plane_set_fb(igt_plane_t *plane,
> struct igt_fb *fb)
>       LOG(display, "%s.%d: plane_set_fb(%d)\n",
> kmstest_pipe_name(pipe->pipe),
>           plane->index, fb ? fb->fb_id : 0);
>  
> -     plane->fb = fb;
> +     igt_plane_set_prop_value(plane, IGT_PLANE_CRTC_ID, fb ?
> pipe->crtc_id : 0);
> +     igt_plane_set_prop_value(plane, IGT_PLANE_FB_ID, fb ? fb-
> >fb_id : 0);
> +
> +     if (plane->type == DRM_PLANE_TYPE_CURSOR && fb)
> +             plane->gem_handle = fb->gem_handle;
> +     else
> +             plane->gem_handle = 0;
> +
>       /* hack to keep tests working that don't call
> igt_plane_set_size() */
>       if (fb) {
>               /* set default plane size as fb size */
> -             plane->crtc_w = fb->width;
> -             plane->crtc_h = fb->height;
> +             igt_plane_set_size(plane, fb->width, fb->height);
>  
>               /* set default src pos/size as fb size */
> -             plane->src_x = 0;
> -             plane->src_y = 0;
> -             plane->src_w = fb->width;
> -             plane->src_h = fb->height;
> +             igt_fb_set_position(fb, plane, 0, 0);
> +             igt_fb_set_size(fb, plane, fb->width, fb->height);
>       } else {
> -             plane->src_x = 0;
> -             plane->src_y = 0;
> -             plane->src_w = 0;
> -             plane->src_h = 0;
> +             igt_plane_set_size(plane, 0, 0);
>  
> -             plane->crtc_w = 0;
> -             plane->crtc_h = 0;
> +             /* set default src pos/size as fb size */
> +             igt_fb_set_position(fb, plane, 0, 0);
> +             igt_fb_set_size(fb, plane, 0, 0);
>       }
> -
> -     plane->fb_changed = true;
> -     plane->size_changed = true;
>  }
>  
>  /**
> @@ -2949,12 +2919,19 @@ void igt_plane_set_fb(igt_plane_t *plane,
> struct igt_fb *fb)
>   */
>  void igt_plane_set_fence_fd(igt_plane_t *plane, int fence_fd)
>  {
> -     close(plane->fence_fd);
> +     int64_t fd;
>  
> -     if (fcntl(fence_fd, F_GETFD) != -1)
> -             plane->fence_fd = dup(fence_fd);
> -     else
> -             plane->fence_fd = -1;
> +     fd = plane->values[IGT_PLANE_IN_FENCE_FD];
> +     if (fd != -1)
> +             close(fd);
> +
> +     if (fence_fd != -1) {
> +             fd = dup(fence_fd);
> +             igt_fail_on(fd == -1);
> +     } else
> +             fd = -1;
> +
> +     igt_plane_set_prop_value(plane, IGT_PLANE_IN_FENCE_FD, fd);
>  }
>  
>  void igt_plane_set_position(igt_plane_t *plane, int x, int y)
> @@ -2965,10 +2942,8 @@ void igt_plane_set_position(igt_plane_t
> *plane, int x, int y)
>       LOG(display, "%s.%d: plane_set_position(%d,%d)\n",
>           kmstest_pipe_name(pipe->pipe), plane->index, x, y);
>  
> -     plane->crtc_x = x;
> -     plane->crtc_y = y;
> -
> -     plane->position_changed = true;
> +     igt_plane_set_prop_value(plane, IGT_PLANE_CRTC_X, x);
> +     igt_plane_set_prop_value(plane, IGT_PLANE_CRTC_Y, y);
>  }
>  
>  /**
> @@ -2989,10 +2964,8 @@ void igt_plane_set_size(igt_plane_t *plane,
> int w, int h)
>       LOG(display, "%s.%d: plane_set_size (%dx%d)\n",
>           kmstest_pipe_name(pipe->pipe), plane->index, w, h);
>  
> -     plane->crtc_w = w;
> -     plane->crtc_h = h;
> -
> -     plane->size_changed = true;
> +     igt_plane_set_prop_value(plane, IGT_PLANE_CRTC_W, w);
> +     igt_plane_set_prop_value(plane, IGT_PLANE_CRTC_H, h);
>  }
>  
>  /**
> @@ -3014,10 +2987,8 @@ void igt_fb_set_position(struct igt_fb *fb,
> igt_plane_t *plane,
>       LOG(display, "%s.%d: fb_set_position(%d,%d)\n",
>           kmstest_pipe_name(pipe->pipe), plane->index, x, y);
>  
> -     plane->src_x = x;
> -     plane->src_y = y;
> -
> -     plane->fb_changed = true;
> +     igt_plane_set_prop_value(plane, IGT_PLANE_SRC_X,
> IGT_FIXED(x, 0));
> +     igt_plane_set_prop_value(plane, IGT_PLANE_SRC_Y,
> IGT_FIXED(y, 0));
>  }
>  
>  /**
> @@ -3040,10 +3011,8 @@ void igt_fb_set_size(struct igt_fb *fb,
> igt_plane_t *plane,
>       LOG(display, "%s.%d: fb_set_size(%dx%d)\n",
>           kmstest_pipe_name(pipe->pipe), plane->index, w, h);
>  
> -     plane->src_w = w;
> -     plane->src_h = h;
> -
> -     plane->fb_changed = true;
> +     igt_plane_set_prop_value(plane, IGT_PLANE_SRC_W,
> IGT_FIXED(w, 0));
> +     igt_plane_set_prop_value(plane, IGT_PLANE_SRC_H,
> IGT_FIXED(h, 0));
>  }
>  
>  static const char *rotation_name(igt_rotation_t rotation)
> @@ -3071,9 +3040,7 @@ void igt_plane_set_rotation(igt_plane_t *plane,
> igt_rotation_t rotation)
>           kmstest_pipe_name(pipe->pipe),
>           plane->index, rotation_name(rotation));
>  
> -     plane->rotation = rotation;
> -
> -     plane->rotation_changed = true;
> +     igt_plane_set_prop_value(plane, IGT_PLANE_ROTATION,
> rotation);
>  }
>  
>  /**
> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
> index 1ef10e7d525c..f87f8be31421 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -252,6 +252,9 @@ enum igt_atomic_plane_properties {
>         IGT_PLANE_CRTC_W,
>         IGT_PLANE_CRTC_H,
>  
> +/* Append new properties after IGT_PLANE_COORD_CHANGED_MASK */
> +#define IGT_PLANE_COORD_CHANGED_MASK 0xff
> +
>         IGT_PLANE_FB_ID,
>         IGT_PLANE_CRTC_ID,
>         IGT_PLANE_IN_FENCE_FD,
> @@ -286,37 +289,19 @@ typedef struct {
>       int index;
>       /* capabilities */
>       int type;
> -     /* state tracking */
> -     unsigned int fb_changed       : 1;
> -     unsigned int position_changed : 1;
> -     unsigned int rotation_changed : 1;
> -     unsigned int size_changed     : 1;
> +
>       /*
>        * drm_plane can be NULL for primary and cursor planes (when
> not
>        * using the atomic modeset API)
>        */
>       drmModePlane *drm_plane;
> -     struct igt_fb *fb;
> -
> -     uint32_t rotation_property;
> -
> -     /* position within pipe_src_w x pipe_src_h */
> -     int crtc_x, crtc_y;
> -     /* size within pipe_src_w x pipe_src_h */
> -     int crtc_w, crtc_h;
>  
> -     /* position within the framebuffer */
> -     uint32_t src_x;
> -     uint32_t src_y;
> -     /* size within the framebuffer*/
> -     uint32_t src_w;
> -     uint32_t src_h;
> +     /* gem handle for fb */
> +     uint32_t gem_handle;
>  
> -     igt_rotation_t rotation;
> -
> -     /* in fence fd */
> -     int fence_fd;
> -     uint32_t atomic_props_plane[IGT_NUM_PLANE_PROPS];
> +     uint64_t changed;
> +     uint32_t props[IGT_NUM_PLANE_PROPS];
> +     uint64_t values[IGT_NUM_PLANE_PROPS];
>  } igt_plane_t;
>  
>  struct igt_pipe {
> @@ -407,7 +392,7 @@ bool igt_pipe_get_property(igt_pipe_t *pipe,
> const char *name,
>  
>  static inline bool igt_plane_supports_rotation(igt_plane_t *plane)
>  {
> -     return plane->rotation_property != 0;
> +     return plane->props[IGT_PLANE_ROTATION] != 0;
>  }
>  void igt_pipe_request_out_fence(igt_pipe_t *pipe);
>  void igt_pipe_set_degamma_lut(igt_pipe_t *pipe, void *ptr, size_t
> length);
> @@ -527,16 +512,20 @@ static inline bool
> igt_output_is_connected(igt_output_t *output)
>  
>  #define IGT_FIXED(i,f)       ((i) << 16 | (f))
>  
> -/**
> - * igt_atomic_populate_plane_req:
> - * @req: A pointer to drmModeAtomicReq
> - * @plane: A pointer igt_plane_t
> - * @prop: one of igt_atomic_plane_properties
> - * @value: the value to add
> - */
> -#define igt_atomic_populate_plane_req(req, plane, prop, value) \
> -     igt_assert_lt(0, drmModeAtomicAddProperty(req, plane-
> >drm_plane->plane_id,\
> -                                               plane-
> >atomic_props_plane[prop], value))
> +#define igt_plane_is_prop_changed(plane, prop) \
> +     (!!((plane)->changed & (1 << (prop))))
> +
> +#define igt_plane_set_prop_changed(plane, prop) \
> +     (plane)->changed |= 1 << (prop)
> +
> +#define igt_plane_clear_prop_changed(plane, prop) \
> +     (plane)->changed &= ~(1 << (prop))
> +
> +#define igt_plane_set_prop_value(plane, prop, value) \
> +     do { \
> +             plane->values[prop] = value; \
> +             igt_plane_set_prop_changed(plane, prop); \
> +     } while (0)
>  
>  /**
>   * igt_atomic_populate_crtc_req:
> diff --git a/tests/kms_atomic_interruptible.c
> b/tests/kms_atomic_interruptible.c
> index dcdbc267d3ef..4a2a577412cc 100644
> --- a/tests/kms_atomic_interruptible.c
> +++ b/tests/kms_atomic_interruptible.c
> @@ -163,12 +163,12 @@ static void run_plane_test(igt_display_t
> *display, enum pipe pipe, igt_output_t
>                                       /* connector: 1 prop */
>                                       output-
> >props[IGT_CONNECTOR_CRTC_ID],
>                                       /* plane: remainder props */
> -                                     plane-
> >atomic_props_plane[IGT_PLANE_CRTC_ID],
> -                                     plane-
> >atomic_props_plane[IGT_PLANE_FB_ID],
> -                                     plane-
> >atomic_props_plane[IGT_PLANE_SRC_W],
> -                                     plane-
> >atomic_props_plane[IGT_PLANE_SRC_H],
> -                                     plane-
> >atomic_props_plane[IGT_PLANE_CRTC_W],
> -                                     plane-
> >atomic_props_plane[IGT_PLANE_CRTC_H]
> +                                     plane-
> >props[IGT_PLANE_CRTC_ID],
> +                                     plane-
> >props[IGT_PLANE_FB_ID],
> +                                     plane-
> >props[IGT_PLANE_SRC_W],
> +                                     plane-
> >props[IGT_PLANE_SRC_H],
> +                                     plane-
> >props[IGT_PLANE_CRTC_W],
> +                                     plane-
> >props[IGT_PLANE_CRTC_H]
>                               };
>                               uint64_t prop_vals[] = {
>                                       /* crtc */
> diff --git a/tests/kms_rotation_crc.c b/tests/kms_rotation_crc.c
> index 5aec8fa39671..b8327dfa0d83 100644
> --- a/tests/kms_rotation_crc.c
> +++ b/tests/kms_rotation_crc.c
> @@ -122,11 +122,11 @@ static void prepare_crtc(data_t *data,
> igt_output_t *output, enum pipe pipe,
>       igt_plane_set_fb(primary, &data->fb_modeset);
>  
>       if (commit < COMMIT_ATOMIC) {
> -             primary->rotation_changed = false;
> +             igt_plane_clear_prop_changed(primary,
> IGT_PLANE_ROTATION);
>               igt_display_commit(display);
>  
>               if (plane->type == DRM_PLANE_TYPE_PRIMARY)
> -                     primary->rotation_changed = true;
> +                     igt_plane_set_prop_changed(primary,
> IGT_PLANE_ROTATION);
>       }
>  
>       igt_plane_set_fb(plane, NULL);
-- 
Mika Kahola - Intel OTC

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to