@ -350,7 +350,6 @@ static bool InitGraphicsDevice(int width, int height)
/ / NOTE : Framebuffer ( render area - CORE . Window . render . width , CORE . Window . render . height ) could include black bars . . .
/ / . . . in top - down or left - right to match display aspect ratio ( no weird scaling )
# if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
glfwSetErrorCallback ( ErrorCallback ) ;
/*
/ / TODO : Setup GLFW custom allocators to match raylib ones
@ -363,9 +362,6 @@ static bool InitGraphicsDevice(int width, int height)
glfwInitAllocator ( & allocator ) ;
*/
# if defined(__APPLE__)
glfwInitHint ( GLFW_COCOA_CHDIR_RESOURCES , GLFW_FALSE ) ;
# endif
if ( ! glfwInit ( ) )
{
@ -408,26 +404,7 @@ static bool InitGraphicsDevice(int width, int height)
else glfwWindowHint ( GLFW_FLOATING , GLFW_FALSE ) ;
/ / NOTE : Some GLFW flags are not supported on HTML5
# if defined(PLATFORM_DESKTOP)
if ( ( CORE . Window . flags & FLAG_WINDOW_TRANSPARENT ) > 0 ) glfwWindowHint ( GLFW_TRANSPARENT_FRAMEBUFFER , GLFW_TRUE ) ; / / Transparent framebuffer
else glfwWindowHint ( GLFW_TRANSPARENT_FRAMEBUFFER , GLFW_FALSE ) ; / / Opaque framebuffer
if ( ( CORE . Window . flags & FLAG_WINDOW_HIGHDPI ) > 0 )
{
/ / Resize window content area based on the monitor content scale .
/ / NOTE : This hint only has an effect on platforms where screen coordinates and pixels always map 1 : 1 such as Windows and X11 .
/ / On platforms like macOS the resolution of the framebuffer is changed independently of the window size .
glfwWindowHint ( GLFW_SCALE_TO_MONITOR , GLFW_TRUE ) ; / / Scale content area based on the monitor content scale where window is placed on
# if defined(__APPLE__)
glfwWindowHint ( GLFW_COCOA_RETINA_FRAMEBUFFER , GLFW_TRUE ) ;
# endif
}
else glfwWindowHint ( GLFW_SCALE_TO_MONITOR , GLFW_FALSE ) ;
/ / Mouse passthrough
if ( ( CORE . Window . flags & FLAG_WINDOW_MOUSE_PASSTHROUGH ) > 0 ) glfwWindowHint ( GLFW_MOUSE_PASSTHROUGH , GLFW_TRUE ) ;
else glfwWindowHint ( GLFW_MOUSE_PASSTHROUGH , GLFW_FALSE ) ;
# endif
/ / e . g . : GLFW_TRANSPARENT_FRAMEBUFFER , GLFW_SCALE_TO_MONITOR , GLFW_COCOA_RETINA_FRAMEBUFFER , GLFW_MOUSE_PASSTHROUGH
if ( CORE . Window . flags & FLAG_MSAA_4X_HINT )
{
@ -452,11 +429,7 @@ static bool InitGraphicsDevice(int width, int height)
glfwWindowHint ( GLFW_CONTEXT_VERSION_MINOR , 3 ) ; / / Choose OpenGL minor version ( just hint )
glfwWindowHint ( GLFW_OPENGL_PROFILE , GLFW_OPENGL_CORE_PROFILE ) ; / / Profiles Hint : Only 3.3 and above !
/ / Values : GLFW_OPENGL_CORE_PROFILE , GLFW_OPENGL_ANY_PROFILE , GLFW_OPENGL_COMPAT_PROFILE
# if defined(__APPLE__)
glfwWindowHint ( GLFW_OPENGL_FORWARD_COMPAT , GLFW_TRUE ) ; / / OSX Requires forward compatibility
# else
glfwWindowHint ( GLFW_OPENGL_FORWARD_COMPAT , GLFW_FALSE ) ; / / Forward Compatibility Hint : Only 3.3 and above !
# endif
/ / glfwWindowHint ( GLFW_OPENGL_DEBUG_CONTEXT , GLFW_TRUE ) ; / / Request OpenGL DEBUG context
}
else if ( rlGetVersion ( ) = = RL_OPENGL_43 )
@ -474,56 +447,19 @@ static bool InitGraphicsDevice(int width, int height)
glfwWindowHint ( GLFW_CONTEXT_VERSION_MAJOR , 2 ) ;
glfwWindowHint ( GLFW_CONTEXT_VERSION_MINOR , 0 ) ;
glfwWindowHint ( GLFW_CLIENT_API , GLFW_OPENGL_ES_API ) ;
# if defined(PLATFORM_DESKTOP)
glfwWindowHint ( GLFW_CONTEXT_CREATION_API , GLFW_EGL_CONTEXT_API ) ;
# else
glfwWindowHint ( GLFW_CONTEXT_CREATION_API , GLFW_NATIVE_CONTEXT_API ) ;
# endif
}
else if ( rlGetVersion ( ) = = RL_OPENGL_ES_30 ) / / Request OpenGL ES 3.0 context
{
glfwWindowHint ( GLFW_CONTEXT_VERSION_MAJOR , 3 ) ;
glfwWindowHint ( GLFW_CONTEXT_VERSION_MINOR , 0 ) ;
glfwWindowHint ( GLFW_CLIENT_API , GLFW_OPENGL_ES_API ) ;
# if defined(PLATFORM_DESKTOP)
glfwWindowHint ( GLFW_CONTEXT_CREATION_API , GLFW_EGL_CONTEXT_API ) ;
# else
glfwWindowHint ( GLFW_CONTEXT_CREATION_API , GLFW_NATIVE_CONTEXT_API ) ;
# endif
}
# if defined(PLATFORM_DESKTOP)
/ / NOTE : GLFW 3.4 + defers initialization of the Joystick subsystem on the first call to any Joystick related functions .
/ / Forcing this initialization here avoids doing it on PollInputEvents ( ) called by EndDrawing ( ) after first frame has been just drawn .
/ / The initialization will still happen and possible delays still occur , but before the window is shown , which is a nicer experience .
/ / REF : https : / / github . com / raysan5 / raylib / issues / 1554
if ( MAX_GAMEPADS > 0 ) glfwSetJoystickCallback ( NULL ) ;
# endif
# if defined(PLATFORM_DESKTOP)
/ / Find monitor resolution
GLFWmonitor * monitor = glfwGetPrimaryMonitor ( ) ;
if ( ! monitor )
{
TRACELOG ( LOG_WARNING , " GLFW: Failed to get primary monitor " ) ;
return false ;
}
const GLFWvidmode * mode = glfwGetVideoMode ( monitor ) ;
CORE . Window . display . width = mode - > width ;
CORE . Window . display . height = mode - > height ;
/ / Set screen width / height to the display width / height if they are 0
if ( CORE . Window . screen . width = = 0 ) CORE . Window . screen . width = CORE . Window . display . width ;
if ( CORE . Window . screen . height = = 0 ) CORE . Window . screen . height = CORE . Window . display . height ;
# endif / / PLATFORM_DESKTOP
# if defined(PLATFORM_WEB)
/ / NOTE : Getting video modes is not implemented in emscripten GLFW3 version
CORE . Window . display . width = CORE . Window . screen . width ;
CORE . Window . display . height = CORE . Window . screen . height ;
# endif / / PLATFORM_WEB
if ( CORE . Window . fullscreen )
{
@ -582,13 +518,6 @@ static bool InitGraphicsDevice(int width, int height)
}
else
{
# if defined(PLATFORM_DESKTOP)
/ / If we are windowed fullscreen , ensures that window does not minimize when focus is lost
if ( ( CORE . Window . screen . height = = CORE . Window . display . height ) & & ( CORE . Window . screen . width = = CORE . Window . display . width ) )
{
glfwWindowHint ( GLFW_AUTO_ICONIFY , 0 ) ;
}
# endif
/ / No - fullscreen window creation
CORE . Window . handle = glfwCreateWindow ( CORE . Window . screen . width , CORE . Window . screen . height , ( CORE . Window . title ! = 0 ) ? CORE . Window . title : " " , NULL , NULL ) ;
@ -607,15 +536,10 @@ static bool InitGraphicsDevice(int width, int height)
}
/ / glfwCreateWindow title doesn ' t work with emscripten .
# if defined(PLATFORM_WEB)
emscripten_set_window_title ( ( CORE . Window . title ! = 0 ) ? CORE . Window . title : " " ) ;
# endif
/ / Set window callback events
glfwSetWindowSizeCallback ( CORE . Window . handle , WindowSizeCallback ) ; / / NOTE : Resizing not allowed by default !
# if !defined(PLATFORM_WEB)
glfwSetWindowMaximizeCallback ( CORE . Window . handle , WindowMaximizeCallback ) ;
# endif
glfwSetWindowIconifyCallback ( CORE . Window . handle , WindowIconifyCallback ) ;
glfwSetWindowFocusCallback ( CORE . Window . handle , WindowFocusCallback ) ;
glfwSetDropCallback ( CORE . Window . handle , WindowDropCallback ) ;
@ -630,44 +554,13 @@ static bool InitGraphicsDevice(int width, int height)
glfwMakeContextCurrent ( CORE . Window . handle ) ;
# if !defined(PLATFORM_WEB)
glfwSetInputMode ( CORE . Window . handle , GLFW_LOCK_KEY_MODS , GLFW_TRUE ) ; / / Enable lock keys modifiers ( CAPS , NUM )
glfwSwapInterval ( 0 ) ; / / No V - Sync by default
# endif
/ / Try to enable GPU V - Sync , so frames are limited to screen refresh rate ( 60 Hz - > 60 FPS )
/ / NOTE : V - Sync can be enabled by graphic driver configuration , it doesn ' t need
/ / to be activated on web platforms since VSync is enforced there .
# if !defined(PLATFORM_WEB)
if ( CORE . Window . flags & FLAG_VSYNC_HINT )
{
/ / WARNING : It seems to hit a critical render path in Intel HD Graphics
glfwSwapInterval ( 1 ) ;
TRACELOG ( LOG_INFO , " DISPLAY: Trying to enable VSYNC " ) ;
}
# endif
int fbWidth = CORE . Window . screen . width ;
int fbHeight = CORE . Window . screen . height ;
# if defined(PLATFORM_DESKTOP)
if ( ( CORE . Window . flags & FLAG_WINDOW_HIGHDPI ) > 0 )
{
/ / NOTE : On APPLE platforms system should manage window / input scaling and also framebuffer scaling .
/ / Framebuffer scaling should be activated with : glfwWindowHint ( GLFW_COCOA_RETINA_FRAMEBUFFER , GLFW_TRUE ) ;
# if !defined(__APPLE__)
glfwGetFramebufferSize ( CORE . Window . handle , & fbWidth , & fbHeight ) ;
/ / Screen scaling matrix is required in case desired screen area is different from display area
CORE . Window . screenScale = MatrixScale ( ( float ) fbWidth / CORE . Window . screen . width , ( float ) fbHeight / CORE . Window . screen . height , 1.0f ) ;
/ / Mouse input scaling for the new screen size
SetMouseScale ( ( float ) CORE . Window . screen . width / fbWidth , ( float ) CORE . Window . screen . height / fbHeight ) ;
# endif
}
# endif
CORE . Window . render . width = fbWidth ;
CORE . Window . render . height = fbHeight ;
CORE . Window . currentFbo . width = fbWidth ;
@ -679,377 +572,9 @@ static bool InitGraphicsDevice(int width, int height)
TRACELOG ( LOG_INFO , " > Render size: %i x %i " , CORE . Window . render . width , CORE . Window . render . height ) ;
TRACELOG ( LOG_INFO , " > Viewport offsets: %i, %i " , CORE . Window . renderOffset . x , CORE . Window . renderOffset . y ) ;
# endif / / PLATFORM_DESKTOP || PLATFORM_WEB
# if defined(PLATFORM_ANDROID) || defined(PLATFORM_DRM)
CORE . Window . fullscreen = true ;
CORE . Window . flags | = FLAG_FULLSCREEN_MODE ;
# if defined(PLATFORM_DRM)
CORE . Window . fd = - 1 ;
CORE . Window . connector = NULL ;
CORE . Window . modeIndex = - 1 ;
CORE . Window . crtc = NULL ;
CORE . Window . gbmDevice = NULL ;
CORE . Window . gbmSurface = NULL ;
CORE . Window . prevBO = NULL ;
CORE . Window . prevFB = 0 ;
# if defined(DEFAULT_GRAPHIC_DEVICE_DRM)
CORE . Window . fd = open ( DEFAULT_GRAPHIC_DEVICE_DRM , O_RDWR ) ;
# else
TRACELOG ( LOG_INFO , " DISPLAY: No graphic card set, trying platform-gpu-card " ) ;
CORE . Window . fd = open ( " /dev/dri/by-path/platform-gpu-card " , O_RDWR ) ; / / VideoCore VI ( Raspberry Pi 4 )
if ( ( - 1 = = CORE . Window . fd ) | | ( drmModeGetResources ( CORE . Window . fd ) = = NULL ) )
{
TRACELOG ( LOG_INFO , " DISPLAY: Failed to open platform-gpu-card, trying card1 " ) ;
CORE . Window . fd = open ( " /dev/dri/card1 " , O_RDWR ) ; / / Other Embedded
}
if ( ( - 1 = = CORE . Window . fd ) | | ( drmModeGetResources ( CORE . Window . fd ) = = NULL ) )
{
TRACELOG ( LOG_INFO , " DISPLAY: Failed to open graphic card1, trying card0 " ) ;
CORE . Window . fd = open ( " /dev/dri/card0 " , O_RDWR ) ; / / VideoCore IV ( Raspberry Pi 1 - 3 )
}
# endif
if ( - 1 = = CORE . Window . fd )
{
TRACELOG ( LOG_WARNING , " DISPLAY: Failed to open graphic card " ) ;
return false ;
}
drmModeRes * res = drmModeGetResources ( CORE . Window . fd ) ;
if ( ! res )
{
TRACELOG ( LOG_WARNING , " DISPLAY: Failed get DRM resources " ) ;
return false ;
}
TRACELOG ( LOG_TRACE , " DISPLAY: Connectors found: %i " , res - > count_connectors ) ;
for ( size_t i = 0 ; i < res - > count_connectors ; i + + )
{
TRACELOG ( LOG_TRACE , " DISPLAY: Connector index %i " , i ) ;
drmModeConnector * con = drmModeGetConnector ( CORE . Window . fd , res - > connectors [ i ] ) ;
TRACELOG ( LOG_TRACE , " DISPLAY: Connector modes detected: %i " , con - > count_modes ) ;
if ( ( con - > connection = = DRM_MODE_CONNECTED ) & & ( con - > encoder_id ) )
{
TRACELOG ( LOG_TRACE , " DISPLAY: DRM mode connected " ) ;
CORE . Window . connector = con ;
break ;
}
else
{
TRACELOG ( LOG_TRACE , " DISPLAY: DRM mode NOT connected (deleting) " ) ;
drmModeFreeConnector ( con ) ;
}
}
if ( ! CORE . Window . connector )
{
TRACELOG ( LOG_WARNING , " DISPLAY: No suitable DRM connector found " ) ;
drmModeFreeResources ( res ) ;
return false ;
}
drmModeEncoder * enc = drmModeGetEncoder ( CORE . Window . fd , CORE . Window . connector - > encoder_id ) ;
if ( ! enc )
{
TRACELOG ( LOG_WARNING , " DISPLAY: Failed to get DRM mode encoder " ) ;
drmModeFreeResources ( res ) ;
return false ;
}
CORE . Window . crtc = drmModeGetCrtc ( CORE . Window . fd , enc - > crtc_id ) ;
if ( ! CORE . Window . crtc )
{
TRACELOG ( LOG_WARNING , " DISPLAY: Failed to get DRM mode crtc " ) ;
drmModeFreeEncoder ( enc ) ;
drmModeFreeResources ( res ) ;
return false ;
}
/ / If InitWindow should use the current mode find it in the connector ' s mode list
if ( ( CORE . Window . screen . width < = 0 ) | | ( CORE . Window . screen . height < = 0 ) )
{
TRACELOG ( LOG_TRACE , " DISPLAY: Selecting DRM connector mode for current used mode... " ) ;
CORE . Window . modeIndex = FindMatchingConnectorMode ( CORE . Window . connector , & CORE . Window . crtc - > mode ) ;
if ( CORE . Window . modeIndex < 0 )
{
TRACELOG ( LOG_WARNING , " DISPLAY: No matching DRM connector mode found " ) ;
drmModeFreeEncoder ( enc ) ;
drmModeFreeResources ( res ) ;
return false ;
}
CORE . Window . screen . width = CORE . Window . display . width ;
CORE . Window . screen . height = CORE . Window . display . height ;
}
const bool allowInterlaced = CORE . Window . flags & FLAG_INTERLACED_HINT ;
const int fps = ( CORE . Time . target > 0 ) ? ( 1.0 / CORE . Time . target ) : 60 ;
/ / Try to find an exact matching mode
CORE . Window . modeIndex = FindExactConnectorMode ( CORE . Window . connector , CORE . Window . screen . width , CORE . Window . screen . height , fps , allowInterlaced ) ;
/ / If nothing found , try to find a nearly matching mode
if ( CORE . Window . modeIndex < 0 ) CORE . Window . modeIndex = FindNearestConnectorMode ( CORE . Window . connector , CORE . Window . screen . width , CORE . Window . screen . height , fps , allowInterlaced ) ;
/ / If nothing found , try to find an exactly matching mode including interlaced
if ( CORE . Window . modeIndex < 0 ) CORE . Window . modeIndex = FindExactConnectorMode ( CORE . Window . connector , CORE . Window . screen . width , CORE . Window . screen . height , fps , true ) ;
/ / If nothing found , try to find a nearly matching mode including interlaced
if ( CORE . Window . modeIndex < 0 ) CORE . Window . modeIndex = FindNearestConnectorMode ( CORE . Window . connector , CORE . Window . screen . width , CORE . Window . screen . height , fps , true ) ;
/ / If nothing found , there is no suitable mode
if ( CORE . Window . modeIndex < 0 )
{
TRACELOG ( LOG_WARNING , " DISPLAY: Failed to find a suitable DRM connector mode " ) ;
drmModeFreeEncoder ( enc ) ;
drmModeFreeResources ( res ) ;
return false ;
}
CORE . Window . display . width = CORE . Window . connector - > modes [ CORE . Window . modeIndex ] . hdisplay ;
CORE . Window . display . height = CORE . Window . connector - > modes [ CORE . Window . modeIndex ] . vdisplay ;
TRACELOG ( LOG_INFO , " DISPLAY: Selected DRM connector mode %s (%ux%u%c@%u) " , CORE . Window . connector - > modes [ CORE . Window . modeIndex ] . name ,
CORE . Window . connector - > modes [ CORE . Window . modeIndex ] . hdisplay , CORE . Window . connector - > modes [ CORE . Window . modeIndex ] . vdisplay ,
( CORE . Window . connector - > modes [ CORE . Window . modeIndex ] . flags & DRM_MODE_FLAG_INTERLACE ) ? ' i ' : ' p ' ,
CORE . Window . connector - > modes [ CORE . Window . modeIndex ] . vrefresh ) ;
/ / Use the width and height of the surface for render
CORE . Window . render . width = CORE . Window . screen . width ;
CORE . Window . render . height = CORE . Window . screen . height ;
drmModeFreeEncoder ( enc ) ;
enc = NULL ;
drmModeFreeResources ( res ) ;
res = NULL ;
CORE . Window . gbmDevice = gbm_create_device ( CORE . Window . fd ) ;
if ( ! CORE . Window . gbmDevice )
{
TRACELOG ( LOG_WARNING , " DISPLAY: Failed to create GBM device " ) ;
return false ;
}
CORE . Window . gbmSurface = gbm_surface_create ( CORE . Window . gbmDevice , CORE . Window . connector - > modes [ CORE . Window . modeIndex ] . hdisplay ,
CORE . Window . connector - > modes [ CORE . Window . modeIndex ] . vdisplay , GBM_FORMAT_ARGB8888 , GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING ) ;
if ( ! CORE . Window . gbmSurface )
{
TRACELOG ( LOG_WARNING , " DISPLAY: Failed to create GBM surface " ) ;
return false ;
}
# endif
EGLint samples = 0 ;
EGLint sampleBuffer = 0 ;
if ( CORE . Window . flags & FLAG_MSAA_4X_HINT )
{
samples = 4 ;
sampleBuffer = 1 ;
TRACELOG ( LOG_INFO , " DISPLAY: Trying to enable MSAA x4 " ) ;
}
const EGLint framebufferAttribs [ ] =
{
EGL_RENDERABLE_TYPE ,
( rlGetVersion ( ) = = RL_OPENGL_ES_30 ) ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT , / / Type of context support
# if defined(PLATFORM_DRM)
EGL_SURFACE_TYPE ,
EGL_WINDOW_BIT , / / Don ' t use it on Android !
# endif
EGL_RED_SIZE ,
8 , / / RED color bit depth ( alternative : 5 )
EGL_GREEN_SIZE ,
8 , / / GREEN color bit depth ( alternative : 6 )
EGL_BLUE_SIZE ,
8 , / / BLUE color bit depth ( alternative : 5 )
# if defined(PLATFORM_DRM)
EGL_ALPHA_SIZE ,
8 , / / ALPHA bit depth ( required for transparent framebuffer )
# endif
/ / EGL_TRANSPARENT_TYPE , EGL_NONE , / / Request transparent framebuffer ( EGL_TRANSPARENT_RGB does not work on RPI )
EGL_DEPTH_SIZE ,
16 , / / Depth buffer size ( Required to use Depth testing ! )
/ / EGL_STENCIL_SIZE , 8 , / / Stencil buffer size
EGL_SAMPLE_BUFFERS ,
sampleBuffer , / / Activate MSAA
EGL_SAMPLES ,
samples , / / 4 x Antialiasing if activated ( Free on MALI GPUs )
EGL_NONE
} ;
const EGLint contextAttribs [ ] =
{
EGL_CONTEXT_CLIENT_VERSION , 2 ,
EGL_NONE } ;
# if defined(PLATFORM_ANDROID) || defined(PLATFORM_DRM)
EGLint numConfigs = 0 ;
/ / Get an EGL device connection
# if defined(PLATFORM_DRM)
CORE . Window . device = eglGetDisplay ( ( EGLNativeDisplayType ) CORE . Window . gbmDevice ) ;
# else
CORE . Window . device = eglGetDisplay ( EGL_DEFAULT_DISPLAY ) ;
# endif
if ( CORE . Window . device = = EGL_NO_DISPLAY )
{
TRACELOG ( LOG_WARNING , " DISPLAY: Failed to initialize EGL device " ) ;
return false ;
}
/ / Initialize the EGL device connection
if ( eglInitialize ( CORE . Window . device , NULL , NULL ) = = EGL_FALSE )
{
/ / If all of the calls to eglInitialize returned EGL_FALSE then an error has occurred .
TRACELOG ( LOG_WARNING , " DISPLAY: Failed to initialize EGL device " ) ;
return false ;
}
# if defined(PLATFORM_DRM)
if ( ! eglChooseConfig ( CORE . Window . device , NULL , NULL , 0 , & numConfigs ) )
{
TRACELOG ( LOG_WARNING , " DISPLAY: Failed to get EGL config count: 0x%x " , eglGetError ( ) ) ;
return false ;
}
TRACELOG ( LOG_TRACE , " DISPLAY: EGL configs available: %d " , numConfigs ) ;
EGLConfig * configs = RL_CALLOC ( numConfigs , sizeof ( * configs ) ) ;
if ( ! configs )
{
TRACELOG ( LOG_WARNING , " DISPLAY: Failed to get memory for EGL configs " ) ;
return false ;
}
EGLint matchingNumConfigs = 0 ;
if ( ! eglChooseConfig ( CORE . Window . device , framebufferAttribs , configs , numConfigs , & matchingNumConfigs ) )
{
TRACELOG ( LOG_WARNING , " DISPLAY: Failed to choose EGL config: 0x%x " , eglGetError ( ) ) ;
free ( configs ) ;
return false ;
}
TRACELOG ( LOG_TRACE , " DISPLAY: EGL matching configs available: %d " , matchingNumConfigs ) ;
/ / find the EGL config that matches the previously setup GBM format
int found = 0 ;
for ( EGLint i = 0 ; i < matchingNumConfigs ; + + i )
{
EGLint id = 0 ;
if ( ! eglGetConfigAttrib ( CORE . Window . device , configs [ i ] , EGL_NATIVE_VISUAL_ID , & id ) )
{
TRACELOG ( LOG_WARNING , " DISPLAY: Failed to get EGL config attribute: 0x%x " , eglGetError ( ) ) ;
continue ;
}
if ( GBM_FORMAT_ARGB8888 = = id )
{
TRACELOG ( LOG_TRACE , " DISPLAY: Using EGL config: %d " , i ) ;
CORE . Window . config = configs [ i ] ;
found = 1 ;
break ;
}
}
RL_FREE ( configs ) ;
if ( ! found )
{
TRACELOG ( LOG_WARNING , " DISPLAY: Failed to find a suitable EGL config " ) ;
return false ;
}
# else
/ / Get an appropriate EGL framebuffer configuration
eglChooseConfig ( CORE . Window . device , framebufferAttribs , & CORE . Window . config , 1 , & numConfigs ) ;
# endif
/ / Set rendering API
eglBindAPI ( EGL_OPENGL_ES_API ) ;
/ / Create an EGL rendering context
CORE . Window . context = eglCreateContext ( CORE . Window . device , CORE . Window . config , EGL_NO_CONTEXT , contextAttribs ) ;
if ( CORE . Window . context = = EGL_NO_CONTEXT )
{
TRACELOG ( LOG_WARNING , " DISPLAY: Failed to create EGL context " ) ;
return false ;
}
# endif
/ / Create an EGL window surface
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# if defined(PLATFORM_ANDROID)
EGLint displayFormat = 0 ;
/ / EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is guaranteed to be accepted by ANativeWindow_setBuffersGeometry ( )
/ / As soon as we picked a EGLConfig , we can safely reconfigure the ANativeWindow buffers to match , using EGL_NATIVE_VISUAL_ID
eglGetConfigAttrib ( CORE . Window . device , CORE . Window . config , EGL_NATIVE_VISUAL_ID , & displayFormat ) ;
/ / At this point we need to manage render size vs screen size
/ / NOTE : This function use and modify global module variables :
/ / - > CORE . Window . screen . width / CORE . Window . screen . height
/ / - > CORE . Window . render . width / CORE . Window . render . height
/ / - > CORE . Window . screenScale
SetupFramebuffer ( CORE . Window . display . width , CORE . Window . display . height ) ;
ANativeWindow_setBuffersGeometry ( CORE . Android . app - > window , CORE . Window . render . width , CORE . Window . render . height , displayFormat ) ;
/ / ANativeWindow_setBuffersGeometry ( CORE . Android . app - > window , 0 , 0 , displayFormat ) ; / / Force use of native display size
CORE . Window . surface = eglCreateWindowSurface ( CORE . Window . device , CORE . Window . config , CORE . Android . app - > window , NULL ) ;
# endif / / PLATFORM_ANDROID
# if defined(PLATFORM_DRM)
CORE . Window . surface = eglCreateWindowSurface ( CORE . Window . device , CORE . Window . config , ( EGLNativeWindowType ) CORE . Window . gbmSurface , NULL ) ;
if ( EGL_NO_SURFACE = = CORE . Window . surface )
{
TRACELOG ( LOG_WARNING , " DISPLAY: Failed to create EGL window surface: 0x%04x " , eglGetError ( ) ) ;
return false ;
}
/ / At this point we need to manage render size vs screen size
/ / NOTE : This function use and modify global module variables :
/ / - > CORE . Window . screen . width / CORE . Window . screen . height
/ / - > CORE . Window . render . width / CORE . Window . render . height
/ / - > CORE . Window . screenScale
SetupFramebuffer ( CORE . Window . display . width , CORE . Window . display . height ) ;
# endif / / PLATFORM_DRM
/ / There must be at least one frame displayed before the buffers are swapped
/ / eglSwapInterval ( CORE . Window . device , 1 ) ;
if ( eglMakeCurrent ( CORE . Window . device , CORE . Window . surface , CORE . Window . surface , CORE . Window . context ) = = EGL_FALSE )
{
TRACELOG ( LOG_WARNING , " DISPLAY: Failed to attach EGL rendering context to EGL surface " ) ;
return false ;
}
else
{
CORE . Window . render . width = CORE . Window . screen . width ;
CORE . Window . render . height = CORE . Window . screen . height ;
CORE . Window . currentFbo . width = CORE . Window . render . width ;
CORE . Window . currentFbo . height = CORE . Window . render . height ;
TRACELOG ( LOG_INFO , " DISPLAY: Device initialized successfully " ) ;
TRACELOG ( LOG_INFO , " > Display size: %i x %i " , CORE . Window . display . width , CORE . Window . display . height ) ;
TRACELOG ( LOG_INFO , " > Screen size: %i x %i " , CORE . Window . screen . width , CORE . Window . screen . height ) ;
TRACELOG ( LOG_INFO , " > Render size: %i x %i " , CORE . Window . render . width , CORE . Window . render . height ) ;
TRACELOG ( LOG_INFO , " > Viewport offsets: %i, %i " , CORE . Window . renderOffset . x , CORE . Window . renderOffset . y ) ;
}
# endif / / PLATFORM_ANDROID || PLATFORM_DRM
/ / Load OpenGL extensions
/ / NOTE : GL procedures address loader is required to load extensions
# if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
rlLoadExtensions ( glfwGetProcAddress ) ;
# else
rlLoadExtensions ( eglGetProcAddress ) ;
# endif
/ / Initialize OpenGL context ( states and resources )
/ / NOTE : CORE . Window . currentFbo . width and CORE . Window . currentFbo . height not used , just stored as globals in rlgl
@ -1059,10 +584,6 @@ static bool InitGraphicsDevice(int width, int height)
/ / NOTE : It updated CORE . Window . render . width and CORE . Window . render . height
SetupViewport ( CORE . Window . currentFbo . width , CORE . Window . currentFbo . height ) ;
# if defined(PLATFORM_ANDROID)
CORE . Window . ready = true ;
# endif
if ( ( CORE . Window . flags & FLAG_WINDOW_MINIMIZED ) > 0 ) MinimizeWindow ( ) ;
return true ;
@ -1578,7 +1099,6 @@ void SetMousePosition(int x, int y)
glfwSetCursorPos ( CORE . Window . handle , CORE . Input . Mouse . currentPosition . x , CORE . Input . Mouse . currentPosition . y ) ;
}
/ / Get mouse wheel movement Y
float GetMouseWheelMove ( void )
{
@ -1590,6 +1110,36 @@ float GetMouseWheelMove(void)
return result ;
}
/ / Set mouse cursor
/ / NOTE : This is a no - op on platforms other than PLATFORM_DESKTOP
void SetMouseCursor ( int cursor )
{
TRACELOG ( LOG_INFO , " SetMouseCursor not implemented in rcore_web.c " ) ;
}
/ / Get touch position X for touch point 0 ( relative to screen size )
int GetTouchX ( void )
{
return ( int ) CORE . Input . Touch . position [ 0 ] . x ;
}
/ / Get touch position Y for touch point 0 ( relative to screen size )
int GetTouchY ( void )
{
return ( int ) CORE . Input . Touch . position [ 0 ] . y ;
}
/ / Get touch position XY for a touch point index ( relative to screen size )
/ / TODO : Touch position should be scaled depending on display size and render size
Vector2 GetTouchPosition ( int index )
{
Vector2 position = { - 1.0f , - 1.0f } ;
if ( index < MAX_TOUCH_POINTS ) position = CORE . Input . Touch . position [ index ] ;
else TRACELOG ( LOG_WARNING , " INPUT: Required touch point out of range (Max touch points: %i) " , MAX_TOUCH_POINTS) ;
return position ;
}
/ / Swap back buffer with front buffer ( screen drawing )
void SwapScreenBuffer ( void )
@ -1597,7 +1147,6 @@ void SwapScreenBuffer(void)
glfwSwapBuffers ( CORE . Window . handle ) ;
}
/ / Register all input events
void PollInputEvents ( void )
{