mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-20 14:13:16 +00:00
4f8b350be0
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
74 lines
2.5 KiB
Diff
74 lines
2.5 KiB
Diff
From 58a92eae6ed463c294381e72eefec701d23fcdaf Mon Sep 17 00:00:00 2001
|
|
From: Boris Brezillon <boris.brezillon@bootlin.com>
|
|
Date: Fri, 3 Aug 2018 11:22:30 +0200
|
|
Subject: [PATCH 759/806] drm/vc4: Move ->offsets[] adjustment out of
|
|
setup_clipping_and_scaling()
|
|
|
|
The offset adjustment depends on the framebuffer modified, so let's
|
|
just move this operation in the DRM_FORMAT_MOD_LINEAR case inside
|
|
vc4_plane_mode_set().
|
|
|
|
This we'll be able to fix offset calculation for
|
|
DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED and DRM_FORMAT_MOD_BROADCOM_SANDXXX.
|
|
|
|
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
|
|
Reviewed-by: Eric Anholt <eric@anholt.net>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20180803092231.26446-4-boris.brezillon@bootlin.com
|
|
---
|
|
drivers/gpu/drm/vc4/vc4_plane.c | 26 ++++++++++++++++----------
|
|
1 file changed, 16 insertions(+), 10 deletions(-)
|
|
|
|
--- a/drivers/gpu/drm/vc4/vc4_plane.c
|
|
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
|
|
@@ -406,16 +406,6 @@ static int vc4_plane_setup_clipping_and_
|
|
vc4_state->y_scaling[1] = VC4_SCALING_NONE;
|
|
}
|
|
|
|
- /* Adjust the base pointer to the first pixel to be scanned out. */
|
|
- for (i = 0; i < num_planes; i++) {
|
|
- vc4_state->offsets[i] += (vc4_state->src_y /
|
|
- (i ? v_subsample : 1)) *
|
|
- fb->pitches[i];
|
|
- vc4_state->offsets[i] += (vc4_state->src_x /
|
|
- (i ? h_subsample : 1)) *
|
|
- fb->format->cpp[i];
|
|
- }
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
@@ -523,6 +513,7 @@ static int vc4_plane_mode_set(struct drm
|
|
const struct hvs_format *format = vc4_get_hvs_format(fb->format->format);
|
|
u64 base_format_mod = fourcc_mod_broadcom_mod(fb->modifier);
|
|
int num_planes = drm_format_num_planes(format->drm);
|
|
+ u32 h_subsample, v_subsample;
|
|
bool mix_plane_alpha;
|
|
bool covers_screen;
|
|
u32 scl0, scl1, pitch0;
|
|
@@ -568,10 +559,25 @@ static int vc4_plane_mode_set(struct drm
|
|
scl1 = vc4_get_scl_field(state, 0);
|
|
}
|
|
|
|
+ h_subsample = drm_format_horz_chroma_subsampling(format->drm);
|
|
+ v_subsample = drm_format_vert_chroma_subsampling(format->drm);
|
|
+
|
|
switch (base_format_mod) {
|
|
case DRM_FORMAT_MOD_LINEAR:
|
|
tiling = SCALER_CTL0_TILING_LINEAR;
|
|
pitch0 = VC4_SET_FIELD(fb->pitches[0], SCALER_SRC_PITCH);
|
|
+
|
|
+ /* Adjust the base pointer to the first pixel to be scanned
|
|
+ * out.
|
|
+ */
|
|
+ for (i = 0; i < num_planes; i++) {
|
|
+ vc4_state->offsets[i] += vc4_state->src_y /
|
|
+ (i ? v_subsample : 1) *
|
|
+ fb->pitches[i];
|
|
+ vc4_state->offsets[i] += vc4_state->src_x /
|
|
+ (i ? h_subsample : 1) *
|
|
+ fb->format->cpp[i];
|
|
+ }
|
|
break;
|
|
|
|
case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED: {
|