drm/i915: Pass 90/270 vs. 0/180 rotation info for intel_gen4_compute_page_offset()
The page aligned surface address calculation needs to know which way things are rotated. The contract now says that the caller must pass the rotate x/y coordinates, as well as the tile_height aligned stride in the tile_height direction. This will make it fairly simple to deal with 90/270 degree rotation on SKL+ where we have to deal with the rotated view into the GTT. v2: Pass rotation instead of bool even thoughwe only care about 0/180 vs. 90/270 v3: Introduce intel_tile_dims(), and don't mix up different units so much v4: Unconfuse bytes vs. pixels even more Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1455569699-27905-4-git-send-email-ville.syrjala@linux.intel.com Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
此提交包含在:
@@ -193,7 +193,7 @@ skl_update_plane(struct drm_plane *drm_plane,
|
||||
const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
|
||||
u32 surf_addr;
|
||||
u32 tile_height, plane_offset, plane_size;
|
||||
unsigned int rotation;
|
||||
unsigned int rotation = plane_state->base.rotation;
|
||||
int x_offset, y_offset;
|
||||
int crtc_x = plane_state->dst.x1;
|
||||
int crtc_y = plane_state->dst.y1;
|
||||
@@ -213,7 +213,6 @@ skl_update_plane(struct drm_plane *drm_plane,
|
||||
plane_ctl |= skl_plane_ctl_format(fb->pixel_format);
|
||||
plane_ctl |= skl_plane_ctl_tiling(fb->modifier[0]);
|
||||
|
||||
rotation = plane_state->base.rotation;
|
||||
plane_ctl |= skl_plane_ctl_rotation(rotation);
|
||||
|
||||
stride_div = intel_fb_stride_alignment(dev_priv, fb->modifier[0],
|
||||
@@ -351,6 +350,7 @@ vlv_update_plane(struct drm_plane *dplane,
|
||||
int plane = intel_plane->plane;
|
||||
u32 sprctl;
|
||||
u32 sprsurf_offset, linear_offset;
|
||||
unsigned int rotation = dplane->state->rotation;
|
||||
int cpp = drm_format_plane_cpp(fb->pixel_format, 0);
|
||||
const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
|
||||
int crtc_x = plane_state->dst.x1;
|
||||
@@ -425,10 +425,10 @@ vlv_update_plane(struct drm_plane *dplane,
|
||||
linear_offset = y * fb->pitches[0] + x * cpp;
|
||||
sprsurf_offset = intel_compute_tile_offset(dev_priv, &x, &y,
|
||||
fb->modifier[0], cpp,
|
||||
fb->pitches[0]);
|
||||
fb->pitches[0], rotation);
|
||||
linear_offset -= sprsurf_offset;
|
||||
|
||||
if (plane_state->base.rotation == BIT(DRM_ROTATE_180)) {
|
||||
if (rotation == BIT(DRM_ROTATE_180)) {
|
||||
sprctl |= SP_ROTATE_180;
|
||||
|
||||
x += src_w;
|
||||
@@ -493,6 +493,7 @@ ivb_update_plane(struct drm_plane *plane,
|
||||
enum pipe pipe = intel_plane->pipe;
|
||||
u32 sprctl, sprscale = 0;
|
||||
u32 sprsurf_offset, linear_offset;
|
||||
unsigned int rotation = plane_state->base.rotation;
|
||||
int cpp = drm_format_plane_cpp(fb->pixel_format, 0);
|
||||
const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
|
||||
int crtc_x = plane_state->dst.x1;
|
||||
@@ -558,10 +559,10 @@ ivb_update_plane(struct drm_plane *plane,
|
||||
linear_offset = y * fb->pitches[0] + x * cpp;
|
||||
sprsurf_offset = intel_compute_tile_offset(dev_priv, &x, &y,
|
||||
fb->modifier[0], cpp,
|
||||
fb->pitches[0]);
|
||||
fb->pitches[0], rotation);
|
||||
linear_offset -= sprsurf_offset;
|
||||
|
||||
if (plane_state->base.rotation == BIT(DRM_ROTATE_180)) {
|
||||
if (rotation == BIT(DRM_ROTATE_180)) {
|
||||
sprctl |= SPRITE_ROTATE_180;
|
||||
|
||||
/* HSW and BDW does this automagically in hardware */
|
||||
@@ -634,6 +635,7 @@ ilk_update_plane(struct drm_plane *plane,
|
||||
int pipe = intel_plane->pipe;
|
||||
u32 dvscntr, dvsscale;
|
||||
u32 dvssurf_offset, linear_offset;
|
||||
unsigned int rotation = plane_state->base.rotation;
|
||||
int cpp = drm_format_plane_cpp(fb->pixel_format, 0);
|
||||
const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
|
||||
int crtc_x = plane_state->dst.x1;
|
||||
@@ -695,10 +697,10 @@ ilk_update_plane(struct drm_plane *plane,
|
||||
linear_offset = y * fb->pitches[0] + x * cpp;
|
||||
dvssurf_offset = intel_compute_tile_offset(dev_priv, &x, &y,
|
||||
fb->modifier[0], cpp,
|
||||
fb->pitches[0]);
|
||||
fb->pitches[0], rotation);
|
||||
linear_offset -= dvssurf_offset;
|
||||
|
||||
if (plane_state->base.rotation == BIT(DRM_ROTATE_180)) {
|
||||
if (rotation == BIT(DRM_ROTATE_180)) {
|
||||
dvscntr |= DVS_ROTATE_180;
|
||||
|
||||
x += src_w;
|
||||
|
新增問題並參考
封鎖使用者