Hi, attached are two patches -
1) fixes incorrect patching of the frequency for NTSC/PAL-60 standards (they are defined as 59.94Hz not 60Hz, this is simply wrong) 2) I would like to have an API to retrieve the current VSync count - attached is an implementation for the fbdev system. Cheers, Andre'
>From 1be16a019ffe32f0f56d93ff027a2713b4e667c7 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Andr=C3=A9=20Draszik?= <andre.dras...@st.com> Date: Fri, 29 Jan 2010 11:52:24 +0000 Subject: [PATCH 1/2] screen: NTSC and PAL60 standards are defined as 59.94Hz not 60Hz MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Signed-off-by: André Draszik <andre.dras...@st.com> --- src/display/idirectfbscreen.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/display/idirectfbscreen.c b/src/display/idirectfbscreen.c index 9fcebdc..cd7bbe1 100644 --- a/src/display/idirectfbscreen.c +++ b/src/display/idirectfbscreen.c @@ -631,7 +631,7 @@ PatchEncoderConfig( DFBScreenEncoderConfig *patched, case DSETV_PAL_60: case DSETV_PAL_M: patched->resolution = DSOR_720_480; - patched->frequency = DSEF_60HZ; + patched->frequency = DSEF_59_94HZ; break; case DSETV_SECAM: @@ -643,7 +643,7 @@ PatchEncoderConfig( DFBScreenEncoderConfig *patched, case DSETV_NTSC_M_JPN: case DSETV_NTSC_443: patched->resolution = DSOR_720_480; - patched->frequency = DSEF_60HZ; + patched->frequency = DSEF_59_94HZ; break; default: -- 1.6.3.3
>From b63f9c164ff305719357e0c890f261ab197d2dec Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Andr=C3=A9=20Draszik?= <andre.dras...@st.com> Date: Fri, 29 Jan 2010 11:51:08 +0000 Subject: [PATCH 2/2] IDirectFBScreen: add IDirectFBScreen::GetVSyncCount() MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Signed-off-by: André Draszik <andre.dras...@st.com> --- include/directfb.h | 11 +++++++++++ src/core/screen.c | 20 ++++++++++++++++++++ src/core/screen.h | 2 ++ src/core/screens.h | 8 ++++++++ src/display/idirectfbscreen.c | 10 ++++++++++ systems/fbdev/fbdev.c | 32 ++++++++++++++++++++++++++++++++ 6 files changed, 83 insertions(+), 0 deletions(-) diff --git a/include/directfb.h b/include/directfb.h index 54fbd19..a4edf43 100644 --- a/include/directfb.h +++ b/include/directfb.h @@ -2693,6 +2693,17 @@ DEFINE_INTERFACE( IDirectFBScreen, int output, const DFBScreenOutputConfig *config ); + + + /** Synchronization **/ + + /* + * Return current VSync count. + */ + DFBResult (*GetVSyncCount) ( + IDirectFBScreen *thiz, + unsigned long *ret_count + ); ) diff --git a/src/core/screen.c b/src/core/screen.c index 4b233e0..ede0f11 100644 --- a/src/core/screen.c +++ b/src/core/screen.c @@ -111,6 +111,26 @@ dfb_screen_wait_vsync( CoreScreen *screen ) return DFB_UNSUPPORTED; } +DFBResult +dfb_screen_get_vsync_count( CoreScreen *screen, unsigned long *ret_count ) +{ + ScreenFuncs *funcs; + + D_ASSERT( screen != NULL ); + D_ASSERT( screen->funcs != NULL ); + D_ASSERT( ret_count != NULL ); + + funcs = screen->funcs; + + if (funcs->GetVSyncCount) + return funcs->GetVSyncCount( screen, + screen->driver_data, + screen->screen_data, + ret_count ); + + return DFB_UNSUPPORTED; +} + /*********************************** Mixers ***********************************/ diff --git a/src/core/screen.h b/src/core/screen.h index b5491f4..72cea82 100644 --- a/src/core/screen.h +++ b/src/core/screen.h @@ -45,6 +45,8 @@ DFBResult dfb_screen_set_powermode ( CoreScreen *screen, DFBScreenPowerMode mode ); DFBResult dfb_screen_wait_vsync ( CoreScreen *screen ); +DFBResult dfb_screen_get_vsync_count ( CoreScreen *screen, + unsigned long *ret_count ); /* Mixers */ diff --git a/src/core/screens.h b/src/core/screens.h index 40fc084..ddf2a4b 100644 --- a/src/core/screens.h +++ b/src/core/screens.h @@ -132,6 +132,14 @@ typedef struct { void *driver_data, void *screen_data ); + /* + * Wait for the vertical retrace. + */ + DFBResult (*GetVSyncCount) ( CoreScreen *screen, + void *driver_data, + void *screen_data, + unsigned long *ret_count ); + /** Mixer configuration **/ diff --git a/src/display/idirectfbscreen.c b/src/display/idirectfbscreen.c index cd7bbe1..51ce261 100644 --- a/src/display/idirectfbscreen.c +++ b/src/display/idirectfbscreen.c @@ -213,6 +213,15 @@ IDirectFBScreen_WaitForSync( IDirectFBScreen *thiz ) } static DFBResult +IDirectFBScreen_GetVSyncCount( IDirectFBScreen *thiz, + unsigned long *ret_count ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBScreen) + + return dfb_screen_get_vsync_count( data->screen, ret_count ); +} + +static DFBResult IDirectFBScreen_GetMixerDescriptions( IDirectFBScreen *thiz, DFBScreenMixerDescription *descriptions ) { @@ -555,6 +564,7 @@ IDirectFBScreen_Construct( IDirectFBScreen *thiz, thiz->EnumDisplayLayers = IDirectFBScreen_EnumDisplayLayers; thiz->SetPowerMode = IDirectFBScreen_SetPowerMode; thiz->WaitForSync = IDirectFBScreen_WaitForSync; + thiz->GetVSyncCount = IDirectFBScreen_GetVSyncCount; thiz->GetMixerDescriptions = IDirectFBScreen_GetMixerDescriptions; thiz->GetMixerConfiguration = IDirectFBScreen_GetMixerConfiguration; thiz->TestMixerConfiguration = IDirectFBScreen_TestMixerConfiguration; diff --git a/systems/fbdev/fbdev.c b/systems/fbdev/fbdev.c index 9eda96a..05be073 100644 --- a/systems/fbdev/fbdev.c +++ b/systems/fbdev/fbdev.c @@ -209,11 +209,17 @@ static DFBResult primaryGetScreenSize( CoreScreen *screen, int *ret_width, int *ret_height ); +static DFBResult primaryGetVSyncCount( CoreScreen *screen, + void *driver_data, + void *screen_data, + unsigned long *ret_count ); + static ScreenFuncs primaryScreenFuncs = { .InitScreen = primaryInitScreen, .SetPowerMode = primarySetPowerMode, .WaitVSync = primaryWaitVSync, .GetScreenSize = primaryGetScreenSize, + .GetVSyncCount = primaryGetVSyncCount, }; /******************************************************************************/ @@ -1068,6 +1074,32 @@ primaryWaitVSync( CoreScreen *screen, } static DFBResult +primaryGetVSyncCount( CoreScreen *screen, + void *driver_data, + void *screen_data, + unsigned long *ret_count ) +{ + struct fb_vblank vblank; + + D_DEBUG_AT( FBDev_Primary, "%s()\n", __FUNCTION__ ); + + D_ASSERT( ret_count != NULL ); + + if (!ret_count) + return DFB_INVARG; + + if (ioctl( dfb_fbdev->fd, FBIOGET_VBLANK, &vblank )) + return errno2result( errno ); + + if (!D_FLAGS_IS_SET( vblank.flags, FB_VBLANK_HAVE_COUNT )) + return DFB_UNSUPPORTED; + + *ret_count = vblank.count; + + return DFB_OK; +} + +static DFBResult primaryGetScreenSize( CoreScreen *screen, void *driver_data, void *screen_data, -- 1.6.3.3
_______________________________________________ directfb-dev mailing list directfb-dev@directfb.org http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev