[Openchrome-devel] xf86-video-openchrome: 3 commits - configure.ac src/via_driver.c src/via_kms.h src/via_ums.c
Kevin Brace
kevinbrace at kemper.freedesktop.org
Sun May 29 08:11:27 UTC 2016
configure.ac | 2
src/via_driver.c | 132 +++++++++++++++++++++++++++++++++++--------------------
src/via_kms.h | 2
src/via_ums.c | 39 ++++++----------
4 files changed, 103 insertions(+), 72 deletions(-)
New commits:
commit 21ae2b4c3c02812a69e9162791c6db2e6ec36842
Author: Kevin Brace <kevinbrace at gmx.com>
Date: Sun May 29 00:44:08 2016 -0700
Version bumped to 0.4.158
This version includes initial support for RandR and a fix for
runtime screen resize bug. Please start testing this version since
there will be a feature freeze for Version 0.5 soon. Enjoy!!!
Signed-off-by: Kevin Brace <kevinbrace at gmx.com>
diff --git a/configure.ac b/configure.ac
index d9b12e7..9673ce6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -23,7 +23,7 @@
# Initialize Autoconf
AC_PREREQ(2.57)
AC_INIT([xf86-video-openchrome],
- [0.4.157],
+ [0.4.158],
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/openchrome],
[xf86-video-openchrome])
commit 19065ceb96cce922191121f917f1ce079e7a4876
Author: Kevin Brace <kevinbrace at gmx.com>
Date: Sun May 29 00:30:51 2016 -0700
Limit X and Y direction screen resolution
In order to support RandR properly, the supported X direction
total screen size will be limited to 2048 dots for 32-bit color
mode and 4096 dots for 16-bit color mode. For now, Y direction
total screen size will be symmetrical with respect to the X
direction total screen size. With this fix, RandR should work
for most users, and you can now use 2 monitors to display your
extended desktop screen. Enjoy!!!
Signed-off-by: Kevin Brace <kevinbrace at gmx.com>
diff --git a/src/via_ums.c b/src/via_ums.c
index 5e42381..7473e45 100644
--- a/src/via_ums.c
+++ b/src/via_ums.c
@@ -985,30 +985,6 @@ umsCrtcInit(ScrnInfoPtr pScrn)
iga2_rec->index = 1;
iga2->driver_private = iga2_rec;
- /*
- * CLE266A:
- * Max Line Pitch: 4080, (FB corruption when higher, driver problem?)
- * Max Height: 4096 (and beyond)
- *
- * CLE266A: primary AdjustFrame can use only 24 bits, so we are limited
- * to 12x11 bits; 4080x2048 (~2:1), 3344x2508 (4:3), or 2896x2896 (1:1).
- * TODO Test CLE266Cx, KM400, KM400A, K8M800, CN400 please.
- *
- * We should be able to limit the memory available for a mode to 32 MB,
- * but miScanLineWidth fails to catch this properly (apertureSize).
- */
- switch (pVia->Chipset) {
- case VIA_CLE266:
- case VIA_KM400:
- max_pitch = 3344;
- max_height = 2508;
- break;
- default:
- max_pitch = 16384 / (pScrn->bitsPerPixel >> 3);
- max_height = max_pitch;
- break;
- }
-
/* Init HI_X0 for cursor */
switch (pVia->Chipset) {
case VIA_CX700:
@@ -1039,6 +1015,21 @@ umsCrtcInit(ScrnInfoPtr pScrn)
break;
}
+ /*
+ * CLE266A:
+ * Max Line Pitch: 4080, (FB corruption when higher, driver problem?)
+ * Max Height: 4096 (and beyond)
+ *
+ * CLE266A: primary AdjustFrame can use only 24 bits, so we are limited
+ * to 12x11 bits; 4080x2048 (~2:1), 3344x2508 (4:3), or 2896x2896 (1:1).
+ * TODO Test CLE266Cx, KM400, KM400A, K8M800, CN400 please.
+ *
+ * We should be able to limit the memory available for a mode to 32 MB,
+ * but miScanLineWidth fails to catch this properly (apertureSize).
+ */
+ max_pitch = 8192 / ((pScrn->bitsPerPixel + 7) >> 3);
+ max_height = max_pitch;
+
xf86CrtcSetSizeRange(pScrn, 320, 200, max_pitch, max_height);
viaOutputDetect(pScrn);
commit 25787b7ada1e114d5e0f3692ec96e8d0c1420a8b
Author: Kevin Brace <kevinbrace at gmx.com>
Date: Sun May 29 00:10:47 2016 -0700
Fix a fatal regression impacting runtime screen resize
It was discovered that a commit done between Version 0.3.2
and Version 0.3.3 broke the screen resize functionality
(Commit cee0a1fab9cade87e6de16c67cd34c84cf697531). This led to
an X Server crash if the screen was resized from a screen resize
utility. With this fix, the screen resolution can now be changed
from the screen resize utility safely.
Signed-off-by: Kevin Brace <kevinbrace at gmx.com>
diff --git a/src/via_driver.c b/src/via_driver.c
index 2390b43..2893abd 100644
--- a/src/via_driver.c
+++ b/src/via_driver.c
@@ -781,87 +781,108 @@ static Bool
via_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
{
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- struct buffer_object *old_front = NULL, *new_front = NULL;
- int cpp = (scrn->bitsPerPixel + 7) >> 3, fd, i;
- int old_width, old_height, old_dwidth, format;
+ xf86CrtcPtr crtc = NULL;
ScreenPtr screen = scrn->pScreen;
VIAPtr pVia = VIAPTR(scrn);
+ drmmode_crtc_private_ptr drmmode_crtc
+ = xf86_config->crtc[0]->driver_private;
+ drmmode_ptr drmmode = drmmode_crtc->drmmode;
+ struct buffer_object *old_front = NULL;
void *new_pixels = NULL;
+ PixmapPtr ppix;
+ int old_width, old_height, old_displayWidth, old_fd;
uint32_t old_fb_id;
+ int format, i;
Bool ret = FALSE;
- PixmapPtr ppix;
- if (scrn->virtualX == width && scrn->virtualY == height)
+ DEBUG(xf86DrvMsg(scrn->scrnIndex, X_INFO,
+ "Entered via_xf86crtc_resize.\n"));
+ xf86DrvMsg(scrn->scrnIndex, X_INFO,
+ "Now attempting to resize the screen . . .\n");
+
+ if ((scrn->virtualX == width) && (scrn->virtualY == height)) {
+ xf86DrvMsg(scrn->scrnIndex, X_INFO,
+ "It was determined that there is no need to resize the "
+ "screen.\n");
+ DEBUG(xf86DrvMsg(scrn->scrnIndex, X_INFO,
+ "Exiting via_xf86crtc_resize.\n"));
return TRUE;
+ }
+
+ /* Preserve the old screen information just in case they need to
+ * be restored. */
+ old_width = scrn->virtualX;
+ old_height = scrn->virtualY;
+ old_displayWidth = scrn->displayWidth;
+ old_fd = drmmode->fd;
+ old_fb_id = drmmode->fb_id;
+ old_front = drmmode->front_bo;
format = map_legacy_formats(scrn->bitsPerPixel, scrn->depth);
- new_front = drm_bo_alloc_surface(scrn, width, height, format,
+ drmmode->front_bo = drm_bo_alloc_surface(scrn, width, height, format,
16, TTM_PL_FLAG_VRAM);
- if (!new_front)
+ if (!drmmode->front_bo) {
goto fail;
+ }
xf86DrvMsg(scrn->scrnIndex, X_INFO,
- "Allocate new frame buffer %dx%d stride %lu\n",
- width, height, new_front->pitch);
+ "Allocated a new frame buffer: %dx%d\n",
+ width, height);
- new_pixels = drm_bo_map(scrn, new_front);
- if (!new_pixels)
+ new_pixels = drm_bo_map(scrn, drmmode->front_bo);
+ if (!new_pixels) {
goto fail;
+ }
if (pVia->shadowFB) {
- new_pixels = malloc(height * new_front->pitch);
- if (!new_pixels)
+ new_pixels = malloc(height * drmmode->front_bo->pitch);
+ if (!new_pixels) {
goto fail;
+ }
+
free(pVia->ShadowPtr);
pVia->ShadowPtr = new_pixels;
}
+ scrn->virtualX = width;
+ scrn->virtualY = height;
+ scrn->displayWidth = (drmmode->front_bo->pitch)
+ / ((scrn->bitsPerPixel + 7) >> 3);
+
ppix = screen->GetScreenPixmap(screen);
if (!screen->ModifyPixmapHeader(ppix, width, height, -1, -1,
- new_front->pitch,
- new_pixels))
+ drmmode->front_bo->pitch,
+ new_pixels)) {
goto fail;
+ }
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,9,99,1,0)
scrn->pixmapPrivate.ptr = ppix->devPrivate.ptr;
#endif
- scrn->virtualX = width;
- scrn->virtualY = height;
- scrn->displayWidth = new_front->pitch / cpp;
+
for (i = 0; i < xf86_config->num_crtc; i++) {
- xf86CrtcPtr crtc = xf86_config->crtc[i];
- drmmode_crtc_private_ptr drmmode_crtc;
- drmmode_ptr drmmode;
+ crtc = xf86_config->crtc[i];
- if (!xf86CrtcInUse(crtc) || !crtc->driver_private)
+ if (!xf86CrtcInUse(crtc)) {
continue;
-
- drmmode_crtc = crtc->driver_private;
- drmmode = drmmode_crtc->drmmode;
-
- if (drmmode->front_bo != new_front) {
- old_front = drmmode->front_bo;
- old_fb_id = drmmode->fb_id;
- fd = drmmode->fd;
-
- drmmode->front_bo = new_front;
- drmmode->fb_id = 0;
}
- ret = xf86CrtcSetMode(crtc, &crtc->desiredMode, crtc->rotation,
- crtc->x, crtc->y);
+ ret = xf86CrtcSetMode(crtc,
+ &crtc->desiredMode,
+ crtc->desiredRotation,
+ crtc->desiredX, crtc->desiredY);
if (!ret) {
- drmmode->front_bo = old_front;
- drmmode->fb_id = old_fb_id;
- xf86DrvMsg(scrn->scrnIndex, X_INFO, "xf86CrtcSetMode failed\n");
+ xf86DrvMsg(scrn->scrnIndex, X_INFO,
+ "Mode setting failed.\n");
goto fail;
}
}
#ifdef HAVE_DRI
- if (pVia->KMS && old_fb_id)
- drmModeRmFB(fd, old_fb_id);
+ if (pVia->KMS && old_fb_id) {
+ drmModeRmFB(old_fd, old_fb_id);
+ }
#endif
if (old_front) {
@@ -869,17 +890,36 @@ via_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
drm_bo_free(scrn, old_front);
}
- return ret;
+ xf86DrvMsg(scrn->scrnIndex, X_INFO,
+ "Screen resize successful.\n");
+ DEBUG(xf86DrvMsg(scrn->scrnIndex, X_INFO,
+ "Exiting via_xf86crtc_resize.\n"));
+ return TRUE;
fail:
- if (new_front) {
- drm_bo_unmap(scrn, new_front);
- drm_bo_free(scrn, new_front);
+ if (drmmode->front_bo) {
+ drm_bo_unmap(scrn, drmmode->front_bo);
+ drm_bo_free(scrn, drmmode->front_bo);
}
- scrn->virtualY = old_height;
scrn->virtualX = old_width;
- scrn->displayWidth = old_dwidth;
+ scrn->virtualY = old_height;
+ scrn->displayWidth = old_displayWidth;
+
+#ifdef HAVE_DRI
+ if (pVia->KMS && (old_fb_id != drmmode->fb_id)) {
+ drmModeRmFB(old_fd, old_fb_id);
+ }
+#endif
+
+ drmmode->fd = old_fd;
+ drmmode->fb_id = old_fb_id;
+ drmmode->front_bo = old_front;
+
+ xf86DrvMsg(scrn->scrnIndex, X_INFO,
+ "An error occurred during screen resize.\n");
+ DEBUG(xf86DrvMsg(scrn->scrnIndex, X_INFO,
+ "Exiting via_xf86crtc_resize.\n"));
return FALSE;
}
diff --git a/src/via_kms.h b/src/via_kms.h
index 1511a8f..2085f62 100644
--- a/src/via_kms.h
+++ b/src/via_kms.h
@@ -36,7 +36,7 @@
typedef struct {
int fd;
- unsigned fb_id;
+ uint32_t fb_id;
#ifdef HAVE_DRI
drmModeResPtr mode_res;
drmModeFBPtr mode_fb;
More information about the Openchrome-devel
mailing list