kms_rotation_crc: Factor out common primary/sprite code in prepare_crtc()

This results in less code, always a good thing. Also, we only really
need one reference CRC.

Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
This commit is contained in:
Damien Lespiau 2014-07-08 12:59:03 +01:00
parent 92b29b18ca
commit 19743a1435

View File

@ -61,7 +61,7 @@ typedef struct {
int type; int type;
int pipe; int pipe;
struct igt_fb fb; struct igt_fb fb;
igt_crc_t ref_crc[2]; igt_crc_t ref_crc;
igt_pipe_crc_t *pipe_crc; igt_pipe_crc_t *pipe_crc;
int rotate; int rotate;
} data_t; } data_t;
@ -97,7 +97,7 @@ static bool prepare_crtc(data_t *data)
drmModeModeInfo *mode; drmModeModeInfo *mode;
igt_display_t *display = &data->display; igt_display_t *display = &data->display;
igt_output_t *output = data->output; igt_output_t *output = data->output;
igt_plane_t *primary, *sprite; igt_plane_t *plane;
int fb_id; int fb_id;
igt_output_set_pipe(output, data->pipe); igt_output_set_pipe(output, data->pipe);
@ -106,6 +106,19 @@ static bool prepare_crtc(data_t *data)
if (!data->output->valid) if (!data->output->valid)
return false; return false;
switch (data->type) {
case DRM_PLANE_TYPE_OVERLAY: /* Sprite */
igt_info("Sprite plane\n");
plane = igt_output_get_plane(output, IGT_PLANE_2);
break;
case DRM_PLANE_TYPE_PRIMARY: /* Primary */
igt_info("Primary plane\n");
plane = igt_output_get_plane(output, IGT_PLANE_PRIMARY);
break;
default:
return false;
}
/* create the pipe_crc object for this pipe */ /* create the pipe_crc object for this pipe */
if (data->pipe_crc) if (data->pipe_crc)
igt_pipe_crc_free(data->pipe_crc); igt_pipe_crc_free(data->pipe_crc);
@ -118,10 +131,6 @@ static bool prepare_crtc(data_t *data)
return false; return false;
} }
switch (data->type) {
case DRM_PLANE_TYPE_OVERLAY: /* Sprite */
igt_info("Sprite plane\n");
mode = igt_output_get_mode(output); mode = igt_output_get_mode(output);
fb_id = igt_create_fb(data->gfx_fd, fb_id = igt_create_fb(data->gfx_fd,
@ -133,51 +142,17 @@ static bool prepare_crtc(data_t *data)
paint_squares(data, &data->fb, mode, DRM_ROTATE_180); paint_squares(data, &data->fb, mode, DRM_ROTATE_180);
sprite = igt_output_get_plane(output, IGT_PLANE_2); igt_plane_set_fb(plane, &data->fb);
igt_plane_set_fb(sprite, &data->fb);
igt_display_commit(display); igt_display_commit(display);
/* Collect reference crc */ /* Collect reference crc */
igt_pipe_crc_collect_crc(data->pipe_crc, &data->ref_crc[1]); igt_pipe_crc_collect_crc(data->pipe_crc, &data->ref_crc);
paint_squares(data, &data->fb, mode, DRM_ROTATE_0); paint_squares(data, &data->fb, mode, DRM_ROTATE_0);
sprite = igt_output_get_plane(output, IGT_PLANE_2); igt_plane_set_fb(plane, &data->fb);
igt_plane_set_fb(sprite, &data->fb);
igt_display_commit(display); igt_display_commit(display);
break;
case DRM_PLANE_TYPE_PRIMARY: /* Primary */
igt_info("Primary plane\n");
mode = igt_output_get_mode(output);
fb_id = igt_create_fb(data->gfx_fd,
mode->hdisplay, mode->vdisplay,
DRM_FORMAT_XRGB8888,
false, /* tiled */
&data->fb);
igt_assert(fb_id);
paint_squares(data, &data->fb, mode, DRM_ROTATE_180);
primary = igt_output_get_plane(output, IGT_PLANE_PRIMARY);
igt_plane_set_fb(primary, &data->fb);
igt_display_commit(display);
/* Collect reference crc */
igt_pipe_crc_collect_crc(data->pipe_crc, &data->ref_crc[0]);
paint_squares(data, &data->fb, mode, DRM_ROTATE_0);
primary = igt_output_get_plane(output, IGT_PLANE_PRIMARY);
igt_plane_set_fb(primary, &data->fb);
igt_display_commit(display);
break;
}
return true; return true;
} }
@ -332,7 +307,7 @@ static void test_sprite_rotation(data_t *data)
return; return;
} }
} }
igt_assert(igt_crc_equal(&data->ref_crc[1], &crc_output)); igt_assert(igt_crc_equal(&data->ref_crc, &crc_output));
sleep(2); sleep(2);
valid_tests++; valid_tests++;
cleanup_crtc(data, output); cleanup_crtc(data, output);
@ -378,7 +353,7 @@ static void test_primary_rotation(data_t *data)
return; return;
} }
} }
igt_assert(igt_crc_equal(&data->ref_crc[0], &crc_output)); igt_assert(igt_crc_equal(&data->ref_crc, &crc_output));
sleep(2); sleep(2);
valid_tests++; valid_tests++;
cleanup_crtc(data, output); cleanup_crtc(data, output);