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.lankhorst@xxxxxxxxxxxxxxx> > --- > 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@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx