Index: gfxdrivers/matrox/matrox_crtc2.c =================================================================== RCS file: /cvs/directfb/DirectFB/gfxdrivers/matrox/matrox_crtc2.c,v retrieving revision 1.1 diff -p -u -p -u -r1.1 matrox_crtc2.c --- gfxdrivers/matrox/matrox_crtc2.c 5 Sep 2002 11:36:23 -0000 1.1 +++ gfxdrivers/matrox/matrox_crtc2.c 26 Sep 2002 00:33:19 -0000 @@ -364,6 +364,23 @@ crtc2SetOpacity( DisplayLayer *layer, return DFB_OK; } +static DFBResult +crtc2GetCurrentOutputField( DisplayLayer *layer, + void *driver_data, + void *layer_data, + int *field ) +{ + MatroxDriverData *mdrv = (MatroxDriverData*) driver_data; + int mga_field = ( mga_in32( mdrv->mmio_base, C2VCOUNT ) >> 24 ) & 1; + + if( field ) { + *field = mga_field; + return DFB_OK; + } else { + return DFB_INVARG; + } +} + DisplayLayerFuncs matroxCrtc2Funcs = { LayerDataSize: crtc2LayerDataSize, InitLayer: crtc2InitLayer, @@ -373,7 +390,8 @@ DisplayLayerFuncs matroxCrtc2Funcs = { SetConfiguration: crtc2SetConfiguration, FlipBuffers: crtc2FlipBuffers, SetColorAdjustment: crtc2SetColorAdjustment, - SetOpacity: crtc2SetOpacity + SetOpacity: crtc2SetOpacity, + GetCurrentOutputField: crtc2GetCurrentOutputField }; /* internal */ Index: include/directfb.h =================================================================== RCS file: /cvs/directfb/DirectFB/include/directfb.h,v retrieving revision 1.149 diff -p -u -p -u -r1.149 directfb.h --- include/directfb.h 10 Sep 2002 21:42:04 -0000 1.149 +++ include/directfb.h 26 Sep 2002 00:33:20 -0000 @@ -1470,6 +1470,23 @@ DEFINE_INTERFACE( IDirectFBDisplayLaye int level ); + /* + * For an interlaced display, this Returns the currently inactive + * field: 0 for an even field (the even scanlines starting at 0), + * and 1 for an odd field (the odd scanlines starting at 1). + * + * The inactive field is the one you should draw to next to avoid + * tearing, the active field is the one currently being displayed. + * + * For a progressive output, this should always return 0. We should + * also have some other call to indicate whether the display layer + * is interlaced or progressive, but this is a start. + */ + DFBResult (*GetCurrentOutputField) ( + IDirectFBDisplayLayer *thiz, + int *field + ); + /** Configuration handling **/ Index: src/core/layers.c =================================================================== RCS file: /cvs/directfb/DirectFB/src/core/layers.c,v retrieving revision 1.67 diff -p -u -p -u -r1.67 layers.c --- src/core/layers.c 11 Sep 2002 10:47:07 -0000 1.67 +++ src/core/layers.c 26 Sep 2002 00:33:20 -0000 @@ -1084,6 +1084,22 @@ dfb_layer_set_opacity (DisplayLayer *lay return DFB_OK; } +DFBResult dfb_layer_get_current_output_field( DisplayLayer *layer, int *field ) +{ + DFBResult ret; + DisplayLayerShared *shared = layer->shared; + + if (!layer->funcs->GetCurrentOutputField) + return DFB_UNSUPPORTED; + + ret = layer->funcs->GetCurrentOutputField( layer, layer->driver_data, + layer->layer_data, field ); + if (ret) + return ret; + + return DFB_OK; +} + DFBResult dfb_layer_set_coloradjustment (DisplayLayer *layer, DFBColorAdjustment *adj) Index: src/core/layers.h =================================================================== RCS file: /cvs/directfb/DirectFB/src/core/layers.h,v retrieving revision 1.38 diff -p -u -p -u -r1.38 layers.h --- src/core/layers.h 11 Sep 2002 10:47:07 -0000 1.38 +++ src/core/layers.h 26 Sep 2002 00:33:20 -0000 @@ -83,6 +83,11 @@ typedef struct { void *driver_data, void *layer_data, __u8 opacity ); + + DFBResult (*GetCurrentOutputField) ( DisplayLayer *layer, + void *driver_data, + void *layer_data, + int *field ); DFBResult (*SetScreenLocation) ( DisplayLayer *layer, void *driver_data, @@ -308,6 +313,8 @@ DFBResult dfb_layer_set_screenlocation( float width, float height ); DFBResult dfb_layer_set_opacity (DisplayLayer *layer, __u8 opacity); + +DFBResult dfb_layer_get_current_output_field( DisplayLayer *layer, int *field ); DFBResult dfb_layer_set_coloradjustment (DisplayLayer *layer, DFBColorAdjustment *adj); Index: src/display/idirectfbdisplaylayer.c =================================================================== RCS file: /cvs/directfb/DirectFB/src/display/idirectfbdisplaylayer.c,v retrieving revision 1.40 diff -p -u -p -u -r1.40 idirectfbdisplaylayer.c --- src/display/idirectfbdisplaylayer.c 10 Sep 2002 16:35:54 -0000 1.40 +++ src/display/idirectfbdisplaylayer.c 26 Sep 2002 00:33:20 -0000 @@ -218,6 +218,14 @@ IDirectFBDisplayLayer_SetOpacity( IDirec } static DFBResult +IDirectFBDisplayLayer_GetCurrentOutputField( IDirectFBDisplayLayer *thiz, int *field ) +{ + INTERFACE_GET_DATA(IDirectFBDisplayLayer) + + return dfb_layer_get_current_output_field( data->layer, field ); +} + +static DFBResult IDirectFBDisplayLayer_SetScreenLocation( IDirectFBDisplayLayer *thiz, float x, float y, @@ -591,6 +599,7 @@ IDirectFBDisplayLayer_Construct( IDirect thiz->GetSurface = IDirectFBDisplayLayer_GetSurface; thiz->SetCooperativeLevel = IDirectFBDisplayLayer_SetCooperativeLevel; thiz->SetOpacity = IDirectFBDisplayLayer_SetOpacity; + thiz->GetCurrentOutputField = IDirectFBDisplayLayer_GetCurrentOutputField; thiz->SetScreenLocation = IDirectFBDisplayLayer_SetScreenLocation; thiz->SetSrcColorKey = IDirectFBDisplayLayer_SetSrcColorKey; thiz->SetDstColorKey = IDirectFBDisplayLayer_SetDstColorKey;