linux-fbdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Antonino A. Daplas" <adaplas@hotpop.com>
To: David Eger <eger@havoc.gtf.org>
Cc: James Simmons <jsimmons@infradead.org>,
	Andrew Morton <akpm@osdl.org>,
	Linux Fbdev development list
	<linux-fbdev-devel@lists.sourceforge.net>
Subject: Re: [PATCH][RIVAFB]: Updates to rivafb driver
Date: Wed, 16 Jun 2004 13:53:51 +0800	[thread overview]
Message-ID: <200406161353.51195.adaplas@hotpop.com> (raw)
In-Reply-To: <200406161044.45807.adaplas@hotpop.com>

On Wednesday 16 June 2004 10:44, Antonino A. Daplas wrote:
> On Wednesday 16 June 2004 06:17, David Eger wrote:
> > hey tony,
> >
> > your patch against drivers/video/riva/fbdev.c chokes on hunk 2 when
> > applied to 2.6.7-rc3-mm2.  resend, and i'll test it on my TNT2 :)
>
> Ok.  Patch against 2.6.7-rc3-mm2.
>
> Note I haven't added the hardware acceleration capability support yet,
> so scrolling is still slow.
>
> Secondly, stty seems not to work anymore, though I'm sure
> the driver can do mode setup independently if with DDC. I'll look into
> this later.

I believe I know why stty failed.  It's because fbcon_resize() inf fbcon.c uses
fb_find_mode().  I have reservations with this method though.

1. Since it uses a mode database, this will completely ignore drivers/hardware
that can do scaling or can use the GTF.

2. Secondly, stty works in a weird manner.  For example, fb is in 800x600.  I want
to go to 1024x768.  In order to do that I issue 'stty cols 128 rows 48'.  This will fail
because it will be processed in 2 steps:

	1. set at 1024x592 (128x37) <-- fails
	2. set at 1024x768(128x48)

Of course, step 1 will fail since 1024x592 is not in the database.

I believe a proper way is to just add another method in info->fb_ops, something like
info->fb_ops->fb_find_mode(struct fb_var_screeninfo*, int xres, int yres) that will
be called by fbcon_resize().

Anyway, a workaround is to add a best-fit algorithm in fb_find_mode().  It will try to return
modes that are bigger but closest to the given mode.  fb_find_mode will return 5 in this case.
Note that it currently ignores refresh rates. So, it will now work this way:

	1. set at 1024x592(128x37)
		fb_find_mode() return 1024x768
	2. set at 1024x768(128x48)
		fb_find_mode() return 1024x768 (success)

The algo is currently very simple, feel free to modify.

Tony

Signed-off-by: Antonino Daplas <adaplas@pol.net>

1. pass info->monspecs.modedb and info->monspecs.modedb_len to fb_find_mode()
instead of NULL, 0 since its contents are specific to the attached display.  Anyway, if 
info->monspecs.modedb == NULL, fb_find_mode() will use the default database.

2. Added best fit algo to fb_find_mode().

3. Use snprintf instead of sprintf. 

diff -Naur linux-2.6.6-rc3-mm2-orig/drivers/video/console/fbcon.c linux-2.6.6-rc3-mm2-test/drivers/video/console/fbcon.c
--- linux-2.6.6-rc3-mm2-orig/drivers/video/console/fbcon.c	2004-06-16 01:18:35.000000000 +0000
+++ linux-2.6.6-rc3-mm2-test/drivers/video/console/fbcon.c	2004-06-16 05:31:06.594105304 +0000
@@ -1512,9 +1512,10 @@
 		if (!info->fbops->fb_set_par)
 			return -EINVAL;
 
-		sprintf(mode, "%dx%d", var.xres, var.yres);
-		err = fb_find_mode(&var, info, mode, NULL, 0, NULL,
-					info->var.bits_per_pixel);
+		snprintf(mode, 40, "%ix%i", var.xres, var.yres);
+		err = fb_find_mode(&var, info, mode, info->monspecs.modedb, 
+				   info->monspecs.modedb_len, NULL,
+				   info->var.bits_per_pixel);
 		if (!err || width > var.xres/fw || height > var.yres/fh)
 			return -EINVAL;
 		DPRINTK("resize now %ix%i\n", var.xres, var.yres);
diff -Naur linux-2.6.6-rc3-mm2-orig/drivers/video/modedb.c linux-2.6.6-rc3-mm2-test/drivers/video/modedb.c
--- linux-2.6.6-rc3-mm2-orig/drivers/video/modedb.c	2004-06-16 01:17:54.000000000 +0000
+++ linux-2.6.6-rc3-mm2-test/drivers/video/modedb.c	2004-06-16 05:30:55.409805576 +0000
@@ -490,7 +490,8 @@
 	int res_specified = 0, bpp_specified = 0, refresh_specified = 0;
 	unsigned int xres = 0, yres = 0, bpp = default_bpp, refresh = 0;
 	int yres_specified = 0;
-
+	u32 best = -1, diff = -1;
+	
 	for (i = namelen-1; i >= 0; i--) {
 	    switch (name[i]) {
 		case '@':
@@ -529,8 +530,8 @@
 	}
 done:
 	for (i = refresh_specified; i >= 0; i--) {
-	    DPRINTK("Trying specified video mode%s\n",
-		    i ? "" : " (ignoring refresh rate)");
+	    DPRINTK("Trying specified video mode%s %ix%i\n",
+		    i ? "" : " (ignoring refresh rate)", xres, yres);
 	    for (j = 0; j < dbsize; j++)
 		if ((name_matches(db[j], name, namelen) ||
 		     (res_specified && res_matches(db[j], xres, yres))) &&
@@ -538,6 +539,22 @@
 		    !fb_try_mode(var, info, &db[j], bpp))
 		    return 2-i;
 	}
+	DPRINTK("Trying best-fit modes\n");
+	for (i = 0; i < dbsize; i++) {
+	    if (xres <= db[i].xres && yres <= db[i].yres) {
+		DPRINTK("Trying %ix%i\n", db[i].xres, db[i].yres);
+		if (!fb_try_mode(var, info, &db[i], bpp)) {
+		    if (diff > (db[i].xres - xres) + (db[i].yres - yres)) {
+			diff = (db[i].xres - xres) + (db[i].yres - yres);
+			best = i;
+		    }
+		}
+	    }
+	}
+	if (best != -1) {
+	    fb_try_mode(var, info, &db[best], bpp);
+	    return 5;
+	}
     }
 
     DPRINTK("Trying default video mode\n");




-------------------------------------------------------
This SF.Net email is sponsored by The 2004 JavaOne(SM) Conference
Learn from the experts at JavaOne(SM), Sun's Worldwide Java Developer
Conference, June 28 - July 1 at the Moscone Center in San Francisco, CA
REGISTER AND SAVE! http://java.sun.com/javaone/sf Priority Code NWMGYKND

  reply	other threads:[~2004-06-16  5:53 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-06-15 20:06 [PATCH][RIVAFB]: Updates to rivafb driver Antonino A. Daplas
2004-06-15 22:17 ` David Eger
2004-06-15 22:18   ` jsimmons
2004-06-16  2:44   ` Antonino A. Daplas
2004-06-16  5:53     ` Antonino A. Daplas [this message]
2004-06-16 16:47       ` jsimmons
2004-06-16 20:23         ` Andrew Morton
2004-06-16 22:29           ` Antonino A. Daplas
2004-06-16 22:39             ` Andrew Morton
2004-06-17 18:24             ` [PATCH][RIVAFB] rivafb: fb accel capabilities David Eger
2004-06-16 17:34       ` [PATCH][RIVAFB]: Updates to rivafb driver David Eger
2004-06-16 22:29         ` Antonino A. Daplas
2004-06-17  0:16           ` David Eger
2004-06-17 16:34             ` Benjamin Herrenschmidt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200406161353.51195.adaplas@hotpop.com \
    --to=adaplas@hotpop.com \
    --cc=adaplas@pol.net \
    --cc=akpm@osdl.org \
    --cc=eger@havoc.gtf.org \
    --cc=jsimmons@infradead.org \
    --cc=linux-fbdev-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).