فهرست منبع

Fixed bug 4054 - Raspberry Pi refresh rate detection

Viacheslav Slavinsky

SDL_rpivideo driver has 60 frames per second hardcoded in it, this is a problem for games that need to keep pace using VSYNC. I believe that I have found a solution to this. It is based on code in tvservice.c in rpi userland:

https://github.com/raspberrypi/userland/blob/a1b89e91f393c7134b4cdc36431f863bb3333163/host_applications/linux/apps/tvservice/tvservice.c#L433
Sam Lantinga 7 سال پیش
والد
کامیت
940933d892
1فایلهای تغییر یافته به همراه18 افزوده شده و 2 حذف شده
  1. 18 2
      src/video/raspberry/SDL_rpivideo.c

+ 18 - 2
src/video/raspberry/SDL_rpivideo.c

@@ -63,6 +63,23 @@ RPI_Destroy(SDL_VideoDevice * device)
     SDL_free(device);
 }
 
+static int 
+RPI_GetRefreshRate()
+{
+    TV_DISPLAY_STATE_T tvstate;
+    if (vc_tv_get_display_state( &tvstate ) == 0) {
+        //The width/height parameters are in the same position in the union
+        //for HDMI and SDTV
+        HDMI_PROPERTY_PARAM_T property;
+        property.property = HDMI_PROPERTY_PIXEL_CLOCK_TYPE;
+        vc_tv_hdmi_get_property(&property);
+        return property.param1 == HDMI_PIXEL_CLOCK_TYPE_NTSC ? 
+            tvstate.display.hdmi.frame_rate * (1000.0f/1001.0f) : 
+            tvstate.display.hdmi.frame_rate;
+    } 
+    return 60;  /* Failed to get display state, default to 60 */
+}
+
 static SDL_VideoDevice *
 RPI_Create()
 {
@@ -159,8 +176,7 @@ RPI_VideoInit(_THIS)
 
     current_mode.w = w;
     current_mode.h = h;
-    /* FIXME: Is there a way to tell the actual refresh rate? */
-    current_mode.refresh_rate = 60;
+    current_mode.refresh_rate = RPI_GetRefreshRate();
     /* 32 bpp for default */
     current_mode.format = SDL_PIXELFORMAT_ABGR8888;