This patch adds WaitForSync() to IDirectFBDisplayLayer. I also replaced
all cases of dfb_system_wait_vsync() with layer specific stuff. I left
IDirectFB::WaitForSync() intact to avoid breaking all apps using it.
Compiles fine but I didn't test it in action yet.

-- 
Ville Syrj�l�
[EMAIL PROTECTED]
http://www.sci.fi/~syrjala/
Index: gfxdrivers/matrox/matrox_crtc2.c
===================================================================
RCS file: /cvs/directfb/DirectFB/gfxdrivers/matrox/matrox_crtc2.c,v
retrieving revision 1.4
diff -u -r1.4 matrox_crtc2.c
--- gfxdrivers/matrox/matrox_crtc2.c    12 Nov 2002 22:46:31 -0000      1.4
+++ gfxdrivers/matrox/matrox_crtc2.c    18 Nov 2002 11:44:27 -0000
@@ -383,6 +383,19 @@
      }
 }
 
+
+static DFBResult
+crtc2WaitVSync( DisplayLayer *layer,
+                void         *driver_data,
+                void         *layer_data )
+{
+     MatroxDriverData *mdrv = (MatroxDriverData*) driver_data;
+
+     crtc2_wait_vsync( mdrv );
+
+     return DFB_OK;
+}
+
 DisplayLayerFuncs matroxCrtc2Funcs = {
      LayerDataSize:      crtc2LayerDataSize,
      InitLayer:          crtc2InitLayer,
@@ -393,7 +406,8 @@
      FlipBuffers:        crtc2FlipBuffers,
      SetColorAdjustment: crtc2SetColorAdjustment,
      SetOpacity:         crtc2SetOpacity,
-     GetCurrentOutputField: crtc2GetCurrentOutputField
+     GetCurrentOutputField: crtc2GetCurrentOutputField,
+     WaitVSync:          crtc2WaitVSync
 };
 
 /* internal */
Index: include/directfb.h
===================================================================
RCS file: /cvs/directfb/DirectFB/include/directfb.h,v
retrieving revision 1.153
diff -u -r1.153 directfb.h
--- include/directfb.h  1 Nov 2002 23:06:35 -0000       1.153
+++ include/directfb.h  18 Nov 2002 11:44:46 -0000
@@ -1517,6 +1517,13 @@
           int                                *field
      );
 
+     /*
+      * Wait for next vertical retrace.
+      */
+     DFBResult (*WaitForSync) (
+          IDirectFBDisplayLayer              *thiz
+     );
+
 
    /** Configuration handling **/
 
Index: src/core/layers.c
===================================================================
RCS file: /cvs/directfb/DirectFB/src/core/layers.c,v
retrieving revision 1.80
diff -u -r1.80 layers.c
--- src/core/layers.c   13 Nov 2002 21:13:45 -0000      1.80
+++ src/core/layers.c   18 Nov 2002 11:44:54 -0000
@@ -959,7 +959,7 @@
           
           case DLBM_BACKSYSTEM:
                if (flags & DSFLIP_WAITFORSYNC)
-                    dfb_system_wait_vsync();
+                    dfb_layer_wait_vsync( layer );
                dfb_back_to_front_copy( shared->surface, NULL );
                dfb_layer_update_region( layer, NULL, flags );
                break;
@@ -1121,7 +1121,8 @@
      return DFB_OK;
 }
 
-DFBResult dfb_layer_get_current_output_field( DisplayLayer *layer, int *field )
+DFBResult
+dfb_layer_get_current_output_field( DisplayLayer *layer, int *field )
 {
      DFBResult ret;
 
@@ -1135,6 +1136,21 @@
 
      return DFB_OK;
 }
+
+DFBResult
+dfb_layer_wait_vsync( DisplayLayer *layer )
+{
+     DFBResult ret;
+
+     if (layer->funcs->WaitVSync)
+          ret = layer->funcs->WaitVSync( layer, layer->driver_data,
+                                         layer->layer_data );
+     else
+          ret = dfb_system_wait_vsync();
+
+     return ret;
+}
+
 
 DFBResult
 dfb_layer_set_coloradjustment (DisplayLayer       *layer,
Index: src/core/layers.h
===================================================================
RCS file: /cvs/directfb/DirectFB/src/core/layers.h,v
retrieving revision 1.39
diff -u -r1.39 layers.h
--- src/core/layers.h   27 Sep 2002 12:50:50 -0000      1.39
+++ src/core/layers.h   18 Nov 2002 11:44:55 -0000
@@ -88,7 +88,11 @@
                                           void                   *driver_data,
                                           void                   *layer_data,
                                           int                    *field );
-     
+
+     DFBResult (*WaitVSync)         ( DisplayLayer               *layer,
+                                      void                       *driver_data,
+                                      void                       *layer_data );
+
      DFBResult (*SetScreenLocation) ( DisplayLayer               *layer,
                                       void                       *driver_data,
                                       void                       *layer_data,
@@ -315,6 +319,7 @@
 DFBResult dfb_layer_set_opacity (DisplayLayer *layer, __u8 opacity);
 
 DFBResult dfb_layer_get_current_output_field( DisplayLayer *layer, int *field );
+DFBResult dfb_layer_wait_vsync( DisplayLayer *layer );
 
 DFBResult dfb_layer_set_coloradjustment (DisplayLayer       *layer,
                                          DFBColorAdjustment *adj);
Index: src/core/windows.c
===================================================================
RCS file: /cvs/directfb/DirectFB/src/core/windows.c,v
retrieving revision 1.117
diff -u -r1.117 windows.c
--- src/core/windows.c  11 Nov 2002 05:33:09 -0000      1.117
+++ src/core/windows.c  18 Nov 2002 11:45:12 -0000
@@ -1347,7 +1347,7 @@
                                      region->y2 - region->y1 + 1 };
 
                if (flags & DSFLIP_WAITFORSYNC)
-                    dfb_system_wait_vsync();
+                    dfb_layer_wait_vsync( layer );
                
                dfb_back_to_front_copy( surface, &rect );
           }
Index: src/display/idirectfbdisplaylayer.c
===================================================================
RCS file: /cvs/directfb/DirectFB/src/display/idirectfbdisplaylayer.c,v
retrieving revision 1.42
diff -u -r1.42 idirectfbdisplaylayer.c
--- src/display/idirectfbdisplaylayer.c 2 Oct 2002 19:37:23 -0000       1.42
+++ src/display/idirectfbdisplaylayer.c 18 Nov 2002 11:45:15 -0000
@@ -209,6 +209,14 @@
 }
 
 static DFBResult
+IDirectFBDisplayLayer_WaitForSync( IDirectFBDisplayLayer *thiz )
+{
+     INTERFACE_GET_DATA(IDirectFBDisplayLayer)
+
+     return dfb_layer_wait_vsync( data->layer );
+}
+
+static DFBResult
 IDirectFBDisplayLayer_SetScreenLocation( IDirectFBDisplayLayer *thiz,
                                          float                  x,
                                          float                  y,
Index: src/display/idirectfbsurface_layer.c
===================================================================
RCS file: /cvs/directfb/DirectFB/src/display/idirectfbsurface_layer.c,v
retrieving revision 1.28
diff -u -r1.28 idirectfbsurface_layer.c
--- src/display/idirectfbsurface_layer.c        2 Oct 2002 19:37:23 -0000       1.28
+++ src/display/idirectfbsurface_layer.c        18 Nov 2002 11:45:17 -0000
@@ -100,7 +100,7 @@
 
      if (flags & DSFLIP_BLIT || region || data->base.caps & DSCAPS_SUBSURFACE) {
           if (flags & DSFLIP_WAITFORSYNC)
-               dfb_system_wait_vsync();
+               dfb_layer_wait_vsync( data->layer );
           
           if (region) {
                DFBRegion    reg  = *region;

Reply via email to