mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 03:53:37 +02:00
drm/amd/display: encapsulate atomic regamma operation
We will wire up MPC 3D LUT to DM CRTC color pipeline in the next patch, but so far, only for atomic interface. By checking set_output_transfer_func in DC drivers with MPC 3D LUT support, we can verify that regamma is only programmed when 3D LUT programming fails. As a groundwork to introduce 3D LUT programming and better understand each step, detach atomic regamma programming from the crtc colocr updating code. 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
98fbb52772
commit
8b6b3f668f
|
|
@ -525,6 +525,37 @@ static int __set_output_tf(struct dc_transfer_func *func,
|
|||
return res ? 0 : -ENOMEM;
|
||||
}
|
||||
|
||||
static int amdgpu_dm_set_atomic_regamma(struct dc_stream_state *stream,
|
||||
const struct drm_color_lut *regamma_lut,
|
||||
uint32_t regamma_size, bool has_rom)
|
||||
{
|
||||
struct dc_transfer_func *out_tf = stream->out_transfer_func;
|
||||
int ret = 0;
|
||||
|
||||
if (regamma_size) {
|
||||
/*
|
||||
* CRTC RGM goes into RGM LUT.
|
||||
*
|
||||
* Note: there is no implicit sRGB regamma here. We are using
|
||||
* degamma calculation from color module to calculate the curve
|
||||
* from a linear base.
|
||||
*/
|
||||
out_tf->type = TF_TYPE_DISTRIBUTED_POINTS;
|
||||
out_tf->tf = TRANSFER_FUNCTION_LINEAR;
|
||||
|
||||
ret = __set_output_tf(out_tf, regamma_lut, regamma_size, has_rom);
|
||||
} else {
|
||||
/*
|
||||
* No CRTC RGM means we can just put the block into bypass
|
||||
* since we don't have any plane level adjustments using it.
|
||||
*/
|
||||
out_tf->type = TF_TYPE_BYPASS;
|
||||
out_tf->tf = TRANSFER_FUNCTION_LINEAR;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* __set_input_tf - calculates the input transfer function based on expected
|
||||
* input space.
|
||||
|
|
@ -672,28 +703,12 @@ int amdgpu_dm_update_crtc_color_mgmt(struct dm_crtc_state *crtc)
|
|||
regamma_size, has_rom);
|
||||
if (r)
|
||||
return r;
|
||||
} else if (has_regamma) {
|
||||
/*
|
||||
* CRTC RGM goes into RGM LUT.
|
||||
*
|
||||
* Note: there is no implicit sRGB regamma here. We are using
|
||||
* degamma calculation from color module to calculate the curve
|
||||
* from a linear base.
|
||||
*/
|
||||
stream->out_transfer_func->type = TF_TYPE_DISTRIBUTED_POINTS;
|
||||
stream->out_transfer_func->tf = TRANSFER_FUNCTION_LINEAR;
|
||||
|
||||
r = __set_output_tf(stream->out_transfer_func, regamma_lut,
|
||||
regamma_size, has_rom);
|
||||
} else {
|
||||
regamma_size = has_regamma ? regamma_size : 0;
|
||||
r = amdgpu_dm_set_atomic_regamma(stream, regamma_lut,
|
||||
regamma_size, has_rom);
|
||||
if (r)
|
||||
return r;
|
||||
} else {
|
||||
/*
|
||||
* No CRTC RGM means we can just put the block into bypass
|
||||
* since we don't have any plane level adjustments using it.
|
||||
*/
|
||||
stream->out_transfer_func->type = TF_TYPE_BYPASS;
|
||||
stream->out_transfer_func->tf = TRANSFER_FUNCTION_LINEAR;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user