[igt-dev] [PATCH i-g-t 2/6] tests/kms_color: Wrap LUTs in a gamma_lut_t struct
Ville Syrjala
ville.syrjala at linux.intel.com
Tue Apr 2 16:33:44 UTC 2019
From: Ville Syrjälä <ville.syrjala at linux.intel.com>
To make life easier let's wrap the LUTs in a small struct.
Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
---
tests/kms_color.c | 119 +++++++++++++++++++++++++---------------------
1 file changed, 66 insertions(+), 53 deletions(-)
diff --git a/tests/kms_color.c b/tests/kms_color.c
index 1e5a5d329bea..43e59dd42b0b 100644
--- a/tests/kms_color.c
+++ b/tests/kms_color.c
@@ -47,6 +47,10 @@ typedef struct {
uint64_t gamma_lut_size;
} data_t;
+typedef struct {
+ int size;
+ double coeffs[];
+} gamma_lut_t;
static void paint_gradient_rectangles(data_t *data,
drmModeModeInfo *mode,
@@ -106,55 +110,68 @@ static void paint_rectangles(data_t *data,
igt_put_cairo_ctx(data->drm_fd, fb, cr);
}
-static double *generate_table(uint32_t lut_size, double exp)
+static gamma_lut_t *alloc_lut(int lut_size)
{
- double *coeffs;
- uint32_t i;
+ gamma_lut_t *gamma;
igt_assert_lt(0, lut_size);
- coeffs = malloc(sizeof(double) * lut_size);
+ gamma = malloc(sizeof(*gamma) + lut_size * sizeof(gamma->coeffs[0]));
+ gamma->size = lut_size;
- for (i = 0; i < lut_size; i++)
- coeffs[i] = powf((double) i * 1.0 / (double) (lut_size - 1), exp);
+ return gamma;
+}
+
+static void free_lut(gamma_lut_t *gamma)
+{
+ if (!gamma)
+ return;
- return coeffs;
+ free(gamma);
}
-static double *generate_table_max(uint32_t lut_size)
+static gamma_lut_t *generate_table(int lut_size, double exp)
{
- double *coeffs;
- uint32_t i;
+ gamma_lut_t *gamma = alloc_lut(lut_size);
+ int i;
- igt_assert_lt(0, lut_size);
+ gamma->coeffs[0] = 0.0;
+ for (i = 1; i < lut_size; i++)
+ gamma->coeffs[i] = pow(i * 1.0 / (lut_size - 1), exp);
+
+ return gamma;
+}
- coeffs = malloc(sizeof(double) * lut_size);
- coeffs[0] = 0.0;
+static gamma_lut_t *generate_table_max(int lut_size)
+{
+ gamma_lut_t *gamma = alloc_lut(lut_size);
+ int i;
+
+ gamma->coeffs[0] = 0.0;
for (i = 1; i < lut_size; i++)
- coeffs[i] = 1.0;
+ gamma->coeffs[i] = 1.0;
- return coeffs;
+ return gamma;
}
-static double *generate_table_zero(uint32_t lut_size)
+static gamma_lut_t *generate_table_zero(int lut_size)
{
- double *coeffs = malloc(sizeof(double) * lut_size);
- uint32_t i;
+ gamma_lut_t *gamma = alloc_lut(lut_size);
+ int i;
for (i = 0; i < lut_size; i++)
- coeffs[i] = 0.0;
+ gamma->coeffs[i] = 0.0;
- return coeffs;
+ return gamma;
}
static struct drm_color_lut *coeffs_to_lut(data_t *data,
- const double *coefficients,
- uint32_t lut_size,
+ const gamma_lut_t *gamma,
uint32_t color_depth,
int off)
{
struct drm_color_lut *lut;
- uint32_t i;
+ int i, lut_size = gamma->size;
uint32_t max_value = (1 << 16) - 1;
uint32_t mask;
@@ -168,7 +185,7 @@ static struct drm_color_lut *coeffs_to_lut(data_t *data,
if (IS_CHERRYVIEW(data->devid))
lut_size -= 1;
for (i = 0; i < lut_size; i++) {
- uint32_t v = (coefficients[i] * max_value);
+ uint32_t v = (gamma->coeffs[i] * max_value);
/*
* Hardware might encode colors on a different number of bits
@@ -193,13 +210,11 @@ static struct drm_color_lut *coeffs_to_lut(data_t *data,
static void set_degamma(data_t *data,
igt_pipe_t *pipe,
- const double *coefficients)
+ const gamma_lut_t *gamma)
{
- size_t size = sizeof(struct drm_color_lut) * data->degamma_lut_size;
- struct drm_color_lut *lut = coeffs_to_lut(data,
- coefficients,
- data->degamma_lut_size,
- data->color_depth, 0);
+ size_t size = sizeof(struct drm_color_lut) * gamma->size;
+ struct drm_color_lut *lut = coeffs_to_lut(data, gamma,
+ data->color_depth, 0);
igt_pipe_obj_replace_prop_blob(pipe, IGT_CRTC_DEGAMMA_LUT, lut, size);
@@ -208,15 +223,13 @@ static void set_degamma(data_t *data,
static void set_gamma(data_t *data,
igt_pipe_t *pipe,
- const double *coefficients)
+ const gamma_lut_t *gamma)
{
- size_t size = sizeof(struct drm_color_lut) * data->gamma_lut_size;
- struct drm_color_lut *lut = coeffs_to_lut(data,
- coefficients,
- data->gamma_lut_size,
- data->color_depth, 0);
+ size_t size = sizeof(struct drm_color_lut) * gamma->size;
+ struct drm_color_lut *lut = coeffs_to_lut(data, gamma,
+ data->color_depth, 0);
- igt_pipe_obj_replace_prop_blob(pipe, IGT_CRTC_GAMMA_LUT, lut, size);
+ igt_pipe_obj_replace_prop_blob(pipe, IGT_CRTC_GAMMA_LUT, lut, size);
free(lut);
}
@@ -252,8 +265,8 @@ static void test_pipe_degamma(data_t *data,
igt_plane_t *primary)
{
igt_output_t *output;
- double *degamma_linear, *degamma_full;
- double *gamma_linear;
+ gamma_lut_t *degamma_linear, *degamma_full;
+ gamma_lut_t *gamma_linear;
color_t red_green_blue[] = {
{ 1.0, 0.0, 0.0 },
{ 0.0, 1.0, 0.0 },
@@ -323,9 +336,9 @@ static void test_pipe_degamma(data_t *data,
igt_output_set_pipe(output, PIPE_NONE);
}
- free(degamma_linear);
- free(degamma_full);
- free(gamma_linear);
+ free_lut(degamma_linear);
+ free_lut(degamma_full);
+ free_lut(gamma_linear);
}
/*
@@ -336,7 +349,7 @@ static void test_pipe_gamma(data_t *data,
igt_plane_t *primary)
{
igt_output_t *output;
- double *gamma_full;
+ gamma_lut_t *gamma_full;
color_t red_green_blue[] = {
{ 1.0, 0.0, 0.0 },
{ 0.0, 1.0, 0.0 },
@@ -402,7 +415,7 @@ static void test_pipe_gamma(data_t *data,
igt_output_set_pipe(output, PIPE_NONE);
}
- free(gamma_full);
+ free_lut(gamma_full);
}
/*
@@ -533,7 +546,7 @@ static void test_pipe_legacy_gamma_reset(data_t *data,
0.0, 0.0, 1.0
};
drmModeCrtc *kms_crtc;
- double *degamma_linear, *gamma_zero;
+ gamma_lut_t *degamma_linear, *gamma_zero;
uint32_t i, legacy_lut_size;
uint16_t *red_lut, *green_lut, *blue_lut;
struct drm_color_lut *lut;
@@ -622,8 +635,8 @@ static void test_pipe_legacy_gamma_reset(data_t *data,
igt_output_set_pipe(output, PIPE_NONE);
}
- free(degamma_linear);
- free(gamma_zero);
+ free_lut(degamma_linear);
+ free_lut(gamma_zero);
}
static bool crc_equal(igt_crc_t *a, igt_crc_t *b)
@@ -646,7 +659,7 @@ static bool test_pipe_ctm(data_t *data,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0
};
- double *degamma_linear, *gamma_linear;
+ gamma_lut_t *degamma_linear, *gamma_linear;
igt_output_t *output;
bool ret = true;
@@ -709,8 +722,8 @@ static bool test_pipe_ctm(data_t *data,
igt_output_set_pipe(output, PIPE_NONE);
}
- free(degamma_linear);
- free(gamma_linear);
+ free_lut(degamma_linear);
+ free_lut(gamma_linear);
return ret;
}
@@ -745,7 +758,7 @@ static void test_pipe_limited_range_ctm(data_t *data,
double ctm[] = { 1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0 };
- double *degamma_linear, *gamma_linear;
+ gamma_lut_t *degamma_linear, *gamma_linear;
igt_output_t *output;
bool has_broadcast_rgb_output = false;
@@ -814,8 +827,8 @@ static void test_pipe_limited_range_ctm(data_t *data,
igt_assert_crc_equal(&crc_full, &crc_limited);
}
- free(gamma_linear);
- free(degamma_linear);
+ free_lut(gamma_linear);
+ free_lut(degamma_linear);
igt_require(has_broadcast_rgb_output);
}
--
2.19.2
More information about the igt-dev
mailing list