Home
Developer Resources
QNX RTOS v4
QNX RTOS v4 Knowledge Base

QNX RTOS v4 Knowledge Base

Foundry27
Foundry27
QNX RTOS v4 project
Resources

QNX RTOS v4 Knowledge Base

Title Configuring dual display for Photon
Ref. No. QNX.000009490
Category(ies) Video, Configuration
Issue We would like to use two monitors with Photon. Can this be done? 



Solution Please note that the following explanation doesn't apply to QNX RTP.  QNX RTP does not currently support multiple video cards.


To use multiple monitors under Photon, you must be running at least version 1.13 of Photon which includes the Hydra.ms trapper/mode switcher.

For best results, both cards must be VESA 2.0 compliant. Although it is not strictly neccessary, you will likely have less trouble if both cards are identical. You must also have a PCI 2.1 motherboard, and the cards must be PCI cards.

This method works by switching both cards into graphics mode and enabling a linear frame buffer. Pg.flat or Pg.flatdc can then be used, both of which only access the memory using the CPU. In Photon 1.14, you can use Banshee cards to get an accelerated driver. Prior to Photon 1.14 or with cards other then the Banshee, you can not use the accelerated mode. See below for the changes when you use the Banshee card.

To start, go into your computers CMOS options, and check the following settings if your computer has them:

Palette Snooping      == ON or Enabled
Plug and Play aware OS == OFF or disabled

Next, power down and put both cards in the machine. If your machine does not boot, or it boots but there are problems even in text mode, you will need to get different cards or upgrade your motherboard.

To generate a trap file for use with Hydra.ms, go to the /qnx4/graphics/drivers directory, and type the following:

    'Hydra.ms -T >file'  - for non-accelerated mode
    'crttrap trap > file' - for Banshee cards using accelerated mode

This will create a trapfile which contains a list of 'mode switcher;driver' commands for each mode and each card in the system.

This process may take some time, but you should see the secondary monitor perform a video BIOS warm boot while the process is taking place. You will see the signon screen that would be seen if this machine were booted with only the secondary card installed.

You must ensure that nothing attempts to display text on your console screen during the trap process, as well as during the mode witch that will occur later when you go to run Photon.


If your machine hangs while trying to perform this trap, it will not work.  Assuming the trap is successful, your file should look something like the following (the trap file for a banshee card is different. See below for
details):

    # Card 1, Bus 0, Dev/Func 90
    Hydra.ms -S -i0x4100 -s0x0000,0x0090;Pg.flat -HC0x00000090 -PX -HNqnx/crt -g640x400x8 -A0xFF000000,0x400000 -WB640;#640,400,8,100,1,flat - SVGA 256 color
    Hydra.ms -S -i0x4101 -s0x0000,0x0090;Pg.flat -HC0x00000090 -PX -HNqnx/crt -g640x480x8 -A0xFF000000,0x400000 -WB640;#640,480,8,100,1,flat - SVGA 256 color
    Hydra.ms -S -i0x4103 -s0x0000,0x0090;Pg.flat -HC0x00000090 -PX -HNqnx/crt -g800x600x8 -A0xFF000000,0x400000 -WB1024;#800,600,8,100,1,flat - SVGA 256 color
    Hydra.ms -S -i0x4105 -s0x0000,0x0090;Pg.flat -HC0x00000090 -PX -HNqnx/crt -g1024x768x8 -A0xFF000000,0x400000 -WB1024;#1024,768,8,100,1,flat - SVGA 256 color
    Hydra.ms -S -i0x4107 -s0x0000,0x0090;Pg.flat -HC0x00000090 -PX -HNqnx/crt -g1280x1024x8 -A0xFF000000,0x400000 -WB1280;#1280,1024,8,100,1,flat - SVGA 256 color
    Hydra.ms -S -i0x4110 -s0x0000,0x0090;Pg.flatdc -HC0x00000090 -PX -HNqnx/crt -g640x480x16 -A0xFF000000,0x400000 -WB1280;#640,480,16,100,1,flatdc - VGA hi-color
    Hydra.ms -S -i0x4111 -s0x0000,0x0090;Pg.flatdc -HC0x00000090 -PX -HNqnx/crt -g640x480x16 -A0xFF000000,0x400000 -WB1280;#640,480,16,100,1,flatdc - VGA hi-color
    Hydra.ms -S -i0x4112 -s0x0000,0x0090;Pg.flatdc32 -HC0x00000090 -PX -HNqnx/crt -g640x480x32 -A0xFF000000,0x400000 -WB2560;#640,480,32,100,1,flatdc32 - VGA hi-color
    Hydra.ms -S -i0x4113 -s0x0000,0x0090;Pg.flatdc -HC0x00000090 -PX -HNqnx/crt -g800x600x16 -A0xFF000000,0x400000 -WB1920;#800,600,16,100,1,flatdc - VGA hi-color
    Hydra.ms -S -i0x4114 -s0x0000,0x0090;Pg.flatdc -HC0x00000090 -PX -HNqnx/crt -g800x600x16 -A0xFF000000,0x400000 -WB1920;#800,600,16,100,1,flatdc - VGA hi-color
    Hydra.ms -S -i0x4115 -s0x0000,0x0090;Pg.flatdc32 -HC0x00000090 -PX -HNqnx/crt -g800x600x32 -A0xFF000000,0x400000 -WB3200;#800,600,32,100,1,flatdc32 - VGA hi-color
    Hydra.ms -S -i0x4116 -s0x0000,0x0090;Pg.flatdc -HC0x00000090 -PX -HNqnx/crt -g1024x768x16 -A0xFF000000,0x400000 -WB2048;#1024,768,16,100,1,flatdc - VGA hi-color
    Hydra.ms -S -i0x4117 -s0x0000,0x0090;Pg.flatdc -HC0x00000090 -PX -HNqnx/crt -g1024x768x16 -A0xFF000000,0x400000 -WB2048;#1024,768,16,100,1,flatdc - VGA hi-color
    Hydra.ms -S -i0x411C -s0x0000,0x0090;Pg.flat -HC0x00000090 -PX -HNqnx/crt -g1600x1200x8 -A0xFF000000,0x400000 -WB1664;#1600,1200,8,100,1,flat - SVGA 256 color
    Hydra.ms -S -i0x4118 -s0x0000,0x0090;Pg.flatdc32 -HC0x00000090 -PX -HNqnx/crt -g1024x768x32 -A0xFF000000,0x400000 -WB4096;#1024,768,32,100,1,flatdc32 - VGA hi-color
    Hydra.ms -S -i0x4119 -s0x0000,0x0090;Pg.flatdc -HC0x00000090 -PX -HNqnx/crt -g1280x1024x16 -A0xFF000000,0x400000 -WB2560;#1280,1024,16,100,1,flatdc - VGA hi-color
    Hydra.ms -S -i0x411A -s0x0000,0x0090;Pg.flatdc -HC0x00000090 -PX -HNqnx/crt -g1280x1024x16 -A0xFF000000,0x400000 -WB2560;#1280,1024,16,100,1,flatdc - VGA hi-color
    Hydra.ms -S -i0x411D -s0x0000,0x0090;Pg.flatdc -HC0x00000090 -PX -HNqnx/crt -g1600x1200x16 -A0xFF000000,0x400000 -WB3200;#1600,1200,16,100,1,flatdc - VGA hi-color
    Hydra.ms -S -i0x411E -s0x0000,0x0090;Pg.flatdc -HC0x00000090 -PX -HNqnx/crt -g1600x1200x16 -A0xFF000000,0x400000 -WB3200;#1600,1200,16,100,1,flatdc - VGA hi-color
    # Card 2, Bus 0, Dev/Func 88
    Hydra.ms -S -i0x4100 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flat -HC0x00000088 -PX -HNqnx/crt88 -g640x400x8 -A0xFE800000,0x400000 -WB640;
    Hydra.ms -S -i0x4101 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flat -HC0x00000088 -PX -HNqnx/crt88 -g640x480x8 -A0xFE800000,0x400000 -WB640;
    Hydra.ms -S -i0x4103 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flat -HC0x00000088 -PX -HNqnx/crt88 -g800x600x8 -A0xFE800000,0x400000 -WB960;
    Hydra.ms -S -i0x4105 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flat -HC0x00000088 -PX -HNqnx/crt88 -g1024x768x8 -A0xFE800000,0x400000 -WB1024;
    Hydra.ms -S -i0x4107 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flat -HC0x00000088 -PX -HNqnx/crt88 -g1280x1024x8 -A0xFE800000,0x400000 -WB1280;
    Hydra.ms -S -i0x4110 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flatdc -HC0x00000088 -PX -HNqnx/crt88 -g640x480x16 -A0xFE800000,0x400000 -WB1280;
    Hydra.ms -S -i0x4111 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flatdc -HC0x00000088 -PX -HNqnx/crt88 -g640x480x16 -A0xFE800000,0x400000 -WB1280;
    Hydra.ms -S -i0x4112 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flatdc32 -HC0x00000088 -PX -HNqnx/crt88 -g640x480x32 -A0xFE800000,0x400000 -WB2560;
    Hydra.ms -S -i0x4113 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flatdc -HC0x00000088 -PX -HNqnx/crt88 -g800x600x16 -A0xFE800000,0x400000 -WB1920;
    Hydra.ms -S -i0x4114 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flatdc -HC0x00000088 -PX -HNqnx/crt88 -g800x600x16 -A0xFE800000,0x400000 -WB1920;
    Hydra.ms -S -i0x4115 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flatdc32 -HC0x00000088 -PX -HNqnx/crt88 -g800x600x32 -A0xFE800000,0x400000 -WB3200;
    Hydra.ms -S -i0x4116 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flatdc -HC0x00000088 -PX -HNqnx/crt88 -g1024x768x16 -A0xFE800000,0x400000 -WB2048;
    Hydra.ms -S -i0x4117 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flatdc -HC0x00000088 -PX -HNqnx/crt88 -g1024x768x16 -A0xFE800000,0x400000 -WB2048;
    Hydra.ms -S -i0x411C -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flat -HC0x00000088 -PX -HNqnx/crt88 -g1600x1200x8 -A0xFE800000,0x400000 -WB1600;
    Hydra.ms -S -i0x4118 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flatdc32 -HC0x00000088 -PX -HNqnx/crt88 -g1024x768x32 -A0xFE800000,0x400000 -WB4096;
    Hydra.ms -S -i0x4119 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flatdc -HC0x00000088 -PX -HNqnx/crt88 -g1280x1024x16 -A0xFE800000,0x400000 -WB2560;
    Hydra.ms -S -i0x411A -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flatdc -HC0x00000088 -PX -HNqnx/crt88 -g1280x1024x16 -A0xFE800000,0x400000 -WB2560;
    Hydra.ms -S -i0x411D -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flatdc -HC0x00000088 -PX -HNqnx/crt88 -g1600x1200x16 -A0xFE800000,0x400000 -WB3200;

Here's an analysis of one of the secondary trap lines:

  Hydra.ms  <-- name of mode switcher
  -S        <-- flag to tell it to perform a mode switch
  -i0x4100  <-- which (VESA) mode number to switch to
  -s0x0000,0x0088  <-- PCI bus,(PCI Device << 3) | PCI Function
  -cnone        <-- which console to 'hold' (none for secondary)
  -nqnx/crt88; <-- name to register (based on PCI info)
  Pg.flat      <-- driver to run
  -HC0x00000088    <-- Channel number (based on PCI info)
  -PX          <-- set palette using Xternal agent (i.e. Hydra.ms)
  -HNqnx/crt88  <-- name to use when sending palette requests
  -g640x400x8  <-- resolution/color depth
  -A0xFE800000,0x400000    <-- Aperture/size info
  -WB640;      <-- Bytes Per Scanline


You may have trouble trying to use a palette based mode since many (or most) cards still use the VGA I/O registers to program the palette. It's probably easiest to simply use 16 bit modes.

To run Photon, take one of the lines from the primary card...

Hydra.ms -S -i0x4117 -s0x0000,0x0090;Pg.flatdc -HC0x00000090 -PX -HNqnx/crt -g1024x768x16 -A0xFF000000,0x400000 -WB2048;#1024,768,16,100,1,flatdc - VGA hi-color

...split it at the semicolon....

Hydra.ms -S -i0x4117 -s0x0000,0x0090;
Pg.flatdc -HC0x00000090 -PX -HNqnx/crt -g1024x768x16 -A0xFF000000,0x400000 -WB2048;#1024,768,16,100,1,flatdc - VGA hi-color


... stuff one of the secondary lines in the middle.....

Hydra.ms -S -i0x4117 -s0x0000,0x0090;
Hydra.ms -S -i0x4117 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flatdc -HC0x00000088 -PX -HNqnx/crt88 -g1024x768x16 -A0xFE800000,0x400000 -WB2048;
Pg.flatdc -HC0x00000090 -PX -HNqnx/crt -g1024x768x16 -A0xFF000000,0x400000 -WB2048;#1024,768,16,100,1,flatdc - VGA hi-color

... and then sew it back together:

Hydra.ms -S -i0x4117 -s0x0000,0x0090;Hydra.ms -S -i0x4117 -s0x0000,0x0088 -cnone -nqnx/crt88;Pg.flatdc -HC0x00000088 -PX -HNqnx/crt88 -g1024x768x16 -A0xFE800000,0x400000 -WB2048;
Pg.flatdc -HC0x00000090 -PX -HNqnx/crt -g1024x768x16 -A0xFF000000,0x400000 -WB2048;#1024,768,16,100,1,flatdc - VGA hi-color

Make this the top line of your nodes trap file, and then just type 'ph'.

You probably want to move the second screen over to the right of the first screen. Add a '-o' argument to the secondary cards driver command. In this case, adding '-o1024' moves the second screen so it starts just to the right of the first screen.


For the Banshee card, the trap file will look like:

Null.ms;Pg.Banshee -HNqnx/crt -g1024x768x32 -I0 -d0x121A,0x0005 -WB4096 -WV0x01000000;#1024,768,32,300,0rCB,Banshee - 3Dfx Voodoo Banshee
#;Pg.Banshee -HNqnx/crt -g1024x768x32 -o1024 -I0 -d0x121A,0x0003 -WB4096 -WV0x01000000
Null.ms;Pg.Banshee -HNqnx/crt -g640x480x8 -I0 -d0x121A,0x0003 -WB640 -WV0x01000000;#640,480,8,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g640x480x16 -I0 -d0x121A,0x0003 -WB1280 -WV0x01000000;#640,480,16,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g640x480x24 -I0 -d0x121A,0x0003 -WB1920 -WV0x01000000;#640,480,24,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g640x480x32 -I0 -d0x121A,0x0003 -WB2560 -WV0x01000000;#640,480,32,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g800x600x8 -I0 -d0x121A,0x0003 -WB800 -WV0x01000000;#800,600,8,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g800x600x16 -I0 -d0x121A,0x0003 -WB1600 -WV0x01000000;#800,600,16,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g800x600x24 -I0 -d0x121A,0x0003 -WB2400 -WV0x01000000;#800,600,24,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g800x600x32 -I0 -d0x121A,0x0003 -WB3200 -WV0x01000000;#800,600,32,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1024x768x8 -I0 -d0x121A,0x0003 -WB1024 -WV0x01000000;#1024,768,8,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1024x768x16 -I0 -d0x121A,0x0003 -WB2048 -WV0x01000000;#1024,768,16,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1024x768x24 -I0 -d0x121A,0x0003 -WB3072 -WV0x01000000;#1024,768,24,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1024x768x32 -I0 -d0x121A,0x0003 -WB4096 -WV0x01000000;#1024,768,32,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1152x864x8 -I0 -d0x121A,0x0003 -WB1152 -WV0x01000000;#1152,864,8,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1152x864x16 -I0 -d0x121A,0x0003 -WB2304 -WV0x01000000;#1152,864,16,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1152x864x24 -I0 -d0x121A,0x0003 -WB3456 -WV0x01000000;#1152,864,24,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1152x864x32 -I0 -d0x121A,0x0003 -WB4608 -WV0x01000000;#1152,864,32,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1280x1024x8 -I0 -d0x121A,0x0003 -WB1280 -WV0x01000000;#1280,1024,8,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1280x1024x16 -I0 -d0x121A,0x0003 -WB2560 -WV0x01000000;#1280,1024,16,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1280x1024x24 -I0 -d0x121A,0x0003 -WB3840 -WV0x01000000;#1280,1024,24,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1280x1024x32 -I0 -d0x121A,0x0003 -WB5120 -WV0x01000000;#1280,1024,32,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1600x1200x8 -I0 -d0x121A,0x0003 -WB1600 -WV0x01000000;#1600,1200,8,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1600x1200x16 -I0 -d0x121A,0x0003 -WB3200 -WV0x01000000;#1600,1200,16,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1600x1200x24 -I0 -d0x121A,0x0003 -WB4800 -WV0x01000000;#1600,1200,24,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1600x1200x32 -I0 -d0x121A,0x0003 -WB6400 -WV0x01000000;#1600,1200,32,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g640x480x8 -I0 -d0x121A,0x0005 -WB640 -WV0x01000000;#640,480,8,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g640x480x16 -I0 -d0x121A,0x0005 -WB1280 -WV0x01000000;#640,480,16,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g640x480x24 -I0 -d0x121A,0x0005 -WB1920 -WV0x01000000;#640,480,24,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g640x480x32 -I0 -d0x121A,0x0005 -WB2560 -WV0x01000000;#640,480,32,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g800x600x8 -I0 -d0x121A,0x0005 -WB800 -WV0x01000000;#800,600,8,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g800x600x16 -I0 -d0x121A,0x0005 -WB1600 -WV0x01000000;#800,600,16,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g800x600x24 -I0 -d0x121A,0x0005 -WB2400 -WV0x01000000;#800,600,24,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g800x600x32 -I0 -d0x121A,0x0005 -WB3200 -WV0x01000000;#800,600,32,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1024x768x8 -I0 -d0x121A,0x0005 -WB1024 -WV0x01000000;#1024,768,8,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1024x768x16 -I0 -d0x121A,0x0005 -WB2048 -WV0x01000000;#1024,768,16,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1024x768x24 -I0 -d0x121A,0x0005 -WB3072 -WV0x01000000;#1024,768,24,300,0rCB,Banshee - 3Dfx Voodoo Banshee

As you can see, it is using an empty mode switcher. This is the difference between the trap file for the accelerated driver and the normal driver. Now, chose the two modes that you want to use:

Null.ms;Pg.Banshee -HNqnx/crt -g1024x768x32 -I0 -d0x121A,0x0003 -WB4096 -WV0x01000000;#1024,768,32,300,0rCB,Banshee - 3Dfx Voodoo Banshee
Null.ms;Pg.Banshee -HNqnx/crt -g1024x768x32 -I0 -d0x121A,0x0005 -WB4096 -WV0x01000000;#1024,768,32,300,0rCB,Banshee - 3Dfx Voodoo Banshee

and put them together:

Null.ms;Pg.Banshee -HNqnx/crt -g1024x768x32 -o1024 -I0 -d0x121A,0x0003 -WB4096 -WV0x01000000;Pg.Banshee -HNqnx/crt -g1024x768x32 -I0 -d0x121A,0x0005 -WB4096 -WV0x01000000;#1024,768,32,300,0rCB,Banshee - 3Dfx Voodoo Banshee

You only need one instance of the mode switcher. Don't forget to add the -o option to
the driver if you want to use an offset.