|
@@ -602,12 +602,6 @@ extern void UnloadFontDefault(void); // [Module: text] Unloads default fo
|
|
|
static bool InitGraphicsDevice(int width, int height); // Initialize graphics device
|
|
|
static void SetupFramebuffer(int width, int height); // Setup main framebuffer
|
|
|
static void SetupViewport(int width, int height); // Set viewport for a provided width and height
|
|
|
-static void SwapBuffers(void); // Copy back buffer to front buffer
|
|
|
-
|
|
|
-static void InitTimer(void); // Initialize timer
|
|
|
-static void WaitTime(float ms); // Wait for some milliseconds (stop program execution)
|
|
|
-
|
|
|
-static void PollInputEvents(void); // Register user events
|
|
|
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
|
|
|
static void ErrorCallback(int error, const char *description); // GLFW3 Error Callback, runs on GLFW3 error
|
|
@@ -2019,6 +2013,7 @@ void EndDrawing(void)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+#if !defined(SUPPORT_CUSTOM_FRAME_CONTROL)
|
|
|
SwapBuffers(); // Copy back buffer to front buffer (screen)
|
|
|
|
|
|
// Frame time control system
|
|
@@ -2041,6 +2036,7 @@ void EndDrawing(void)
|
|
|
}
|
|
|
|
|
|
PollInputEvents(); // Poll user events
|
|
|
+#endif
|
|
|
|
|
|
#if defined(SUPPORT_EVENTS_AUTOMATION)
|
|
|
// Events recording and playing logic
|
|
@@ -4660,7 +4656,7 @@ static void SetupFramebuffer(int width, int height)
|
|
|
}
|
|
|
|
|
|
// Initialize hi-resolution timer
|
|
|
-static void InitTimer(void)
|
|
|
+void InitTimer(void)
|
|
|
{
|
|
|
srand((unsigned int)time(NULL)); // Initialize random seed
|
|
|
|
|
@@ -4690,7 +4686,7 @@ static void InitTimer(void)
|
|
|
// take longer than expected... for that reason we use the busy wait loop
|
|
|
// Ref: http://stackoverflow.com/questions/43057578/c-programming-win32-games-sleep-taking-longer-than-expected
|
|
|
// Ref: http://www.geisswerks.com/ryan/FAQS/timing.html --> All about timming on Win32!
|
|
|
-static void WaitTime(float ms)
|
|
|
+void WaitTime(float ms)
|
|
|
{
|
|
|
#if defined(PLATFORM_UWP)
|
|
|
UWPGetSleepFunc()(ms/1000);
|
|
@@ -4738,8 +4734,70 @@ static void WaitTime(float ms)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-// Poll (store) all input events
|
|
|
-static void PollInputEvents(void)
|
|
|
+// Swap back buffer with front buffer (screen drawing)
|
|
|
+void SwapBuffers(void)
|
|
|
+{
|
|
|
+#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
|
|
|
+ glfwSwapBuffers(CORE.Window.handle);
|
|
|
+#endif
|
|
|
+
|
|
|
+#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) || defined(PLATFORM_UWP)
|
|
|
+ eglSwapBuffers(CORE.Window.device, CORE.Window.surface);
|
|
|
+
|
|
|
+#if defined(PLATFORM_DRM)
|
|
|
+ if (!CORE.Window.gbmSurface || (-1 == CORE.Window.fd) || !CORE.Window.connector || !CORE.Window.crtc)
|
|
|
+ {
|
|
|
+ TRACELOG(LOG_ERROR, "DISPLAY: DRM initialization failed to swap");
|
|
|
+ abort();
|
|
|
+ }
|
|
|
+
|
|
|
+ struct gbm_bo *bo = gbm_surface_lock_front_buffer(CORE.Window.gbmSurface);
|
|
|
+ if (!bo)
|
|
|
+ {
|
|
|
+ TRACELOG(LOG_ERROR, "DISPLAY: Failed GBM to lock front buffer");
|
|
|
+ abort();
|
|
|
+ }
|
|
|
+
|
|
|
+ uint32_t fb = 0;
|
|
|
+ int result = drmModeAddFB(CORE.Window.fd, CORE.Window.connector->modes[CORE.Window.modeIndex].hdisplay,
|
|
|
+ CORE.Window.connector->modes[CORE.Window.modeIndex].vdisplay, 24, 32, gbm_bo_get_stride(bo), gbm_bo_get_handle(bo).u32, &fb);
|
|
|
+ if (0 != result)
|
|
|
+ {
|
|
|
+ TRACELOG(LOG_ERROR, "DISPLAY: drmModeAddFB() failed with result: %d", result);
|
|
|
+ abort();
|
|
|
+ }
|
|
|
+
|
|
|
+ result = drmModeSetCrtc(CORE.Window.fd, CORE.Window.crtc->crtc_id, fb, 0, 0,
|
|
|
+ &CORE.Window.connector->connector_id, 1, &CORE.Window.connector->modes[CORE.Window.modeIndex]);
|
|
|
+ if (0 != result)
|
|
|
+ {
|
|
|
+ TRACELOG(LOG_ERROR, "DISPLAY: drmModeSetCrtc() failed with result: %d", result);
|
|
|
+ abort();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (CORE.Window.prevFB)
|
|
|
+ {
|
|
|
+ result = drmModeRmFB(CORE.Window.fd, CORE.Window.prevFB);
|
|
|
+ if (0 != result)
|
|
|
+ {
|
|
|
+ TRACELOG(LOG_ERROR, "DISPLAY: drmModeRmFB() failed with result: %d", result);
|
|
|
+ abort();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ CORE.Window.prevFB = fb;
|
|
|
+
|
|
|
+ if (CORE.Window.prevBO)
|
|
|
+ {
|
|
|
+ gbm_surface_release_buffer(CORE.Window.gbmSurface, CORE.Window.prevBO);
|
|
|
+ }
|
|
|
+
|
|
|
+ CORE.Window.prevBO = bo;
|
|
|
+#endif // PLATFORM_DRM
|
|
|
+#endif // PLATFORM_ANDROID || PLATFORM_RPI || PLATFORM_DRM || PLATFORM_UWP
|
|
|
+}
|
|
|
+
|
|
|
+// Register all input events
|
|
|
+void PollInputEvents(void)
|
|
|
{
|
|
|
#if defined(SUPPORT_GESTURES_SYSTEM)
|
|
|
// NOTE: Gestures update must be called every frame to reset gestures correctly
|
|
@@ -5015,68 +5073,6 @@ static void PollInputEvents(void)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-// Copy back buffer to front buffers
|
|
|
-static void SwapBuffers(void)
|
|
|
-{
|
|
|
-#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
|
|
|
- glfwSwapBuffers(CORE.Window.handle);
|
|
|
-#endif
|
|
|
-
|
|
|
-#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) || defined(PLATFORM_UWP)
|
|
|
- eglSwapBuffers(CORE.Window.device, CORE.Window.surface);
|
|
|
-
|
|
|
-#if defined(PLATFORM_DRM)
|
|
|
- if (!CORE.Window.gbmSurface || (-1 == CORE.Window.fd) || !CORE.Window.connector || !CORE.Window.crtc)
|
|
|
- {
|
|
|
- TRACELOG(LOG_ERROR, "DISPLAY: DRM initialization failed to swap");
|
|
|
- abort();
|
|
|
- }
|
|
|
-
|
|
|
- struct gbm_bo *bo = gbm_surface_lock_front_buffer(CORE.Window.gbmSurface);
|
|
|
- if (!bo)
|
|
|
- {
|
|
|
- TRACELOG(LOG_ERROR, "DISPLAY: Failed GBM to lock front buffer");
|
|
|
- abort();
|
|
|
- }
|
|
|
-
|
|
|
- uint32_t fb = 0;
|
|
|
- int result = drmModeAddFB(CORE.Window.fd, CORE.Window.connector->modes[CORE.Window.modeIndex].hdisplay,
|
|
|
- CORE.Window.connector->modes[CORE.Window.modeIndex].vdisplay, 24, 32, gbm_bo_get_stride(bo), gbm_bo_get_handle(bo).u32, &fb);
|
|
|
- if (0 != result)
|
|
|
- {
|
|
|
- TRACELOG(LOG_ERROR, "DISPLAY: drmModeAddFB() failed with result: %d", result);
|
|
|
- abort();
|
|
|
- }
|
|
|
-
|
|
|
- result = drmModeSetCrtc(CORE.Window.fd, CORE.Window.crtc->crtc_id, fb, 0, 0,
|
|
|
- &CORE.Window.connector->connector_id, 1, &CORE.Window.connector->modes[CORE.Window.modeIndex]);
|
|
|
- if (0 != result)
|
|
|
- {
|
|
|
- TRACELOG(LOG_ERROR, "DISPLAY: drmModeSetCrtc() failed with result: %d", result);
|
|
|
- abort();
|
|
|
- }
|
|
|
-
|
|
|
- if (CORE.Window.prevFB)
|
|
|
- {
|
|
|
- result = drmModeRmFB(CORE.Window.fd, CORE.Window.prevFB);
|
|
|
- if (0 != result)
|
|
|
- {
|
|
|
- TRACELOG(LOG_ERROR, "DISPLAY: drmModeRmFB() failed with result: %d", result);
|
|
|
- abort();
|
|
|
- }
|
|
|
- }
|
|
|
- CORE.Window.prevFB = fb;
|
|
|
-
|
|
|
- if (CORE.Window.prevBO)
|
|
|
- {
|
|
|
- gbm_surface_release_buffer(CORE.Window.gbmSurface, CORE.Window.prevBO);
|
|
|
- }
|
|
|
-
|
|
|
- CORE.Window.prevBO = bo;
|
|
|
-#endif // PLATFORM_DRM
|
|
|
-#endif // PLATFORM_ANDROID || PLATFORM_RPI || PLATFORM_DRM || PLATFORM_UWP
|
|
|
-}
|
|
|
-
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
|
|
|
// GLFW3 Error Callback, runs on GLFW3 error
|
|
|
static void ErrorCallback(int error, const char *description)
|