And here's version 3 of the triple buffering/field parity ioctl thing.

What's new?

- CRTC1 support
- CRTC2 sub-picture support (including field parity :)

-- 
Ville Syrjälä
[EMAIL PROTECTED]
http://www.sci.fi/~syrjala/
diff -urpN linux-2.6.14-2/drivers/video/matrox/matroxfb_base.c 
linux-2.6.14-3/drivers/video/matrox/matroxfb_base.c
--- linux-2.6.14-2/drivers/video/matrox/matroxfb_base.c 2005-11-01 
18:46:02.000000000 +0200
+++ linux-2.6.14-3/drivers/video/matrox/matroxfb_base.c 2005-11-01 
19:22:45.000000000 +0200
@@ -191,6 +191,7 @@ static void matroxfb_crtc1_panpos(WPMINF
                        ACCESS_FBINFO(crtc1.panpos) = -1; /* No update pending 
anymore */
                        extvga_reg = mga_inb(M_EXTVGA_INDEX);
                        mga_setr(M_EXTVGA_INDEX, 0x00, panpos);
+                       mga_inb(M_EXTVGA_INDEX);
                        if (extvga_reg != 0x00) {
                                mga_outb(M_EXTVGA_INDEX, extvga_reg);
                        }
@@ -208,16 +209,36 @@ static irqreturn_t matrox_irq(int irq, v
 
        status = mga_inl(M_STATUS);
 
+       if (status & 0x220)
+               mga_outl(M_ICLEAR, status & 0x220);
+
        if (status & 0x20) {
-               mga_outl(M_ICLEAR, 0x20);
                ACCESS_FBINFO(crtc1.vsync.cnt)++;
                matroxfb_crtc1_panpos(PMINFO2);
                wake_up_interruptible(&ACCESS_FBINFO(crtc1.vsync.wait));
                handled = 1;
        }
        if (status & 0x200) {
-               mga_outl(M_ICLEAR, 0x200);
                ACCESS_FBINFO(crtc2.vsync.cnt)++;
+               ACCESS_FBINFO(crtc2.vsync.field) = (mga_inl(0x3C48) >> 24) ^ 1;
+               if (ACCESS_FBINFO(crtc2.pan) &&
+                   ACCESS_FBINFO(crtc2.address.field) != 
ACCESS_FBINFO(crtc2.vsync.field)) {
+                       ACCESS_FBINFO(crtc2.pan) = 0;
+                       mga_outl(0x3C28, 
ACCESS_FBINFO(crtc2.address.offset[0]));
+                       mga_outl(0x3C2C, 
ACCESS_FBINFO(crtc2.address.offset[1]));
+                       mga_outl(0x3C30, 
ACCESS_FBINFO(crtc2.address.offset[2]));
+                       mga_outl(0x3C34, 
ACCESS_FBINFO(crtc2.address.offset[3]));
+                       mga_outl(0x3C38, 
ACCESS_FBINFO(crtc2.address.offset[4]));
+                       mga_outl(0x3C3C, 
ACCESS_FBINFO(crtc2.address.offset[5]));
+                       mga_inl(0x3C3C);
+               }
+               if (ACCESS_FBINFO(spic.pan) &&
+                   ACCESS_FBINFO(spic.address.field) != 
ACCESS_FBINFO(crtc2.vsync.field)) {
+                       ACCESS_FBINFO(spic.pan) = 0;
+                       mga_outl(0x3C54, ACCESS_FBINFO(spic.address.offset[0]));
+                       mga_outl(0x3C58, ACCESS_FBINFO(spic.address.offset[1]));
+                       mga_inl(0x3C58);
+               }
                wake_up_interruptible(&ACCESS_FBINFO(crtc2.vsync.wait));
                handled = 1;
        }
@@ -300,6 +321,162 @@ int matroxfb_wait_for_sync(WPMINFO u_int
        return 0;
 }
 
+int matroxfb_address(WPMINFO struct matrox_address *address) 
+{
+       if (address->device == MATROX_ADDRESS_DEVICE_CRTC1) {
+               int diff, linecomp = ACCESS_FBINFO(fbcon).var.yres;
+               unsigned int p0, p1, p2, p3, pos;
+               unsigned long flags;
+               int err;
+
+               pos = address->offset[0] * ACCESS_FBINFO(curr.final_bppShift) / 
32;
+               pos += ACCESS_FBINFO(curr.ydstorg.chunks);
+
+               p0 = ACCESS_FBINFO(hw).CRTC[0x0D] = pos & 0xFF;
+               p1 = ACCESS_FBINFO(hw).CRTC[0x0C] = (pos & 0xFF00) >> 8;
+               p2 = ACCESS_FBINFO(hw).CRTCEXT[0] = 
(ACCESS_FBINFO(hw).CRTCEXT[0] & 0xB0) |
+                                                   ((pos >> 16) & 0x0F) | 
((pos >> 14) & 0x40);
+               p3 = ACCESS_FBINFO(hw).CRTCEXT[8] = pos >> 21;
+
+               err = matroxfb_enable_irq(PMINFO 0);
+
+               do {
+                       diff = linecomp - mga_inl(0x1E20);
+               } while (-2 < diff && diff < 2);
+
+               CRITBEGIN
+
+               matroxfb_DAC_lock_irqsave(flags);
+               mga_setr(M_CRTC_INDEX, 0x0D, p0);
+               mga_setr(M_CRTC_INDEX, 0x0C, p1);
+               mga_setr(M_EXTVGA_INDEX, 0x08, p3);
+               if (!err) {
+                       ACCESS_FBINFO(crtc1.panpos) = p2;
+               } else {
+                       /* Abort any pending change */
+                       ACCESS_FBINFO(crtc1.panpos) = -1;
+                       mga_setr(M_EXTVGA_INDEX, 0x00, p2);
+                       mga_inb(M_EXTVGA_INDEX);
+               }
+               matroxfb_DAC_unlock_irqrestore(flags);
+       
+               CRITEND
+
+               address->field = -1; /* N/A */
+               address->count = ACCESS_FBINFO(crtc1.vsync.cnt);
+
+               return 0;
+       } else
+       if (address->device == MATROX_ADDRESS_DEVICE_CRTC2 &&
+           ACCESS_FBINFO(devflags.accelerator) == FB_ACCEL_MATROX_MGAG400) {
+               int diff, c2vlinecomp = (mga_inl(0x3C44) >> 16) & 0xFFF;
+               int err;
+
+               /* Interrupts are always needed to update vsync.cnt. */
+               err = matroxfb_enable_irq(PMINFO 0);
+
+               do {
+                       diff = c2vlinecomp - mga_inl(0x3C48);
+               } while (-2 < diff && diff < 2);
+
+               if (!err && address->field == ACCESS_FBINFO(crtc2.vsync.field)) 
{
+                       ACCESS_FBINFO(crtc2.address) = *address;
+                       ACCESS_FBINFO(crtc2.pan) = 1;
+               } else {
+                       ACCESS_FBINFO(crtc2.pan) = 0;
+
+                       mga_outl(0x3C28, address->offset[0]);
+                       mga_outl(0x3C2C, address->offset[1]);
+                       mga_outl(0x3C30, address->offset[2]);
+                       mga_outl(0x3C34, address->offset[3]);
+                       mga_outl(0x3C38, address->offset[4]);
+                       mga_outl(0x3C3C, address->offset[5]);
+                       mga_inl(0x3C3C);
+               }
+
+               address->field = ACCESS_FBINFO(crtc2.vsync.field);
+               address->count = ACCESS_FBINFO(crtc2.vsync.cnt);
+
+               return 0;
+       } else
+       if (address->device == MATROX_ADDRESS_DEVICE_SPIC &&
+           ACCESS_FBINFO(devflags.accelerator) == FB_ACCEL_MATROX_MGAG400) {
+               int diff, c2vlinecomp = (mga_inl(0x3C44) >> 16) & 0xFFF;
+               int err;
+
+               /* Interrupts are always needed to update vsync.cnt. */
+               err = matroxfb_enable_irq(PMINFO 0);
+
+               do {
+                       diff = c2vlinecomp - mga_inl(0x3C48);
+               } while (-2 < diff && diff < 2);
+
+               if (!err && address->field == ACCESS_FBINFO(crtc2.vsync.field)) 
{
+                       ACCESS_FBINFO(spic.address) = *address;
+                       ACCESS_FBINFO(spic.pan) = 1;
+               } else {
+                       ACCESS_FBINFO(spic.pan) = 0;
+
+                       mga_outl(0x3C54, address->offset[0]);
+                       mga_outl(0x3C58, address->offset[1]);
+                       mga_inl(0x3C58);
+               }
+
+               address->field = ACCESS_FBINFO(crtc2.vsync.field);
+               address->count = ACCESS_FBINFO(crtc2.vsync.cnt);
+
+               return 0;
+       } else
+       if (address->device == MATROX_ADDRESS_DEVICE_BES &&
+           ACCESS_FBINFO(devflags.accelerator) == FB_ACCEL_MATROX_MGAG400) {
+               int diff, besvcnt = (mga_inl(0x3DC0) >> 16) & 0xFFF;
+
+               /* Interrupts are always needed to update vsync.cnt. */
+               matroxfb_enable_irq(PMINFO 0);
+
+               do {
+                       diff = besvcnt - mga_inl(0x1E20);
+               } while (-2 < diff && diff < 2);
+
+               mga_outl(0x3D00, address->offset[0]);
+               mga_outl(0x3D04, address->offset[1]);
+               mga_outl(0x3D10, address->offset[2]);
+               mga_outl(0x3D14, address->offset[3]);
+               mga_outl(0x3D60, address->offset[4]);
+               mga_outl(0x3D64, address->offset[5]);
+               mga_inl(0x3D64);
+
+               address->field = -1; /* N/A */
+               address->count = ACCESS_FBINFO(crtc1.vsync.cnt);
+
+               return 0;
+       } else
+       if (address->device == MATROX_ADDRESS_DEVICE_BES &&
+           ACCESS_FBINFO(devflags.accelerator) == FB_ACCEL_MATROX_MGAG200) {
+               int diff, besvcnt = (mga_inl(0x3DC0) >> 16) & 0xFFF;
+
+               /* Interrupts are always needed to update vsync.cnt. */
+               matroxfb_enable_irq(PMINFO 0);
+
+               do {
+                       diff = besvcnt - mga_inl(0x1E20);
+               } while (-2 < diff && diff < 2);
+
+               mga_outl(0x3D00, address->offset[0]);
+               mga_outl(0x3D04, address->offset[1]);
+               mga_outl(0x3D10, address->offset[2]);
+               mga_outl(0x3D14, address->offset[3]);
+               mga_inl(0x3D14);
+
+               address->field = -1; /* N/A */
+               address->count = ACCESS_FBINFO(crtc1.vsync.cnt);
+
+               return 0;
+       }
+
+       return -ENODEV;
+}
+
 /* --------------------------------------------------------------------- */
 
 static void matrox_pan_var(WPMINFO struct fb_var_screeninfo *var) {
@@ -1160,6 +1337,23 @@ static int matroxfb_ioctl(struct inode *
                                up_read(&ACCESS_FBINFO(altout).lock);
                                return err;
                        }
+               case MATROXFB_ADDRESS:
+                       {
+                               struct matrox_address address;
+                               int err;
+
+                               if (copy_from_user(&address, argp, 
sizeof(address)))
+                                       return -EFAULT;
+
+                               err = matroxfb_address(PMINFO &address);
+                               if (err)
+                                       return err;
+
+                               if (copy_to_user(argp, &address, 
sizeof(address)))
+                                       return -EFAULT;
+
+                               return 0;
+                       }
        }
        return -ENOTTY;
 }
diff -urpN linux-2.6.14-2/drivers/video/matrox/matroxfb_base.h 
linux-2.6.14-3/drivers/video/matrox/matroxfb_base.h
--- linux-2.6.14-2/drivers/video/matrox/matroxfb_base.h 2005-11-01 
18:44:07.000000000 +0200
+++ linux-2.6.14-3/drivers/video/matrox/matroxfb_base.h 2005-11-01 
19:20:48.000000000 +0200
@@ -360,6 +360,20 @@ struct matroxfb_dh_fb_info;
 struct matrox_vsync {
        wait_queue_head_t       wait;
        unsigned int            cnt;
+       unsigned int            field;
+};
+
+#define MATROXFB_ADDRESS _IOWR('n', 0xFC, struct matrox_address)
+
+#define MATROX_ADDRESS_DEVICE_CRTC1    0
+#define MATROX_ADDRESS_DEVICE_BES      1       
+#define MATROX_ADDRESS_DEVICE_CRTC2    2
+#define MATROX_ADDRESS_DEVICE_SPIC     3
+struct matrox_address {
+       u32 device;
+       u32 field;
+       u32 count;
+       u32 offset[6];
 };
 
 struct matrox_fb_info {
@@ -393,8 +407,14 @@ struct matrox_fb_info {
                int             mnp;
        struct matroxfb_dh_fb_info*     info;
        struct rw_semaphore     lock;
+               int             pan;
+               struct matrox_address address;
                              } crtc2;
        struct {
+               int             pan;
+               struct matrox_address address;
+                             } spic;
+       struct {
        struct rw_semaphore     lock;
        struct {
                int brightness, contrast, saturation, hue, gamma;
diff -urpN linux-2.6.14-2/drivers/video/matrox/matroxfb_misc.c 
linux-2.6.14-3/drivers/video/matrox/matroxfb_misc.c
--- linux-2.6.14-2/drivers/video/matrox/matroxfb_misc.c 2005-11-01 
18:44:07.000000000 +0200
+++ linux-2.6.14-3/drivers/video/matrox/matroxfb_misc.c 2005-11-01 
19:21:06.000000000 +0200
@@ -273,7 +273,7 @@ int matroxfb_vgaHWinit(WPMINFO struct my
        vs = m->VSyncStart - 1;
        ve = m->VSyncEnd - 1;
        vt = m->VTotal - 2;
-       lc = vd;
+       lc = vd + 1;
        /* G200 cannot work with (ht & 7) == 6 */
        if (((ht & 0x07) == 0x06) || ((ht & 0x0F) == 0x04))
                ht++;
Index: gfxdrivers/matrox/matrox_bes.c
===================================================================
RCS file: /cvs/directfb/DirectFB/gfxdrivers/matrox/matrox_bes.c,v
retrieving revision 1.61
diff -u -r1.61 matrox_bes.c
--- gfxdrivers/matrox/matrox_bes.c      1 Nov 2005 15:11:14 -0000       1.61
+++ gfxdrivers/matrox/matrox_bes.c      1 Nov 2005 16:21:28 -0000
@@ -56,12 +56,15 @@
 
 #include <misc/util.h>
 
+#include <fbdev/fbdev.h>
+
 #include "regs.h"
 #include "mmio.h"
 #include "matrox.h"
 
 typedef struct {
      CoreLayerRegionConfig config;
+     __u32                 last_count;
 
      /* Stored registers */
      struct {
@@ -268,6 +271,8 @@
      {
           bes_calc_regs( mdrv, mbes, config, surface );
           bes_set_regs( mdrv, mbes, true );
+
+          mbes->last_count = 0;
      }
 
      /* set color key */
@@ -324,10 +329,36 @@
      MatroxDriverData   *mdrv = (MatroxDriverData*) driver_data;
      MatroxBesLayerData *mbes = (MatroxBesLayerData*) layer_data;
 
+#if 0
      bes_calc_regs( mdrv, mbes, &mbes->config, surface );
      bes_set_regs( mdrv, mbes, flags & DSFLIP_ONSYNC );
 
      dfb_surface_flip_buffers( surface, false );
+#else
+     {
+          FBDev                 *dfb_fbdev = dfb_system_data();
+          struct matrox_address  address;
+
+          bes_calc_regs( mdrv, mbes, &mbes->config, surface );
+
+          address.device    = MATROX_ADDRESS_DEVICE_BES;
+          address.field     = -1;
+          address.count     = mbes->last_count + 1;
+          address.offset[0] = mbes->regs.besA1ORG;
+          address.offset[1] = mbes->regs.besA2ORG;
+          address.offset[2] = mbes->regs.besA1CORG;
+          address.offset[3] = mbes->regs.besA2CORG;
+          address.offset[4] = mbes->regs.besA1C3ORG;
+          address.offset[5] = mbes->regs.besA2C3ORG;
+
+          if (ioctl( dfb_fbdev->fd, MATROXFB_ADDRESS, &address ))
+               D_ERROR( "DirectFB/Matrox/BES Address ioctl() failed!\n" );
+
+          dfb_surface_flip_buffers( surface, address.count == mbes->last_count 
);
+
+          mbes->last_count = address.count;
+     }
+#endif
 
      if (flags & DSFLIP_WAIT)
           dfb_screen_wait_vsync( mdrv->primary );
Index: gfxdrivers/matrox/matrox_crtc2.c
===================================================================
RCS file: /cvs/directfb/DirectFB/gfxdrivers/matrox/matrox_crtc2.c,v
retrieving revision 1.32
diff -u -r1.32 matrox_crtc2.c
--- gfxdrivers/matrox/matrox_crtc2.c    1 Nov 2005 15:26:28 -0000       1.32
+++ gfxdrivers/matrox/matrox_crtc2.c    1 Nov 2005 16:21:28 -0000
@@ -61,7 +61,10 @@
 typedef struct {
      CoreLayerRegionConfig config;
      DFBColorAdjustment    adj;
-     int                   field;
+     __u32                 parity;
+     __u32                 last_parity;
+     __u32                 last_field;
+     __u32                 last_count;
 
      /* Stored registers */
      struct {
@@ -247,7 +250,7 @@
      mcrtc2->config = *config;
 
      if (updated & CLRCF_PARITY)
-          mcrtc2->field = !config->parity;
+          mcrtc2->parity = !config->parity;
 
      if (updated & (CLRCF_WIDTH | CLRCF_HEIGHT | CLRCF_FORMAT |
                     CLRCF_SURFACE_CAPS | CLRCF_ALPHA_RAMP | CLRCF_SURFACE)) {
@@ -257,6 +260,10 @@
           ret = crtc2_enable_output( mdrv, mcrtc2 );
           if (ret)
                return ret;
+          
+          mcrtc2->last_parity = -1;
+          mcrtc2->last_field = 0;
+          mcrtc2->last_count = 0;
      }
 
      return DFB_OK;
@@ -286,6 +293,7 @@
 {
      MatroxDriverData     *mdrv    = (MatroxDriverData*) driver_data;
      MatroxCrtc2LayerData *mcrtc2  = (MatroxCrtc2LayerData*) layer_data;
+#if 0
      volatile __u8        *mmio    = mdrv->mmio_base;
 
      crtc2_calc_buffer( mdrv, mcrtc2, surface );
@@ -293,7 +301,7 @@
      if (mcrtc2->config.options & DLOP_FIELD_PARITY) {
           int field = (mga_in32( mmio, C2VCOUNT ) & C2FIELD) ? 1 : 0;
 
-          while (field == mcrtc2->field) {
+          while (field == mcrtc2->parity) {
                dfb_screen_wait_vsync( mdrv->secondary );
 
                field = (mga_in32( mmio, C2VCOUNT ) & C2FIELD) ? 1 : 0;
@@ -302,6 +310,38 @@
      crtc2_set_buffer( mdrv, mcrtc2 );
 
      dfb_surface_flip_buffers( surface, false );
+#else
+     {
+          FBDev                 *dfb_fbdev = dfb_system_data();
+          struct matrox_address  address;
+          __u32                  diff;
+
+          crtc2_calc_buffer( mdrv, mcrtc2, surface );
+
+          address.device    = MATROX_ADDRESS_DEVICE_CRTC2;
+          address.field     = (mcrtc2->config.options & DLOP_FIELD_PARITY) ? 
mcrtc2->parity : -1;
+          address.count     = mcrtc2->last_count + 2;
+          address.offset[0] = mcrtc2->regs.c2STARTADD0;
+          address.offset[1] = mcrtc2->regs.c2STARTADD1;
+          address.offset[2] = mcrtc2->regs.c2PL2STARTADD0;
+          address.offset[3] = mcrtc2->regs.c2PL2STARTADD1;
+          address.offset[4] = mcrtc2->regs.c2PL3STARTADD0;
+          address.offset[5] = mcrtc2->regs.c2PL3STARTADD1;
+
+          if (ioctl( dfb_fbdev->fd, MATROXFB_ADDRESS, &address ))
+               D_ERROR( "DirectFB/Matrox/CRTC2 Address ioctl() failed!\n" );
+
+          diff = address.count >= mcrtc2->last_count ?
+               address.count - mcrtc2->last_count :
+               0xFFFFFFFF - mcrtc2->last_count + address.count;
+
+          dfb_surface_flip_buffers( surface, diff == 0 || (diff == 1 && 
mcrtc2->last_field == mcrtc2->last_parity) );
+
+          mcrtc2->last_count = address.count;
+          mcrtc2->last_field = address.field;
+          mcrtc2->last_parity = (mcrtc2->config.options & DLOP_FIELD_PARITY) ? 
mcrtc2->parity : -1;
+     }
+#endif
 
      if (flags & DSFLIP_WAIT)
           dfb_screen_wait_vsync( mdrv->secondary );
@@ -492,7 +532,7 @@
 
           mcrtc2->regs.c2MISC = 0;
           /* c2vlinecomp */
-          mcrtc2->regs.c2MISC |= (vdisplay + 1) << 16;
+          mcrtc2->regs.c2MISC |= (vdisplay << 16) | 0x77;
      }
 
      /* c2bpp15halpha */
Index: gfxdrivers/matrox/matrox_spic.c
===================================================================
RCS file: /cvs/directfb/DirectFB/gfxdrivers/matrox/matrox_spic.c,v
retrieving revision 1.17
diff -u -r1.17 matrox_spic.c
--- gfxdrivers/matrox/matrox_spic.c     1 Nov 2005 16:13:13 -0000       1.17
+++ gfxdrivers/matrox/matrox_spic.c     1 Nov 2005 16:21:28 -0000
@@ -60,6 +60,10 @@
 
 typedef struct {
      CoreLayerRegionConfig config;
+     __u32                 parity;
+     __u32                 last_parity;
+     __u32                 last_field;
+     __u32                 last_count;
 
      /* Stored registers */
      struct {
@@ -78,7 +82,7 @@
 static void spic_set_buffer( MatroxDriverData    *mdrv,
                              MatroxSpicLayerData *mspic );
 
-#define SPIC_SUPPORTED_OPTIONS   (DLOP_ALPHACHANNEL | DLOP_OPACITY)
+#define SPIC_SUPPORTED_OPTIONS   (DLOP_ALPHACHANNEL | DLOP_OPACITY | 
DLOP_FIELD_PARITY)
 
 /**********************/
 
@@ -197,6 +201,9 @@
      /* remember configuration */
      mspic->config = *config;
 
+     if (updated & CLRCF_PARITY)
+          mspic->parity = !config->parity;
+
      if (updated & CLRCF_PALETTE) {
           __u8 y, cb, cr;
           int  i;
@@ -238,6 +245,10 @@
           mspic->regs.c2DATACTL |= ((config->opacity + 1) << 20) & C2STATICKEY;
 
           mga_out32( mmio, mspic->regs.c2DATACTL, C2DATACTL);
+
+          mspic->last_parity = -1;
+          mspic->last_field = 0;
+          mspic->last_count = 0;
      }
 
      return DFB_OK;
@@ -273,10 +284,39 @@
      MatroxDriverData    *mdrv  = (MatroxDriverData*) driver_data;
      MatroxSpicLayerData *mspic = (MatroxSpicLayerData*) layer_data;
 
+#if 0
      spic_calc_buffer( mdrv, mspic, surface );
      spic_set_buffer( mdrv, mspic );
 
      dfb_surface_flip_buffers( surface, false );
+#else
+     {
+          FBDev                 *dfb_fbdev = dfb_system_data();
+          struct matrox_address  address;
+          __u32                  diff;
+
+          spic_calc_buffer( mdrv, mspic, surface );
+
+          address.device    = MATROX_ADDRESS_DEVICE_SPIC;
+          address.field     = (mspic->config.options & DLOP_FIELD_PARITY) ? 
mspic->parity : -1;
+          address.count     = mspic->last_count + 2;
+          address.offset[0] = mspic->regs.c2SPICSTARTADD0;
+          address.offset[1] = mspic->regs.c2SPICSTARTADD1;
+
+          if (ioctl( dfb_fbdev->fd, MATROXFB_ADDRESS, &address ))
+               D_ERROR( "DirectFB/Matrox/SPIC Address ioctl() failed!\n" );
+
+          diff = address.count >= mspic->last_count ?
+                 address.count - mspic->last_count :
+                 0xFFFFFFFF - mspic->last_count + address.count;
+
+          dfb_surface_flip_buffers( surface, diff == 0 || (diff == 1 && 
mspic->last_field == mspic->last_parity) );
+
+          mspic->last_count = address.count;
+          mspic->last_field = address.field;
+          mspic->last_parity = (mspic->config.options & DLOP_FIELD_PARITY) ? 
mspic->parity : -1;
+     }
+#endif
 
      return DFB_OK;
 }
Index: systems/fbdev/fbdev.c
===================================================================
RCS file: /cvs/directfb/DirectFB/systems/fbdev/fbdev.c,v
retrieving revision 1.30
diff -u -r1.30 fbdev.c
--- systems/fbdev/fbdev.c       18 Oct 2005 10:57:32 -0000      1.30
+++ systems/fbdev/fbdev.c       1 Nov 2005 16:21:28 -0000
@@ -1276,6 +1276,7 @@
                    CoreSurface         *surface,
                    DFBSurfaceFlipFlags  flags )
 {
+#if 0
      DFBResult ret;
 
      if (((flags & DSFLIP_WAITFORSYNC) == DSFLIP_WAITFORSYNC) &&
@@ -1293,6 +1294,29 @@
           dfb_screen_wait_vsync( dfb_screens_at(DSCID_PRIMARY) );
 
      dfb_surface_flip_buffers( surface, false );
+#else
+     {
+          struct matrox_address  address;
+          unsigned int offset;
+
+          offset = surface->back_buffer->video.offset / 
DFB_BYTES_PER_PIXEL(surface->format);
+
+          address.device    = MATROX_ADDRESS_DEVICE_CRTC1;
+          address.field     = -1;
+          address.count     = dfb_fbdev->shared->last_count + 1;
+          address.offset[0] = offset;
+
+          if (ioctl( dfb_fbdev->fd, MATROXFB_ADDRESS, &address ))
+               D_ERROR( "DirectFB/Matrox/BES Address ioctl() failed!\n" );
+
+          dfb_surface_flip_buffers( surface, address.count == 
dfb_fbdev->shared->last_count );
+
+          dfb_fbdev->shared->last_count = address.count;
+     }
+
+     if (flags & DSFLIP_WAIT)
+          dfb_screen_wait_vsync( dfb_screens_at(DSCID_PRIMARY) );
+#endif
 
      return DFB_OK;
 }
Index: systems/fbdev/fbdev.h
===================================================================
RCS file: /cvs/directfb/DirectFB/systems/fbdev/fbdev.h,v
retrieving revision 1.4
diff -u -r1.4 fbdev.h
--- systems/fbdev/fbdev.h       22 Sep 2005 09:22:01 -0000      1.4
+++ systems/fbdev/fbdev.h       1 Nov 2005 16:21:28 -0000
@@ -43,6 +43,18 @@
 #define FBIO_WAITFORVSYNC      _IOW('F', 0x20, u_int32_t)
 #endif
 
+#define MATROX_ADDRESS_DEVICE_CRTC1     0
+#define MATROX_ADDRESS_DEVICE_BES       1
+#define MATROX_ADDRESS_DEVICE_CRTC2     2
+#define MATROX_ADDRESS_DEVICE_SPIC      3
+struct matrox_address
+{
+     __u32 device;
+     __u32 field;
+     __u32 count;
+     __u32 offset[6];
+};
+#define MATROXFB_ADDRESS _IOWR('n', 0xFC, struct matrox_address)
 
 typedef struct {
      /* fbdev fixed screeninfo, contains infos about memory and type of card */
@@ -76,6 +88,8 @@
           unsigned short      vendor;        /* Graphics device vendor id */
           unsigned short      model;         /* Graphics device model id */
      } device;
+
+     __u32 last_count;
 } FBDevShared;
 
 typedef struct {
_______________________________________________
directfb-dev mailing list
[email protected]
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev

Reply via email to