diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-06-25 22:22:58 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-06-25 22:22:58 +0200 |
commit | aab4e32ce05a26bff7386bb86ffc24589cbe601c (patch) | |
tree | 3ee177109bf3b076b6cccf461cf559c284fa845a /sys/src/9/pc/screen.c | |
parent | ffde0eda463e8b908975abcabc5345cfaa1a14f7 (diff) |
pc, pc64: support for multiboot framebuffer, common bootargs and multiboot code
Diffstat (limited to 'sys/src/9/pc/screen.c')
-rw-r--r-- | sys/src/9/pc/screen.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/sys/src/9/pc/screen.c b/sys/src/9/pc/screen.c index 69018c4fe..20df768fd 100644 --- a/sys/src/9/pc/screen.c +++ b/sys/src/9/pc/screen.c @@ -587,6 +587,36 @@ bootmapfb(VGAscr *scr, ulong pa, ulong sz) return vgalinearaddr0(scr, pa, sz); } +char* +rgbmask2chan(char *buf, int depth, u32int rm, u32int gm, u32int bm) +{ + u32int m[4], dm; /* r,g,b,x */ + char tmp[32]; + int c, n; + + dm = 1<<depth-1; + dm |= dm-1; + + m[0] = rm & dm; + m[1] = gm & dm; + m[2] = bm & dm; + m[3] = (~(m[0] | m[1] | m[2])) & dm; + + buf[0] = 0; +Next: + for(c=0; c<4; c++){ + for(n = 0; m[c] & (1<<n); n++) + ; + if(n){ + m[0] >>= n, m[1] >>= n, m[2] >>= n, m[3] >>= n; + snprint(tmp, sizeof tmp, "%c%d%s", "rgbx"[c], n, buf); + strcpy(buf, tmp); + goto Next; + } + } + return buf; +} + /* * called early on boot to attach to framebuffer * setup by bootloader/firmware or plan9. @@ -682,11 +712,10 @@ bootscreenconf(VGAscr *scr) char conf[100], chan[30]; conf[0] = '\0'; - if(scr != nil && scr->paddr != 0) + if(scr != nil && scr->paddr != 0 && scr->gscreen != nil) snprint(conf, sizeof(conf), "%dx%dx%d %s %#p %d\n", scr->gscreen->r.max.x, scr->gscreen->r.max.y, scr->gscreen->depth, chantostr(chan, scr->gscreen->chan), scr->paddr, scr->apsize); - ksetenv("*bootscreen", conf, 1); } |