[openfirmware] r1475 - dev/via/unichrome dev/video/common ofw/termemu

svn at openfirmware.info svn at openfirmware.info
Fri Nov 13 23:45:01 CET 2009


Author: wmb
Date: 2009-11-13 23:45:00 +0100 (Fri, 13 Nov 2009)
New Revision: 1475

Modified:
   dev/via/unichrome/accel2d.fth
   dev/via/unichrome/vgamodes.fth
   dev/video/common/rectangle16.fth
   ofw/termemu/fb8.fth
Log:
OLPC trac 9671 - Switch display depth to 32bpp in coordination
with the OS's change.  Requires os40.


Modified: dev/via/unichrome/accel2d.fth
===================================================================
--- dev/via/unichrome/accel2d.fth	2009-11-13 22:43:30 UTC (rev 1474)
+++ dev/via/unichrome/accel2d.fth	2009-11-13 22:45:00 UTC (rev 1475)
@@ -1,8 +1,6 @@
 \ See license at end of file
 purpose: Via Unichrome graphics acceleration
 
-alias depth+ wa+
-
 : mmio@  ( offset -- l )  mmio-base + rl@  ;
 : mmio!  ( l offset -- )  mmio-base + rl!  ;
 
@@ -11,7 +9,7 @@
    0 h# 14 mmio!  \ Destination map base - beginning of frame buffer
    0 h# 1c mmio!  \ Source map base - beginning of frame buffer
    bytes/line 3 rshift  dup wljoin  8 mmio!  \ Dest and src pitch
-   depth  case
+   effective-depth  case
       8      of      0 endof  \  8-bpp 3:3:2
       d# 16  of h# 100 endof  \ 16-bpp 5:6:5
       d# 32  of h# 300 endof  \ 32-bpp 8:8:8:8

Modified: dev/via/unichrome/vgamodes.fth
===================================================================
--- dev/via/unichrome/vgamodes.fth	2009-11-13 22:43:30 UTC (rev 1474)
+++ dev/via/unichrome/vgamodes.fth	2009-11-13 22:45:00 UTC (rev 1475)
@@ -88,5 +88,6 @@
 : 640x480x32   ( -- )  olpc-lcd-mode  d# 640 d# 480 d# 32 change-resolution  h# 112 note-mode  ;  \ VESA mode 112
 : 800x600x32   ( -- )  olpc-lcd-mode  d# 800 d# 600 d# 32 change-resolution  h# 115 note-mode  ;  \ VESA mode 115
 : 1024x768x32  ( -- )  olpc-lcd-mode d# 1024 d# 768 d# 32 change-resolution  h# 118 note-mode  ;  \ VESA mode 118
-: 1200x900x16  ( -- )  olpc-lcd-mode d# 1024 d# 768 d# 16 change-resolution  note-native-mode  ;
-: 1200x900x32  ( -- )  olpc-lcd-mode d# 1024 d# 768 d# 32 change-resolution  native-mode# 1- note-mode  ;
+: 1200x900x16  ( -- )  olpc-lcd-mode d# 1024 d# 768 d# 16 change-resolution  native-mode# 1- note-mode  ;
+: 1200x900x24  ( -- )  olpc-lcd-mode d# 1024 d# 768 d# 32 change-resolution  note-native-mode  ;
+: 1200x900x32  ( -- )  olpc-lcd-mode d# 1024 d# 768 d# 32 change-resolution  note-native-mode  ;

Modified: dev/video/common/rectangle16.fth
===================================================================
--- dev/video/common/rectangle16.fth	2009-11-13 22:43:30 UTC (rev 1474)
+++ dev/video/common/rectangle16.fth	2009-11-13 22:45:00 UTC (rev 1475)
@@ -3,13 +3,73 @@
 
 external
 
+code 565>argb-pixel  ( 565 -- argb )
+   ax pop
+   ax bx mov  d# 11 # bx shr  d# 19 # bx shl  \ Red
+   ax dx mov  d# 27 # dx shl  d# 24 # dx shr  dx bx or  \ Blue
+   d# 21 # ax shl  d# 26 # ax shr  d# 10 # ax shl  bx ax or
+   h# ff070307 # ax or
+   ax push
+c;
+code 565>argb  ( src dst #pixels -- )
+   cx pop
+   di  0 [sp]  xchg
+   si  4 [sp]  xchg
+
+   begin
+      ax ax xor
+      op: ax lods
+      ax bx mov  d# 11 # bx shr  d# 19 # bx shl  \ Red
+      ax dx mov  d# 27 # dx shl  d# 24 # dx shr  dx bx or  \ Blue
+      d# 21 # ax shl  d# 26 # ax shr  d# 10 # ax shl  bx ax or
+      h# ff070307 # ax or
+      ax stos
+   loopa
+
+   di pop
+   si pop
+c;
+code argb>565-pixel  ( argb -- 565 )
+   ax pop
+   ax bx mov  d# 19 # bx shr  d# 11 # bx shl  \ Red
+   ax dx mov  d# 24 # dx shl  d# 27 # dx shr  dx bx or  \ Blue
+   d# 16 # ax shl  d# 26 # ax shr  d# 5 # ax shl  bx ax or  \ Green
+   ax push
+c;
+
+code argb>565  ( src dst #pixels -- )
+   cx pop
+   di  0 [sp]  xchg
+   si  4 [sp]  xchg
+
+   begin
+      ax lods
+      ax bx mov  d# 19 # bx shr  d# 11 # bx shl  \ Red
+      ax dx mov  d# 24 # dx shl  d# 27 # dx shr  dx bx or  \ Blue
+      d# 16 # ax shl  d# 26 # ax shr  d# 5 # ax shl  bx ax or  \ Green
+      op: ax stos
+   loopa
+
+   di pop
+   si pop
+c;
+
 : rectangle-setup  ( x y w h -- wb fbadr h )
    swap depth * 3 rshift swap              ( x y wbytes h )
    2swap  /scanline * frame-buffer-adr +   ( wbytes h x line-adr )
    swap depth * 3 rshift +                 ( wbytes h fbadr )
    swap                                    ( wbytes fbadr h )
 ;
+: 565-rectangle-setup  ( x y w h -- w fbadr h )
+   2swap  /scanline * frame-buffer-adr +   ( w h x line-adr )
+   swap depth * 3 rshift +                 ( w h fbadr )
+   swap                                    ( w fbadr h )
+;
 : fill-rectangle  ( color x y w h -- )
+   depth d# 32 =  if                            ( color x y w h )
+      2>r 2>r  565>argb-pixel  2r> 2r>          ( color' x y w h )
+   then                                         ( color x y w h )
+
    rot /scanline *  frame-buffer-adr +          ( color x w h fbadr )
    -rot >r                                      ( color x fbadr w  r: h )
    \ The loop is inside the case for speed
@@ -24,32 +84,47 @@
 ;
 
 : draw-rectangle  ( adr x y w h -- )
-   rectangle-setup  0  ?do                 ( adr wbytes fbadr )
-      3dup swap move                       ( adr wbytes fbadr )
-      >r  tuck + swap  r>                  ( adr' wbytes fbadr )
-      /scanline +                          ( adr' wbytes fbadr' )
-   loop                                    ( adr' wbytes fbadr' )
+   565-rectangle-setup  0  ?do             ( adr w fbadr )
+      3dup swap                            ( adr w fbadr  adr fbadr w )
+      depth d# 32 =  if                    ( adr w fbadr  adr fbadr w )
+         565>argb                          ( adr w fbadr )
+      else                                 ( adr w fbadr  adr fbadr w )
+         /w* move                          ( adr w fbadr )
+      then                                 ( adr w fbadr )
+      >r  tuck wa+ swap  r>                ( adr' w fbadr )
+      /scanline +                          ( adr' w fbadr' )
+   loop                                    ( adr' w fbadr' )
    3drop
 ;
 
+defer pixel!  ( color fbadr i -- )
+: 565-pixel!   ( color fbadr i -- )  wa+ w!  ;
+: argb-pixel!  ( color fbadr i -- )  rot 565>argb-pixel -rot  la+ l!  ;
+
 : draw-transparent-rectangle  ( adr x y w h -- )
-   rectangle-setup                         ( adr wbytes fbadr h )
-   >r  rot  r>                             ( wbytes fbadr adr h )
-   0  ?do                                  ( wbytes fbadr adr )
-      2 pick 0  ?do                        ( wbytes fbadr adr )
-         dup w@ >r  wa1+ r>                ( wbytes fbadr adr' color )
-         dup h# ffff =  if                 ( wbytes fbadr adr color )
-            drop                           ( wbytes fbadr adr )
-         else                              ( wbytes fbadr adr color )
-            2 pick i + w!                  ( wbytes fbadr adr )
-         then                              ( wbytes fbadr adr )
-      /w +loop                             ( wbytes fbadr adr )
-      swap /scanline +   swap              ( wbytes fbadr' adr )
-   loop                                    ( wbytes fbadr' adr' )
+   depth d# 32 =  if
+      ['] argb-pixel! to pixel!
+   else
+      ['] 565-pixel! to pixel!
+   then
+   565-rectangle-setup                  ( adr w fbadr h )
+   >r  rot  r>                          ( w fbadr adr h )
+   0  ?do                               ( w fbadr adr )
+      2 pick 0  ?do                     ( w fbadr adr )
+         dup i wa+ w@                   ( w fbadr adr color )
+         dup h# ffff =  if              ( w fbadr adr color )
+            drop                        ( w fbadr adr )
+         else                           ( w fbadr adr color )
+            2 pick i pixel!             ( w fbadr adr )
+         then                           ( w fbadr adr )
+      loop                              ( w fbadr adr )
+      swap /scanline +   swap           ( w fbadr' adr )
+      third wa+                         ( w fbadr adr' )
+   loop                                 ( w fbadr' adr' )
    3drop
 ;
 
-: read-rectangle  ( adr x y w h -- )
+: native-read-rectangle  ( adr x y w h -- )
    rectangle-setup 0  ?do                  ( adr wbytes fbadr )
       3dup -rot move                       ( adr wbytes fbadr )
       >r  tuck + swap  r>                  ( adr' wbytes fbadr )
@@ -57,6 +132,19 @@
    loop                                    ( adr' wbytes fbadr' )
    3drop
 ;
+: read-rectangle  ( adr x y w h -- )
+   565-rectangle-setup 0  ?do              ( adr w fbadr )
+      3dup -rot                            ( adr w fbadr  fbadr adr w )
+      depth d# 32 =  if                    ( adr w fbadr  fbadr adr w )
+         argb>565                          ( adr w fbadr )
+      else                                 ( adr w fbadr  fbadr adr w )
+         /w* move                          ( adr w fbadr )
+      then                                 ( adr w fbadr )
+      >r  tuck wa+ swap  r>                ( adr' w fbadr )
+      /scanline +                          ( adr' w fbadr' )
+   loop                                    ( adr' w fbadr' )
+   3drop
+;
 : dimensions  ( -- width height )  width height  ;
 
 : replace-color16  ( old new -- )

Modified: ofw/termemu/fb8.fth
===================================================================
--- ofw/termemu/fb8.fth	2009-11-13 22:43:30 UTC (rev 1474)
+++ ofw/termemu/fb8.fth	2009-11-13 22:45:00 UTC (rev 1475)
@@ -281,6 +281,14 @@
    loop
    4drop
 ;
+: merge-rect-565  ( color mask-adr dst-adr width height -- )
+   0  ?do                          ( color mask-adr rect-adr width )
+      2over @  2over  fb16-merge   ( color mask-adr rect-adr width )
+      rot na1+ -rot                ( color mask-adr' rect-adr width )
+      tuck wa+  swap               ( color mask-adr rect-adr' width )
+   loop
+   4drop
+;
 
 headers
 : fb8-insert-characters  ( #chars -- )




More information about the openfirmware mailing list