Get rid of SDL in more parts of native OS X backend

This commit is contained in:
alexey.lysiuk 2014-12-14 13:20:39 +02:00
parent 8d16c2e3c0
commit 9d135a0586
7 changed files with 238 additions and 89 deletions

View file

@ -549,18 +549,17 @@ set( PLAT_SDL_SOURCES
sdl/crashcatcher.c sdl/crashcatcher.c
sdl/hardware.cpp sdl/hardware.cpp
sdl/i_cd.cpp sdl/i_cd.cpp
sdl/i_main.cpp
sdl/i_movie.cpp
sdl/i_system.cpp
sdl/sdlvideo.cpp
sdl/st_start.cpp
sdl/i_gui.cpp sdl/i_gui.cpp
sdl/i_input.cpp sdl/i_input.cpp
sdl/i_joystick.cpp sdl/i_joystick.cpp
sdl/i_timer.cpp ) sdl/i_main.cpp
sdl/i_movie.cpp
sdl/i_system.cpp
sdl/i_timer.cpp
sdl/sdlvideo.cpp
sdl/st_start.cpp )
set( PLAT_MAC_SOURCES set( PLAT_MAC_SOURCES
cocoa/iwadpicker_cocoa.mm cocoa/iwadpicker_cocoa.mm )
cocoa/i_system_cocoa.mm )
set( PLAT_COCOA_SOURCES set( PLAT_COCOA_SOURCES
cocoa/hid/HID_Config_Utilities.c cocoa/hid/HID_Config_Utilities.c
cocoa/hid/HID_Error_Handler.c cocoa/hid/HID_Error_Handler.c
@ -575,8 +574,9 @@ set( PLAT_COCOA_SOURCES
cocoa/i_cd.cpp cocoa/i_cd.cpp
cocoa/i_joystick.cpp cocoa/i_joystick.cpp
cocoa/i_movie.cpp cocoa/i_movie.cpp
cocoa/st_start.cpp cocoa/i_system.cpp
cocoa/i_timer.cpp cocoa/i_timer.cpp
cocoa/st_start.cpp
cocoa/zdoom.icns ) cocoa/zdoom.icns )
if( WIN32 ) if( WIN32 )
@ -601,6 +601,7 @@ elseif( APPLE )
else( OSX_COCOA_BACKEND ) else( OSX_COCOA_BACKEND )
set( SYSTEM_SOURCES_DIR sdl ) set( SYSTEM_SOURCES_DIR sdl )
set( SYSTEM_SOURCES ${PLAT_SDL_SOURCES} ) set( SYSTEM_SOURCES ${PLAT_SDL_SOURCES} )
set( PLAT_MAC_SOURCES ${PLAT_MAC_SOURCES} cocoa/i_system_cocoa.mm )
set( OTHER_SYSTEM_SOURCES ${PLAT_WIN32_SOURCES} ${PLAT_COCOA_SOURCES} ) set( OTHER_SYSTEM_SOURCES ${PLAT_WIN32_SOURCES} ${PLAT_COCOA_SOURCES} )
endif( OSX_COCOA_BACKEND ) endif( OSX_COCOA_BACKEND )

View file

@ -56,15 +56,19 @@
#include "cmdlib.h" #include "cmdlib.h"
#include "d_event.h" #include "d_event.h"
#include "d_gui.h" #include "d_gui.h"
#include "d_main.h"
#include "dikeys.h" #include "dikeys.h"
#include "doomdef.h" #include "doomdef.h"
#include "doomerrors.h"
#include "doomstat.h" #include "doomstat.h"
#include "m_argv.h"
#include "s_sound.h" #include "s_sound.h"
#include "textures.h" #include "textures.h"
#include "v_video.h" #include "v_video.h"
#include "version.h" #include "version.h"
#include "i_rbopts.h" #include "i_rbopts.h"
#include "i_osversion.h" #include "i_osversion.h"
#include "i_system.h"
#undef Class #undef Class
@ -190,8 +194,12 @@ typedef NSInteger NSApplicationActivationPolicy;
RenderBufferOptions rbOpts; RenderBufferOptions rbOpts;
EXTERN_CVAR(Bool, fullscreen) EXTERN_CVAR(Bool, fullscreen )
EXTERN_CVAR(Bool, vid_hidpi) EXTERN_CVAR(Bool, vid_hidpi )
EXTERN_CVAR(Bool, vid_vsync )
EXTERN_CVAR(Int, vid_adapter )
EXTERN_CVAR(Int, vid_defwidth )
EXTERN_CVAR(Int, vid_defheight)
CVAR(Bool, use_mouse, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Bool, use_mouse, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Bool, m_noprescale, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Bool, m_noprescale, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
@ -217,9 +225,90 @@ extern constate_e ConsoleState;
EXTERN_CVAR(Int, m_use_mouse); EXTERN_CVAR(Int, m_use_mouse);
void I_StartupJoysticks();
void I_ShutdownJoysticks(); void I_ShutdownJoysticks();
// ---------------------------------------------------------------------------
DArgs *Args; // command line arguments
namespace
{
// The maximum number of functions that can be registered with atterm.
static const size_t MAX_TERMS = 64;
static void (*TermFuncs[MAX_TERMS])();
static const char *TermNames[MAX_TERMS];
static size_t NumTerms;
void call_terms()
{
while (NumTerms > 0)
{
TermFuncs[--NumTerms]();
}
}
} // unnamed namespace
void addterm(void (*func)(), const char *name)
{
// Make sure this function wasn't already registered.
for (size_t i = 0; i < NumTerms; ++i)
{
if (TermFuncs[i] == func)
{
return;
}
}
if (NumTerms == MAX_TERMS)
{
func();
I_FatalError("Too many exit functions registered.");
}
TermNames[NumTerms] = name;
TermFuncs[NumTerms] = func;
++NumTerms;
}
void popterm()
{
if (NumTerms)
{
--NumTerms;
}
}
void I_SetMainWindowVisible(bool);
void Mac_I_FatalError(const char* const message)
{
I_SetMainWindowVisible(false);
const CFStringRef errorString = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault,
message, kCFStringEncodingASCII, kCFAllocatorNull);
if (NULL != errorString)
{
CFOptionFlags dummy;
CFUserNotificationDisplayAlert( 0, kCFUserNotificationStopAlertLevel, NULL, NULL, NULL,
CFSTR("Fatal Error"), errorString, CFSTR("Exit"), NULL, NULL, &dummy);
CFRelease(errorString);
}
}
namespace namespace
{ {
@ -241,6 +330,112 @@ size_t s_skipMouseMoves;
NSCursor* s_cursor; NSCursor* s_cursor;
void NewFailure()
{
I_FatalError("Failed to allocate memory from system heap");
}
int OriginalMain(int argc, char** argv)
{
printf(GAMENAME" %s - %s - Cocoa version\nCompiled on %s\n",
GetVersionString(), GetGitTime(), __DATE__);
seteuid(getuid());
std::set_new_handler(NewFailure);
// Set LC_NUMERIC environment variable in case some library decides to
// clear the setlocale call at least this will be correct.
// Note that the LANG environment variable is overridden by LC_*
setenv("LC_NUMERIC", "C", 1);
setlocale(LC_ALL, "C");
if (SDL_Init (SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_NOPARACHUTE|SDL_INIT_JOYSTICK) == -1)
{
fprintf (stderr, "Could not initialize SDL:\n%s\n", SDL_GetError());
return -1;
}
atterm(SDL_Quit);
printf("\n");
SDL_DisplayMode videoInfo = {};
if (0 == SDL_GetDesktopDisplayMode(vid_adapter, &videoInfo))
{
vid_defwidth = videoInfo.w;
vid_defheight = videoInfo.h;
vid_vsync = true;
fullscreen = true;
}
try
{
Args = new DArgs(argc, argv);
/*
killough 1/98:
This fixes some problems with exit handling
during abnormal situations.
The old code called I_Quit() to end program,
while now I_Quit() is installed as an exit
handler and exit() is called to exit, either
normally or abnormally. Seg faults are caught
and the error handler is used, to prevent
being left in graphics mode or having very
loud SFX noise because the sound card is
left in an unstable state.
*/
atexit (call_terms);
atterm (I_Quit);
// Should we even be doing anything with progdir on Unix systems?
char program[PATH_MAX];
if (realpath (argv[0], program) == NULL)
strcpy (program, argv[0]);
char *slash = strrchr (program, '/');
if (slash != NULL)
{
*(slash + 1) = '\0';
progdir = program;
}
else
{
progdir = "./";
}
I_StartupJoysticks();
C_InitConsole(80 * 8, 25 * 8, false);
D_DoomMain();
}
catch(const CDoomError& error)
{
const char* const message = error.GetMessage();
if (NULL != message)
{
fprintf(stderr, "%s\n", message);
Mac_I_FatalError(message);
}
exit(-1);
}
catch(...)
{
call_terms();
throw;
}
return 0;
}
// ---------------------------------------------------------------------------
void CheckGUICapture() void CheckGUICapture()
{ {
const bool wantCapture = (MENU_Off == menuactive) const bool wantCapture = (MENU_Off == menuactive)
@ -1131,7 +1326,7 @@ static bool s_fullscreenNewAPI;
[[NSRunLoop currentRunLoop] addTimer:timer [[NSRunLoop currentRunLoop] addTimer:timer
forMode:NSDefaultRunLoopMode]; forMode:NSDefaultRunLoopMode];
exit(SDL_main(s_argc, s_argv)); exit(OriginalMain(s_argc, s_argv));
} }
@ -1613,33 +1808,9 @@ bool I_SetCursor(FTexture* cursorpic)
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
const char* I_GetBackEndName()
{
return "Native Cocoa";
}
// ---------------------------------------------------------------------------
extern "C" extern "C"
{ {
static timeval s_startTicks;
uint32_t SDL_GetTicks()
{
timeval now;
gettimeofday(&now, NULL);
const uint32_t ticks =
(now.tv_sec - s_startTicks.tv_sec ) * 1000
+ (now.tv_usec - s_startTicks.tv_usec) / 1000;
return ticks;
}
int SDL_Init(Uint32 flags) int SDL_Init(Uint32 flags)
{ {
ZD_UNUSED(flags); ZD_UNUSED(flags);
@ -1667,11 +1838,6 @@ const char* SDL_GetError()
} }
const char* SDL_GetCurrentVideoDriver()
{
return "Native OpenGL";
}
int SDL_GetDesktopDisplayMode(int displayIndex, SDL_DisplayMode *mode) int SDL_GetDesktopDisplayMode(int displayIndex, SDL_DisplayMode *mode)
{ {
// NOTE: Only required fields are assigned // NOTE: Only required fields are assigned
@ -2099,8 +2265,6 @@ const DarwinVersion darwinVersion = GetDarwinVersion();
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
gettimeofday(&s_startTicks, NULL);
for (int i = 0; i <= argc; ++i) for (int i = 0; i <= argc; ++i)
{ {
const char* const argument = argv[i]; const char* const argument = argv[i];

1
src/cocoa/i_system.cpp Symbolic link
View file

@ -0,0 +1 @@
../sdl/i_system.cpp

View file

@ -4,8 +4,6 @@
#include <pthread.h> #include <pthread.h>
#include <libkern/OSAtomic.h> #include <libkern/OSAtomic.h>
#include <SDL.h>
#include "basictypes.h" #include "basictypes.h"
#include "basicinlines.h" #include "basicinlines.h"
#include "doomdef.h" #include "doomdef.h"
@ -13,23 +11,36 @@
#include "templates.h" #include "templates.h"
static timeval s_startTicks;
unsigned int I_MSTime() unsigned int I_MSTime()
{ {
return SDL_GetTicks(); timeval now;
gettimeofday(&now, NULL);
const uint32_t ticks =
(now.tv_sec - s_startTicks.tv_sec ) * 1000
+ (now.tv_usec - s_startTicks.tv_usec) / 1000;
return ticks;
} }
unsigned int I_FPSTime() unsigned int I_FPSTime()
{ {
return SDL_GetTicks(); timeval now;
gettimeofday(&now, NULL);
return static_cast<unsigned int>(
(now.tv_sec) * 1000 + (now.tv_usec) / 1000);
} }
bool g_isTicFrozen;
namespace namespace
{ {
bool s_isTicFrozen;
timespec GetNextTickTime() timespec GetNextTickTime()
{ {
static const long MILLISECONDS_IN_SECOND = 1000; static const long MILLISECONDS_IN_SECOND = 1000;
@ -91,7 +102,7 @@ void* TimerThreadFunc(void*)
pthread_mutex_lock(&s_timerMutex); pthread_mutex_lock(&s_timerMutex);
pthread_cond_timedwait(&s_timerEvent, &s_timerMutex, &timeToNextTick); pthread_cond_timedwait(&s_timerEvent, &s_timerMutex, &timeToNextTick);
if (!g_isTicFrozen) if (!s_isTicFrozen)
{ {
// The following GCC/Clang intrinsic can be used instead of OS X specific function: // The following GCC/Clang intrinsic can be used instead of OS X specific function:
// __sync_add_and_fetch(&s_tics, 1); // __sync_add_and_fetch(&s_tics, 1);
@ -101,7 +112,7 @@ void* TimerThreadFunc(void*)
OSAtomicIncrement32(&s_tics); OSAtomicIncrement32(&s_tics);
} }
s_timerStart = SDL_GetTicks(); s_timerStart = I_MSTime();
pthread_cond_broadcast(&s_timerEvent); pthread_cond_broadcast(&s_timerEvent);
pthread_mutex_unlock(&s_timerMutex); pthread_mutex_unlock(&s_timerMutex);
@ -122,7 +133,7 @@ int GetTimeThreaded(bool saveMS)
int WaitForTicThreaded(int prevTic) int WaitForTicThreaded(int prevTic)
{ {
assert(!g_isTicFrozen); assert(!s_isTicFrozen);
while (s_tics <= prevTic) while (s_tics <= prevTic)
{ {
@ -136,7 +147,7 @@ int WaitForTicThreaded(int prevTic)
void FreezeTimeThreaded(bool frozen) void FreezeTimeThreaded(bool frozen)
{ {
g_isTicFrozen = frozen; s_isTicFrozen = frozen;
} }
} // unnamed namespace } // unnamed namespace
@ -144,7 +155,7 @@ void FreezeTimeThreaded(bool frozen)
fixed_t I_GetTimeFrac(uint32* ms) fixed_t I_GetTimeFrac(uint32* ms)
{ {
const uint32_t now = SDL_GetTicks(); const uint32_t now = I_MSTime();
if (NULL != ms) if (NULL != ms)
{ {
@ -157,11 +168,13 @@ fixed_t I_GetTimeFrac(uint32* ms)
} }
void I_InitTimer () void I_InitTimer()
{ {
assert(!s_timerInitialized); assert(!s_timerInitialized);
s_timerInitialized = true; s_timerInitialized = true;
gettimeofday(&s_startTicks, NULL);
pthread_cond_init (&s_timerEvent, NULL); pthread_cond_init (&s_timerEvent, NULL);
pthread_mutex_init(&s_timerMutex, NULL); pthread_mutex_init(&s_timerMutex, NULL);
@ -172,7 +185,7 @@ void I_InitTimer ()
I_FreezeTime = FreezeTimeThreaded; I_FreezeTime = FreezeTimeThreaded;
} }
void I_ShutdownTimer () void I_ShutdownTimer()
{ {
if (!s_timerInitialized) if (!s_timerInitialized)
{ {

View file

@ -59,8 +59,3 @@ void I_SetMainWindowVisible(bool visible)
{ {
} }
const char* I_GetBackEndName()
{
return "SDL";
}

View file

@ -235,13 +235,7 @@ static void unprotect_rtext()
void I_StartupJoysticks(); void I_StartupJoysticks();
void I_ShutdownJoysticks(); void I_ShutdownJoysticks();
const char* I_GetBackEndName();
#ifdef USE_NATIVE_COCOA
int SDL_main (int argc, char **argv)
#else
int main (int argc, char **argv) int main (int argc, char **argv)
#endif
{ {
#if !defined (__APPLE__) #if !defined (__APPLE__)
{ {
@ -250,8 +244,8 @@ int main (int argc, char **argv)
} }
#endif // !__APPLE__ #endif // !__APPLE__
printf(GAMENAME" %s - %s - %s version\nCompiled on %s\n", printf(GAMENAME" %s - %s - SDL version\nCompiled on %s\n",
GetVersionString(), GetGitTime(), I_GetBackEndName(), __DATE__); GetVersionString(), GetGitTime(), __DATE__);
seteuid (getuid ()); seteuid (getuid ());
std::set_new_handler (NewFailure); std::set_new_handler (NewFailure);
@ -281,24 +275,6 @@ int main (int argc, char **argv)
printf("Using video driver %s\n", SDL_GetCurrentVideoDriver()); printf("Using video driver %s\n", SDL_GetCurrentVideoDriver());
printf("\n"); printf("\n");
#ifdef __APPLE__
EXTERN_CVAR( Int, vid_adapter )
SDL_DisplayMode videoInfo = {};
if ( SDL_GetDesktopDisplayMode (vid_adapter, &videoInfo) == 0 )
{
EXTERN_CVAR( Int, vid_defwidth )
EXTERN_CVAR( Int, vid_defheight )
EXTERN_CVAR( Int, vid_defbits )
EXTERN_CVAR( Bool, vid_vsync )
EXTERN_CVAR( Bool, fullscreen )
vid_defwidth = videoInfo.w;
vid_defheight = videoInfo.h;
vid_vsync = true;
fullscreen = true;
}
#endif // __APPLE__
try try
{ {
Args = new DArgs(argc, argv); Args = new DArgs(argc, argv);

View file

@ -41,7 +41,6 @@
#include "doomerrors.h" #include "doomerrors.h"
#include <math.h> #include <math.h>
#include "SDL.h"
#include "doomtype.h" #include "doomtype.h"
#include "doomstat.h" #include "doomstat.h"
#include "version.h" #include "version.h"