aux/vga: remove -s option, move scaling to the size string itself
This commit is contained in:
parent
31e1c15d44
commit
d908aff72f
4 changed files with 88 additions and 49 deletions
|
@ -15,10 +15,6 @@ vga \- configure a VGA card
|
|||
.I monitor
|
||||
]
|
||||
[
|
||||
.B -s
|
||||
.I scaling
|
||||
]
|
||||
[
|
||||
.B -x
|
||||
.I file
|
||||
]
|
||||
|
@ -85,16 +81,6 @@ is usually set by including it in the
|
|||
.B plan9.ini
|
||||
file read by the PC boot program.
|
||||
.TP
|
||||
.B -s
|
||||
set scaling mode to either
|
||||
.I off
|
||||
to disable completely (image will be centered),
|
||||
.I full
|
||||
to stretch to full screen
|
||||
or
|
||||
.I aspect
|
||||
to stretch while preserving aspect ratio.
|
||||
.TP
|
||||
.B -p
|
||||
print the current or expected register values at appropriate points depending on
|
||||
other options.
|
||||
|
@ -113,13 +99,19 @@ as the VGA database rather than
|
|||
.PP
|
||||
.I Mode
|
||||
is of the form
|
||||
.IB X x Y x Z
|
||||
.IB X x Y x Z ,S
|
||||
, where
|
||||
.IR X ,
|
||||
.IR Y ,
|
||||
and
|
||||
.I Z
|
||||
are numbers specifying the display height, width, and depth respectively.
|
||||
.I S
|
||||
is scaling mode, either
|
||||
.I scalefull
|
||||
or
|
||||
.IR scaleaspect ;
|
||||
not specifying it disables scaling altogether.
|
||||
The mode must appear in
|
||||
.B /lib/vgadb
|
||||
as a value for one of the monitor entries.
|
||||
|
@ -227,3 +219,7 @@ new VGA controller or monitor setting.
|
|||
It is useful in such cases to have
|
||||
the above command for setting the controller to a known state
|
||||
at your fingertips.
|
||||
Scaling modes currently work with Intel and NVIDIA video
|
||||
adapters only, using VESA. Intel doesn't support
|
||||
.I scaleaspect
|
||||
mode.
|
||||
|
|
|
@ -149,7 +149,7 @@ chanstr[32+1] = {
|
|||
static void
|
||||
usage(void)
|
||||
{
|
||||
fprint(2, "usage: aux/vga [ -BcdilpvV ] [ -b bios-id ] [ -m monitor ] [-s scaling] [ -x db ] [ mode [ virtualsize ] ]\n");
|
||||
fprint(2, "usage: aux/vga [ -BcdilpvV ] [ -b bios-id ] [ -m monitor ] [ -x db ] [ mode [ virtualsize ] ]\n");
|
||||
exits("usage");
|
||||
}
|
||||
|
||||
|
@ -157,7 +157,7 @@ void
|
|||
main(int argc, char** argv)
|
||||
{
|
||||
char *bios, buf[256], sizeb[256], *p, *vsize, *psize;
|
||||
char *type, *vtype, *scaling;
|
||||
char *type, *vtype;
|
||||
int virtual, len;
|
||||
Ctlr *ctlr;
|
||||
Vga *vga;
|
||||
|
@ -169,7 +169,6 @@ main(int argc, char** argv)
|
|||
if((type = getenv("monitor")) == 0)
|
||||
type = "vga";
|
||||
psize = vsize = "640x480x8";
|
||||
scaling = nil;
|
||||
|
||||
ARGBEGIN{
|
||||
default:
|
||||
|
@ -205,9 +204,6 @@ main(int argc, char** argv)
|
|||
*/
|
||||
rflag++;
|
||||
break;
|
||||
case 's':
|
||||
scaling = EARGF(usage());
|
||||
break;
|
||||
case 'v':
|
||||
vflag = 1;
|
||||
break;
|
||||
|
@ -471,11 +467,6 @@ main(int argc, char** argv)
|
|||
}
|
||||
}
|
||||
|
||||
if(scaling != nil){
|
||||
if(vga->vesa)
|
||||
vesa.scaling(vga, vga->vesa, scaling);
|
||||
}
|
||||
|
||||
trace("main->exits\n");
|
||||
exits(0);
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ struct Vbe
|
|||
uchar *mem; /* copy of memory; 1MB */
|
||||
uchar *isvalid; /* 1byte per 4kB in mem */
|
||||
uchar *modebuf;
|
||||
void (*scale)(Vga*, Ctlr*);
|
||||
};
|
||||
|
||||
struct Vmode
|
||||
|
@ -144,10 +145,14 @@ dbvesamode(char *size)
|
|||
Vmode vm;
|
||||
Mode *m;
|
||||
Modelist *l;
|
||||
|
||||
char *scale;
|
||||
|
||||
if(vbe == nil)
|
||||
return nil;
|
||||
|
||||
if(scale = strchr(size, ','))
|
||||
*scale++ = 0;
|
||||
|
||||
if(strncmp(size, "0x", 2) == 0){
|
||||
if(vbemodeinfo(vbe, strtol(size+2, nil, 16), &vm) == 0)
|
||||
goto havemode;
|
||||
|
@ -216,6 +221,17 @@ havemode:
|
|||
a->next = nil;
|
||||
m->attr = a;
|
||||
|
||||
/* scaling mode */
|
||||
if(scale != nil){
|
||||
a = alloc(sizeof(Attr));
|
||||
a->attr = "scale";
|
||||
a->val = alloc(32);
|
||||
strncpy(a->val, scale, 32);
|
||||
|
||||
a->next = m->attr;
|
||||
m->attr = a;
|
||||
}
|
||||
|
||||
/* account for framebuffer stride */
|
||||
width = vm.bpl * 8 / m->z;
|
||||
if(width > m->x){
|
||||
|
@ -261,6 +277,8 @@ load(Vga* vga, Ctlr* ctlr)
|
|||
{
|
||||
if(vbe == nil)
|
||||
error("no vesa bios\n");
|
||||
if(vbe->scale != nil)
|
||||
vbe->scale(vga, ctlr);
|
||||
if(vbesetmode(vbe, atoi(dbattr(vga->mode->attr, "id"))) < 0){
|
||||
ctlr->flag |= Ferror;
|
||||
fprint(2, "vbesetmode: %r\n");
|
||||
|
@ -297,33 +315,63 @@ dump(Vga*, Ctlr*)
|
|||
}
|
||||
|
||||
static void
|
||||
scaling(Vga*, Ctlr* ctlr, char* scaling)
|
||||
intelscale(Vga* vga, Ctlr* ctlr)
|
||||
{
|
||||
Ureg u;
|
||||
int mode;
|
||||
int cx;
|
||||
char *scale;
|
||||
|
||||
if(vbe == nil)
|
||||
error("no vesa bios\n");
|
||||
|
||||
if(strcmp(scaling, "off") == 0)
|
||||
mode = 1;
|
||||
else if(strcmp(scaling, "aspect") == 0)
|
||||
mode = 3;
|
||||
else if(strcmp(scaling, "full") == 0)
|
||||
mode = 0;
|
||||
/* NOTE: intel doesn't support "aspect" scaling mode :( */
|
||||
scale = dbattr(vga->mode->attr, "scale");
|
||||
if(scale == nil)
|
||||
cx = 0;
|
||||
else if(strcmp(scale, "scalefull") == 0)
|
||||
cx = 4;
|
||||
else{
|
||||
ctlr->flag |= Ferror;
|
||||
fprint(2, "vbescaling: unknown mode %s\n", scaling);
|
||||
fprint(2, "vbescale: unsupported mode %s\n", scale);
|
||||
return;
|
||||
}
|
||||
|
||||
vbesetup(vbe, &u, 0x5F61);
|
||||
u.bx = 0;
|
||||
u.cx = cx; /* horizontal */
|
||||
u.dx = cx; /* vertical */
|
||||
if(vbecall(vbe, &u) < 0 && (u.ax&0xFFFF) != 0x5F)
|
||||
fprint(2, "vbescale: %r\n");
|
||||
}
|
||||
|
||||
static void
|
||||
nvidiascale(Vga* vga, Ctlr* ctlr)
|
||||
{
|
||||
Ureg u;
|
||||
int cx;
|
||||
char *scale;
|
||||
|
||||
if(vbe == nil)
|
||||
error("no vesa bios\n");
|
||||
|
||||
scale = dbattr(vga->mode->attr, "scale");
|
||||
if(scale == nil)
|
||||
cx = 1;
|
||||
else if(strcmp(scale, "scaleaspect") == 0)
|
||||
cx = 3;
|
||||
else if(strcmp(scale, "scalefull") == 0)
|
||||
cx = 0;
|
||||
else{
|
||||
ctlr->flag |= Ferror;
|
||||
fprint(2, "vbescale: unsupported mode %s\n", scale);
|
||||
return;
|
||||
}
|
||||
|
||||
vbesetup(vbe, &u, 0x4F14);
|
||||
u.bx = 0x102;
|
||||
u.cx = mode;
|
||||
if(vbecall(vbe, &u) < 0){
|
||||
ctlr->flag |= Ferror;
|
||||
fprint(2, "vbescaling: %r\n");
|
||||
}
|
||||
u.cx = cx;
|
||||
if(vbecall(vbe, &u) < 0)
|
||||
fprint(2, "vbescale: %r\n");
|
||||
}
|
||||
|
||||
Ctlr vesa = {
|
||||
|
@ -333,7 +381,6 @@ Ctlr vesa = {
|
|||
nil,
|
||||
load,
|
||||
dump,
|
||||
scaling,
|
||||
};
|
||||
|
||||
Ctlr softhwgc = {
|
||||
|
@ -526,7 +573,7 @@ int
|
|||
vbecall(Vbe *vbe, Ureg *u)
|
||||
{
|
||||
u->trap = 0x10;
|
||||
|
||||
|
||||
vbeflush(vbe);
|
||||
|
||||
if(pwrite(vbe->rmfd, u, sizeof *u, 0) != sizeof *u)
|
||||
|
@ -546,6 +593,7 @@ vbecall(Vbe *vbe, Ureg *u)
|
|||
int
|
||||
vbecheck(Vbe *vbe)
|
||||
{
|
||||
char *oem;
|
||||
uchar *p;
|
||||
Ureg u;
|
||||
|
||||
|
@ -561,6 +609,11 @@ vbecheck(Vbe *vbe)
|
|||
werrstr("invalid vesa version: %.4H\n", p+4);
|
||||
return -1;
|
||||
}
|
||||
oem = unfarptr(vbe, p+6);
|
||||
if(memcmp(oem, "Intel", 5) == 0)
|
||||
vbe->scale = intelscale;
|
||||
else if(memcmp(oem, "NVIDIA", 6) == 0)
|
||||
vbe->scale = nvidiascale;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -795,7 +848,7 @@ vbeddcedid(Vbe *vbe, Edid *e)
|
|||
{
|
||||
uchar *p;
|
||||
Ureg u;
|
||||
|
||||
|
||||
p = vbesetup(vbe, &u, 0x4F15);
|
||||
u.bx = 0x0001;
|
||||
if(vbecall(vbe, &u) < 0)
|
||||
|
@ -806,12 +859,12 @@ vbeddcedid(Vbe *vbe, Edid *e)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
printedid(Edid *e)
|
||||
{
|
||||
Modelist *l;
|
||||
|
||||
|
||||
printitem("edid", "mfr");
|
||||
Bprint(&stdout, "%s\n", e->mfr);
|
||||
printitem("edid", "serialstr");
|
||||
|
@ -838,7 +891,7 @@ printedid(Edid *e)
|
|||
Bprint(&stdout, "%lud\n", e->pclkmax);
|
||||
printitem("edid", "flags");
|
||||
printflags(edidflags, e->flags);
|
||||
|
||||
|
||||
for(l=e->modelist; l; l=l->next){
|
||||
printitem("edid", l->name);
|
||||
Bprint(&stdout, "\n\t\tclock=%g\n"
|
||||
|
@ -1144,7 +1197,7 @@ parseedid128(Edid *e, void *v)
|
|||
*/
|
||||
estab = (p[0]<<16) | (p[1]<<8) | p[2];
|
||||
p += 3;
|
||||
|
||||
|
||||
for(i=0, m=1<<23; i<nelem(estabtime); i++, m>>=1)
|
||||
if(estab & m)
|
||||
if(vesalookup(&mode, estabtime[i]) == 0)
|
||||
|
|
|
@ -49,7 +49,6 @@ typedef struct Ctlr {
|
|||
void (*init)(Vga*, Ctlr*);
|
||||
void (*load)(Vga*, Ctlr*);
|
||||
void (*dump)(Vga*, Ctlr*);
|
||||
void (*scaling)(Vga*, Ctlr*, char*);
|
||||
char* type;
|
||||
|
||||
ulong flag;
|
||||
|
|
Loading…
Reference in a new issue