Cleanup passing platform window/context data.

This commit is contained in:
Branimir Karadžić 2015-04-20 16:22:40 -07:00
parent 7904b9d9dd
commit a528554e67
13 changed files with 425 additions and 459 deletions

View file

@ -31,55 +31,15 @@ typedef enum bgfx_render_frame
*/
BGFX_C_API bgfx_render_frame_t bgfx_render_frame();
#if BX_PLATFORM_ANDROID
# include <android/native_window.h>
typedef struct bgfx_platform_data
{
void* ndt;
void* nwh;
void* context;
void* backbuffer;
/**
*
*/
BGFX_C_API void bgfx_android_set_window(ANativeWindow* _window);
} bgfx_platform_data_t;
#elif BX_PLATFORM_IOS
/**
*
*/
BGFX_C_API void bgfx_ios_set_eagl_layer(void* _layer);
#elif BX_PLATFORM_FREEBSD || BX_PLATFORM_LINUX || BX_PLATFORM_RPI
# include <X11/Xlib.h>
/**
*
*/
BGFX_C_API void bgfx_x11_set_display_window(Display* _display, Window _window);
#elif BX_PLATFORM_NACL
# include <ppapi/c/ppb_graphics_3d.h>
# include <ppapi/c/ppb_instance.h>
typedef void (*bgfx_post_swap_buffers_fn)(uint32_t _width, uint32_t _height);
/**
*
*/
BGFX_C_API bool bgfx_nacl_set_interfaces(PP_Instance, const PPB_Instance*, const PPB_Graphics3D*, bgfx_post_swap_buffers_fn);
#elif BX_PLATFORM_OSX
/**
*
*/
BGFX_C_API void bgfx_osx_set_ns_window(void* _window);
#elif BX_PLATFORM_WINDOWS
# include <windows.h>
/**
*
*/
BGFX_C_API void bgfx_win_set_hwnd(HWND _window);
#endif // BX_PLATFORM_
BGFX_C_API void bgfx_set_platform_data(bgfx_platform_data_t* _pd);
#endif // BGFX_PLATFORM_C99_H_HEADER_GUARD

View file

@ -30,7 +30,18 @@ namespace bgfx
/// allow creating separate rendering thread. If it is called before
/// to bgfx::init, render thread won't be created by bgfx::init call.
RenderFrame::Enum renderFrame();
}
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
#if BX_PLATFORM_ANDROID
# include <android/native_window.h>
@ -38,7 +49,13 @@ namespace bgfx
namespace bgfx
{
///
void androidSetWindow(::ANativeWindow* _window);
inline void androidSetWindow(::ANativeWindow* _window)
{
PlatformData pd;
memset(&pd, 0, sizeof(pd) );
pd.nwh = _window;
setPlatformData(pd);
}
} // namespace bgfx
@ -46,7 +63,13 @@ namespace bgfx
namespace bgfx
{
///
void iosSetEaglLayer(void* _layer);
inline void iosSetEaglLayer(void* _window)
{
PlatformData pd;
memset(&pd, 0, sizeof(pd) );
pd.nwh = _window;
setPlatformData(pd);
}
} // namespace bgfx
@ -55,7 +78,15 @@ namespace bgfx
namespace bgfx
{
///
void x11SetDisplayWindow(void* _display, uint32_t _window, void* _glx = NULL);
inline void x11SetDisplayWindow(void* _display, uint32_t _window, void* _glx = NULL);
{
PlatformData pd;
memset(&pd, 0, sizeof(pd) );
pd.ndt = _display;
pd.nwh = _window;
pd.context = _glx;
setPlatformData(pd);
}
} // namespace bgfx
@ -76,7 +107,14 @@ namespace bgfx
namespace bgfx
{
///
void osxSetNSWindow(void* _window, void* _nsgl = NULL);
inline void osxSetNSWindow(void* _window, void* _nsgl = NULL)
{
PlatformData pd;
memset(&pd, 0, sizeof(pd) );
pd.nwh = _window;
pd.context = _nsgl;
setPlatformData(pd);
}
} // namespace bgfx
@ -86,7 +124,13 @@ namespace bgfx
namespace bgfx
{
///
void winSetHwnd(::HWND _window);
inline void winSetHwnd(::HWND _window)
{
PlatformData pd;
memset(&pd, 0, sizeof(pd) );
pd.nwh = _window;
setPlatformData(pd);
}
} // namespace bgfx
@ -96,7 +140,13 @@ namespace bgfx
namespace bgfx
{
///
void winrtSetWindow(IUnknown* _window);
inline void winrtSetWindow(::IUnknown* _window)
{
PlatformData pd;
memset(&pd, 0, sizeof(pd) );
pd.nwh = _window;
setPlatformData(pd);
}
} // namespace bgfx

View file

@ -19,56 +19,6 @@ namespace bgfx
# define BGFX_CHECK_RENDER_THREAD()
#endif // BGFX_CONFIG_MULTITHREADED && !BX_PLATFORM_OSX && !BX_PLATFORM_IOS
#if BX_PLATFORM_ANDROID
::ANativeWindow* g_bgfxAndroidWindow = NULL;
void androidSetWindow(::ANativeWindow* _window)
{
g_bgfxAndroidWindow = _window;
}
#elif BX_PLATFORM_IOS
void* g_bgfxEaglLayer = NULL;
void iosSetEaglLayer(void* _layer)
{
g_bgfxEaglLayer = _layer;
}
#elif BX_PLATFORM_LINUX || BX_PLATFORM_FREEBSD
void* g_bgfxX11Display;
uint32_t g_bgfxX11Window;
void* g_bgfxGLX;
void x11SetDisplayWindow(void* _display, uint32_t _window, void* _glx)
{
g_bgfxX11Display = _display;
g_bgfxX11Window = _window;
g_bgfxGLX = _glx;
}
#elif BX_PLATFORM_OSX
void* g_bgfxNSWindow = NULL;
void* g_bgfxNSGL = NULL;
void osxSetNSWindow(void* _window, void* _nsgl)
{
g_bgfxNSWindow = _window;
g_bgfxNSGL = _nsgl;
}
#elif BX_PLATFORM_WINDOWS
::HWND g_bgfxHwnd = NULL;
void winSetHwnd(::HWND _window)
{
g_bgfxHwnd = _window;
}
#elif BX_PLATFORM_WINRT
::IUnknown* g_bgfxCoreWindow = NULL;
void winrtSetWindow(::IUnknown* _window)
{
g_bgfxCoreWindow = _window;
}
#endif // BX_PLATFORM_*
#if BGFX_CONFIG_USE_TINYSTL
void* TinyStlAllocator::static_allocate(size_t _bytes)
{
@ -252,6 +202,13 @@ namespace bgfx
static BX_THREAD uint32_t s_threadIndex = 0;
static Context* s_ctx = NULL;
static bool s_renderFrameCalled = false;
PlatformData g_platformData;
void setPlatformData(const PlatformData& _pd)
{
BGFX_FATAL(NULL == s_ctx, Fatal::UnableToInitialize, "Must be set prior to initialization!");
memcpy(&g_platformData, &_pd, sizeof(PlatformData) );
}
void setGraphicsDebuggerPresent(bool _present)
{
@ -3033,6 +2990,7 @@ BX_STATIC_ASSERT(sizeof(bgfx::TransientVertexBuffer) == sizeof(bgfx_transient_ve
BX_STATIC_ASSERT(sizeof(bgfx::InstanceDataBuffer) == sizeof(bgfx_instance_data_buffer_t) );
BX_STATIC_ASSERT(sizeof(bgfx::TextureInfo) == sizeof(bgfx_texture_info_t) );
BX_STATIC_ASSERT(sizeof(bgfx::Caps) == sizeof(bgfx_caps_t) );
BX_STATIC_ASSERT(sizeof(bgfx::PlatformData) == sizeof(bgfx_platform_data_t) );
BGFX_C_API void bgfx_vertex_decl_begin(bgfx_vertex_decl_t* _decl, bgfx_renderer_type_t _renderer)
{
@ -3645,40 +3603,7 @@ BGFX_C_API bgfx_render_frame_t bgfx_render_frame()
return bgfx_render_frame_t(bgfx::renderFrame() );
}
#if BX_PLATFORM_ANDROID
BGFX_C_API void bgfx_android_set_window(ANativeWindow* _window)
BGFX_C_API void bgfx_set_platform_data(bgfx_platform_data_t* _pd)
{
bgfx::androidSetWindow(_window);
bgfx::setPlatformData(*(bgfx::PlatformData*)_pd);
}
#elif BX_PLATFORM_IOS
BGFX_C_API void bgfx_ios_set_eagl_layer(void* _layer)
{
bgfx::iosSetEaglLayer(_layer);
}
#elif BX_PLATFORM_FREEBSD || BX_PLATFORM_LINUX || BX_PLATFORM_RPI
BGFX_C_API void bgfx_x11_set_display_window(::Display* _display, ::Window _window)
{
bgfx::x11SetDisplayWindow(_display, _window);
}
#elif BX_PLATFORM_NACL
BGFX_C_API bool bgfx_nacl_set_interfaces(PP_Instance _instance, const PPB_Instance* _instInterface, const PPB_Graphics3D* _graphicsInterface, bgfx_post_swap_buffers_fn _postSwapBuffers)
{
return bgfx::naclSetInterfaces(_instance, _instInterface, _graphicsInterface, _postSwapBuffers);
}
#elif BX_PLATFORM_OSX
BGFX_C_API void bgfx_osx_set_ns_window(void* _window)
{
bgfx::osxSetNSWindow(_window);
}
#elif BX_PLATFORM_WINDOWS
BGFX_C_API void bgfx_win_set_hwnd(HWND _window)
{
bgfx::winSetHwnd(_window);
}
#endif // BX_PLATFORM_*

View file

@ -217,22 +217,7 @@ namespace stl
namespace bgfx
{
#if BX_PLATFORM_ANDROID
extern ::ANativeWindow* g_bgfxAndroidWindow;
#elif BX_PLATFORM_IOS
extern void* g_bgfxEaglLayer;
#elif BX_PLATFORM_LINUX || BX_PLATFORM_FREEBSD
extern void* g_bgfxX11Display;
extern uint32_t g_bgfxX11Window;
extern void* g_bgfxGLX;
#elif BX_PLATFORM_OSX
extern void* g_bgfxNSWindow;
extern void* g_bgfxNSGL;
#elif BX_PLATFORM_WINDOWS
extern ::HWND g_bgfxHwnd;
#elif BX_PLATFORM_WINRT
extern ::IUnknown* g_bgfxCoreWindow;
#endif // BX_PLATFORM_*
extern PlatformData g_platformData;
#if BGFX_CONFIG_MAX_DRAW_CALLS < (64<<10)
typedef uint16_t RenderItemCount;

View file

@ -18,7 +18,7 @@ namespace bgfx { namespace gl
void GlContext::create(uint32_t _width, uint32_t _height)
{
BX_UNUSED(_width, _height);
CAEAGLLayer* layer = (CAEAGLLayer*)g_bgfxEaglLayer;
CAEAGLLayer* layer = (CAEAGLLayer*)g_platformData.nwh;
layer.opaque = true;
layer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys

View file

@ -178,25 +178,19 @@ EGL_IMPORT
m_eglLibrary = eglOpen();
# if BX_PLATFORM_ANDROID
if (!g_bgfxAndroidWindow)
if (NULL == g_platformData.context)
{
BX_TRACE("androidSetWindow() was not called, assuming EGLContext and buffer-swapping are managed outside bgfx.");
}
else
{
# endif
BX_UNUSED(_width, _height);
EGLNativeDisplayType ndt = EGL_DEFAULT_DISPLAY;
EGLNativeWindowType nwh = (EGLNativeWindowType)NULL;
EGLNativeDisplayType ndt = (EGLNativeDisplayType)g_platformData.ndt;
EGLNativeWindowType nwh = (EGLNativeWindowType )g_platformData.nwh;
# if BX_PLATFORM_WINDOWS
ndt = GetDC(g_bgfxHwnd);
nwh = g_bgfxHwnd;
# elif BX_PLATFORM_LINUX
ndt = (EGLNativeDisplayType)g_bgfxX11Display;
nwh = (EGLNativeWindowType)g_bgfxX11Window;
# endif // BX_PLATFORM_
if (NULL == g_platformData.ndt)
{
ndt = GetDC( (HWND)g_platformData.nwh);
}
# endif // BX_PLATFORM_WINDOWS
m_display = eglGetDisplay(ndt);
BGFX_FATAL(m_display != EGL_NO_DISPLAY, Fatal::UnableToInitialize, "Failed to create display %p", m_display);
@ -224,10 +218,11 @@ EGL_IMPORT
BGFX_FATAL(success, Fatal::UnableToInitialize, "eglChooseConfig");
# if BX_PLATFORM_ANDROID
EGLint format;
eglGetConfigAttrib(m_display, m_config, EGL_NATIVE_VISUAL_ID, &format);
ANativeWindow_setBuffersGeometry(g_bgfxAndroidWindow, _width, _height, format);
nwh = g_bgfxAndroidWindow;
ANativeWindow_setBuffersGeometry( (ANativeWindow*)g_platformData.nwh, _width, _height, format);
# elif BX_PLATFORM_RPI
DISPMANX_DISPLAY_HANDLE_T dispmanDisplay = vc_dispmanx_display_open(0);
DISPMANX_UPDATE_HANDLE_T dispmanUpdate = vc_dispmanx_update_start(0);
@ -266,9 +261,8 @@ EGL_IMPORT
m_current = NULL;
eglSwapInterval(m_display, 0);
# if BX_PLATFORM_ANDROID
}
# endif
# if BX_PLATFORM_EMSCRIPTEN
emscripten_set_canvas_size(_width, _height);
# endif // BX_PLATFORM_EMSCRIPTEN
@ -303,7 +297,7 @@ EGL_IMPORT
{
EGLint format;
eglGetConfigAttrib(m_display, m_config, EGL_NATIVE_VISUAL_ID, &format);
ANativeWindow_setBuffersGeometry(g_bgfxAndroidWindow, _width, _height, format);
ANativeWindow_setBuffersGeometry( (ANativeWindow*)g_platformData.nwh, _width, _height, format);
}
# endif // BX_PLATFORM_ANDROID

View file

@ -29,23 +29,23 @@ namespace bgfx { namespace gl
SwapChainGL(::Window _window, XVisualInfo* _visualInfo, GLXContext _context)
: m_window(_window)
{
m_context = glXCreateContext( (::Display*)g_bgfxX11Display, _visualInfo, _context, GL_TRUE);
m_context = glXCreateContext( (::Display*)g_platformData.ndt, _visualInfo, _context, GL_TRUE);
}
~SwapChainGL()
{
glXMakeCurrent( (::Display*)g_bgfxX11Display, 0, 0);
glXDestroyContext( (::Display*)g_bgfxX11Display, m_context);
glXMakeCurrent( (::Display*)g_platformData.ndt, 0, 0);
glXDestroyContext( (::Display*)g_platformData.ndt, m_context);
}
void makeCurrent()
{
glXMakeCurrent( (::Display*)g_bgfxX11Display, m_window, m_context);
glXMakeCurrent( (::Display*)g_platformData.ndt, m_window, m_context);
}
void swapBuffers()
{
glXSwapBuffers( (::Display*)g_bgfxX11Display, m_window);
glXSwapBuffers( (::Display*)g_platformData.ndt, m_window);
}
Window m_window;
@ -56,14 +56,14 @@ namespace bgfx { namespace gl
{
BX_UNUSED(_width, _height);
m_context = (GLXContext)g_bgfxGLX;
m_context = (GLXContext)g_platformData.context;
if (NULL == g_bgfxGLX)
if (NULL == g_platformData.context)
{
XLockDisplay( (::Display*)g_bgfxX11Display);
XLockDisplay( (::Display*)g_platformData.ndt);
int major, minor;
bool version = glXQueryVersion( (::Display*)g_bgfxX11Display, &major, &minor);
bool version = glXQueryVersion( (::Display*)g_platformData.ndt, &major, &minor);
BGFX_FATAL(version, Fatal::UnableToInitialize, "Failed to query GLX version");
BGFX_FATAL( (major == 1 && minor >= 2) || major > 1
, Fatal::UnableToInitialize
@ -72,9 +72,9 @@ namespace bgfx { namespace gl
, minor
);
int32_t screen = DefaultScreen( (::Display*)g_bgfxX11Display);
int32_t screen = DefaultScreen( (::Display*)g_platformData.ndt);
const char* extensions = glXQueryExtensionsString( (::Display*)g_bgfxX11Display, screen);
const char* extensions = glXQueryExtensionsString( (::Display*)g_platformData.ndt, screen);
BX_TRACE("GLX extensions:");
dumpExtensions(extensions);
@ -96,13 +96,13 @@ namespace bgfx { namespace gl
GLXFBConfig bestConfig = NULL;
int numConfigs;
GLXFBConfig* configs = glXChooseFBConfig( (::Display*)g_bgfxX11Display, screen, attrsGlx, &numConfigs);
GLXFBConfig* configs = glXChooseFBConfig( (::Display*)g_platformData.ndt, screen, attrsGlx, &numConfigs);
BX_TRACE("glX num configs %d", numConfigs);
for (int ii = 0; ii < numConfigs; ++ii)
{
m_visualInfo = glXGetVisualFromFBConfig( (::Display*)g_bgfxX11Display, configs[ii]);
m_visualInfo = glXGetVisualFromFBConfig( (::Display*)g_platformData.ndt, configs[ii]);
if (NULL != m_visualInfo)
{
BX_TRACE("---");
@ -110,7 +110,7 @@ namespace bgfx { namespace gl
for (uint32_t attr = 6; attr < BX_COUNTOF(attrsGlx)-1 && attrsGlx[attr] != None; attr += 2)
{
int value;
glXGetFBConfigAttrib( (::Display*)g_bgfxX11Display, configs[ii], attrsGlx[attr], &value);
glXGetFBConfigAttrib( (::Display*)g_platformData.ndt, configs[ii], attrsGlx[attr], &value);
BX_TRACE("glX %d/%d %2d: %4x, %8x (%8x%s)"
, ii
, numConfigs
@ -146,7 +146,7 @@ namespace bgfx { namespace gl
BGFX_FATAL(m_visualInfo, Fatal::UnableToInitialize, "Failed to find a suitable X11 display configuration.");
BX_TRACE("Create GL 2.1 context.");
m_context = glXCreateContext( (::Display*)g_bgfxX11Display, m_visualInfo, 0, GL_TRUE);
m_context = glXCreateContext( (::Display*)g_platformData.ndt, m_visualInfo, 0, GL_TRUE);
BGFX_FATAL(NULL != m_context, Fatal::UnableToInitialize, "Failed to create GL 2.1 context.");
#if BGFX_CONFIG_RENDERER_OPENGL >= 31
@ -163,11 +163,11 @@ namespace bgfx { namespace gl
0,
};
GLXContext context = glXCreateContextAttribsARB( (::Display*)g_bgfxX11Display, bestConfig, 0, true, contextAttrs);
GLXContext context = glXCreateContextAttribsARB( (::Display*)g_platformData.ndt, bestConfig, 0, true, contextAttrs);
if (NULL != context)
{
glXDestroyContext( (::Display*)g_bgfxX11Display, m_context);
glXDestroyContext( (::Display*)g_platformData.ndt, m_context);
m_context = context;
}
}
@ -175,19 +175,19 @@ namespace bgfx { namespace gl
BX_UNUSED(bestConfig);
#endif // BGFX_CONFIG_RENDERER_OPENGL >= 31
XUnlockDisplay( (::Display*)g_bgfxX11Display);
XUnlockDisplay( (::Display*)g_platformData.ndt);
}
import();
glXMakeCurrent( (::Display*)g_bgfxX11Display, (::Window)g_bgfxX11Window, m_context);
glXMakeCurrent( (::Display*)g_platformData.ndt, (::Window)g_platformData.nwh, m_context);
m_current = NULL;
glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glXGetProcAddress( (const GLubyte*)"glXSwapIntervalEXT");
if (NULL != glXSwapIntervalEXT)
{
BX_TRACE("Using glXSwapIntervalEXT.");
glXSwapIntervalEXT( (::Display*)g_bgfxX11Display, (::Window)g_bgfxX11Window, 0);
glXSwapIntervalEXT( (::Display*)g_platformData.ndt, (::Window)g_platformData.nwh, 0);
}
else
{
@ -210,15 +210,15 @@ namespace bgfx { namespace gl
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glXSwapBuffers( (::Display*)g_bgfxX11Display, (::Window)g_bgfxX11Window);
glXSwapBuffers( (::Display*)g_platformData.ndt, (::Window)g_platformData.nwh);
}
void GlContext::destroy()
{
glXMakeCurrent( (::Display*)g_bgfxX11Display, 0, 0);
if (NULL == g_bgfxGLX)
glXMakeCurrent( (::Display*)g_platformData.ndt, 0, 0);
if (NULL == g_platformData.context)
{
glXDestroyContext( (::Display*)g_bgfxX11Display, m_context);
glXDestroyContext( (::Display*)g_platformData.ndt, m_context);
XFree(m_visualInfo);
}
m_context = NULL;
@ -232,7 +232,7 @@ namespace bgfx { namespace gl
if (NULL != glXSwapIntervalEXT)
{
glXSwapIntervalEXT( (::Display*)g_bgfxX11Display, (::Window)g_bgfxX11Window, interval);
glXSwapIntervalEXT( (::Display*)g_platformData.ndt, (::Window)g_platformData.nwh, interval);
}
else if (NULL != glXSwapIntervalMESA)
{
@ -265,7 +265,7 @@ namespace bgfx { namespace gl
if (NULL == _swapChain)
{
glXSwapBuffers( (::Display*)g_bgfxX11Display, (::Window)g_bgfxX11Window);
glXSwapBuffers( (::Display*)g_platformData.ndt, (::Window)g_platformData.nwh);
}
else
{
@ -281,7 +281,7 @@ namespace bgfx { namespace gl
if (NULL == _swapChain)
{
glXMakeCurrent( (::Display*)g_bgfxX11Display, (::Window)g_bgfxX11Window, m_context);
glXMakeCurrent( (::Display*)g_platformData.ndt, (::Window)g_platformData.nwh, m_context);
}
else
{

View file

@ -65,10 +65,10 @@ namespace bgfx { namespace gl
BX_CHECK(NULL != s_opengl, "OpenGL dynamic library is not found!");
const AutoreleasePoolHolder pool;
NSWindow* nsWindow = (NSWindow*)g_bgfxNSWindow;
m_context = g_bgfxNSGL;
NSWindow* nsWindow = (NSWindow*)g_platformData.nwh;
m_context = g_platformData.context;
if (NULL == g_bgfxNSGL)
if (NULL == g_platformData.context)
{
#if defined(MAC_OS_X_VERSION_MAX_ALLOWED) && (MAC_OS_X_VERSION_MAX_ALLOWED >= 1070)
NSOpenGLPixelFormatAttribute profile =
@ -120,7 +120,7 @@ namespace bgfx { namespace gl
void GlContext::destroy()
{
if (NULL == g_bgfxNSGL)
if (NULL == g_platformData.context)
{
NSOpenGLView* glView = (NSOpenGLView*)m_view;
[glView release];

View file

@ -109,14 +109,14 @@ namespace bgfx { namespace gl
wglGetProcAddress = (PFNWGLGETPROCADDRESSPROC)bx::dlsym(m_opengl32dll, "wglGetProcAddress");
BGFX_FATAL(NULL != wglGetProcAddress, Fatal::UnableToInitialize, "Failed get wglGetProcAddress.");
// If g_bgfxHwnd is NULL, the assumption is that GL context was created
// If g_platformHooks.nwh is NULL, the assumption is that GL context was created
// by user (for example, using SDL, GLFW, etc.)
BX_WARN(NULL != g_bgfxHwnd
, "bgfx::winSetHwnd with valid window is not called. This might "
BX_WARN(NULL != g_platformData.nwh
, "bgfx::setPlatform with valid window is not called. This might "
"be intentional when GL context is created by the user."
);
if (NULL != g_bgfxHwnd)
if (NULL != g_platformData.nwh)
{
wglMakeCurrent = (PFNWGLMAKECURRENTPROC)bx::dlsym(m_opengl32dll, "wglMakeCurrent");
BGFX_FATAL(NULL != wglMakeCurrent, Fatal::UnableToInitialize, "Failed get wglMakeCurrent.");
@ -127,7 +127,7 @@ namespace bgfx { namespace gl
wglDeleteContext = (PFNWGLDELETECONTEXTPROC)bx::dlsym(m_opengl32dll, "wglDeleteContext");
BGFX_FATAL(NULL != wglDeleteContext, Fatal::UnableToInitialize, "Failed get wglDeleteContext.");
m_hdc = GetDC(g_bgfxHwnd);
m_hdc = GetDC( (HWND)g_platformData.nwh);
BGFX_FATAL(NULL != m_hdc, Fatal::UnableToInitialize, "GetDC failed!");
// Dummy window to peek into WGL functionality.
@ -272,14 +272,14 @@ namespace bgfx { namespace gl
void GlContext::destroy()
{
if (NULL != g_bgfxHwnd)
if (NULL != g_platformData.nwh)
{
wglMakeCurrent(NULL, NULL);
wglDeleteContext(m_context);
m_context = NULL;
ReleaseDC(g_bgfxHwnd, m_hdc);
ReleaseDC( (HWND)g_platformData.nwh, m_hdc);
m_hdc = NULL;
}
@ -324,7 +324,7 @@ namespace bgfx { namespace gl
if (NULL == _swapChain)
{
if (NULL != g_bgfxHwnd)
if (NULL != g_platformData.nwh)
{
SwapBuffers(m_hdc);
}

View file

@ -430,21 +430,39 @@ namespace bgfx { namespace d3d11
struct RendererContextD3D11 : public RendererContextI
{
RendererContextD3D11()
: m_renderdocdll(NULL)
: m_d3d9dll(NULL)
, m_d3d11dll(NULL)
, m_dxgidll(NULL)
, m_renderdocdll(NULL)
, m_driverType(D3D_DRIVER_TYPE_NULL)
, m_featureLevel(D3D_FEATURE_LEVEL(0) )
, m_adapter(NULL)
, m_factory(NULL)
, m_swapChain(NULL)
, m_lost(0)
, m_numWindows(0)
, m_device(NULL)
, m_deviceCtx(NULL)
, m_backBufferColor(NULL)
, m_backBufferDepthStencil(NULL)
, m_currentColor(NULL)
, m_currentDepthStencil(NULL)
, m_captureTexture(NULL)
, m_captureResolve(NULL)
, m_wireframe(false)
, m_flags(BGFX_RESET_NONE)
, m_maxAnisotropy(1)
, m_currentProgram(NULL)
, m_vsChanges(0)
, m_fsChanges(0)
, m_rtMsaa(false)
, m_ovrRtv(NULL)
, m_ovrDsv(NULL)
{
m_fbh.idx = invalidHandle;
memset(&m_adapterDesc, 0, sizeof(m_adapterDesc) );
memset(&m_scd, 0, sizeof(m_scd) );
memset(&m_windows, 0xff, sizeof(m_windows) );
}
~RendererContextD3D11()
@ -509,6 +527,10 @@ namespace bgfx { namespace d3d11
BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Unable to create DXGI factory.");
#endif // BX_PLATFORM_WINRT
m_device = (ID3D11Device*)g_platformData.context;
if (NULL == m_device)
{
m_adapter = NULL;
m_driverType = D3D_DRIVER_TYPE_HARDWARE;
@ -615,8 +637,15 @@ namespace bgfx { namespace d3d11
{
DX_RELEASE(m_adapter, 2);
}
}
else
{
m_device->GetImmediateContext(&m_deviceCtx);
BGFX_FATAL(NULL != m_deviceCtx, Fatal::UnableToInitialize, "Unable to create Direct3D11 device.");
}
IDXGIDevice* device = NULL;
IDXGIAdapter* adapter;
hr = E_FAIL;
for (uint32_t ii = 0; ii < BX_COUNTOF(s_deviceIIDs) && FAILED(hr); ++ii)
{
@ -660,6 +689,8 @@ BX_PRAGMA_DIAGNOSTIC_POP();
g_caps.vendorId = (uint16_t)m_adapterDesc.VendorId;
g_caps.deviceId = (uint16_t)m_adapterDesc.DeviceId;
if (NULL == g_platformData.backbuffer)
{
#if BX_PLATFORM_WINRT
hr = adapter->GetParent(__uuidof(IDXGIFactory2), (void**)&m_factory);
BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Unable to create Direct3D11 device.");
@ -679,7 +710,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
m_scd.AlphaMode = DXGI_ALPHA_MODE_IGNORE;
hr = m_factory->CreateSwapChainForCoreWindow(m_device
, g_bgfxCoreWindow
, (::IUnknown*)g_platformData.nwh
, &m_scd
, NULL
, &m_swapChain
@ -700,7 +731,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
m_scd.SampleDesc.Quality = 0;
m_scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
m_scd.BufferCount = 1;
m_scd.OutputWindow = g_bgfxHwnd;
m_scd.OutputWindow = (HWND)g_platformData.nwh;
m_scd.Windowed = true;
hr = m_factory->CreateSwapChain(m_device
@ -709,11 +740,17 @@ BX_PRAGMA_DIAGNOSTIC_POP();
);
BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Failed to create swap chain.");
DX_CHECK(m_factory->MakeWindowAssociation(g_bgfxHwnd, 0
DX_CHECK(m_factory->MakeWindowAssociation((HWND)g_platformData.nwh, 0
| DXGI_MWA_NO_WINDOW_CHANGES
| DXGI_MWA_NO_ALT_ENTER
));
#endif // BX_PLATFORM_WINRT
}
else
{
memset(&m_scd, 0, sizeof(m_scd) );
m_backBufferColor = (ID3D11RenderTargetView*)g_platformData.backbuffer;
}
m_numWindows = 1;
@ -1147,6 +1184,12 @@ BX_PRAGMA_DIAGNOSTIC_POP();
void saveScreenShot(const char* _filePath) BX_OVERRIDE
{
BX_WARN(NULL != m_swapChain, "Unable to capture screenshot %s.", _filePath);
if (NULL == m_swapChain)
{
return;
}
ID3D11Texture2D* backBuffer;
DX_CHECK(m_swapChain->GetBuffer(0, IID_ID3D11Texture2D, (void**)&backBuffer));
@ -1317,7 +1360,11 @@ BX_PRAGMA_DIAGNOSTIC_POP();
ovrPreReset();
DX_RELEASE(m_backBufferDepthStencil, 0);
if (NULL != m_swapChain)
{
DX_RELEASE(m_backBufferColor, 0);
}
for (uint32_t ii = 0; ii < BX_COUNTOF(m_frameBuffers); ++ii)
{
@ -1330,12 +1377,15 @@ BX_PRAGMA_DIAGNOSTIC_POP();
}
void postReset()
{
if (NULL != m_swapChain)
{
ID3D11Texture2D* color;
DX_CHECK(m_swapChain->GetBuffer(0, IID_ID3D11Texture2D, (void**)&color));
DX_CHECK(m_device->CreateRenderTargetView(color, NULL, &m_backBufferColor) );
DX_RELEASE(color, 0);
}
ovrPostReset();
@ -1502,6 +1552,8 @@ BX_PRAGMA_DIAGNOSTIC_POP();
preReset();
if (NULL != m_swapChain)
{
if (resize)
{
DX_CHECK(m_swapChain->ResizeBuffers(2
@ -1521,7 +1573,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
#if BX_PLATFORM_WINRT
HRESULT hr;
hr = m_factory->CreateSwapChainForCoreWindow(m_device
, g_bgfxCoreWindow
, (::IUnknown*)g_platformData.nwh
, &m_scd
, NULL
, &m_swapChain
@ -1535,6 +1587,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
#endif // BX_PLATFORM_WINRT
BGFX_FATAL(SUCCEEDED(hr), bgfx::Fatal::UnableToInitialize, "Failed to create swap chain.");
}
}
postReset();
}
@ -2042,7 +2095,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
config.D3D11.pDeviceContext = m_deviceCtx;
config.D3D11.pBackBufferRT = m_backBufferColor;
config.D3D11.pSwapChain = m_swapChain;
if (m_ovr.postReset(g_bgfxHwnd, &config.Config, !!(m_flags & BGFX_RESET_HMD_DEBUG) ) )
if (m_ovr.postReset(g_platformData.nwh, &config.Config, !!(m_flags & BGFX_RESET_HMD_DEBUG) ) )
{
uint32_t size = sizeof(uint32_t) + sizeof(TextureCreate);
const Memory* mem = alloc(size);
@ -2404,11 +2457,9 @@ BX_PRAGMA_DIAGNOSTIC_POP();
}
}
#if USE_D3D11_DYNAMIC_LIB
void* m_d3d9dll;
void* m_d3d11dll;
void* m_dxgidll;
#endif // USE_D3D11_DYNAMIC_LIB
void* m_renderdocdll;
@ -2422,7 +2473,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
#else
IDXGIFactory* m_factory;
IDXGISwapChain* m_swapChain;
#endif
#endif // BX_PLATFORM_WINRT
uint16_t m_lost;
uint16_t m_numWindows;

View file

@ -22,7 +22,7 @@ BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4005) // warning C4005: '' : macro redefinitio
# include <d3d11_2.h>
#else
# include <d3d11.h>
#endif
#endif // BX_PLATFORM_WINRT
BX_PRAGMA_DIAGNOSTIC_POP()
#include "renderer.h"

View file

@ -272,6 +272,7 @@ namespace bgfx { namespace d3d9
RendererContextD3D9()
: m_d3d9(NULL)
, m_device(NULL)
, m_swapChain(NULL)
, m_captureTexture(NULL)
, m_captureSurface(NULL)
, m_captureResolve(NULL)
@ -316,7 +317,7 @@ namespace bgfx { namespace d3d9
m_params.Windowed = true;
RECT rect;
GetWindowRect(g_bgfxHwnd, &rect);
GetWindowRect( (HWND)g_platformData.nwh, &rect);
m_params.BackBufferWidth = rect.right-rect.left;
m_params.BackBufferHeight = rect.bottom-rect.top;
@ -417,7 +418,7 @@ namespace bgfx { namespace d3d9
#if 0 // BGFX_CONFIG_RENDERER_DIRECT3D9EX
DX_CHECK(m_d3d9->CreateDeviceEx(m_adapter
, m_deviceType
, g_bgfxHwnd
, g_platformHooks.nwh
, behaviorFlags[ii]
, &m_params
, NULL
@ -426,7 +427,7 @@ namespace bgfx { namespace d3d9
#else
DX_CHECK(m_d3d9->CreateDevice(m_adapter
, m_deviceType
, g_bgfxHwnd
, (HWND)g_platformData.nwh
, behaviorFlags[ii]
, &m_params
, &m_device
@ -860,11 +861,11 @@ namespace bgfx { namespace d3d9
) );
RECT rc;
GetClientRect(g_bgfxHwnd, &rc);
GetClientRect( (HWND)g_platformData.nwh, &rc);
POINT point;
point.x = rc.left;
point.y = rc.top;
ClientToScreen(g_bgfxHwnd, &point);
ClientToScreen( (HWND)g_platformData.nwh, &point);
uint8_t* data = (uint8_t*)rect.pBits;
uint32_t bytesPerPixel = rect.Pitch/dm.Width;
@ -1146,7 +1147,7 @@ namespace bgfx { namespace d3d9
void flip(HMD& /*_hmd*/) BX_OVERRIDE
{
if (NULL != m_device)
if (NULL != m_swapChain)
{
#if BGFX_CONFIG_RENDERER_DIRECT3D9EX
if (NULL != m_deviceEx)
@ -1160,7 +1161,7 @@ namespace bgfx { namespace d3d9
HRESULT hr;
if (0 == ii)
{
hr = m_swapChain->Present(NULL, NULL, g_bgfxHwnd, NULL, 0);
hr = m_swapChain->Present(NULL, NULL, (HWND)g_platformData.nwh, NULL, 0);
}
else
{

View file

@ -2239,9 +2239,9 @@ namespace bgfx { namespace gl
config.OGL.Header.RTSize.h = m_resolution.m_height;
# endif // OVR_VERSION > OVR_VERSION_043
config.OGL.Header.Multisample = 0;
config.OGL.Window = g_bgfxHwnd;
config.OGL.DC = GetDC(g_bgfxHwnd);
if (m_ovr.postReset(g_bgfxHwnd, &config.Config, !!(m_resolution.m_flags & BGFX_RESET_HMD_DEBUG) ) )
config.OGL.Window = g_platformData.nwh;
config.OGL.DC = GetDC(g_platformData.nwh);
if (m_ovr.postReset(g_platformData.nwh, &config.Config, !!(m_resolution.m_flags & BGFX_RESET_HMD_DEBUG) ) )
{
uint32_t size = sizeof(uint32_t) + sizeof(TextureCreate);
const Memory* mem = alloc(size);