diff options
author | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2016-06-30 10:24:28 +0200 |
---|---|---|
committer | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2016-07-26 14:50:21 +0200 |
commit | 9f45ea116539f6c1ad8cd11cd627f091d63baa4b (patch) | |
tree | 169ffe20c06958443cc46d534380c592fd00701e /lib/igt_kms.c | |
parent | 5a63668766ac7645f6f019deb1e9fc7f2d8f2fa5 (diff) |
igt_kms: Handle atomic pipe properties better.
Move properties to the pipe, they don't belong in the output
and make atomic commit use the pipes for crtc properties.
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Ander Conselvan de Oliveira <conselvan2@gmail.com>
Diffstat (limited to 'lib/igt_kms.c')
-rw-r--r-- | lib/igt_kms.c | 98 |
1 files changed, 48 insertions, 50 deletions
diff --git a/lib/igt_kms.c b/lib/igt_kms.c index 4397efbd..2880c487 100644 --- a/lib/igt_kms.c +++ b/lib/igt_kms.c @@ -213,8 +213,7 @@ igt_atomic_fill_plane_props(igt_display_t *display, igt_plane_t *plane, * config->atomic_props_crtc and config->atomic_props_connector. */ static void -igt_atomic_fill_props(igt_display_t *display, igt_output_t *output, - int num_crtc_props, const char **crtc_prop_names, +igt_atomic_fill_connector_props(igt_display_t *display, igt_output_t *output, int num_connector_props, const char **conn_prop_names) { drmModeObjectPropertiesPtr props; @@ -222,18 +221,18 @@ igt_atomic_fill_props(igt_display_t *display, igt_output_t *output, fd = display->drm_fd; - props = drmModeObjectGetProperties(fd, output->config.crtc->crtc_id, DRM_MODE_OBJECT_CRTC); + props = drmModeObjectGetProperties(fd, output->config.connector->connector_id, DRM_MODE_OBJECT_CONNECTOR); igt_assert(props); for (i = 0; i < props->count_props; i++) { drmModePropertyPtr prop = drmModeGetProperty(fd, props->props[i]); - for (j = 0; j < num_crtc_props; j++) { - if (strcmp(prop->name, crtc_prop_names[j]) != 0) + for (j = 0; j < num_connector_props; j++) { + if (strcmp(prop->name, conn_prop_names[j]) != 0) continue; - output->config.atomic_props_crtc[j] = props->props[i]; + output->config.atomic_props_connector[j] = props->props[i]; break; } @@ -241,19 +240,29 @@ igt_atomic_fill_props(igt_display_t *display, igt_output_t *output, } drmModeFreeObjectProperties(props); - props = NULL; - props = drmModeObjectGetProperties(fd, output->config.connector->connector_id, DRM_MODE_OBJECT_CONNECTOR); +} + +static void +igt_atomic_fill_pipe_props(igt_display_t *display, igt_pipe_t *pipe, + int num_crtc_props, const char **crtc_prop_names) +{ + drmModeObjectPropertiesPtr props; + int i, j, fd; + + fd = display->drm_fd; + + props = drmModeObjectGetProperties(fd, pipe->crtc_id, DRM_MODE_OBJECT_CRTC); igt_assert(props); for (i = 0; i < props->count_props; i++) { drmModePropertyPtr prop = drmModeGetProperty(fd, props->props[i]); - for (j = 0; j < num_connector_props; j++) { - if (strcmp(prop->name, conn_prop_names[j]) != 0) + for (j = 0; j < num_crtc_props; j++) { + if (strcmp(prop->name, crtc_prop_names[j]) != 0) continue; - output->config.atomic_props_connector[j] = props->props[i]; + pipe->atomic_props_crtc[j] = props->props[i]; break; } @@ -261,7 +270,6 @@ igt_atomic_fill_props(igt_display_t *display, igt_output_t *output, } drmModeFreeObjectProperties(props); - } const unsigned char* igt_kms_get_alt_edid(void) @@ -1222,6 +1230,9 @@ static void igt_output_refresh(igt_output_t *output) -1); } + igt_atomic_fill_connector_props(display, output, + IGT_NUM_CONNECTOR_PROPS, igt_connector_prop_names); + if (!output->valid) return; @@ -1232,8 +1243,6 @@ static void igt_output_refresh(igt_output_t *output) kmstest_pipe_name(output->config.pipe)); display->pipes_in_use |= 1 << output->config.pipe; - igt_atomic_fill_props(display, output, IGT_NUM_CRTC_PROPS, igt_crtc_prop_names, - IGT_NUM_CONNECTOR_PROPS, igt_connector_prop_names); } static bool @@ -1359,6 +1368,8 @@ void igt_display_init(igt_display_t *display, int drm_fd) NULL, NULL); + igt_atomic_fill_pipe_props(display, pipe, IGT_NUM_CRTC_PROPS, igt_crtc_prop_names); + /* add the planes that can be used with that pipe */ for (j = 0; j < plane_resources->count_planes; j++) { drmModePlane *drm_plane; @@ -1660,11 +1671,10 @@ static uint32_t igt_plane_get_fb_gem_handle(igt_plane_t *plane) * Add position and fb changes of a plane to the atomic property set */ static void -igt_atomic_prepare_plane_commit(igt_plane_t *plane, igt_output_t *output, +igt_atomic_prepare_plane_commit(igt_plane_t *plane, igt_pipe_t *pipe, drmModeAtomicReq *req) { - - igt_display_t *display = output->display; + igt_display_t *display = pipe->display; uint32_t fb_id, crtc_id; igt_assert(plane->drm_plane); @@ -1674,12 +1684,11 @@ igt_atomic_prepare_plane_commit(igt_plane_t *plane, igt_output_t *output, !plane->rotation_changed); fb_id = igt_plane_get_fb_id(plane); - crtc_id = output->config.crtc->crtc_id; + crtc_id = pipe->crtc_id; LOG(display, - "%s: populating plane data: %s.%d, fb %u\n", - igt_output_name(output), - kmstest_pipe_name(output->config.pipe), + "populating plane data: %s.%d, fb %u\n", + kmstest_pipe_name(pipe->pipe), plane->index, fb_id); @@ -2040,21 +2049,15 @@ static int igt_pipe_commit(igt_pipe_t *pipe, /* * Add crtc property changes to the atomic property set */ -static void igt_atomic_prepare_crtc_commit(igt_output_t *output, drmModeAtomicReq *req) +static void igt_atomic_prepare_crtc_commit(igt_pipe_t *pipe_obj, drmModeAtomicReq *req) { - - igt_pipe_t *pipe_obj = igt_output_get_driving_pipe(output); - - if (!pipe_obj) - return; - if (pipe_obj->background_changed) - igt_atomic_populate_crtc_req(req, output, IGT_CRTC_BACKGROUND, pipe_obj->background); + igt_atomic_populate_crtc_req(req, pipe_obj, IGT_CRTC_BACKGROUND, pipe_obj->background); if (pipe_obj->color_mgmt_changed) { - igt_atomic_populate_crtc_req(req, output, IGT_CRTC_DEGAMMA_LUT, pipe_obj->degamma_blob); - igt_atomic_populate_crtc_req(req, output, IGT_CRTC_CTM, pipe_obj->ctm_blob); - igt_atomic_populate_crtc_req(req, output, IGT_CRTC_GAMMA_LUT, pipe_obj->gamma_blob); + igt_atomic_populate_crtc_req(req, pipe_obj, IGT_CRTC_DEGAMMA_LUT, pipe_obj->degamma_blob); + igt_atomic_populate_crtc_req(req, pipe_obj, IGT_CRTC_CTM, pipe_obj->ctm_blob); + igt_atomic_populate_crtc_req(req, pipe_obj, IGT_CRTC_GAMMA_LUT, pipe_obj->gamma_blob); } /* @@ -2088,42 +2091,37 @@ static void igt_atomic_prepare_connector_commit(igt_output_t *output, drmModeAto static int igt_atomic_commit(igt_display_t *display) { - int ret = 0; + int ret = 0, i; + enum pipe pipe; drmModeAtomicReq *req; igt_output_t *output; + if (display->is_atomic != 1) return -1; req = drmModeAtomicAlloc(); drmModeAtomicSetCursor(req, 0); - for_each_connected_output(display, output) { - igt_pipe_t *pipe_obj; + for_each_pipe(display, pipe) { + igt_pipe_t *pipe_obj = &display->pipes[pipe]; igt_plane_t *plane; - enum pipe pipe; /* * Add CRTC Properties to the property set */ - igt_atomic_prepare_crtc_commit(output, req); - - /* - * Add Connector Properties to the property set - */ - igt_atomic_prepare_connector_commit(output, req); - - - pipe_obj = igt_output_get_driving_pipe(output); - if (!pipe_obj) - continue; - - pipe = pipe_obj->pipe; + igt_atomic_prepare_crtc_commit(pipe_obj, req); for_each_plane_on_pipe(display, pipe, plane) { - igt_atomic_prepare_plane_commit(plane, output, req); + igt_atomic_prepare_plane_commit(plane, pipe_obj, req); } } + for (i = 0; i < display->n_outputs; i++) { + output = &display->outputs[i]; + + igt_atomic_prepare_connector_commit(output, req); + } + ret = drmModeAtomicCommit(display->drm_fd, req, 0, NULL); drmModeAtomicFree(req); return ret; |