diff options
-rw-r--r-- | lib/igt_fb.c | 169 | ||||
-rw-r--r-- | lib/igt_fb.h | 5 | ||||
-rw-r--r-- | tools/intel_dp_compliance.c | 5 | ||||
-rw-r--r-- | tools/msm_dp_compliance.c | 48 |
4 files changed, 212 insertions, 15 deletions
diff --git a/lib/igt_fb.c b/lib/igt_fb.c index 1530b960..a5566f49 100644 --- a/lib/igt_fb.c +++ b/lib/igt_fb.c @@ -1461,7 +1461,172 @@ void igt_paint_color(cairo_t *cr, int x, int y, int w, int h, } /** - * igt_fill_cts_framebuffer: + * + * igt_fill_cts_color_square_framebuffer: + * @pixmap: handle to mapped buffer + * @video_width: required width for pattern + * @video_height: required height for pattern + * @bitdepth: required bitdepth fot pattern + * @alpha: required alpha for the pattern + * + * This function draws a color square pattern for given width and height + * as per the specifications mentioned in section 3.2.5.3 of DP CTS spec. + */ +int igt_fill_cts_color_square_framebuffer(uint32_t *pixmap, + uint32_t video_width, uint32_t video_height, + uint32_t bitdepth, int alpha) +{ + uint32_t pmax = 0; + uint32_t pmin = 0; + int tile_width = 64; + int tile_height = 64; + int reverse = 0; + int i; + uint32_t colors[8][3]; + uint32_t reverse_colors[8][3]; + + switch (bitdepth) { + case 8: + pmax = 235; + pmin = 16; + break; + case 10: + pmax = 940; + pmin = 64; + break; + } + + /* + * According to the requirement stated in the 3.2.5.3 DP CTS spec + * the required pattern for color square should look like below + * + * white | yellow | cyan | green | magenta | red | blue | black | white | ... | .. + * ------------------------------------------------------------------------------- + * blue | red | magenta | green | cyan | yellow | white | black | blue | ... | .. + * ------------------------------------------------------------------------------- + * white | yellow | cyan | green | magenta | red | blue | black | white | ... | .. + * ------------------------------------------------------------------------------- + * blue | red | magenta | green | cyan | yellow | white | black | blue | ... | .. + * -------------------------------------------------------------------------------- + * . | . | . | . | . | . | . | . | . | . + * + * . | . | . | . | . | . | . | . | . | . + * + * + */ + + for (i = 0; i < 8; i++) { + if ((i % 8) == 0) { + /* White Color */ + colors[i][0] = pmax; + colors[i][1] = pmax; + colors[i][2] = pmax; + /* Blue Color */ + reverse_colors[i][0] = pmin; + reverse_colors[i][1] = pmin; + reverse_colors[i][2] = pmax; + } else if ((i % 8) == 1) { + /* Yellow Color */ + colors[i][0] = pmax; + colors[i][1] = pmax; + colors[i][2] = pmin; + /* Red Color */ + reverse_colors[i][0] = pmax; + reverse_colors[i][1] = pmin; + reverse_colors[i][2] = pmin; + } else if ((i % 8) == 2) { + /* Cyan Color */ + colors[i][0] = pmin; + colors[i][1] = pmax; + colors[i][2] = pmax; + /* Magenta Color */ + reverse_colors[i][0] = pmax; + reverse_colors[i][1] = pmin; + reverse_colors[i][2] = pmax; + } else if ((i % 8) == 3) { + /* Green Color */ + colors[i][0] = pmin; + colors[i][1] = pmax; + colors[i][2] = pmin; + /* Green Color */ + reverse_colors[i][0] = pmin; + reverse_colors[i][1] = pmax; + reverse_colors[i][2] = pmin; + } else if ((i % 8) == 4) { + /* Magenta Color */ + colors[i][0] = pmax; + colors[i][1] = pmin; + colors[i][2] = pmax; + /* Cyan Color */ + reverse_colors[i][0] = pmin; + reverse_colors[i][1] = pmax; + reverse_colors[i][2] = pmax; + } else if ((i % 8) == 5) { + /* Red Color */ + colors[i][0] = pmax; + colors[i][1] = pmin; + colors[i][2] = pmin; + /* Yellow Color */ + reverse_colors[i][0] = pmax; + reverse_colors[i][1] = pmax; + reverse_colors[i][2] = pmin; + } else if ((i % 8) == 6) { + /* Blue Color */ + colors[i][0] = pmin; + colors[i][1] = pmin; + colors[i][2] = pmax; + /* White Color */ + reverse_colors[i][0] = pmax; + reverse_colors[i][1] = pmax; + reverse_colors[i][2] = pmax; + } else if ((i % 8) == 7) { + /* Black Color */ + colors[i][0] = pmin; + colors[i][1] = pmin; + colors[i][2] = pmin; + /* Black Color */ + reverse_colors[i][0] = pmin; + reverse_colors[i][1] = pmin; + reverse_colors[i][2] = pmin; + } + } + + for (uint32_t height = 0; height < video_height; height++) { + uint32_t color = 0; + uint8_t *temp = (uint8_t *)pixmap; + uint8_t **buf = &temp; + uint32_t (*clr_arr)[3]; + + temp += (4 * video_width * height); + + for (uint32_t width = 0; width < video_width; width++) { + + if (reverse == 0) + clr_arr = colors; + else + clr_arr = reverse_colors; + + /* using BGRA8888 format */ + *(*buf)++ = (((uint8_t)clr_arr[color][2]) & 0xFF); + *(*buf)++ = (((uint8_t)clr_arr[color][1]) & 0xFF); + *(*buf)++ = (((uint8_t)clr_arr[color][0]) & 0xFF); + *(*buf)++ = ((uint8_t)alpha & 0xFF); + + if (((width + 1) % tile_width) == 0) + color = (color + 1) % 8; + + } + if (((height + 1) % tile_height) == 0) { + if (reverse == 0) + reverse = 1; + else + reverse = 0; + } + } + return 0; +} +/** + * igt_fill_cts_color_ramp_framebuffer: * @pixmap: handle to the mapped buffer * @video_width: required width for the CTS pattern * @video_height: required height for the CTS pattern @@ -1469,7 +1634,7 @@ void igt_paint_color(cairo_t *cr, int x, int y, int w, int h, * @alpha: required alpha for the CTS pattern * This functions draws the CTS test pattern for a given width, height. */ -int igt_fill_cts_framebuffer(uint32_t *pixmap, uint32_t video_width, +int igt_fill_cts_color_ramp_framebuffer(uint32_t *pixmap, uint32_t video_width, uint32_t video_height, uint32_t bitdepth, int alpha) { uint32_t tile_height, tile_width; diff --git a/lib/igt_fb.h b/lib/igt_fb.h index c61d9e72..623a8caa 100644 --- a/lib/igt_fb.h +++ b/lib/igt_fb.h @@ -216,8 +216,11 @@ bool igt_format_is_fp16(uint32_t drm_format); int igt_format_plane_bpp(uint32_t drm_format, int plane); void igt_format_array_fill(uint32_t **formats_array, unsigned int *count, bool allow_yuv); -int igt_fill_cts_framebuffer(uint32_t *pixmap, uint32_t video_width, +int igt_fill_cts_color_ramp_framebuffer(uint32_t *pixmap, uint32_t video_width, uint32_t video_height, uint32_t bitdepth, int alpha); +int igt_fill_cts_color_square_framebuffer(uint32_t *pixmap, + uint32_t video_width, uint32_t video_height, + uint32_t bitdepth, int alpha); int igt_fb_get_fnv1a_crc(struct igt_fb *fb, igt_crc_t *crc); const char *igt_fb_modifier_name(uint64_t modifier); diff --git a/tools/intel_dp_compliance.c b/tools/intel_dp_compliance.c index 39218c3b..2e20d7f0 100644 --- a/tools/intel_dp_compliance.c +++ b/tools/intel_dp_compliance.c @@ -452,6 +452,7 @@ static int set_test_mode(struct connector *dp_conn) bool found_std = false, found_fs = false; uint32_t alpha; drmModeConnector *c = dp_conn->connector; + uint32_t *pixmap; /* Ignore any disconnected devices */ if (c->connection != DRM_MODE_CONNECTED) { @@ -532,7 +533,9 @@ static int set_test_mode(struct connector *dp_conn) return ret; } - ret = igt_fill_cts_framebuffer(dp_conn->test_pattern.pixmap, + pixmap = dp_conn->test_pattern.pixmap; + + ret = igt_fill_cts_color_ramp_framebuffer(pixmap, dp_conn->test_pattern.hdisplay, dp_conn->test_pattern.vdisplay, dp_conn->test_pattern.bitdepth, diff --git a/tools/msm_dp_compliance.c b/tools/msm_dp_compliance.c index 5e491c89..6941d385 100644 --- a/tools/msm_dp_compliance.c +++ b/tools/msm_dp_compliance.c @@ -143,6 +143,10 @@ /* DRM definitions - must be kept in sync with the DRM header */ #define DP_TEST_LINK_VIDEO_PATTERN (1 << 1) + +/* DP CTS PATTERN TYPE */ +#define PATTERN_COLOR_RAMP 1 +#define PATTERN_COLOR_SQUARE 3 /* Global file pointers for the sysfs files */ FILE *test_active_fp, *test_data_fp, *test_type_fp; @@ -153,6 +157,7 @@ uint16_t hdisplay; uint16_t vdisplay; uint8_t bitdepth; +uint16_t pattern; drmModeRes *resources; int drm_fd, modes, gen; uint64_t modifier = DRM_FORMAT_MOD_LINEAR; @@ -172,6 +177,7 @@ struct test_video_pattern { uint16_t hdisplay; uint16_t vdisplay; uint8_t bitdepth; + uint16_t pattern; uint32_t fb; uint32_t size; struct igt_fb fb_pattern; @@ -244,15 +250,15 @@ static unsigned long get_test_type(void) static void get_test_videopattern_data(void) { int count = 0; - uint16_t video_pattern_value[3]; - char video_pattern_attribute[15]; + uint16_t video_pattern_value[5]; + char video_pattern_attribute[20]; int ret; if (!test_data_fp) fprintf(stderr, "Invalid test_data file\n"); rewind(test_data_fp); - while (!feof(test_data_fp) && count < 3) { + while (!feof(test_data_fp) && count < 4) { ret = fscanf(test_data_fp, "%s %u\n", video_pattern_attribute, (unsigned int *)&video_pattern_value[count++]); if (ret < 2) { @@ -264,10 +270,11 @@ static void get_test_videopattern_data(void) hdisplay = video_pattern_value[0]; vdisplay = video_pattern_value[1]; bitdepth = video_pattern_value[2]; + pattern = video_pattern_value[3]; igt_info("Hdisplay = %d\n", hdisplay); igt_info("Vdisplay = %d\n", vdisplay); igt_info("BitDepth = %u\n", bitdepth); - + igt_info("pattern = %d\n", pattern); } static int process_test_request(int test_type) @@ -325,6 +332,7 @@ static int setup_video_pattern_framebuffer(struct connector *dp_conn) dp_conn->test_pattern.size = dp_conn->test_pattern.fb_pattern.size; memset(dp_conn->test_pattern.pixmap, 0, dp_conn->test_pattern.size); + igt_info("size: %d\n", dp_conn->test_pattern.size); return 0; } @@ -334,6 +342,7 @@ static int set_test_mode(struct connector *dp_conn) int ret = 0; int i; drmModeConnector *c = dp_conn->connector; + uint32_t *pixmap; /* Ignore any disconnected devices */ if (c->connection != DRM_MODE_CONNECTED) { @@ -374,6 +383,8 @@ static int set_test_mode(struct connector *dp_conn) dp_conn->test_pattern.hdisplay = hdisplay; dp_conn->test_pattern.vdisplay = vdisplay; dp_conn->test_pattern.bitdepth = bitdepth; + dp_conn->test_pattern.pattern = pattern; + igt_info("Pattern :%d\n", dp_conn->test_pattern.pattern); ret = setup_video_pattern_framebuffer(dp_conn); if (ret) { @@ -382,15 +393,30 @@ static int set_test_mode(struct connector *dp_conn) return ret; } - ret = igt_fill_cts_framebuffer(dp_conn->test_pattern.pixmap, + pixmap = dp_conn->test_pattern.pixmap; + + if (dp_conn->test_pattern.pattern == PATTERN_COLOR_RAMP) { + ret = igt_fill_cts_color_ramp_framebuffer(pixmap, dp_conn->test_pattern.hdisplay, dp_conn->test_pattern.vdisplay, - dp_conn->test_pattern.bitdepth, - 0); - if (ret) { - igt_warn("Filling framebuffer for connector %u failed (%d)\n", - c->connector_id, ret); - return ret; + dp_conn->test_pattern.bitdepth, 0); + if (ret) { + igt_warn("Filling framebuffer for connector %u failed (%d)\n", + c->connector_id, ret); + return ret; + } + } + + if (dp_conn->test_pattern.pattern == PATTERN_COLOR_SQUARE) { + ret = igt_fill_cts_color_square_framebuffer(pixmap, + dp_conn->test_pattern.hdisplay, + dp_conn->test_pattern.vdisplay, + dp_conn->test_pattern.bitdepth, 0); + if (ret) { + igt_warn("Filling framebuffer for connector %u failed (%d)\n", + c->connector_id, ret); + return ret; + } } /* unmapping the buffer previously mapped during setup */ munmap(dp_conn->test_pattern.pixmap, |