drm/amd/display: add plane shaper TF support
Enable usage of predefined transfer func in addition to shaper 1D LUT. That means we can save some complexity by just setting a predefined curve, instead of programming a custom curve when preparing color space for applying 3D LUT. Reviewed-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Melissa Wen <mwen@igalia.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
aba8b76baa
commit
99de686115
@ -624,20 +624,23 @@ amdgpu_tf_to_dc_tf(enum amdgpu_transfer_function tf)
|
||||
}
|
||||
|
||||
static int amdgpu_dm_atomic_shaper_lut(const struct drm_color_lut *shaper_lut,
|
||||
bool has_rom,
|
||||
enum dc_transfer_func_predefined tf,
|
||||
uint32_t shaper_size,
|
||||
struct dc_transfer_func *func_shaper)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (shaper_size) {
|
||||
if (shaper_size || tf != TRANSFER_FUNCTION_LINEAR) {
|
||||
/*
|
||||
* If user shaper LUT is set, we assume a linear color space
|
||||
* (linearized by degamma 1D LUT or not).
|
||||
*/
|
||||
func_shaper->type = TF_TYPE_DISTRIBUTED_POINTS;
|
||||
func_shaper->tf = TRANSFER_FUNCTION_LINEAR;
|
||||
func_shaper->tf = tf;
|
||||
func_shaper->sdr_ref_white_level = SDR_WHITE_LEVEL_INIT_VALUE;
|
||||
|
||||
ret = __set_output_tf(func_shaper, shaper_lut, shaper_size, false);
|
||||
ret = __set_output_tf(func_shaper, shaper_lut, shaper_size, has_rom);
|
||||
} else {
|
||||
func_shaper->type = TF_TYPE_BYPASS;
|
||||
func_shaper->tf = TRANSFER_FUNCTION_LINEAR;
|
||||
@ -972,6 +975,7 @@ amdgpu_dm_plane_set_color_properties(struct drm_plane_state *plane_state,
|
||||
struct dc_plane_state *dc_plane_state)
|
||||
{
|
||||
struct dm_plane_state *dm_plane_state = to_dm_plane_state(plane_state);
|
||||
enum amdgpu_transfer_function shaper_tf = AMDGPU_TRANSFER_FUNCTION_DEFAULT;
|
||||
const struct drm_color_lut *shaper_lut;
|
||||
uint32_t shaper_size;
|
||||
int ret;
|
||||
@ -980,8 +984,11 @@ amdgpu_dm_plane_set_color_properties(struct drm_plane_state *plane_state,
|
||||
|
||||
shaper_lut = __extract_blob_lut(dm_plane_state->shaper_lut, &shaper_size);
|
||||
shaper_size = shaper_lut != NULL ? shaper_size : 0;
|
||||
shaper_tf = dm_plane_state->shaper_tf;
|
||||
|
||||
ret = amdgpu_dm_atomic_shaper_lut(shaper_lut, shaper_size,
|
||||
ret = amdgpu_dm_atomic_shaper_lut(shaper_lut, false,
|
||||
amdgpu_tf_to_dc_tf(shaper_tf),
|
||||
shaper_size,
|
||||
dc_plane_state->in_shaper_func);
|
||||
if (ret)
|
||||
drm_dbg_kms(plane_state->plane->dev,
|
||||
|
Loading…
x
Reference in New Issue
Block a user