SDL2: Moved renderer to main thread. Added --with-sdl GENie option.

This commit is contained in:
Branimir Karadzic
2014-10-11 21:55:24 -07:00
parent 12c3508aa2
commit e063661e95
3 changed files with 150 additions and 131 deletions

View File

@@ -198,6 +198,8 @@ namespace entry
s_userEventStart = SDL_RegisterEvents(7);
bgfx::sdlSetWindow(m_window[0]);
bgfx::renderFrame();
m_thread.init(MainThreadEntry::threadFunc, &m_mte);
// Force window resolution...
@@ -206,151 +208,157 @@ namespace entry
bool exit = false;
SDL_Event event;
while (!exit && SDL_WaitEvent(&event) )
while (!exit)
{
switch (event.type)
bgfx::renderFrame();
while (SDL_PollEvent(&event) )
{
case SDL_QUIT:
m_eventQueue.postExitEvent();
exit = true;
break;
case SDL_MOUSEMOTION:
switch (event.type)
{
const SDL_MouseMotionEvent& mev = event.motion;
m_eventQueue.postMouseEvent(defaultWindow, mev.x, mev.y, 0);
}
break;
case SDL_QUIT:
m_eventQueue.postExitEvent();
exit = true;
break;
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
{
const SDL_MouseButtonEvent& mev = event.button;
m_eventQueue.postMouseEvent(defaultWindow, mev.x, mev.y, 0, MouseButton::Left, mev.type == SDL_MOUSEBUTTONDOWN);
}
break;
case SDL_KEYDOWN:
case SDL_KEYUP:
{
const SDL_KeyboardEvent& kev = event.key;
uint8_t modifiers = translateKeyModifiers(kev.keysym.mod);
Key::Enum key = translateKey(kev.keysym.scancode);
m_eventQueue.postKeyEvent(defaultWindow, key, modifiers, kev.state == SDL_PRESSED);
}
break;
case SDL_WINDOWEVENT:
{
const SDL_WindowEvent& wev = event.window;
switch (wev.event)
case SDL_MOUSEMOTION:
{
case SDL_WINDOWEVENT_RESIZED:
case SDL_WINDOWEVENT_SIZE_CHANGED:
setWindowSize(defaultWindow, wev.data1, wev.data2);
break;
case SDL_WINDOWEVENT_SHOWN:
case SDL_WINDOWEVENT_HIDDEN:
case SDL_WINDOWEVENT_EXPOSED:
case SDL_WINDOWEVENT_MOVED:
case SDL_WINDOWEVENT_MINIMIZED:
case SDL_WINDOWEVENT_MAXIMIZED:
case SDL_WINDOWEVENT_RESTORED:
case SDL_WINDOWEVENT_ENTER:
case SDL_WINDOWEVENT_LEAVE:
case SDL_WINDOWEVENT_FOCUS_GAINED:
case SDL_WINDOWEVENT_FOCUS_LOST:
break;
case SDL_WINDOWEVENT_CLOSE:
m_eventQueue.postExitEvent();
exit = true;
break;
const SDL_MouseMotionEvent& mev = event.motion;
m_eventQueue.postMouseEvent(defaultWindow, mev.x, mev.y, 0);
}
}
break;
break;
default:
{
const SDL_UserEvent uev = event.user;
if (uev.type == SDL_USER_WINDOW_CREATE)
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
{
WindowHandle handle = { *reinterpret_cast<const uint16_t*>(&uev.data1) };
Msg* msg = (Msg*)uev.data2;
const SDL_MouseButtonEvent& mev = event.button;
m_eventQueue.postMouseEvent(defaultWindow, mev.x, mev.y, 0, MouseButton::Left, mev.type == SDL_MOUSEBUTTONDOWN);
}
break;
m_window[handle.idx] = SDL_CreateWindow(msg->m_title.c_str()
, msg->m_x
, msg->m_y
, msg->m_width
, msg->m_height
, SDL_WINDOW_SHOWN
| SDL_WINDOW_OPENGL
| SDL_WINDOW_RESIZABLE
);
case SDL_KEYDOWN:
case SDL_KEYUP:
{
const SDL_KeyboardEvent& kev = event.key;
uint8_t modifiers = translateKeyModifiers(kev.keysym.mod);
Key::Enum key = translateKey(kev.keysym.scancode);
m_eventQueue.postKeyEvent(defaultWindow, key, modifiers, kev.state == SDL_PRESSED);
}
break;
m_flags[handle.idx] = msg->m_flags;
SDL_SysWMinfo wmi;
SDL_VERSION(&wmi.version);
if (SDL_GetWindowWMInfo(m_window[handle.idx], &wmi) )
case SDL_WINDOWEVENT:
{
const SDL_WindowEvent& wev = event.window;
switch (wev.event)
{
# if BX_PLATFORM_LINUX || BX_PLATFORM_FREEBSD
void* nwh = wmi.info.x11.window;
# elif BX_PLATFORM_OSX
void* nwh = wmi.info.cocoa.window;
# elif BX_PLATFORM_WINDOWS
void* nwh = wmi.info.win.window;
# endif // BX_PLATFORM_
m_eventQueue.postWindowEvent(handle, nwh);
m_eventQueue.postSizeEvent(handle, msg->m_width, msg->m_height);
}
case SDL_WINDOWEVENT_RESIZED:
case SDL_WINDOWEVENT_SIZE_CHANGED:
setWindowSize(defaultWindow, wev.data1, wev.data2);
break;
delete msg;
case SDL_WINDOWEVENT_SHOWN:
case SDL_WINDOWEVENT_HIDDEN:
case SDL_WINDOWEVENT_EXPOSED:
case SDL_WINDOWEVENT_MOVED:
case SDL_WINDOWEVENT_MINIMIZED:
case SDL_WINDOWEVENT_MAXIMIZED:
case SDL_WINDOWEVENT_RESTORED:
case SDL_WINDOWEVENT_ENTER:
case SDL_WINDOWEVENT_LEAVE:
case SDL_WINDOWEVENT_FOCUS_GAINED:
case SDL_WINDOWEVENT_FOCUS_LOST:
break;
case SDL_WINDOWEVENT_CLOSE:
m_eventQueue.postExitEvent();
exit = true;
break;
}
}
else if (uev.type == SDL_USER_WINDOW_DESTROY)
break;
default:
{
WindowHandle handle = { *reinterpret_cast<const uint16_t*>(&uev.data1) };
m_eventQueue.postWindowEvent(handle);
SDL_DestroyWindow(m_window[handle.idx]);
m_window[handle.idx] = NULL;
}
else if (uev.type == SDL_USER_WINDOW_SET_TITLE)
{
WindowHandle handle = { *reinterpret_cast<const uint16_t*>(&uev.data1) };
Msg* msg = (Msg*)uev.data2;
SDL_SetWindowTitle(m_window[handle.idx], msg->m_title.c_str());
delete msg;
}
else if (uev.type == SDL_USER_WINDOW_SET_POS)
{
WindowHandle handle = { *reinterpret_cast<const uint16_t*>(&uev.data1) };
Msg* msg = (Msg*)uev.data2;
SDL_SetWindowPosition(m_window[handle.idx], msg->m_x, msg->m_y);
delete msg;
}
else if (uev.type == SDL_USER_WINDOW_SET_SIZE)
{
WindowHandle handle = findHandle(uev.windowID);
uint32_t width = *(uint32_t*)&uev.data1;
uint32_t height = *(uint32_t*)&uev.data2;
setWindowSize(handle, width, height);
}
else if (SDL_USER_WINDOW_TOGGLE_FRAME == uev.type)
{
WindowHandle handle = { *reinterpret_cast<const uint16_t*>(&uev.data1) };
m_flags[handle.idx] ^= ENTRY_WINDOW_FLAG_FRAME;
SDL_SetWindowBordered(m_window[handle.idx], (SDL_bool)!!(m_flags[handle.idx] & ENTRY_WINDOW_FLAG_FRAME) );
}
else if (SDL_USER_WINDOW_MOUSE_LOCK == uev.type)
{
SDL_SetRelativeMouseMode(!!uev.code ? SDL_TRUE : SDL_FALSE);
const SDL_UserEvent uev = event.user;
if (uev.type == SDL_USER_WINDOW_CREATE)
{
WindowHandle handle = { *reinterpret_cast<const uint16_t*>(&uev.data1) };
Msg* msg = (Msg*)uev.data2;
m_window[handle.idx] = SDL_CreateWindow(msg->m_title.c_str()
, msg->m_x
, msg->m_y
, msg->m_width
, msg->m_height
, SDL_WINDOW_SHOWN
| SDL_WINDOW_OPENGL
| SDL_WINDOW_RESIZABLE
);
m_flags[handle.idx] = msg->m_flags;
SDL_SysWMinfo wmi;
SDL_VERSION(&wmi.version);
if (SDL_GetWindowWMInfo(m_window[handle.idx], &wmi) )
{
# if BX_PLATFORM_LINUX || BX_PLATFORM_FREEBSD
void* nwh = wmi.info.x11.window;
# elif BX_PLATFORM_OSX
void* nwh = wmi.info.cocoa.window;
# elif BX_PLATFORM_WINDOWS
void* nwh = wmi.info.win.window;
# endif // BX_PLATFORM_
m_eventQueue.postWindowEvent(handle, nwh);
m_eventQueue.postSizeEvent(handle, msg->m_width, msg->m_height);
}
delete msg;
}
else if (uev.type == SDL_USER_WINDOW_DESTROY)
{
WindowHandle handle = { *reinterpret_cast<const uint16_t*>(&uev.data1) };
m_eventQueue.postWindowEvent(handle);
SDL_DestroyWindow(m_window[handle.idx]);
m_window[handle.idx] = NULL;
}
else if (uev.type == SDL_USER_WINDOW_SET_TITLE)
{
WindowHandle handle = { *reinterpret_cast<const uint16_t*>(&uev.data1) };
Msg* msg = (Msg*)uev.data2;
SDL_SetWindowTitle(m_window[handle.idx], msg->m_title.c_str());
delete msg;
}
else if (uev.type == SDL_USER_WINDOW_SET_POS)
{
WindowHandle handle = { *reinterpret_cast<const uint16_t*>(&uev.data1) };
Msg* msg = (Msg*)uev.data2;
SDL_SetWindowPosition(m_window[handle.idx], msg->m_x, msg->m_y);
delete msg;
}
else if (uev.type == SDL_USER_WINDOW_SET_SIZE)
{
WindowHandle handle = findHandle(uev.windowID);
uint32_t width = *(uint32_t*)&uev.data1;
uint32_t height = *(uint32_t*)&uev.data2;
setWindowSize(handle, width, height);
}
else if (SDL_USER_WINDOW_TOGGLE_FRAME == uev.type)
{
WindowHandle handle = { *reinterpret_cast<const uint16_t*>(&uev.data1) };
m_flags[handle.idx] ^= ENTRY_WINDOW_FLAG_FRAME;
SDL_SetWindowBordered(m_window[handle.idx], (SDL_bool)!!(m_flags[handle.idx] & ENTRY_WINDOW_FLAG_FRAME) );
}
else if (SDL_USER_WINDOW_MOUSE_LOCK == uev.type)
{
SDL_SetRelativeMouseMode(!!uev.code ? SDL_TRUE : SDL_FALSE);
}
}
break;
}
break;
}
}
while (bgfx::RenderFrame::NoContext != bgfx::renderFrame() ) {};
m_thread.shutdown();
SDL_DestroyWindow(m_window[0]);

View File

@@ -13,15 +13,17 @@ project ("example-common")
BGFX_DIR .. "3rdparty",
}
defines {
-- "ENTRY_CONFIG_USE_SDL=1",
}
files {
BGFX_DIR .. "examples/common/**.cpp",
BGFX_DIR .. "examples/common/**.h",
}
if _OPTIONS["with-sdl"] then
defines {
"ENTRY_CONFIG_USE_SDL=1",
}
end
configuration { "xcode4" }
includedirs {
BX_DIR .. "include/compat/osx",

View File

@@ -13,6 +13,11 @@ newoption {
description = "Enable building shared library.",
}
newoption {
trigger = "with-sdl",
description = "Enable SDL entry.",
}
solution "bgfx"
configurations {
"Debug",
@@ -71,6 +76,11 @@ function exampleProject(_name)
"example-common",
}
if _OPTIONS["with-sdl"] then
defines { "ENTRY_CONFIG_USE_SDL=1" }
links { "SDL2" }
end
configuration { "vs*" }
linkoptions {
"/ignore:4199", -- LNK4199: /DELAYLOAD:*.dll ignored; no imports found from *.dll
@@ -143,7 +153,6 @@ function exampleProject(_name)
links {
"Cocoa.framework",
"OpenGL.framework",
-- "SDL2",
}
configuration { "xcode4" }