[PATCH] drm/amd/display: Respect DRM framebuffer info for video surfaces
Wentland, Harry
Harry.Wentland at amd.com
Wed Mar 13 17:58:10 UTC 2019
On 2019-03-13 12:35 p.m., Nicholas Kazlauskas wrote:
> [Why]
> Incorrect hardcoded assumptions are made regarding luma and chroma
> alignment. The actual values set for the DRM framebuffer should be used
> when programming the address.
>
> [How]
> Respect the given pitch for both luma and chroma planes - it's not like
> we can force the alignment to anything else at this point anyway.
>
> Use the FB offset for the chroma planes directly. DRM already
> provides this to us so there's no need to calculate it manually.
>
> While we don't actually use the chroma surface size parameters on Raven,
> these should have technically been fb->width / 2 and fb->height / 2
> since the chroma plane is half size of the luma plane for NV12.
>
> Leave a TODO indicating that those should be set based on the actual
> surface format instead since this is only correct for YUV420 formats.
>
> Cc: Leo Li <sunpeng.li at amd.com>
> Cc: Harry Wentland <harry.wentland at amd.com>
> Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas at amd.com>
Reviewed-by: Harry Wentland <harry.wentland at amd.com>
Harry
> ---
> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 21 +++++++++----------
> 1 file changed, 10 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index cde0da3ae964..5f1e23ba75e1 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -2465,8 +2465,7 @@ fill_plane_tiling_attributes(struct amdgpu_device *adev,
> address->grph.addr.high_part = upper_32_bits(afb->address);
> } else {
> const struct drm_framebuffer *fb = &afb->base;
> - uint64_t awidth = ALIGN(fb->width, 64);
> - uint64_t chroma_addr = afb->address + awidth * fb->height;
> + uint64_t chroma_addr = afb->address + fb->offsets[1];
>
> address->type = PLN_ADDR_TYPE_VIDEO_PROGRESSIVE;
> address->video_progressive.luma_addr.low_part =
> @@ -2542,7 +2541,6 @@ static int fill_plane_attributes_from_fb(struct amdgpu_device *adev,
> const struct amdgpu_framebuffer *amdgpu_fb)
> {
> uint64_t tiling_flags;
> - unsigned int awidth;
> const struct drm_framebuffer *fb = &amdgpu_fb->base;
> int ret = 0;
> struct drm_format_name_buf format_name;
> @@ -2602,20 +2600,21 @@ static int fill_plane_attributes_from_fb(struct amdgpu_device *adev,
> plane_state->color_space = COLOR_SPACE_SRGB;
>
> } else {
> - awidth = ALIGN(fb->width, 64);
> -
> plane_state->plane_size.video.luma_size.x = 0;
> plane_state->plane_size.video.luma_size.y = 0;
> - plane_state->plane_size.video.luma_size.width = awidth;
> + plane_state->plane_size.video.luma_size.width = fb->width;
> plane_state->plane_size.video.luma_size.height = fb->height;
> - /* TODO: unhardcode */
> - plane_state->plane_size.video.luma_pitch = awidth;
> + plane_state->plane_size.video.luma_pitch =
> + fb->pitches[0] / fb->format->cpp[0];
>
> plane_state->plane_size.video.chroma_size.x = 0;
> plane_state->plane_size.video.chroma_size.y = 0;
> - plane_state->plane_size.video.chroma_size.width = awidth;
> - plane_state->plane_size.video.chroma_size.height = fb->height;
> - plane_state->plane_size.video.chroma_pitch = awidth / 2;
> + /* TODO: set these based on surface format */
> + plane_state->plane_size.video.chroma_size.width = fb->width / 2;
> + plane_state->plane_size.video.chroma_size.height = fb->height / 2;
> +
> + plane_state->plane_size.video.chroma_pitch =
> + fb->pitches[1] / fb->format->cpp[1];
>
> /* TODO: unhardcode */
> plane_state->color_space = COLOR_SPACE_YCBCR709;
>
More information about the amd-gfx
mailing list