This includes logic to configure the LUT accordingly. Signed-off-by: Ilia Mirkin <imirkin@xxxxxxxxxxxx> --- tests/modetest/buffers.c | 2 ++ tests/modetest/modetest.c | 47 ++++++++++++++++++++++++++++++++++----- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/tests/modetest/buffers.c b/tests/modetest/buffers.c index 9b635c0c..5ec4ec8e 100644 --- a/tests/modetest/buffers.c +++ b/tests/modetest/buffers.c @@ -135,6 +135,7 @@ bo_create(int fd, unsigned int format, int ret; switch (format) { + case DRM_FORMAT_C8: case DRM_FORMAT_NV12: case DRM_FORMAT_NV21: case DRM_FORMAT_NV16: @@ -275,6 +276,7 @@ bo_create(int fd, unsigned int format, planes[2] = virtual + offsets[2]; break; + case DRM_FORMAT_C8: case DRM_FORMAT_ARGB4444: case DRM_FORMAT_XRGB4444: case DRM_FORMAT_ABGR4444: diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c index 71ddc861..7bb21d17 100644 --- a/tests/modetest/modetest.c +++ b/tests/modetest/modetest.c @@ -1089,6 +1089,42 @@ static bool add_property_optional(struct device *dev, uint32_t obj_id, return set_property(dev, &p); } +static void set_gamma(struct device *dev, unsigned crtc_id, unsigned fourcc) +{ + unsigned blob_id = 0; + /* TODO: support 1024-sized LUTs, when the use-case arises */ + struct drm_color_lut gamma_lut[256]; + int i, ret; + + if (fourcc == DRM_FORMAT_C8) { + /* TODO: Add C8 support for more patterns */ + util_smpte_c8_gamma(256, gamma_lut); + drmModeCreatePropertyBlob(dev->fd, gamma_lut, sizeof(gamma_lut), &blob_id); + } else { + for (i = 0; i < 256; i++) { + gamma_lut[i].red = + gamma_lut[i].green = + gamma_lut[i].blue = i << 8; + } + } + + add_property_optional(dev, crtc_id, "DEGAMMA_LUT", 0); + add_property_optional(dev, crtc_id, "CTM", 0); + if (!add_property_optional(dev, crtc_id, "GAMMA_LUT", blob_id)) { + uint16_t r[256], g[256], b[256]; + + for (i = 0; i < 256; i++) { + r[i] = gamma_lut[i].red; + g[i] = gamma_lut[i].green; + b[i] = gamma_lut[i].blue; + } + + ret = drmModeCrtcSetGamma(dev->fd, crtc_id, 256, r, g, b); + if (ret) + fprintf(stderr, "failed to set gamma: %s\n", strerror(errno)); + } +} + static int atomic_set_plane(struct device *dev, struct plane_arg *p, int pattern, bool update) { @@ -1270,6 +1306,8 @@ static void atomic_set_planes(struct device *dev, struct plane_arg *p, for (i = 0; i < count; i++) { if (i > 0) pattern = UTIL_PATTERN_TILES; + else + set_gamma(dev, p[i].crtc_id, p[i].fourcc); if (atomic_set_plane(dev, &p[i], pattern, update)) return; @@ -1454,6 +1492,8 @@ static void set_mode(struct device *dev, struct pipe_arg *pipes, unsigned int co fprintf(stderr, "failed to set mode: %s\n", strerror(errno)); return; } + + set_gamma(dev, pipe->crtc->crtc->crtc_id, pipe->fourcc); } } @@ -1728,11 +1768,8 @@ static int parse_plane(struct plane_arg *plane, const char *p) } if (*end == '@') { - p = end + 1; - if (strlen(p) != 4) - return -EINVAL; - - strcpy(plane->format_str, p); + strncpy(plane->format_str, end + 1, 4); + plane->format_str[4] = '\0'; } else { strcpy(plane->format_str, "XR24"); } -- 2.21.0 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel