2013-01-13 15:35:06 -08:00
/*
2015-01-01 15:04:46 -08:00
* Copyright 2011 - 2015 Branimir Karadzic . All rights reserved .
2014-06-05 22:49:51 -07:00
* License : https : //github.com/bkaradzic/bgfx/blob/master/LICENSE
2013-01-13 15:35:06 -08:00
*/
2013-11-13 21:54:36 -08:00
# ifndef BGFX_PLATFORM_H_HEADER_GUARD
# define BGFX_PLATFORM_H_HEADER_GUARD
2013-01-13 15:35:06 -08:00
2013-01-13 22:44:04 -08:00
// NOTICE:
// This header file contains platform specific interfaces. It is only
// necessary to use this header in conjunction with creating windows.
2014-06-05 22:49:51 -07:00
# include <bx/platform.h>
2013-01-13 15:35:06 -08:00
2013-11-18 20:43:17 -08:00
namespace bgfx
{
struct RenderFrame
{
enum Enum
{
NoContext ,
Render ,
Exiting ,
Count
} ;
} ;
/// WARNING: This call should be only used on platforms that don't
2014-01-19 14:58:05 -08:00
/// allow creating separate rendering thread. If it is called before
/// to bgfx::init, render thread won't be created by bgfx::init call.
2013-11-18 20:43:17 -08:00
RenderFrame : : Enum renderFrame ( ) ;
2015-04-20 16:22:40 -07:00
struct PlatformData
{
void * ndt ; //< Native display type
void * nwh ; //< Native window handle
void * context ; //< GL context, or D3D device
void * backbuffer ; //< GL backbuffer, or D3D render target view
} ;
void setPlatformData ( const PlatformData & _hooks ) ;
} // namespace bgfx
2013-11-18 20:43:17 -08:00
2013-04-15 23:10:32 -07:00
# if BX_PLATFORM_ANDROID
2013-04-18 21:16:09 -07:00
# include <android / native_window.h>
2013-04-15 23:10:32 -07:00
namespace bgfx
{
2013-08-10 22:15:59 -07:00
///
2015-04-20 16:22:40 -07:00
inline void androidSetWindow ( : : ANativeWindow * _window )
{
PlatformData pd ;
memset ( & pd , 0 , sizeof ( pd ) ) ;
pd . nwh = _window ;
setPlatformData ( pd ) ;
}
2013-08-10 22:15:59 -07:00
2013-04-15 23:10:32 -07:00
} // namespace bgfx
2013-07-21 14:44:53 -07:00
# elif BX_PLATFORM_IOS
namespace bgfx
{
2013-08-10 22:15:59 -07:00
///
2015-04-20 16:22:40 -07:00
inline void iosSetEaglLayer ( void * _window )
{
PlatformData pd ;
memset ( & pd , 0 , sizeof ( pd ) ) ;
pd . nwh = _window ;
setPlatformData ( pd ) ;
}
2013-08-10 22:15:59 -07:00
2013-07-21 14:44:53 -07:00
} // namespace bgfx
2014-08-24 17:41:41 -07:00
# elif BX_PLATFORM_FREEBSD || BX_PLATFORM_LINUX || BX_PLATFORM_RPI
2013-01-13 15:35:06 -08:00
namespace bgfx
{
2013-08-10 22:15:59 -07:00
///
2015-04-20 19:05:41 -07:00
inline void x11SetDisplayWindow ( void * _display , uint32_t _window , void * _glx = NULL )
2015-04-20 16:22:40 -07:00
{
PlatformData pd ;
memset ( & pd , 0 , sizeof ( pd ) ) ;
pd . ndt = _display ;
2015-04-20 19:05:41 -07:00
pd . nwh = ( void * ) ( uintptr_t ) _window ;
2015-04-20 16:22:40 -07:00
pd . context = _glx ;
setPlatformData ( pd ) ;
}
2013-08-10 22:15:59 -07:00
2013-01-13 15:35:06 -08:00
} // namespace bgfx
# elif BX_PLATFORM_NACL
# include <ppapi / c / ppb_graphics_3d.h>
# include <ppapi / c / ppb_instance.h>
namespace bgfx
{
typedef void ( * PostSwapBuffersFn ) ( uint32_t _width , uint32_t _height ) ;
2013-08-10 22:15:59 -07:00
///
2014-01-19 22:34:58 -08:00
bool naclSetInterfaces ( : : PP_Instance , const : : PPB_Instance * , const : : PPB_Graphics3D * , PostSwapBuffersFn ) ;
2013-08-10 22:15:59 -07:00
2013-01-13 15:35:06 -08:00
} // namespace bgfx
2013-04-18 21:16:09 -07:00
# elif BX_PLATFORM_OSX
2013-01-13 15:35:06 -08:00
namespace bgfx
{
2013-08-10 22:15:59 -07:00
///
2015-04-20 16:22:40 -07:00
inline void osxSetNSWindow ( void * _window , void * _nsgl = NULL )
{
PlatformData pd ;
memset ( & pd , 0 , sizeof ( pd ) ) ;
pd . nwh = _window ;
pd . context = _nsgl ;
setPlatformData ( pd ) ;
}
2013-08-10 22:15:59 -07:00
2013-01-13 15:35:06 -08:00
} // namespace bgfx
2013-04-18 21:16:09 -07:00
# elif BX_PLATFORM_WINDOWS
# include <windows.h>
2013-01-15 20:37:07 -08:00
namespace bgfx
{
2013-08-10 22:15:59 -07:00
///
2015-04-20 16:22:40 -07:00
inline void winSetHwnd ( : : HWND _window )
{
PlatformData pd ;
memset ( & pd , 0 , sizeof ( pd ) ) ;
pd . nwh = _window ;
setPlatformData ( pd ) ;
}
2013-08-10 22:15:59 -07:00
2013-01-15 20:37:07 -08:00
} // namespace bgfx
2014-11-14 08:19:33 -05:00
# elif BX_PLATFORM_WINRT
# include <Unknwn.h>
namespace bgfx
{
2014-12-04 19:56:19 -08:00
///
2015-04-20 16:22:40 -07:00
inline void winrtSetWindow ( : : IUnknown * _window )
{
PlatformData pd ;
memset ( & pd , 0 , sizeof ( pd ) ) ;
pd . nwh = _window ;
setPlatformData ( pd ) ;
}
2014-11-14 08:19:33 -05:00
} // namespace bgfx
2013-01-13 15:35:06 -08:00
# endif // BX_PLATFORM_
2013-08-10 23:22:40 -07:00
# if defined(_SDL_H)
2013-08-10 23:30:57 -07:00
// If SDL.h is included before bgfxplatform.h we can enable SDL window
// interop convenience code.
2013-08-10 23:22:40 -07:00
2013-08-12 20:47:41 -07:00
# include <SDL2 / SDL_syswm.h>
2013-08-10 22:15:59 -07:00
namespace bgfx
{
///
inline bool sdlSetWindow ( SDL_Window * _window )
{
SDL_SysWMinfo wmi ;
SDL_VERSION ( & wmi . version ) ;
2014-01-24 21:49:15 -08:00
if ( ! SDL_GetWindowWMInfo ( _window , & wmi ) )
2013-08-10 22:15:59 -07:00
{
return false ;
}
2014-08-06 21:53:32 -07:00
# if BX_PLATFORM_LINUX || BX_PLATFORM_FREEBSD
2013-08-10 22:15:59 -07:00
x11SetDisplayWindow ( wmi . info . x11 . display , wmi . info . x11 . window ) ;
2013-08-10 23:22:40 -07:00
# elif BX_PLATFORM_OSX
2013-08-10 22:15:59 -07:00
osxSetNSWindow ( wmi . info . cocoa . window ) ;
2013-08-10 23:22:40 -07:00
# elif BX_PLATFORM_WINDOWS
2013-08-10 22:15:59 -07:00
winSetHwnd ( wmi . info . win . window ) ;
2013-08-10 23:22:40 -07:00
# endif // BX_PLATFORM_
2013-08-10 22:15:59 -07:00
return true ;
}
2013-08-12 20:47:41 -07:00
2013-08-10 22:15:59 -07:00
} // namespace bgfx
2013-08-10 23:22:40 -07:00
# elif defined(_glfw3_h_)
2013-08-10 23:30:57 -07:00
// If GLFW/glfw3.h is included before bgfxplatform.h we can enable GLFW3
// window interop convenience code.
2013-08-10 23:22:40 -07:00
2014-08-06 21:53:32 -07:00
# if BX_PLATFORM_LINUX || BX_PLATFORM_FREEBSD
2013-08-10 23:22:40 -07:00
# define GLFW_EXPOSE_NATIVE_X11
# define GLFW_EXPOSE_NATIVE_GLX
# elif BX_PLATFORM_OSX
# define GLFW_EXPOSE_NATIVE_COCOA
# define GLFW_EXPOSE_NATIVE_NSGL
# elif BX_PLATFORM_WINDOWS
# define GLFW_EXPOSE_NATIVE_WIN32
# define GLFW_EXPOSE_NATIVE_WGL
# endif //
# include <GLFW / glfw3native.h>
namespace bgfx
{
inline void glfwSetWindow ( GLFWwindow * _window )
{
2014-08-06 21:53:32 -07:00
# if BX_PLATFORM_LINUX || BX_PLATFORM_FREEBSD
2013-08-10 23:22:40 -07:00
: : Display * display = glfwGetX11Display ( ) ;
2015-03-24 23:21:32 -07:00
: : Window window = glfwGetX11Window ( _window ) ;
void * glx = glfwGetGLXContext ( _window ) ;
x11SetDisplayWindow ( display , window , glx ) ;
2013-08-10 23:22:40 -07:00
# elif BX_PLATFORM_OSX
2015-03-24 22:19:21 -07:00
void * window = glfwGetCocoaWindow ( _window ) ;
void * nsgl = glfwGetNSGLContext ( _window ) ;
osxSetNSWindow ( window , nsgl ) ;
2013-08-10 23:22:40 -07:00
# elif BX_PLATFORM_WINDOWS
HWND hwnd = glfwGetWin32Window ( _window ) ;
winSetHwnd ( hwnd ) ;
2015-03-24 21:24:13 -07:00
# endif // BX_PLATFORM_WINDOWS
2013-08-10 23:22:40 -07:00
}
} // namespace bgfx
# endif // defined(_SDL_H)
2013-08-10 22:15:59 -07:00
2013-11-13 21:54:36 -08:00
# endif // BGFX_PLATFORM_H_HEADER_GUARD