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;