- created complier flag SUPPORT_DRM_CACHE, to enable triple buffered DRM caching

This commit is contained in:
katonar
2025-07-07 17:28:23 +02:00
parent 060bd787b1
commit de62be0ec5
2 changed files with 44 additions and 3 deletions

View File

@@ -299,4 +299,9 @@
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
#define MAX_TRACELOG_MSG_LENGTH 256 // Max length of one trace-log message #define MAX_TRACELOG_MSG_LENGTH 256 // Max length of one trace-log message
//DRM configuration
#if defined(PLATFORM_DRM)
//#define SUPPORT_DRM_CACHE 1 //enable triple buffered DRM caching
#endif //PLATFORM_DRM
#endif // CONFIG_H #endif // CONFIG_H

View File

@@ -71,6 +71,7 @@
#include "EGL/egl.h" // Native platform windowing system interface #include "EGL/egl.h" // Native platform windowing system interface
#include "EGL/eglext.h" // EGL extensions #include "EGL/eglext.h" // EGL extensions
#if defined(SUPPORT_DRM_CACHE)
#include <poll.h> // for drmHandleEvent poll #include <poll.h> // for drmHandleEvent poll
#include <errno.h> //for EBUSY, EAGAIN #include <errno.h> //for EBUSY, EAGAIN
@@ -86,6 +87,8 @@ static volatile int fbCacheCount = 0;
static volatile bool pendingFlip = false; static volatile bool pendingFlip = false;
static bool crtcSet = false; static bool crtcSet = false;
#endif //SUPPORT_DRM_CACHE
#ifndef EGL_OPENGL_ES3_BIT #ifndef EGL_OPENGL_ES3_BIT
#define EGL_OPENGL_ES3_BIT 0x40 #define EGL_OPENGL_ES3_BIT 0x40
#endif #endif
@@ -232,7 +235,6 @@ static const short linuxToRaylibMap[KEYMAP_SIZE] = {
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Module Internal Functions Declaration // Module Internal Functions Declaration
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
int InitSwapScreenBuffer(void);
int InitPlatform(void); // Initialize platform (graphics, inputs and more) int InitPlatform(void); // Initialize platform (graphics, inputs and more)
void ClosePlatform(void); // Close platform void ClosePlatform(void); // Close platform
@@ -567,6 +569,7 @@ void DisableCursor(void)
CORE.Input.Mouse.cursorHidden = true; CORE.Input.Mouse.cursorHidden = true;
} }
#if defined(SUPPORT_DRM_CACHE)
static void drm_fb_destroy_callback(struct gbm_bo *bo, void *data) { static void drm_fb_destroy_callback(struct gbm_bo *bo, void *data) {
uint32_t fb_id = (uintptr_t)data; uint32_t fb_id = (uintptr_t)data;
// Remove from cache // Remove from cache
@@ -769,7 +772,37 @@ void SwapScreenBuffer() {
loopCnt = 0; loopCnt = 0;
} }
} }
#else //SUPPORT_DRM_CACHE is not defined
// Swap back buffer with front buffer (screen drawing)
void SwapScreenBuffer(void)
{
eglSwapBuffers(platform.device, platform.surface);
if (!platform.gbmSurface || (-1 == platform.fd) || !platform.connector || !platform.crtc) TRACELOG(LOG_ERROR, "DISPLAY: DRM initialization failed to swap");
struct gbm_bo *bo = gbm_surface_lock_front_buffer(platform.gbmSurface);
if (!bo) TRACELOG(LOG_ERROR, "DISPLAY: Failed GBM to lock front buffer");
uint32_t fb = 0;
int result = drmModeAddFB(platform.fd, platform.connector->modes[platform.modeIndex].hdisplay, platform.connector->modes[platform.modeIndex].vdisplay, 24, 32, gbm_bo_get_stride(bo), gbm_bo_get_handle(bo).u32, &fb);
if (result != 0) TRACELOG(LOG_ERROR, "DISPLAY: drmModeAddFB() failed with result: %d", result);
result = drmModeSetCrtc(platform.fd, platform.crtc->crtc_id, fb, 0, 0, &platform.connector->connector_id, 1, &platform.connector->modes[platform.modeIndex]);
if (result != 0) TRACELOG(LOG_ERROR, "DISPLAY: drmModeSetCrtc() failed with result: %d", result);
if (platform.prevFB)
{
result = drmModeRmFB(platform.fd, platform.prevFB);
if (result != 0) TRACELOG(LOG_ERROR, "DISPLAY: drmModeRmFB() failed with result: %d", result);
}
platform.prevFB = fb;
if (platform.prevBO) gbm_surface_release_buffer(platform.gbmSurface, platform.prevBO);
platform.prevBO = bo;
}
#endif //SUPPORT_DRM_CACHE
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Module Functions Definition: Misc // Module Functions Definition: Misc
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
@@ -1099,8 +1132,7 @@ int InitPlatform(void)
EGL_BLUE_SIZE, 8, // BLUE color bit depth (alternative: 5) EGL_BLUE_SIZE, 8, // BLUE color bit depth (alternative: 5)
EGL_ALPHA_SIZE, 8, // ALPHA bit depth (required for transparent framebuffer) EGL_ALPHA_SIZE, 8, // ALPHA bit depth (required for transparent framebuffer)
//EGL_TRANSPARENT_TYPE, EGL_NONE, // Request transparent framebuffer (EGL_TRANSPARENT_RGB does not work on RPI) //EGL_TRANSPARENT_TYPE, EGL_NONE, // Request transparent framebuffer (EGL_TRANSPARENT_RGB does not work on RPI)
//ToDo: verify this. In 5.5 it is 16, in master it was 24 EGL_DEPTH_SIZE, 24, // Depth buffer size (Required to use Depth testing!)
EGL_DEPTH_SIZE, 16, // Depth buffer size (Required to use Depth testing!)
//EGL_STENCIL_SIZE, 8, // Stencil buffer size //EGL_STENCIL_SIZE, 8, // Stencil buffer size
EGL_SAMPLE_BUFFERS, sampleBuffer, // Activate MSAA EGL_SAMPLE_BUFFERS, sampleBuffer, // Activate MSAA
EGL_SAMPLES, samples, // 4x Antialiasing if activated (Free on MALI GPUs) EGL_SAMPLES, samples, // 4x Antialiasing if activated (Free on MALI GPUs)
@@ -1273,13 +1305,17 @@ int InitPlatform(void)
CORE.Storage.basePath = GetWorkingDirectory(); CORE.Storage.basePath = GetWorkingDirectory();
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
#if defined(SUPPORT_DRM_CACHE)
if(InitSwapScreenBuffer() == 0) { if(InitSwapScreenBuffer() == 0) {
TRACELOG(LOG_INFO, "PLATFORM: DRM: Initialized successfully"); TRACELOG(LOG_INFO, "PLATFORM: DRM: Initialized successfully");
return 0; return 0;
} else { } else {
#endif//SUPPORT_DRM_CACHE
TRACELOG(LOG_INFO, "PLATFORM: DRM: Initialized failed"); TRACELOG(LOG_INFO, "PLATFORM: DRM: Initialized failed");
#if defined(SUPPORT_DRM_CACHE)
return -1; return -1;
} }
#endif //SUPPORT_DRM_CACHE
} }