drm/vmwgfx: Add gui_x/y to vmw_connector_state
As gui_x/y positioning is display unit is protected by requested_layout_mutex adding vmw_connector_state copy of the same and modeset commit will refer the state copy to sync with modeset_check state. v2: Tested with CONFIG_PROVE_LOCKING enabled. Signed-off-by: Deepak Rawat <drawat@vmware.com> Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com> Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
This commit is contained in:

committed by
Thomas Hellstrom

父節點
b89e5ff9ee
當前提交
3e79ecdad8
@@ -109,7 +109,7 @@ static void vmw_sou_crtc_destroy(struct drm_crtc *crtc)
|
||||
*/
|
||||
static int vmw_sou_fifo_create(struct vmw_private *dev_priv,
|
||||
struct vmw_screen_object_unit *sou,
|
||||
uint32_t x, uint32_t y,
|
||||
int x, int y,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
size_t fifo_size;
|
||||
@@ -139,13 +139,8 @@ static int vmw_sou_fifo_create(struct vmw_private *dev_priv,
|
||||
(sou->base.unit == 0 ? SVGA_SCREEN_IS_PRIMARY : 0);
|
||||
cmd->obj.size.width = mode->hdisplay;
|
||||
cmd->obj.size.height = mode->vdisplay;
|
||||
if (sou->base.is_implicit) {
|
||||
cmd->obj.root.x = x;
|
||||
cmd->obj.root.y = y;
|
||||
} else {
|
||||
cmd->obj.root.x = sou->base.gui_x;
|
||||
cmd->obj.root.y = sou->base.gui_y;
|
||||
}
|
||||
cmd->obj.root.x = x;
|
||||
cmd->obj.root.y = y;
|
||||
sou->base.set_gui_x = cmd->obj.root.x;
|
||||
sou->base.set_gui_y = cmd->obj.root.y;
|
||||
|
||||
@@ -222,12 +217,11 @@ static void vmw_sou_crtc_mode_set_nofb(struct drm_crtc *crtc)
|
||||
struct vmw_plane_state *vps;
|
||||
int ret;
|
||||
|
||||
|
||||
sou = vmw_crtc_to_sou(crtc);
|
||||
sou = vmw_crtc_to_sou(crtc);
|
||||
dev_priv = vmw_priv(crtc->dev);
|
||||
ps = crtc->primary->state;
|
||||
fb = ps->fb;
|
||||
vps = vmw_plane_state_to_vps(ps);
|
||||
ps = crtc->primary->state;
|
||||
fb = ps->fb;
|
||||
vps = vmw_plane_state_to_vps(ps);
|
||||
|
||||
vfb = (fb) ? vmw_framebuffer_to_vfb(fb) : NULL;
|
||||
|
||||
@@ -240,11 +234,25 @@ static void vmw_sou_crtc_mode_set_nofb(struct drm_crtc *crtc)
|
||||
}
|
||||
|
||||
if (vfb) {
|
||||
struct drm_connector_state *conn_state;
|
||||
struct vmw_connector_state *vmw_conn_state;
|
||||
int x, y;
|
||||
|
||||
sou->buffer = vps->bo;
|
||||
sou->buffer_size = vps->bo_size;
|
||||
|
||||
ret = vmw_sou_fifo_create(dev_priv, sou, crtc->x, crtc->y,
|
||||
&crtc->mode);
|
||||
if (sou->base.is_implicit) {
|
||||
x = crtc->x;
|
||||
y = crtc->y;
|
||||
} else {
|
||||
conn_state = sou->base.connector.state;
|
||||
vmw_conn_state = vmw_connector_state_to_vcs(conn_state);
|
||||
|
||||
x = vmw_conn_state->gui_x;
|
||||
y = vmw_conn_state->gui_y;
|
||||
}
|
||||
|
||||
ret = vmw_sou_fifo_create(dev_priv, sou, x, y, &crtc->mode);
|
||||
if (ret)
|
||||
DRM_ERROR("Failed to define Screen Object %dx%d\n",
|
||||
crtc->x, crtc->y);
|
||||
|
Reference in New Issue
Block a user