Op 03-10-17 om 14:05 schreef Mika Kahola: > On Fri, 2017-09-29 at 11:59 +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. >> >> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx> >> --- >> lib/igt_kms.c | 293 +++++++++++++++++---------- >> ------------ >> lib/igt_kms.h | 59 ++++---- >> tests/kms_atomic_interruptible.c | 12 +- >> tests/kms_plane_lowres.c | 2 +- >> tests/kms_rotation_crc.c | 4 +- >> 5 files changed, 160 insertions(+), 210 deletions(-) >> >> diff --git a/lib/igt_kms.c b/lib/igt_kms.c >> index 07d2074c2b1a..6e0052ebe7a7 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,19 @@ 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 on first >> commit. */ >> + igt_plane_set_prop_changed(plane, >> IGT_PLANE_FB_ID); >> + igt_plane_set_prop_changed(plane, >> IGT_PLANE_CRTC_ID); >> } >> >> /* >> @@ -1805,9 +1806,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 +2068,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 +2077,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 +2085,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; >> >> - 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 +2135,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 +2167,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 +2199,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 +2224,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 +2276,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 +2294,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 +2562,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 +2876,31 @@ 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_position(plane, 0, 0); >> + 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_position(plane, 0, 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 +2913,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 +2936,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 +2958,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 +2981,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 +3005,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 +3034,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 2d19fe967809..5570854390ea 100644 >> --- a/tests/kms_atomic_interruptible.c >> +++ b/tests/kms_atomic_interruptible.c >> @@ -161,12 +161,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_plane_lowres.c b/tests/kms_plane_lowres.c >> index b16c8cd433b2..613f68899601 100644 >> --- a/tests/kms_plane_lowres.c >> +++ b/tests/kms_plane_lowres.c >> @@ -227,8 +227,8 @@ test_setup(data_t *data, enum pipe pipe, uint64_t >> modifier, int flags, >> 1.0, 1.0, 0.0, >> &data->fb[i]); >> >> - igt_plane_set_position(data->plane[i], x, y); >> igt_plane_set_fb(data->plane[i], &data->fb[i]); >> + igt_plane_set_position(data->plane[i], x, y); > This part could be split into a separate patch as it fixes an error. > BTW why do we need to igt_plane_set_fb() before > igt_plane_set_position() It wasn't an error before, igt_plane_set_fb cleared everything to defaults except position, but with this patch I felt it should clear position too because why keep it special? Hmm though it seems multiple tests assume that position is untouched by igt_plane_set_fb, I think it might be better to revert this hunk. Perhaps clean it up later.. I'll just drop this part for now. Reality is clashing with ideals again. :( >> } >> >> return mode; >> diff --git a/tests/kms_rotation_crc.c b/tests/kms_rotation_crc.c >> index 4d2ef1c184f0..4932a0d44410 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); _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx