From 6fdcc7dd9a7183970140b6b0f6a4445207709922 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Thu, 7 Jul 2011 16:01:57 +1000 Subject: [PATCH] --- yaml --- r: 269641 b: refs/heads/master c: f3fdc52dd73a083dcb80f95e5c6ce8a33277b102 h: refs/heads/master i: 269639: 2b1b354d09c56718475a131feeea704e2fe67210 v: v3 --- [refs] | 2 +- trunk/drivers/gpu/drm/nouveau/nvd0_display.c | 37 +++++++++++++++++--- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index c440b64c8b7f..f41758e39e88 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a46232ee09064351246c6f7134c81790ef737874 +refs/heads/master: f3fdc52dd73a083dcb80f95e5c6ce8a33277b102 diff --git a/trunk/drivers/gpu/drm/nouveau/nvd0_display.c b/trunk/drivers/gpu/drm/nouveau/nvd0_display.c index 4fadea47b3b4..d85b25939653 100644 --- a/trunk/drivers/gpu/drm/nouveau/nvd0_display.c +++ b/trunk/drivers/gpu/drm/nouveau/nvd0_display.c @@ -150,16 +150,43 @@ nvd0_crtc_set_scale(struct nouveau_crtc *nv_crtc, int type, bool update) { struct drm_display_mode *mode = &nv_crtc->base.mode; struct drm_device *dev = nv_crtc->base.dev; - u32 *push; + struct nouveau_connector *nv_connector; + u32 *push, outX, outY; - /*XXX: actually handle scaling */ + outX = mode->hdisplay; + outY = mode->vdisplay; + + nv_connector = nouveau_crtc_connector_get(nv_crtc); + if (nv_connector && nv_connector->native_mode) { + struct drm_display_mode *native = nv_connector->native_mode; + u32 xratio = (native->hdisplay << 19) / mode->hdisplay; + u32 yratio = (native->vdisplay << 19) / mode->vdisplay; + + switch (type) { + case DRM_MODE_SCALE_ASPECT: + if (xratio > yratio) { + outX = (mode->hdisplay * yratio) >> 19; + outY = (mode->vdisplay * yratio) >> 19; + } else { + outX = (mode->hdisplay * xratio) >> 19; + outY = (mode->vdisplay * xratio) >> 19; + } + break; + case DRM_MODE_SCALE_FULLSCREEN: + outX = native->hdisplay; + outY = native->vdisplay; + break; + default: + break; + } + } push = evo_wait(dev, 0, 16); if (push) { evo_mthd(push, 0x04c0 + (nv_crtc->index * 0x300), 3); - evo_data(push, (mode->vdisplay << 16) | mode->hdisplay); - evo_data(push, (mode->vdisplay << 16) | mode->hdisplay); - evo_data(push, (mode->vdisplay << 16) | mode->hdisplay); + evo_data(push, (outY << 16) | outX); + evo_data(push, (outY << 16) | outX); + evo_data(push, (outY << 16) | outX); evo_mthd(push, 0x0494 + (nv_crtc->index * 0x300), 1); evo_data(push, 0x00000000); evo_mthd(push, 0x04b0 + (nv_crtc->index * 0x300), 1);