Commit 285a7054 authored by Alvin Lee's avatar Alvin Lee Committed by Alex Deucher

drm/amd/display: Remove plane and stream pointers from dc scratch

[Why&How]
Remove several plane and stream pointers from dc for code
refactoring.
Reviewed-by: default avatarWenjing Liu <wenjing.liu@amd.com>
Acked-by: default avatarTom Chung <chiahsuan.chung@amd.com>
Signed-off-by: default avatarAlvin Lee <alvin.lee2@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent a9d51813
...@@ -5700,8 +5700,8 @@ static void fill_stream_properties_from_drm_display_mode( ...@@ -5700,8 +5700,8 @@ static void fill_stream_properties_from_drm_display_mode(
timing_out->aspect_ratio = get_aspect_ratio(mode_in); timing_out->aspect_ratio = get_aspect_ratio(mode_in);
stream->out_transfer_func->type = TF_TYPE_PREDEFINED; stream->out_transfer_func.type = TF_TYPE_PREDEFINED;
stream->out_transfer_func->tf = TRANSFER_FUNCTION_SRGB; stream->out_transfer_func.tf = TRANSFER_FUNCTION_SRGB;
if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A) { if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A) {
if (!adjust_colour_depth_from_display_info(timing_out, info) && if (!adjust_colour_depth_from_display_info(timing_out, info) &&
drm_mode_is_420_also(info, mode_in) && drm_mode_is_420_also(info, mode_in) &&
...@@ -6319,7 +6319,7 @@ create_stream_for_sink(struct drm_connector *connector, ...@@ -6319,7 +6319,7 @@ create_stream_for_sink(struct drm_connector *connector,
if (stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED) if (stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED)
stream->use_vsc_sdp_for_colorimetry = true; stream->use_vsc_sdp_for_colorimetry = true;
} }
if (stream->out_transfer_func->tf == TRANSFER_FUNCTION_GAMMA22) if (stream->out_transfer_func.tf == TRANSFER_FUNCTION_GAMMA22)
tf = TRANSFER_FUNC_GAMMA_22; tf = TRANSFER_FUNC_GAMMA_22;
mod_build_vsc_infopacket(stream, &stream->vsc_infopacket, stream->output_color_space, tf); mod_build_vsc_infopacket(stream, &stream->vsc_infopacket, stream->output_color_space, tf);
aconnector->psr_skip_count = AMDGPU_DM_PSR_ENTRY_DELAY; aconnector->psr_skip_count = AMDGPU_DM_PSR_ENTRY_DELAY;
...@@ -8392,13 +8392,13 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, ...@@ -8392,13 +8392,13 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
bundle->surface_updates[planes_count].surface = dc_plane; bundle->surface_updates[planes_count].surface = dc_plane;
if (new_pcrtc_state->color_mgmt_changed) { if (new_pcrtc_state->color_mgmt_changed) {
bundle->surface_updates[planes_count].gamma = dc_plane->gamma_correction; bundle->surface_updates[planes_count].gamma = &dc_plane->gamma_correction;
bundle->surface_updates[planes_count].in_transfer_func = dc_plane->in_transfer_func; bundle->surface_updates[planes_count].in_transfer_func = &dc_plane->in_transfer_func;
bundle->surface_updates[planes_count].gamut_remap_matrix = &dc_plane->gamut_remap_matrix; bundle->surface_updates[planes_count].gamut_remap_matrix = &dc_plane->gamut_remap_matrix;
bundle->surface_updates[planes_count].hdr_mult = dc_plane->hdr_mult; bundle->surface_updates[planes_count].hdr_mult = dc_plane->hdr_mult;
bundle->surface_updates[planes_count].func_shaper = dc_plane->in_shaper_func; bundle->surface_updates[planes_count].func_shaper = &dc_plane->in_shaper_func;
bundle->surface_updates[planes_count].lut3d_func = dc_plane->lut3d_func; bundle->surface_updates[planes_count].lut3d_func = &dc_plane->lut3d_func;
bundle->surface_updates[planes_count].blend_tf = dc_plane->blend_tf; bundle->surface_updates[planes_count].blend_tf = &dc_plane->blend_tf;
} }
amdgpu_dm_plane_fill_dc_scaling_info(dm->adev, new_plane_state, amdgpu_dm_plane_fill_dc_scaling_info(dm->adev, new_plane_state,
...@@ -8611,7 +8611,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, ...@@ -8611,7 +8611,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
bundle->stream_update.output_csc_transform = bundle->stream_update.output_csc_transform =
&acrtc_state->stream->csc_color_matrix; &acrtc_state->stream->csc_color_matrix;
bundle->stream_update.out_transfer_func = bundle->stream_update.out_transfer_func =
acrtc_state->stream->out_transfer_func; &acrtc_state->stream->out_transfer_func;
bundle->stream_update.lut3d_func = bundle->stream_update.lut3d_func =
(struct dc_3dlut *) acrtc_state->stream->lut3d_func; (struct dc_3dlut *) acrtc_state->stream->lut3d_func;
bundle->stream_update.func_shaper = bundle->stream_update.func_shaper =
......
...@@ -571,7 +571,7 @@ static int amdgpu_dm_set_atomic_regamma(struct dc_stream_state *stream, ...@@ -571,7 +571,7 @@ static int amdgpu_dm_set_atomic_regamma(struct dc_stream_state *stream,
uint32_t regamma_size, bool has_rom, uint32_t regamma_size, bool has_rom,
enum dc_transfer_func_predefined tf) enum dc_transfer_func_predefined tf)
{ {
struct dc_transfer_func *out_tf = stream->out_transfer_func; struct dc_transfer_func *out_tf = &stream->out_transfer_func;
int ret = 0; int ret = 0;
if (regamma_size || tf != TRANSFER_FUNCTION_LINEAR) { if (regamma_size || tf != TRANSFER_FUNCTION_LINEAR) {
...@@ -954,8 +954,8 @@ int amdgpu_dm_update_crtc_color_mgmt(struct dm_crtc_state *crtc) ...@@ -954,8 +954,8 @@ int amdgpu_dm_update_crtc_color_mgmt(struct dm_crtc_state *crtc)
* inverse color ramp in legacy userspace. * inverse color ramp in legacy userspace.
*/ */
crtc->cm_is_degamma_srgb = true; crtc->cm_is_degamma_srgb = true;
stream->out_transfer_func->type = TF_TYPE_DISTRIBUTED_POINTS; stream->out_transfer_func.type = TF_TYPE_DISTRIBUTED_POINTS;
stream->out_transfer_func->tf = TRANSFER_FUNCTION_SRGB; stream->out_transfer_func.tf = TRANSFER_FUNCTION_SRGB;
/* /*
* Note: although we pass has_rom as parameter here, we never * Note: although we pass has_rom as parameter here, we never
* actually use ROM because the color module only takes the ROM * actually use ROM because the color module only takes the ROM
...@@ -963,7 +963,7 @@ int amdgpu_dm_update_crtc_color_mgmt(struct dm_crtc_state *crtc) ...@@ -963,7 +963,7 @@ int amdgpu_dm_update_crtc_color_mgmt(struct dm_crtc_state *crtc)
* *
* See more in mod_color_calculate_regamma_params() * See more in mod_color_calculate_regamma_params()
*/ */
r = __set_legacy_tf(stream->out_transfer_func, regamma_lut, r = __set_legacy_tf(&stream->out_transfer_func, regamma_lut,
regamma_size, has_rom); regamma_size, has_rom);
if (r) if (r)
return r; return r;
...@@ -1034,7 +1034,7 @@ map_crtc_degamma_to_dc_plane(struct dm_crtc_state *crtc, ...@@ -1034,7 +1034,7 @@ map_crtc_degamma_to_dc_plane(struct dm_crtc_state *crtc,
&degamma_size); &degamma_size);
ASSERT(degamma_size == MAX_COLOR_LUT_ENTRIES); ASSERT(degamma_size == MAX_COLOR_LUT_ENTRIES);
dc_plane_state->in_transfer_func->type = TF_TYPE_DISTRIBUTED_POINTS; dc_plane_state->in_transfer_func.type = TF_TYPE_DISTRIBUTED_POINTS;
/* /*
* This case isn't fully correct, but also fairly * This case isn't fully correct, but also fairly
...@@ -1061,12 +1061,12 @@ map_crtc_degamma_to_dc_plane(struct dm_crtc_state *crtc, ...@@ -1061,12 +1061,12 @@ map_crtc_degamma_to_dc_plane(struct dm_crtc_state *crtc,
* map these to the atomic one instead. * map these to the atomic one instead.
*/ */
if (crtc->cm_is_degamma_srgb) if (crtc->cm_is_degamma_srgb)
dc_plane_state->in_transfer_func->tf = tf; dc_plane_state->in_transfer_func.tf = tf;
else else
dc_plane_state->in_transfer_func->tf = dc_plane_state->in_transfer_func.tf =
TRANSFER_FUNCTION_LINEAR; TRANSFER_FUNCTION_LINEAR;
r = __set_input_tf(caps, dc_plane_state->in_transfer_func, r = __set_input_tf(caps, &dc_plane_state->in_transfer_func,
degamma_lut, degamma_size); degamma_lut, degamma_size);
if (r) if (r)
return r; return r;
...@@ -1075,12 +1075,12 @@ map_crtc_degamma_to_dc_plane(struct dm_crtc_state *crtc, ...@@ -1075,12 +1075,12 @@ map_crtc_degamma_to_dc_plane(struct dm_crtc_state *crtc,
* For legacy gamma support we need the regamma input * For legacy gamma support we need the regamma input
* in linear space. Assume that the input is sRGB. * in linear space. Assume that the input is sRGB.
*/ */
dc_plane_state->in_transfer_func->type = TF_TYPE_PREDEFINED; dc_plane_state->in_transfer_func.type = TF_TYPE_PREDEFINED;
dc_plane_state->in_transfer_func->tf = tf; dc_plane_state->in_transfer_func.tf = tf;
if (tf != TRANSFER_FUNCTION_SRGB && if (tf != TRANSFER_FUNCTION_SRGB &&
!mod_color_calculate_degamma_params(caps, !mod_color_calculate_degamma_params(caps,
dc_plane_state->in_transfer_func, &dc_plane_state->in_transfer_func,
NULL, false)) NULL, false))
return -ENOMEM; return -ENOMEM;
} }
...@@ -1114,24 +1114,24 @@ __set_dm_plane_degamma(struct drm_plane_state *plane_state, ...@@ -1114,24 +1114,24 @@ __set_dm_plane_degamma(struct drm_plane_state *plane_state,
if (!has_degamma_lut && tf == AMDGPU_TRANSFER_FUNCTION_DEFAULT) if (!has_degamma_lut && tf == AMDGPU_TRANSFER_FUNCTION_DEFAULT)
return -EINVAL; return -EINVAL;
dc_plane_state->in_transfer_func->tf = amdgpu_tf_to_dc_tf(tf); dc_plane_state->in_transfer_func.tf = amdgpu_tf_to_dc_tf(tf);
if (has_degamma_lut) { if (has_degamma_lut) {
ASSERT(degamma_size == MAX_COLOR_LUT_ENTRIES); ASSERT(degamma_size == MAX_COLOR_LUT_ENTRIES);
dc_plane_state->in_transfer_func->type = dc_plane_state->in_transfer_func.type =
TF_TYPE_DISTRIBUTED_POINTS; TF_TYPE_DISTRIBUTED_POINTS;
ret = __set_input_tf(color_caps, dc_plane_state->in_transfer_func, ret = __set_input_tf(color_caps, &dc_plane_state->in_transfer_func,
degamma_lut, degamma_size); degamma_lut, degamma_size);
if (ret) if (ret)
return ret; return ret;
} else { } else {
dc_plane_state->in_transfer_func->type = dc_plane_state->in_transfer_func.type =
TF_TYPE_PREDEFINED; TF_TYPE_PREDEFINED;
if (!mod_color_calculate_degamma_params(color_caps, if (!mod_color_calculate_degamma_params(color_caps,
dc_plane_state->in_transfer_func, NULL, false)) &dc_plane_state->in_transfer_func, NULL, false))
return -ENOMEM; return -ENOMEM;
} }
return 0; return 0;
...@@ -1156,11 +1156,11 @@ amdgpu_dm_plane_set_color_properties(struct drm_plane_state *plane_state, ...@@ -1156,11 +1156,11 @@ amdgpu_dm_plane_set_color_properties(struct drm_plane_state *plane_state,
lut3d = __extract_blob_lut(dm_plane_state->lut3d, &lut3d_size); lut3d = __extract_blob_lut(dm_plane_state->lut3d, &lut3d_size);
lut3d_size = lut3d != NULL ? lut3d_size : 0; lut3d_size = lut3d != NULL ? lut3d_size : 0;
amdgpu_dm_atomic_lut3d(lut3d, lut3d_size, dc_plane_state->lut3d_func); amdgpu_dm_atomic_lut3d(lut3d, lut3d_size, &dc_plane_state->lut3d_func);
ret = amdgpu_dm_atomic_shaper_lut(shaper_lut, false, ret = amdgpu_dm_atomic_shaper_lut(shaper_lut, false,
amdgpu_tf_to_dc_tf(shaper_tf), amdgpu_tf_to_dc_tf(shaper_tf),
shaper_size, shaper_size,
dc_plane_state->in_shaper_func); &dc_plane_state->in_shaper_func);
if (ret) { if (ret) {
drm_dbg_kms(plane_state->plane->dev, drm_dbg_kms(plane_state->plane->dev,
"setting plane %d shaper LUT failed.\n", "setting plane %d shaper LUT failed.\n",
...@@ -1175,7 +1175,7 @@ amdgpu_dm_plane_set_color_properties(struct drm_plane_state *plane_state, ...@@ -1175,7 +1175,7 @@ amdgpu_dm_plane_set_color_properties(struct drm_plane_state *plane_state,
ret = amdgpu_dm_atomic_blend_lut(blend_lut, false, ret = amdgpu_dm_atomic_blend_lut(blend_lut, false,
amdgpu_tf_to_dc_tf(blend_tf), amdgpu_tf_to_dc_tf(blend_tf),
blend_size, dc_plane_state->blend_tf); blend_size, &dc_plane_state->blend_tf);
if (ret) { if (ret) {
drm_dbg_kms(plane_state->plane->dev, drm_dbg_kms(plane_state->plane->dev,
"setting plane %d gamma lut failed.\n", "setting plane %d gamma lut failed.\n",
...@@ -1221,8 +1221,8 @@ int amdgpu_dm_update_plane_color_mgmt(struct dm_crtc_state *crtc, ...@@ -1221,8 +1221,8 @@ int amdgpu_dm_update_plane_color_mgmt(struct dm_crtc_state *crtc,
color_caps = &dc_plane_state->ctx->dc->caps.color; color_caps = &dc_plane_state->ctx->dc->caps.color;
/* Initially, we can just bypass the DGM block. */ /* Initially, we can just bypass the DGM block. */
dc_plane_state->in_transfer_func->type = TF_TYPE_BYPASS; dc_plane_state->in_transfer_func.type = TF_TYPE_BYPASS;
dc_plane_state->in_transfer_func->tf = TRANSFER_FUNCTION_LINEAR; dc_plane_state->in_transfer_func.tf = TRANSFER_FUNCTION_LINEAR;
/* After, we start to update values according to color props */ /* After, we start to update values according to color props */
has_crtc_cm_degamma = (crtc->cm_has_degamma || crtc->cm_is_degamma_srgb); has_crtc_cm_degamma = (crtc->cm_has_degamma || crtc->cm_is_degamma_srgb);
......
...@@ -2851,55 +2851,45 @@ static void copy_surface_update_to_plane( ...@@ -2851,55 +2851,45 @@ static void copy_surface_update_to_plane(
srf_update->plane_info->layer_index; srf_update->plane_info->layer_index;
} }
if (srf_update->gamma && if (srf_update->gamma) {
(surface->gamma_correction != memcpy(&surface->gamma_correction.entries,
srf_update->gamma)) {
memcpy(&surface->gamma_correction->entries,
&srf_update->gamma->entries, &srf_update->gamma->entries,
sizeof(struct dc_gamma_entries)); sizeof(struct dc_gamma_entries));
surface->gamma_correction->is_identity = surface->gamma_correction.is_identity =
srf_update->gamma->is_identity; srf_update->gamma->is_identity;
surface->gamma_correction->num_entries = surface->gamma_correction.num_entries =
srf_update->gamma->num_entries; srf_update->gamma->num_entries;
surface->gamma_correction->type = surface->gamma_correction.type =
srf_update->gamma->type; srf_update->gamma->type;
} }
if (srf_update->in_transfer_func && if (srf_update->in_transfer_func) {
(surface->in_transfer_func != surface->in_transfer_func.sdr_ref_white_level =
srf_update->in_transfer_func)) {
surface->in_transfer_func->sdr_ref_white_level =
srf_update->in_transfer_func->sdr_ref_white_level; srf_update->in_transfer_func->sdr_ref_white_level;
surface->in_transfer_func->tf = surface->in_transfer_func.tf =
srf_update->in_transfer_func->tf; srf_update->in_transfer_func->tf;
surface->in_transfer_func->type = surface->in_transfer_func.type =
srf_update->in_transfer_func->type; srf_update->in_transfer_func->type;
memcpy(&surface->in_transfer_func->tf_pts, memcpy(&surface->in_transfer_func.tf_pts,
&srf_update->in_transfer_func->tf_pts, &srf_update->in_transfer_func->tf_pts,
sizeof(struct dc_transfer_func_distributed_points)); sizeof(struct dc_transfer_func_distributed_points));
} }
if (srf_update->func_shaper && if (srf_update->func_shaper)
(surface->in_shaper_func != memcpy(&surface->in_shaper_func, srf_update->func_shaper,
srf_update->func_shaper)) sizeof(surface->in_shaper_func));
memcpy(surface->in_shaper_func, srf_update->func_shaper,
sizeof(*surface->in_shaper_func));
if (srf_update->lut3d_func && if (srf_update->lut3d_func)
(surface->lut3d_func != memcpy(&surface->lut3d_func, srf_update->lut3d_func,
srf_update->lut3d_func)) sizeof(surface->lut3d_func));
memcpy(surface->lut3d_func, srf_update->lut3d_func,
sizeof(*surface->lut3d_func));
if (srf_update->hdr_mult.value) if (srf_update->hdr_mult.value)
surface->hdr_mult = surface->hdr_mult =
srf_update->hdr_mult; srf_update->hdr_mult;
if (srf_update->blend_tf && if (srf_update->blend_tf)
(surface->blend_tf != memcpy(&surface->blend_tf, srf_update->blend_tf,
srf_update->blend_tf)) sizeof(surface->blend_tf));
memcpy(surface->blend_tf, srf_update->blend_tf,
sizeof(*surface->blend_tf));
if (srf_update->input_csc_color_matrix) if (srf_update->input_csc_color_matrix)
surface->input_csc_color_matrix = surface->input_csc_color_matrix =
...@@ -2930,14 +2920,13 @@ static void copy_stream_update_to_stream(struct dc *dc, ...@@ -2930,14 +2920,13 @@ static void copy_stream_update_to_stream(struct dc *dc,
if (update->dst.height && update->dst.width) if (update->dst.height && update->dst.width)
stream->dst = update->dst; stream->dst = update->dst;
if (update->out_transfer_func && if (update->out_transfer_func) {
stream->out_transfer_func != update->out_transfer_func) { stream->out_transfer_func.sdr_ref_white_level =
stream->out_transfer_func->sdr_ref_white_level =
update->out_transfer_func->sdr_ref_white_level; update->out_transfer_func->sdr_ref_white_level;
stream->out_transfer_func->tf = update->out_transfer_func->tf; stream->out_transfer_func.tf = update->out_transfer_func->tf;
stream->out_transfer_func->type = stream->out_transfer_func.type =
update->out_transfer_func->type; update->out_transfer_func->type;
memcpy(&stream->out_transfer_func->tf_pts, memcpy(&stream->out_transfer_func.tf_pts,
&update->out_transfer_func->tf_pts, &update->out_transfer_func->tf_pts,
sizeof(struct dc_transfer_func_distributed_points)); sizeof(struct dc_transfer_func_distributed_points));
} }
...@@ -3050,15 +3039,8 @@ static void backup_planes_and_stream_state( ...@@ -3050,15 +3039,8 @@ static void backup_planes_and_stream_state(
for (i = 0; i < status->plane_count; i++) { for (i = 0; i < status->plane_count; i++) {
scratch->plane_states[i] = *status->plane_states[i]; scratch->plane_states[i] = *status->plane_states[i];
scratch->gamma_correction[i] = *status->plane_states[i]->gamma_correction;
scratch->in_transfer_func[i] = *status->plane_states[i]->in_transfer_func;
scratch->lut3d_func[i] = *status->plane_states[i]->lut3d_func;
scratch->in_shaper_func[i] = *status->plane_states[i]->in_shaper_func;
scratch->blend_tf[i] = *status->plane_states[i]->blend_tf;
} }
scratch->stream_state = *stream; scratch->stream_state = *stream;
if (stream->out_transfer_func)
scratch->out_transfer_func = *stream->out_transfer_func;
} }
static void restore_planes_and_stream_state( static void restore_planes_and_stream_state(
...@@ -3073,15 +3055,8 @@ static void restore_planes_and_stream_state( ...@@ -3073,15 +3055,8 @@ static void restore_planes_and_stream_state(
for (i = 0; i < status->plane_count; i++) { for (i = 0; i < status->plane_count; i++) {
*status->plane_states[i] = scratch->plane_states[i]; *status->plane_states[i] = scratch->plane_states[i];
*status->plane_states[i]->gamma_correction = scratch->gamma_correction[i];
*status->plane_states[i]->in_transfer_func = scratch->in_transfer_func[i];
*status->plane_states[i]->lut3d_func = scratch->lut3d_func[i];
*status->plane_states[i]->in_shaper_func = scratch->in_shaper_func[i];
*status->plane_states[i]->blend_tf = scratch->blend_tf[i];
} }
*stream = scratch->stream_state; *stream = scratch->stream_state;
if (stream->out_transfer_func)
*stream->out_transfer_func = scratch->out_transfer_func;
} }
/** /**
...@@ -5354,10 +5329,13 @@ void dc_enable_dcmode_clk_limit(struct dc *dc, bool enable) ...@@ -5354,10 +5329,13 @@ void dc_enable_dcmode_clk_limit(struct dc *dc, bool enable)
} }
dc->clk_mgr->dc_mode_softmax_enabled = enable; dc->clk_mgr->dc_mode_softmax_enabled = enable;
} }
bool dc_is_plane_eligible_for_idle_optimizations(struct dc *dc, struct dc_plane_state *plane, bool dc_is_plane_eligible_for_idle_optimizations(struct dc *dc,
unsigned int pitch,
unsigned int height,
enum surface_pixel_format format,
struct dc_cursor_attributes *cursor_attr) struct dc_cursor_attributes *cursor_attr)
{ {
if (dc->hwss.does_plane_fit_in_mall && dc->hwss.does_plane_fit_in_mall(dc, plane, cursor_attr)) if (dc->hwss.does_plane_fit_in_mall && dc->hwss.does_plane_fit_in_mall(dc, pitch, height, format, cursor_attr))
return true; return true;
return false; return false;
} }
......
...@@ -392,10 +392,10 @@ void get_hdr_visual_confirm_color( ...@@ -392,10 +392,10 @@ void get_hdr_visual_confirm_color(
switch (top_pipe_ctx->plane_res.scl_data.format) { switch (top_pipe_ctx->plane_res.scl_data.format) {
case PIXEL_FORMAT_ARGB2101010: case PIXEL_FORMAT_ARGB2101010:
if (top_pipe_ctx->stream->out_transfer_func->tf == TRANSFER_FUNCTION_PQ) { if (top_pipe_ctx->stream->out_transfer_func.tf == TRANSFER_FUNCTION_PQ) {
/* HDR10, ARGB2101010 - set border color to red */ /* HDR10, ARGB2101010 - set border color to red */
color->color_r_cr = color_value; color->color_r_cr = color_value;
} else if (top_pipe_ctx->stream->out_transfer_func->tf == TRANSFER_FUNCTION_GAMMA22) { } else if (top_pipe_ctx->stream->out_transfer_func.tf == TRANSFER_FUNCTION_GAMMA22) {
/* FreeSync 2 ARGB2101010 - set border color to pink */ /* FreeSync 2 ARGB2101010 - set border color to pink */
color->color_r_cr = color_value; color->color_r_cr = color_value;
color->color_b_cb = color_value; color->color_b_cb = color_value;
...@@ -403,10 +403,10 @@ void get_hdr_visual_confirm_color( ...@@ -403,10 +403,10 @@ void get_hdr_visual_confirm_color(
is_sdr = true; is_sdr = true;
break; break;
case PIXEL_FORMAT_FP16: case PIXEL_FORMAT_FP16:
if (top_pipe_ctx->stream->out_transfer_func->tf == TRANSFER_FUNCTION_PQ) { if (top_pipe_ctx->stream->out_transfer_func.tf == TRANSFER_FUNCTION_PQ) {
/* HDR10, FP16 - set border color to blue */ /* HDR10, FP16 - set border color to blue */
color->color_b_cb = color_value; color->color_b_cb = color_value;
} else if (top_pipe_ctx->stream->out_transfer_func->tf == TRANSFER_FUNCTION_GAMMA22) { } else if (top_pipe_ctx->stream->out_transfer_func.tf == TRANSFER_FUNCTION_GAMMA22) {
/* FreeSync 2 HDR - set border color to green */ /* FreeSync 2 HDR - set border color to green */
color->color_g_y = color_value; color->color_g_y = color_value;
} else } else
......
...@@ -4041,7 +4041,7 @@ static void set_avi_info_frame( ...@@ -4041,7 +4041,7 @@ static void set_avi_info_frame(
} }
if (pixel_encoding && color_space == COLOR_SPACE_2020_YCBCR && if (pixel_encoding && color_space == COLOR_SPACE_2020_YCBCR &&
stream->out_transfer_func->tf == TRANSFER_FUNCTION_GAMMA22) { stream->out_transfer_func.tf == TRANSFER_FUNCTION_GAMMA22) {
hdmi_info.bits.EC0_EC2 = 0; hdmi_info.bits.EC0_EC2 = 0;
hdmi_info.bits.C0_C1 = COLORIMETRY_ITU709; hdmi_info.bits.C0_C1 = COLORIMETRY_ITU709;
} }
......
...@@ -116,12 +116,7 @@ bool dc_stream_construct(struct dc_stream_state *stream, ...@@ -116,12 +116,7 @@ bool dc_stream_construct(struct dc_stream_state *stream,
update_stream_signal(stream, dc_sink_data); update_stream_signal(stream, dc_sink_data);
stream->out_transfer_func = dc_create_transfer_func(); stream->out_transfer_func.type = TF_TYPE_BYPASS;
if (stream->out_transfer_func == NULL) {
dc_sink_release(dc_sink_data);
return false;
}
stream->out_transfer_func->type = TF_TYPE_BYPASS;
dc_stream_assign_stream_id(stream); dc_stream_assign_stream_id(stream);
...@@ -131,10 +126,6 @@ bool dc_stream_construct(struct dc_stream_state *stream, ...@@ -131,10 +126,6 @@ bool dc_stream_construct(struct dc_stream_state *stream,
void dc_stream_destruct(struct dc_stream_state *stream) void dc_stream_destruct(struct dc_stream_state *stream)
{ {
dc_sink_release(stream->sink); dc_sink_release(stream->sink);
if (stream->out_transfer_func != NULL) {
dc_transfer_func_release(stream->out_transfer_func);
stream->out_transfer_func = NULL;
}
} }
void dc_stream_assign_stream_id(struct dc_stream_state *stream) void dc_stream_assign_stream_id(struct dc_stream_state *stream)
...@@ -201,9 +192,6 @@ struct dc_stream_state *dc_copy_stream(const struct dc_stream_state *stream) ...@@ -201,9 +192,6 @@ struct dc_stream_state *dc_copy_stream(const struct dc_stream_state *stream)
if (new_stream->sink) if (new_stream->sink)
dc_sink_retain(new_stream->sink); dc_sink_retain(new_stream->sink);
if (new_stream->out_transfer_func)
dc_transfer_func_retain(new_stream->out_transfer_func);
dc_stream_assign_stream_id(new_stream); dc_stream_assign_stream_id(new_stream);
/* If using dynamic encoder assignment, wait till stream committed to assign encoder. */ /* If using dynamic encoder assignment, wait till stream committed to assign encoder. */
...@@ -425,7 +413,7 @@ bool dc_stream_add_writeback(struct dc *dc, ...@@ -425,7 +413,7 @@ bool dc_stream_add_writeback(struct dc *dc,
dc_exit_ips_for_hw_access(dc); dc_exit_ips_for_hw_access(dc);
wb_info->dwb_params.out_transfer_func = stream->out_transfer_func; wb_info->dwb_params.out_transfer_func = &stream->out_transfer_func;
dwb = dc->res_pool->dwbc[wb_info->dwb_pipe_inst]; dwb = dc->res_pool->dwbc[wb_info->dwb_pipe_inst];
dwb->dwb_is_drc = false; dwb->dwb_is_drc = false;
......
...@@ -41,25 +41,15 @@ void dc_plane_construct(struct dc_context *ctx, struct dc_plane_state *plane_sta ...@@ -41,25 +41,15 @@ void dc_plane_construct(struct dc_context *ctx, struct dc_plane_state *plane_sta
{ {
plane_state->ctx = ctx; plane_state->ctx = ctx;
plane_state->gamma_correction = dc_create_gamma(); plane_state->gamma_correction.is_identity = true;
if (plane_state->gamma_correction != NULL)
plane_state->gamma_correction->is_identity = true;
plane_state->in_transfer_func = dc_create_transfer_func(); plane_state->in_transfer_func.type = TF_TYPE_BYPASS;
if (plane_state->in_transfer_func != NULL) {
plane_state->in_transfer_func->type = TF_TYPE_BYPASS;
}
plane_state->in_shaper_func = dc_create_transfer_func();
if (plane_state->in_shaper_func != NULL) {
plane_state->in_shaper_func->type = TF_TYPE_BYPASS;
}
plane_state->lut3d_func = dc_create_3dlut_func(); plane_state->in_shaper_func.type = TF_TYPE_BYPASS;
plane_state->blend_tf = dc_create_transfer_func(); plane_state->lut3d_func.state.raw = 0;
if (plane_state->blend_tf != NULL) {
plane_state->blend_tf->type = TF_TYPE_BYPASS; plane_state->blend_tf.type = TF_TYPE_BYPASS;
}
plane_state->pre_multiplied_alpha = true; plane_state->pre_multiplied_alpha = true;
...@@ -67,30 +57,7 @@ void dc_plane_construct(struct dc_context *ctx, struct dc_plane_state *plane_sta ...@@ -67,30 +57,7 @@ void dc_plane_construct(struct dc_context *ctx, struct dc_plane_state *plane_sta
void dc_plane_destruct(struct dc_plane_state *plane_state) void dc_plane_destruct(struct dc_plane_state *plane_state)
{ {
if (plane_state->gamma_correction != NULL) { // no more pointers to free within dc_plane_state
dc_gamma_release(&plane_state->gamma_correction);
}
if (plane_state->in_transfer_func != NULL) {
dc_transfer_func_release(
plane_state->in_transfer_func);
plane_state->in_transfer_func = NULL;
}
if (plane_state->in_shaper_func != NULL) {
dc_transfer_func_release(
plane_state->in_shaper_func);
plane_state->in_shaper_func = NULL;
}
if (plane_state->lut3d_func != NULL) {
dc_3dlut_func_release(
plane_state->lut3d_func);
plane_state->lut3d_func = NULL;
}
if (plane_state->blend_tf != NULL) {
dc_transfer_func_release(
plane_state->blend_tf);
plane_state->blend_tf = NULL;
}
} }
/******************************************************************************* /*******************************************************************************
......
...@@ -1212,6 +1212,8 @@ union surface_update_flags { ...@@ -1212,6 +1212,8 @@ union surface_update_flags {
uint32_t raw; uint32_t raw;
}; };
#define DC_REMOVE_PLANE_POINTERS 1
struct dc_plane_state { struct dc_plane_state {
struct dc_plane_address address; struct dc_plane_address address;
struct dc_plane_flip_time time; struct dc_plane_flip_time time;
...@@ -1226,8 +1228,8 @@ struct dc_plane_state { ...@@ -1226,8 +1228,8 @@ struct dc_plane_state {
struct dc_plane_dcc_param dcc; struct dc_plane_dcc_param dcc;
struct dc_gamma *gamma_correction; struct dc_gamma gamma_correction;
struct dc_transfer_func *in_transfer_func; struct dc_transfer_func in_transfer_func;
struct dc_bias_and_scale *bias_and_scale; struct dc_bias_and_scale *bias_and_scale;
struct dc_csc_transform input_csc_color_matrix; struct dc_csc_transform input_csc_color_matrix;
struct fixed31_32 coeff_reduction_factor; struct fixed31_32 coeff_reduction_factor;
...@@ -1239,9 +1241,9 @@ struct dc_plane_state { ...@@ -1239,9 +1241,9 @@ struct dc_plane_state {
enum dc_color_space color_space; enum dc_color_space color_space;
struct dc_3dlut *lut3d_func; struct dc_3dlut lut3d_func;
struct dc_transfer_func *in_shaper_func; struct dc_transfer_func in_shaper_func;
struct dc_transfer_func *blend_tf; struct dc_transfer_func blend_tf;
struct dc_transfer_func *gamcor_tf; struct dc_transfer_func *gamcor_tf;
enum surface_pixel_format format; enum surface_pixel_format format;
...@@ -1308,14 +1310,8 @@ struct dc_scratch_space { ...@@ -1308,14 +1310,8 @@ struct dc_scratch_space {
* a valid current state during dc update. * a valid current state during dc update.
*/ */
struct dc_plane_state plane_states[MAX_SURFACE_NUM]; struct dc_plane_state plane_states[MAX_SURFACE_NUM];
struct dc_gamma gamma_correction[MAX_SURFACE_NUM];
struct dc_transfer_func in_transfer_func[MAX_SURFACE_NUM];
struct dc_3dlut lut3d_func[MAX_SURFACE_NUM];
struct dc_transfer_func in_shaper_func[MAX_SURFACE_NUM];
struct dc_transfer_func blend_tf[MAX_SURFACE_NUM];
struct dc_stream_state stream_state; struct dc_stream_state stream_state;
struct dc_transfer_func out_transfer_func;
}; };
struct dc { struct dc {
...@@ -1384,6 +1380,7 @@ struct dc { ...@@ -1384,6 +1380,7 @@ struct dc {
} update_bw_bounding_box; } update_bw_bounding_box;
struct dc_scratch_space current_state; struct dc_scratch_space current_state;
struct dc_scratch_space new_state; struct dc_scratch_space new_state;
struct dc_stream_state temp_stream; // Used so we don't need to allocate stream on the stack
} scratch; } scratch;
struct dml2_configuration_options dml2_options; struct dml2_configuration_options dml2_options;
...@@ -2364,8 +2361,11 @@ bool dc_is_dmcu_initialized(struct dc *dc); ...@@ -2364,8 +2361,11 @@ bool dc_is_dmcu_initialized(struct dc *dc);
enum dc_status dc_set_clock(struct dc *dc, enum dc_clock_type clock_type, uint32_t clk_khz, uint32_t stepping); enum dc_status dc_set_clock(struct dc *dc, enum dc_clock_type clock_type, uint32_t clk_khz, uint32_t stepping);
void dc_get_clock(struct dc *dc, enum dc_clock_type clock_type, struct dc_clock_config *clock_cfg); void dc_get_clock(struct dc *dc, enum dc_clock_type clock_type, struct dc_clock_config *clock_cfg);
bool dc_is_plane_eligible_for_idle_optimizations(struct dc *dc, struct dc_plane_state *plane, bool dc_is_plane_eligible_for_idle_optimizations(struct dc *dc,
struct dc_cursor_attributes *cursor_attr); unsigned int pitch,
unsigned int height,
enum surface_pixel_format format,
struct dc_cursor_attributes *cursor_attr);
#define dc_allow_idle_optimizations(dc, allow) dc_allow_idle_optimizations_internal(dc, allow, __func__) #define dc_allow_idle_optimizations(dc, allow) dc_allow_idle_optimizations_internal(dc, allow, __func__)
#define dc_exit_ips_for_hw_access(dc) dc_exit_ips_for_hw_access_internal(dc, __func__) #define dc_exit_ips_for_hw_access(dc) dc_exit_ips_for_hw_access_internal(dc, __func__)
......
...@@ -190,7 +190,7 @@ struct dc_stream_state { ...@@ -190,7 +190,7 @@ struct dc_stream_state {
PHYSICAL_ADDRESS_LOC dmdata_address; PHYSICAL_ADDRESS_LOC dmdata_address;
bool use_dynamic_meta; bool use_dynamic_meta;
struct dc_transfer_func *out_transfer_func; struct dc_transfer_func out_transfer_func;
struct colorspace_transform gamut_remap_matrix; struct colorspace_transform gamut_remap_matrix;
struct dc_csc_transform csc_color_matrix; struct dc_csc_transform csc_color_matrix;
......
...@@ -422,7 +422,7 @@ struct dc_dwb_params { ...@@ -422,7 +422,7 @@ struct dc_dwb_params {
enum dwb_capture_rate capture_rate; /* controls the frame capture rate */ enum dwb_capture_rate capture_rate; /* controls the frame capture rate */
struct scaling_taps scaler_taps; /* Scaling taps */ struct scaling_taps scaler_taps; /* Scaling taps */
enum dwb_subsample_position subsample_position; enum dwb_subsample_position subsample_position;
struct dc_transfer_func *out_transfer_func; const struct dc_transfer_func *out_transfer_func;
}; };
/* audio*/ /* audio*/
......
...@@ -736,7 +736,7 @@ bool dpp20_program_shaper( ...@@ -736,7 +736,7 @@ bool dpp20_program_shaper(
bool dpp20_program_3dlut( bool dpp20_program_3dlut(
struct dpp *dpp_base, struct dpp *dpp_base,
struct tetrahedral_params *params); const struct tetrahedral_params *params);
void dpp2_cnv_set_alpha_keyer( void dpp2_cnv_set_alpha_keyer(
struct dpp *dpp_base, struct dpp *dpp_base,
......
...@@ -1114,15 +1114,15 @@ static void dpp20_select_3dlut_ram_mask( ...@@ -1114,15 +1114,15 @@ static void dpp20_select_3dlut_ram_mask(
bool dpp20_program_3dlut( bool dpp20_program_3dlut(
struct dpp *dpp_base, struct dpp *dpp_base,
struct tetrahedral_params *params) const struct tetrahedral_params *params)
{ {
enum dc_lut_mode mode; enum dc_lut_mode mode;
bool is_17x17x17; bool is_17x17x17;
bool is_12bits_color_channel; bool is_12bits_color_channel;
struct dc_rgb *lut0; const struct dc_rgb *lut0;
struct dc_rgb *lut1; const struct dc_rgb *lut1;
struct dc_rgb *lut2; const struct dc_rgb *lut2;
struct dc_rgb *lut3; const struct dc_rgb *lut3;
int lut_size0; int lut_size0;
int lut_size; int lut_size;
......
...@@ -1384,15 +1384,15 @@ static void dpp3_select_3dlut_ram_mask( ...@@ -1384,15 +1384,15 @@ static void dpp3_select_3dlut_ram_mask(
} }
static bool dpp3_program_3dlut(struct dpp *dpp_base, static bool dpp3_program_3dlut(struct dpp *dpp_base,
struct tetrahedral_params *params) const struct tetrahedral_params *params)
{ {
enum dc_lut_mode mode; enum dc_lut_mode mode;
bool is_17x17x17; bool is_17x17x17;
bool is_12bits_color_channel; bool is_12bits_color_channel;
struct dc_rgb *lut0; const struct dc_rgb *lut0;
struct dc_rgb *lut1; const struct dc_rgb *lut1;
struct dc_rgb *lut2; const struct dc_rgb *lut2;
struct dc_rgb *lut3; const struct dc_rgb *lut3;
int lut_size0; int lut_size0;
int lut_size; int lut_size;
......
...@@ -289,16 +289,14 @@ dce110_set_input_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx, ...@@ -289,16 +289,14 @@ dce110_set_input_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx,
if (ipp == NULL) if (ipp == NULL)
return false; return false;
if (plane_state->in_transfer_func) tf = &plane_state->in_transfer_func;
tf = plane_state->in_transfer_func;
build_prescale_params(&prescale_params, plane_state); build_prescale_params(&prescale_params, plane_state);
ipp->funcs->ipp_program_prescale(ipp, &prescale_params); ipp->funcs->ipp_program_prescale(ipp, &prescale_params);
if (plane_state->gamma_correction && if (!plane_state->gamma_correction.is_identity &&
!plane_state->gamma_correction->is_identity &&
dce_use_lut(plane_state->format)) dce_use_lut(plane_state->format))
ipp->funcs->ipp_program_input_lut(ipp, plane_state->gamma_correction); ipp->funcs->ipp_program_input_lut(ipp, &plane_state->gamma_correction);
if (tf == NULL) { if (tf == NULL) {
/* Default case if no input transfer function specified */ /* Default case if no input transfer function specified */
...@@ -614,11 +612,10 @@ dce110_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx, ...@@ -614,11 +612,10 @@ dce110_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx,
xfm->funcs->opp_power_on_regamma_lut(xfm, true); xfm->funcs->opp_power_on_regamma_lut(xfm, true);
xfm->regamma_params.hw_points_num = GAMMA_HW_POINTS_NUM; xfm->regamma_params.hw_points_num = GAMMA_HW_POINTS_NUM;
if (stream->out_transfer_func && if (stream->out_transfer_func.type == TF_TYPE_PREDEFINED &&
stream->out_transfer_func->type == TF_TYPE_PREDEFINED && stream->out_transfer_func.tf == TRANSFER_FUNCTION_SRGB) {
stream->out_transfer_func->tf == TRANSFER_FUNCTION_SRGB) {
xfm->funcs->opp_set_regamma_mode(xfm, OPP_REGAMMA_SRGB); xfm->funcs->opp_set_regamma_mode(xfm, OPP_REGAMMA_SRGB);
} else if (dce110_translate_regamma_to_hw_format(stream->out_transfer_func, } else if (dce110_translate_regamma_to_hw_format(&stream->out_transfer_func,
&xfm->regamma_params)) { &xfm->regamma_params)) {
xfm->funcs->opp_program_regamma_pwl(xfm, &xfm->regamma_params); xfm->funcs->opp_program_regamma_pwl(xfm, &xfm->regamma_params);
xfm->funcs->opp_set_regamma_mode(xfm, OPP_REGAMMA_USER); xfm->funcs->opp_set_regamma_mode(xfm, OPP_REGAMMA_USER);
......
...@@ -1829,14 +1829,12 @@ bool dcn10_set_input_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx, ...@@ -1829,14 +1829,12 @@ bool dcn10_set_input_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx,
if (dpp_base == NULL) if (dpp_base == NULL)
return false; return false;
if (plane_state->in_transfer_func) tf = &plane_state->in_transfer_func;
tf = plane_state->in_transfer_func;
if (plane_state->gamma_correction && if (!dpp_base->ctx->dc->debug.always_use_regamma
!dpp_base->ctx->dc->debug.always_use_regamma && !plane_state->gamma_correction.is_identity
&& !plane_state->gamma_correction->is_identity
&& dce_use_lut(plane_state->format)) && dce_use_lut(plane_state->format))
dpp_base->funcs->dpp_program_input_lut(dpp_base, plane_state->gamma_correction); dpp_base->funcs->dpp_program_input_lut(dpp_base, &plane_state->gamma_correction);
if (tf == NULL) if (tf == NULL)
dpp_base->funcs->dpp_set_degamma(dpp_base, IPP_DEGAMMA_MODE_BYPASS); dpp_base->funcs->dpp_set_degamma(dpp_base, IPP_DEGAMMA_MODE_BYPASS);
...@@ -1877,7 +1875,7 @@ bool dcn10_set_input_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx, ...@@ -1877,7 +1875,7 @@ bool dcn10_set_input_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx,
#define MAX_NUM_HW_POINTS 0x200 #define MAX_NUM_HW_POINTS 0x200
static void log_tf(struct dc_context *ctx, static void log_tf(struct dc_context *ctx,
struct dc_transfer_func *tf, uint32_t hw_points_num) const struct dc_transfer_func *tf, uint32_t hw_points_num)
{ {
// DC_LOG_GAMMA is default logging of all hw points // DC_LOG_GAMMA is default logging of all hw points
// DC_LOG_ALL_GAMMA logs all points, not only hw points // DC_LOG_ALL_GAMMA logs all points, not only hw points
...@@ -1914,16 +1912,15 @@ bool dcn10_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx, ...@@ -1914,16 +1912,15 @@ bool dcn10_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx,
dpp->regamma_params.hw_points_num = GAMMA_HW_POINTS_NUM; dpp->regamma_params.hw_points_num = GAMMA_HW_POINTS_NUM;
if (stream->out_transfer_func && if (stream->out_transfer_func.type == TF_TYPE_PREDEFINED &&
stream->out_transfer_func->type == TF_TYPE_PREDEFINED && stream->out_transfer_func.tf == TRANSFER_FUNCTION_SRGB)
stream->out_transfer_func->tf == TRANSFER_FUNCTION_SRGB)
dpp->funcs->dpp_program_regamma_pwl(dpp, NULL, OPP_REGAMMA_SRGB); dpp->funcs->dpp_program_regamma_pwl(dpp, NULL, OPP_REGAMMA_SRGB);
/* dcn10_translate_regamma_to_hw_format takes 750us, only do it when full /* dcn10_translate_regamma_to_hw_format takes 750us, only do it when full
* update. * update.
*/ */
else if (cm_helper_translate_curve_to_hw_format(dc->ctx, else if (cm_helper_translate_curve_to_hw_format(dc->ctx,
stream->out_transfer_func, &stream->out_transfer_func,
&dpp->regamma_params, false)) { &dpp->regamma_params, false)) {
dpp->funcs->dpp_program_regamma_pwl( dpp->funcs->dpp_program_regamma_pwl(
dpp, dpp,
...@@ -1931,10 +1928,9 @@ bool dcn10_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx, ...@@ -1931,10 +1928,9 @@ bool dcn10_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx,
} else } else
dpp->funcs->dpp_program_regamma_pwl(dpp, NULL, OPP_REGAMMA_BYPASS); dpp->funcs->dpp_program_regamma_pwl(dpp, NULL, OPP_REGAMMA_BYPASS);
if (stream->ctx && if (stream->ctx) {
stream->out_transfer_func) {
log_tf(stream->ctx, log_tf(stream->ctx,
stream->out_transfer_func, &stream->out_transfer_func,
dpp->regamma_params.hw_points_num); dpp->regamma_params.hw_points_num);
} }
......
...@@ -1011,7 +1011,7 @@ bool dcn20_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx, ...@@ -1011,7 +1011,7 @@ bool dcn20_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx,
{ {
int mpcc_id = pipe_ctx->plane_res.hubp->inst; int mpcc_id = pipe_ctx->plane_res.hubp->inst;
struct mpc *mpc = pipe_ctx->stream_res.opp->ctx->dc->res_pool->mpc; struct mpc *mpc = pipe_ctx->stream_res.opp->ctx->dc->res_pool->mpc;
struct pwl_params *params = NULL; const struct pwl_params *params = NULL;
/* /*
* program OGAM only for the top pipe * program OGAM only for the top pipe
* if there is a pipe split then fix diagnostic is required: * if there is a pipe split then fix diagnostic is required:
...@@ -1022,19 +1022,19 @@ bool dcn20_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx, ...@@ -1022,19 +1022,19 @@ bool dcn20_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx,
if (mpc->funcs->power_on_mpc_mem_pwr) if (mpc->funcs->power_on_mpc_mem_pwr)
mpc->funcs->power_on_mpc_mem_pwr(mpc, mpcc_id, true); mpc->funcs->power_on_mpc_mem_pwr(mpc, mpcc_id, true);
if (pipe_ctx->top_pipe == NULL if (pipe_ctx->top_pipe == NULL
&& mpc->funcs->set_output_gamma && stream->out_transfer_func) { && mpc->funcs->set_output_gamma) {
if (stream->out_transfer_func->type == TF_TYPE_HWPWL) if (stream->out_transfer_func.type == TF_TYPE_HWPWL)
params = &stream->out_transfer_func->pwl; params = &stream->out_transfer_func.pwl;
else if (pipe_ctx->stream->out_transfer_func->type == else if (pipe_ctx->stream->out_transfer_func.type ==
TF_TYPE_DISTRIBUTED_POINTS && TF_TYPE_DISTRIBUTED_POINTS &&
cm_helper_translate_curve_to_hw_format(dc->ctx, cm_helper_translate_curve_to_hw_format(dc->ctx,
stream->out_transfer_func, &stream->out_transfer_func,
&mpc->blender_params, false)) &mpc->blender_params, false))
params = &mpc->blender_params; params = &mpc->blender_params;
/* /*
* there is no ROM * there is no ROM
*/ */
if (stream->out_transfer_func->type == TF_TYPE_PREDEFINED) if (stream->out_transfer_func.type == TF_TYPE_PREDEFINED)
BREAK_TO_DEBUGGER(); BREAK_TO_DEBUGGER();
} }
/* /*
...@@ -1050,17 +1050,15 @@ bool dcn20_set_blend_lut( ...@@ -1050,17 +1050,15 @@ bool dcn20_set_blend_lut(
{ {
struct dpp *dpp_base = pipe_ctx->plane_res.dpp; struct dpp *dpp_base = pipe_ctx->plane_res.dpp;
bool result = true; bool result = true;
struct pwl_params *blend_lut = NULL; const struct pwl_params *blend_lut = NULL;
if (plane_state->blend_tf) { if (plane_state->blend_tf.type == TF_TYPE_HWPWL)
if (plane_state->blend_tf->type == TF_TYPE_HWPWL) blend_lut = &plane_state->blend_tf.pwl;
blend_lut = &plane_state->blend_tf->pwl; else if (plane_state->blend_tf.type == TF_TYPE_DISTRIBUTED_POINTS) {
else if (plane_state->blend_tf->type == TF_TYPE_DISTRIBUTED_POINTS) { cm_helper_translate_curve_to_hw_format(plane_state->ctx,
cm_helper_translate_curve_to_hw_format(plane_state->ctx, &plane_state->blend_tf,
plane_state->blend_tf, &dpp_base->regamma_params, false);
&dpp_base->regamma_params, false); blend_lut = &dpp_base->regamma_params;
blend_lut = &dpp_base->regamma_params;
}
} }
result = dpp_base->funcs->dpp_program_blnd_lut(dpp_base, blend_lut); result = dpp_base->funcs->dpp_program_blnd_lut(dpp_base, blend_lut);
...@@ -1072,24 +1070,21 @@ bool dcn20_set_shaper_3dlut( ...@@ -1072,24 +1070,21 @@ bool dcn20_set_shaper_3dlut(
{ {
struct dpp *dpp_base = pipe_ctx->plane_res.dpp; struct dpp *dpp_base = pipe_ctx->plane_res.dpp;
bool result = true; bool result = true;
struct pwl_params *shaper_lut = NULL; const struct pwl_params *shaper_lut = NULL;
if (plane_state->in_shaper_func) { if (plane_state->in_shaper_func.type == TF_TYPE_HWPWL)
if (plane_state->in_shaper_func->type == TF_TYPE_HWPWL) shaper_lut = &plane_state->in_shaper_func.pwl;
shaper_lut = &plane_state->in_shaper_func->pwl; else if (plane_state->in_shaper_func.type == TF_TYPE_DISTRIBUTED_POINTS) {
else if (plane_state->in_shaper_func->type == TF_TYPE_DISTRIBUTED_POINTS) { cm_helper_translate_curve_to_hw_format(plane_state->ctx,
cm_helper_translate_curve_to_hw_format(plane_state->ctx, &plane_state->in_shaper_func,
plane_state->in_shaper_func, &dpp_base->shaper_params, true);
&dpp_base->shaper_params, true); shaper_lut = &dpp_base->shaper_params;
shaper_lut = &dpp_base->shaper_params;
}
} }
result = dpp_base->funcs->dpp_program_shaper_lut(dpp_base, shaper_lut); result = dpp_base->funcs->dpp_program_shaper_lut(dpp_base, shaper_lut);
if (plane_state->lut3d_func && if (plane_state->lut3d_func.state.bits.initialized == 1)
plane_state->lut3d_func->state.bits.initialized == 1)
result = dpp_base->funcs->dpp_program_3dlut(dpp_base, result = dpp_base->funcs->dpp_program_3dlut(dpp_base,
&plane_state->lut3d_func->lut_3d); &plane_state->lut3d_func.lut_3d);
else else
result = dpp_base->funcs->dpp_program_3dlut(dpp_base, NULL); result = dpp_base->funcs->dpp_program_3dlut(dpp_base, NULL);
...@@ -1112,9 +1107,7 @@ bool dcn20_set_input_transfer_func(struct dc *dc, ...@@ -1112,9 +1107,7 @@ bool dcn20_set_input_transfer_func(struct dc *dc,
hws->funcs.set_shaper_3dlut(pipe_ctx, plane_state); hws->funcs.set_shaper_3dlut(pipe_ctx, plane_state);
hws->funcs.set_blend_lut(pipe_ctx, plane_state); hws->funcs.set_blend_lut(pipe_ctx, plane_state);
if (plane_state->in_transfer_func) tf = &plane_state->in_transfer_func;
tf = plane_state->in_transfer_func;
if (tf == NULL) { if (tf == NULL) {
dpp_base->funcs->dpp_set_degamma(dpp_base, dpp_base->funcs->dpp_set_degamma(dpp_base,
......
...@@ -223,16 +223,14 @@ bool dcn30_set_blend_lut( ...@@ -223,16 +223,14 @@ bool dcn30_set_blend_lut(
{ {
struct dpp *dpp_base = pipe_ctx->plane_res.dpp; struct dpp *dpp_base = pipe_ctx->plane_res.dpp;
bool result = true; bool result = true;
struct pwl_params *blend_lut = NULL; const struct pwl_params *blend_lut = NULL;
if (plane_state->blend_tf) { if (plane_state->blend_tf.type == TF_TYPE_HWPWL)
if (plane_state->blend_tf->type == TF_TYPE_HWPWL) blend_lut = &plane_state->blend_tf.pwl;
blend_lut = &plane_state->blend_tf->pwl; else if (plane_state->blend_tf.type == TF_TYPE_DISTRIBUTED_POINTS) {
else if (plane_state->blend_tf->type == TF_TYPE_DISTRIBUTED_POINTS) { cm3_helper_translate_curve_to_hw_format(
cm3_helper_translate_curve_to_hw_format( &plane_state->blend_tf, &dpp_base->regamma_params, false);
plane_state->blend_tf, &dpp_base->regamma_params, false); blend_lut = &dpp_base->regamma_params;
blend_lut = &dpp_base->regamma_params;
}
} }
result = dpp_base->funcs->dpp_program_blnd_lut(dpp_base, blend_lut); result = dpp_base->funcs->dpp_program_blnd_lut(dpp_base, blend_lut);
...@@ -300,27 +298,24 @@ bool dcn30_set_input_transfer_func(struct dc *dc, ...@@ -300,27 +298,24 @@ bool dcn30_set_input_transfer_func(struct dc *dc,
struct dpp *dpp_base = pipe_ctx->plane_res.dpp; struct dpp *dpp_base = pipe_ctx->plane_res.dpp;
enum dc_transfer_func_predefined tf; enum dc_transfer_func_predefined tf;
bool result = true; bool result = true;
struct pwl_params *params = NULL; const struct pwl_params *params = NULL;
if (dpp_base == NULL || plane_state == NULL) if (dpp_base == NULL || plane_state == NULL)
return false; return false;
tf = TRANSFER_FUNCTION_UNITY; tf = TRANSFER_FUNCTION_UNITY;
if (plane_state->in_transfer_func && if (plane_state->in_transfer_func.type == TF_TYPE_PREDEFINED)
plane_state->in_transfer_func->type == TF_TYPE_PREDEFINED) tf = plane_state->in_transfer_func.tf;
tf = plane_state->in_transfer_func->tf;
dpp_base->funcs->dpp_set_pre_degam(dpp_base, tf); dpp_base->funcs->dpp_set_pre_degam(dpp_base, tf);
if (plane_state->in_transfer_func) { if (plane_state->in_transfer_func.type == TF_TYPE_HWPWL)
if (plane_state->in_transfer_func->type == TF_TYPE_HWPWL) params = &plane_state->in_transfer_func.pwl;
params = &plane_state->in_transfer_func->pwl; else if (plane_state->in_transfer_func.type == TF_TYPE_DISTRIBUTED_POINTS &&
else if (plane_state->in_transfer_func->type == TF_TYPE_DISTRIBUTED_POINTS && cm3_helper_translate_curve_to_hw_format(&plane_state->in_transfer_func,
cm3_helper_translate_curve_to_hw_format(plane_state->in_transfer_func, &dpp_base->degamma_params, false))
&dpp_base->degamma_params, false)) params = &dpp_base->degamma_params;
params = &dpp_base->degamma_params;
}
result = dpp_base->funcs->dpp_program_gamcor_lut(dpp_base, params); result = dpp_base->funcs->dpp_program_gamcor_lut(dpp_base, params);
...@@ -378,24 +373,24 @@ bool dcn30_set_output_transfer_func(struct dc *dc, ...@@ -378,24 +373,24 @@ bool dcn30_set_output_transfer_func(struct dc *dc,
{ {
int mpcc_id = pipe_ctx->plane_res.hubp->inst; int mpcc_id = pipe_ctx->plane_res.hubp->inst;
struct mpc *mpc = pipe_ctx->stream_res.opp->ctx->dc->res_pool->mpc; struct mpc *mpc = pipe_ctx->stream_res.opp->ctx->dc->res_pool->mpc;
struct pwl_params *params = NULL; const struct pwl_params *params = NULL;
bool ret = false; bool ret = false;
/* program OGAM or 3DLUT only for the top pipe*/ /* program OGAM or 3DLUT only for the top pipe*/
if (pipe_ctx->top_pipe == NULL) { if (pipe_ctx->top_pipe == NULL) {
/*program rmu shaper and 3dlut in MPC*/ /*program rmu shaper and 3dlut in MPC*/
ret = dcn30_set_mpc_shaper_3dlut(pipe_ctx, stream); ret = dcn30_set_mpc_shaper_3dlut(pipe_ctx, stream);
if (ret == false && mpc->funcs->set_output_gamma && stream->out_transfer_func) { if (ret == false && mpc->funcs->set_output_gamma) {
if (stream->out_transfer_func->type == TF_TYPE_HWPWL) if (stream->out_transfer_func.type == TF_TYPE_HWPWL)
params = &stream->out_transfer_func->pwl; params = &stream->out_transfer_func.pwl;
else if (pipe_ctx->stream->out_transfer_func->type == else if (pipe_ctx->stream->out_transfer_func.type ==
TF_TYPE_DISTRIBUTED_POINTS && TF_TYPE_DISTRIBUTED_POINTS &&
cm3_helper_translate_curve_to_hw_format( cm3_helper_translate_curve_to_hw_format(
stream->out_transfer_func, &stream->out_transfer_func,
&mpc->blender_params, false)) &mpc->blender_params, false))
params = &mpc->blender_params; params = &mpc->blender_params;
/* there are no ROM LUTs in OUTGAM */ /* there are no ROM LUTs in OUTGAM */
if (stream->out_transfer_func->type == TF_TYPE_PREDEFINED) if (stream->out_transfer_func.type == TF_TYPE_PREDEFINED)
BREAK_TO_DEBUGGER(); BREAK_TO_DEBUGGER();
} }
} }
...@@ -946,7 +941,8 @@ bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable) ...@@ -946,7 +941,8 @@ bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable)
plane->format >= SURFACE_PIXEL_FORMAT_GRPH_ARGB8888 && plane->format >= SURFACE_PIXEL_FORMAT_GRPH_ARGB8888 &&
plane->address.page_table_base.quad_part == 0 && plane->address.page_table_base.quad_part == 0 &&
dc->hwss.does_plane_fit_in_mall && dc->hwss.does_plane_fit_in_mall &&
dc->hwss.does_plane_fit_in_mall(dc, plane, dc->hwss.does_plane_fit_in_mall(dc, plane->plane_size.surface_pitch,
plane->plane_size.surface_size.height, plane->format,
cursor_cache_enable ? &cursor_attr : NULL)) { cursor_cache_enable ? &cursor_attr : NULL)) {
unsigned int v_total = stream->adjust.v_total_max ? unsigned int v_total = stream->adjust.v_total_max ?
stream->adjust.v_total_max : stream->timing.v_total; stream->adjust.v_total_max : stream->timing.v_total;
...@@ -1076,11 +1072,15 @@ bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable) ...@@ -1076,11 +1072,15 @@ bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable)
return true; return true;
} }
bool dcn30_does_plane_fit_in_mall(struct dc *dc, struct dc_plane_state *plane, struct dc_cursor_attributes *cursor_attr) bool dcn30_does_plane_fit_in_mall(struct dc *dc,
unsigned int pitch,
unsigned int height,
enum surface_pixel_format format,
struct dc_cursor_attributes *cursor_attr)
{ {
// add meta size? // add meta size?
unsigned int surface_size = plane->plane_size.surface_pitch * plane->plane_size.surface_size.height * unsigned int surface_size = pitch * height *
(plane->format >= SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616 ? 8 : 4); (format >= SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616 ? 8 : 4);
unsigned int mall_size = dc->caps.mall_size_total; unsigned int mall_size = dc->caps.mall_size_total;
unsigned int cursor_size = 0; unsigned int cursor_size = 0;
......
...@@ -71,7 +71,10 @@ void dcn30_set_avmute(struct pipe_ctx *pipe_ctx, bool enable); ...@@ -71,7 +71,10 @@ void dcn30_set_avmute(struct pipe_ctx *pipe_ctx, bool enable);
void dcn30_update_info_frame(struct pipe_ctx *pipe_ctx); void dcn30_update_info_frame(struct pipe_ctx *pipe_ctx);
void dcn30_program_dmdata_engine(struct pipe_ctx *pipe_ctx); void dcn30_program_dmdata_engine(struct pipe_ctx *pipe_ctx);
bool dcn30_does_plane_fit_in_mall(struct dc *dc, struct dc_plane_state *plane, bool dcn30_does_plane_fit_in_mall(struct dc *dc,
unsigned int pitch,
unsigned int height,
enum surface_pixel_format format,
struct dc_cursor_attributes *cursor_attr); struct dc_cursor_attributes *cursor_attr);
bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable); bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable);
......
...@@ -479,39 +479,35 @@ bool dcn32_set_mcm_luts( ...@@ -479,39 +479,35 @@ bool dcn32_set_mcm_luts(
int mpcc_id = pipe_ctx->plane_res.hubp->inst; int mpcc_id = pipe_ctx->plane_res.hubp->inst;
struct mpc *mpc = pipe_ctx->stream_res.opp->ctx->dc->res_pool->mpc; struct mpc *mpc = pipe_ctx->stream_res.opp->ctx->dc->res_pool->mpc;
bool result = true; bool result = true;
struct pwl_params *lut_params = NULL; const struct pwl_params *lut_params = NULL;
// 1D LUT // 1D LUT
if (plane_state->blend_tf) { if (plane_state->blend_tf.type == TF_TYPE_HWPWL)
if (plane_state->blend_tf->type == TF_TYPE_HWPWL) lut_params = &plane_state->blend_tf.pwl;
lut_params = &plane_state->blend_tf->pwl; else if (plane_state->blend_tf.type == TF_TYPE_DISTRIBUTED_POINTS) {
else if (plane_state->blend_tf->type == TF_TYPE_DISTRIBUTED_POINTS) { cm3_helper_translate_curve_to_hw_format(&plane_state->blend_tf,
cm3_helper_translate_curve_to_hw_format(plane_state->blend_tf, &dpp_base->regamma_params, false);
&dpp_base->regamma_params, false); lut_params = &dpp_base->regamma_params;
lut_params = &dpp_base->regamma_params;
}
} }
result = mpc->funcs->program_1dlut(mpc, lut_params, mpcc_id); result = mpc->funcs->program_1dlut(mpc, lut_params, mpcc_id);
lut_params = NULL; lut_params = NULL;
// Shaper // Shaper
if (plane_state->in_shaper_func) { if (plane_state->in_shaper_func.type == TF_TYPE_HWPWL)
if (plane_state->in_shaper_func->type == TF_TYPE_HWPWL) lut_params = &plane_state->in_shaper_func.pwl;
lut_params = &plane_state->in_shaper_func->pwl; else if (plane_state->in_shaper_func.type == TF_TYPE_DISTRIBUTED_POINTS) {
else if (plane_state->in_shaper_func->type == TF_TYPE_DISTRIBUTED_POINTS) { // TODO: dpp_base replace
// TODO: dpp_base replace ASSERT(false);
ASSERT(false); cm3_helper_translate_curve_to_hw_format(&plane_state->in_shaper_func,
cm3_helper_translate_curve_to_hw_format(plane_state->in_shaper_func, &dpp_base->shaper_params, true);
&dpp_base->shaper_params, true); lut_params = &dpp_base->shaper_params;
lut_params = &dpp_base->shaper_params;
}
} }
result = mpc->funcs->program_shaper(mpc, lut_params, mpcc_id); result = mpc->funcs->program_shaper(mpc, lut_params, mpcc_id);
// 3D // 3D
if (plane_state->lut3d_func && plane_state->lut3d_func->state.bits.initialized == 1) if (plane_state->lut3d_func.state.bits.initialized == 1)
result = mpc->funcs->program_3dlut(mpc, &plane_state->lut3d_func->lut_3d, mpcc_id); result = mpc->funcs->program_3dlut(mpc, &plane_state->lut3d_func.lut_3d, mpcc_id);
else else
result = mpc->funcs->program_3dlut(mpc, NULL, mpcc_id); result = mpc->funcs->program_3dlut(mpc, NULL, mpcc_id);
...@@ -528,27 +524,24 @@ bool dcn32_set_input_transfer_func(struct dc *dc, ...@@ -528,27 +524,24 @@ bool dcn32_set_input_transfer_func(struct dc *dc,
enum dc_transfer_func_predefined tf; enum dc_transfer_func_predefined tf;
bool result = true; bool result = true;
struct pwl_params *params = NULL; const struct pwl_params *params = NULL;
if (mpc == NULL || plane_state == NULL) if (mpc == NULL || plane_state == NULL)
return false; return false;
tf = TRANSFER_FUNCTION_UNITY; tf = TRANSFER_FUNCTION_UNITY;
if (plane_state->in_transfer_func && if (plane_state->in_transfer_func.type == TF_TYPE_PREDEFINED)
plane_state->in_transfer_func->type == TF_TYPE_PREDEFINED) tf = plane_state->in_transfer_func.tf;
tf = plane_state->in_transfer_func->tf;
dpp_base->funcs->dpp_set_pre_degam(dpp_base, tf); dpp_base->funcs->dpp_set_pre_degam(dpp_base, tf);
if (plane_state->in_transfer_func) { if (plane_state->in_transfer_func.type == TF_TYPE_HWPWL)
if (plane_state->in_transfer_func->type == TF_TYPE_HWPWL) params = &plane_state->in_transfer_func.pwl;
params = &plane_state->in_transfer_func->pwl; else if (plane_state->in_transfer_func.type == TF_TYPE_DISTRIBUTED_POINTS &&
else if (plane_state->in_transfer_func->type == TF_TYPE_DISTRIBUTED_POINTS && cm3_helper_translate_curve_to_hw_format(&plane_state->in_transfer_func,
cm3_helper_translate_curve_to_hw_format(plane_state->in_transfer_func, &dpp_base->degamma_params, false))
&dpp_base->degamma_params, false)) params = &dpp_base->degamma_params;
params = &dpp_base->degamma_params;
}
dpp_base->funcs->dpp_program_gamcor_lut(dpp_base, params); dpp_base->funcs->dpp_program_gamcor_lut(dpp_base, params);
...@@ -566,24 +559,24 @@ bool dcn32_set_output_transfer_func(struct dc *dc, ...@@ -566,24 +559,24 @@ bool dcn32_set_output_transfer_func(struct dc *dc,
{ {
int mpcc_id = pipe_ctx->plane_res.hubp->inst; int mpcc_id = pipe_ctx->plane_res.hubp->inst;
struct mpc *mpc = pipe_ctx->stream_res.opp->ctx->dc->res_pool->mpc; struct mpc *mpc = pipe_ctx->stream_res.opp->ctx->dc->res_pool->mpc;
struct pwl_params *params = NULL; const struct pwl_params *params = NULL;
bool ret = false; bool ret = false;
/* program OGAM or 3DLUT only for the top pipe*/ /* program OGAM or 3DLUT only for the top pipe*/
if (resource_is_pipe_type(pipe_ctx, OPP_HEAD)) { if (resource_is_pipe_type(pipe_ctx, OPP_HEAD)) {
/*program shaper and 3dlut in MPC*/ /*program shaper and 3dlut in MPC*/
ret = dcn32_set_mpc_shaper_3dlut(pipe_ctx, stream); ret = dcn32_set_mpc_shaper_3dlut(pipe_ctx, stream);
if (ret == false && mpc->funcs->set_output_gamma && stream->out_transfer_func) { if (ret == false && mpc->funcs->set_output_gamma) {
if (stream->out_transfer_func->type == TF_TYPE_HWPWL) if (stream->out_transfer_func.type == TF_TYPE_HWPWL)
params = &stream->out_transfer_func->pwl; params = &stream->out_transfer_func.pwl;
else if (pipe_ctx->stream->out_transfer_func->type == else if (pipe_ctx->stream->out_transfer_func.type ==
TF_TYPE_DISTRIBUTED_POINTS && TF_TYPE_DISTRIBUTED_POINTS &&
cm3_helper_translate_curve_to_hw_format( cm3_helper_translate_curve_to_hw_format(
stream->out_transfer_func, &stream->out_transfer_func,
&mpc->blender_params, false)) &mpc->blender_params, false))
params = &mpc->blender_params; params = &mpc->blender_params;
/* there are no ROM LUTs in OUTGAM */ /* there are no ROM LUTs in OUTGAM */
if (stream->out_transfer_func->type == TF_TYPE_PREDEFINED) if (stream->out_transfer_func.type == TF_TYPE_PREDEFINED)
BREAK_TO_DEBUGGER(); BREAK_TO_DEBUGGER();
} }
} }
......
...@@ -377,7 +377,10 @@ struct hw_sequencer_funcs { ...@@ -377,7 +377,10 @@ struct hw_sequencer_funcs {
/* Idle Optimization Related */ /* Idle Optimization Related */
bool (*apply_idle_power_optimizations)(struct dc *dc, bool enable); bool (*apply_idle_power_optimizations)(struct dc *dc, bool enable);
bool (*does_plane_fit_in_mall)(struct dc *dc, struct dc_plane_state *plane, bool (*does_plane_fit_in_mall)(struct dc *dc,
unsigned int pitch,
unsigned int height,
enum surface_pixel_format format,
struct dc_cursor_attributes *cursor_attr); struct dc_cursor_attributes *cursor_attr);
void (*commit_subvp_config)(struct dc *dc, struct dc_state *context); void (*commit_subvp_config)(struct dc *dc, struct dc_state *context);
void (*enable_phantom_streams)(struct dc *dc, struct dc_state *context); void (*enable_phantom_streams)(struct dc *dc, struct dc_state *context);
......
...@@ -322,7 +322,7 @@ struct dpp_funcs { ...@@ -322,7 +322,7 @@ struct dpp_funcs {
const struct pwl_params *params); const struct pwl_params *params);
bool (*dpp_program_3dlut)( bool (*dpp_program_3dlut)(
struct dpp *dpp, struct dpp *dpp,
struct tetrahedral_params *params); const struct tetrahedral_params *params);
void (*dpp_cnv_set_alpha_keyer)( void (*dpp_cnv_set_alpha_keyer)(
struct dpp *dpp_base, struct dpp *dpp_base,
struct cnv_color_keyer_params *color_keyer); struct cnv_color_keyer_params *color_keyer);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment