- moved around a few bits of code to get rid of winbits.cpp/h.

This commit is contained in:
Christoph Oelckers 2019-12-22 18:53:58 +01:00
parent 3914eb5f85
commit 773be7db26
7 changed files with 153 additions and 187 deletions

View file

@ -474,7 +474,6 @@ endif()
# Start defining source files for Demolition # Start defining source files for Demolition
set( PLAT_WIN32_SOURCES set( PLAT_WIN32_SOURCES
glad/src/glad_wgl.c glad/src/glad_wgl.c
platform/win32/winbits.cpp
platform/win32/i_specialpaths.cpp platform/win32/i_specialpaths.cpp
platform/win32/startwin.game.cpp platform/win32/startwin.game.cpp

View file

@ -75,7 +75,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#ifdef _WIN32 #ifdef _WIN32
# include <shellapi.h> # include <shellapi.h>
# define UPDATEINTERVAL 604800 // 1w # define UPDATEINTERVAL 604800 // 1w
# include "win32/winbits.h"
#else #else
# ifndef GEKKO # ifndef GEKKO
# include <sys/ioctl.h> # include <sys/ioctl.h>

View file

@ -59,10 +59,10 @@
# include "osxbits.h" # include "osxbits.h"
# include <mach/mach.h> # include <mach/mach.h>
# include <mach/mach_time.h> # include <mach/mach_time.h>
#elif defined _WIN32
# include "win32/winbits.h"
#endif #endif
FString progdir;
CVAR(Int, r_displayindex, 0, CVAR_ARCHIVE | CVAR_VIDEOCONFIG) CVAR(Int, r_displayindex, 0, CVAR_ARCHIVE | CVAR_VIDEOCONFIG)
CVAR(Int, r_borderless, 2, CVAR_ARCHIVE | CVAR_VIDEOCONFIG) CVAR(Int, r_borderless, 2, CVAR_ARCHIVE | CVAR_VIDEOCONFIG)
CVAR(Int, maxrefreshfreq, 0, CVAR_ARCHIVE | CVAR_VIDEOCONFIG) CVAR(Int, maxrefreshfreq, 0, CVAR_ARCHIVE | CVAR_VIDEOCONFIG)
@ -156,6 +156,71 @@ uint16_t joydead[9], joysatur[9];
#define MAX_ERRORTEXT 4096 #define MAX_ERRORTEXT 4096
//==========================================================================
//
// CalculateCPUSpeed
//
// Make a decent guess at how much time elapses between TSC steps. This can
// vary over runtime depending on power management settings, so should not
// be used anywhere that truely accurate timing actually matters.
//
//==========================================================================
double PerfToSec, PerfToMillisec;
#include "stats.h"
static void CalculateCPUSpeed()
{
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
if (freq.QuadPart != 0)
{
LARGE_INTEGER count1, count2;
cycle_t ClockCalibration;
DWORD min_diff;
ClockCalibration.Reset();
// Count cycles for at least 55 milliseconds.
// The performance counter may be very low resolution compared to CPU
// speeds today, so the longer we count, the more accurate our estimate.
// On the other hand, we don't want to count too long, because we don't
// want the user to notice us spend time here, since most users will
// probably never use the performance statistics.
min_diff = freq.LowPart * 11 / 200;
// Minimize the chance of task switching during the testing by going very
// high priority. This is another reason to avoid timing for too long.
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
// Make sure we start timing on a counter boundary.
QueryPerformanceCounter(&count1);
do
{
QueryPerformanceCounter(&count2);
} while (count1.QuadPart == count2.QuadPart);
// Do the timing loop.
ClockCalibration.Clock();
do
{
QueryPerformanceCounter(&count1);
} while ((count1.QuadPart - count2.QuadPart) < min_diff);
ClockCalibration.Unclock();
SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
PerfToSec = double(count1.QuadPart - count2.QuadPart) / (double(ClockCalibration.GetRawCounter()) * freq.QuadPart);
PerfToMillisec = PerfToSec * 1000.0;
}
}
//========================================================================== //==========================================================================
// //
@ -362,6 +427,91 @@ void wm_setapptitle(const char *name)
#endif #endif
} }
//==========================================================================
//
// win_buildargs
//
// This should be removed once everything can use the FArgs list.
//
//==========================================================================
int32_t win_buildargs(char** argvbuf)
{
int32_t buildargc = 0;
FString cmdline_utf8 = FString(GetCommandLineW());
*argvbuf = Xstrdup(cmdline_utf8.GetChars());
if (*argvbuf)
{
char quoted = 0, instring = 0, swallownext = 0;
char* wp;
for (const char* p = wp = *argvbuf; *p; p++)
{
if (*p == ' ')
{
if (instring)
{
if (!quoted)
{
// end of a string
*(wp++) = 0;
instring = 0;
}
else
*(wp++) = *p;
}
}
else if (*p == '"' && !swallownext)
{
if (instring)
{
if (quoted && p[1] == ' ')
{
// end of a string
*(wp++) = 0;
instring = 0;
}
quoted = !quoted;
}
else
{
instring = 1;
quoted = 1;
buildargc++;
}
}
else if (*p == '\\' && p[1] == '"' && !swallownext)
swallownext = 1;
else
{
if (!instring)
buildargc++;
instring = 1;
*(wp++) = *p;
swallownext = 0;
}
}
*wp = 0;
}
// Figure out what directory the program resides in.
wchar_t buffer[256];
GetModuleFileNameW(0, buffer, 256);
progdir = buffer;
progdir.Substitute("\\", "/");
auto lastsep = progdir.LastIndexOf('/');
if (lastsep != -1)
progdir.Truncate(lastsep + 1);
return buildargc;
}
// //
// //
// --------------------------------------- // ---------------------------------------
@ -449,6 +599,7 @@ int main(int argc, char *argv[])
#ifndef _WIN32 #ifndef _WIN32
setenv("__GL_THREADED_OPTIMIZATIONS", "1", 0); setenv("__GL_THREADED_OPTIMIZATIONS", "1", 0);
#endif #endif
CalculateCPUSpeed();
buildkeytranslationtable(); buildkeytranslationtable();

View file

@ -65,7 +65,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#ifdef _WIN32 #ifdef _WIN32
# include <shellapi.h> # include <shellapi.h>
# define UPDATEINTERVAL 604800 // 1w # define UPDATEINTERVAL 604800 // 1w
# include "win32/winbits.h"
#else #else
# ifndef GEKKO # ifndef GEKKO
# include <sys/ioctl.h> # include <sys/ioctl.h>

View file

@ -1,173 +0,0 @@
// Windows layer-independent code
#define NOMINMAX
#include <Windows.h>
#include "compat.h"
#include "build.h"
#include "baselayer.h"
#include "osd.h"
#include "zstring.h"
#include "winbits.h"
FString progdir;
//
// CheckWinVersion() -- check to see what version of Windows we happen to be running under (stripped down to what is actually still supported.)
//
//==========================================================================
//
// win_buildargs
//
// This should be removed once everything can use the FArgs list.
//
//==========================================================================
int32_t win_buildargs(char **argvbuf)
{
int32_t buildargc = 0;
FString cmdline_utf8 = FString(GetCommandLineW());
*argvbuf = Xstrdup(cmdline_utf8.GetChars());
if (*argvbuf)
{
char quoted = 0, instring = 0, swallownext = 0;
char *wp;
for (const char *p = wp = *argvbuf; *p; p++)
{
if (*p == ' ')
{
if (instring)
{
if (!quoted)
{
// end of a string
*(wp++) = 0;
instring = 0;
}
else
*(wp++) = *p;
}
}
else if (*p == '"' && !swallownext)
{
if (instring)
{
if (quoted && p[1] == ' ')
{
// end of a string
*(wp++) = 0;
instring = 0;
}
quoted = !quoted;
}
else
{
instring = 1;
quoted = 1;
buildargc++;
}
}
else if (*p == '\\' && p[1] == '"' && !swallownext)
swallownext = 1;
else
{
if (!instring)
buildargc++;
instring = 1;
*(wp++) = *p;
swallownext = 0;
}
}
*wp = 0;
}
// Figure out what directory the program resides in.
wchar_t buffer[256];
GetModuleFileNameW(0, buffer, 256);
progdir = buffer;
progdir.Substitute("\\", "/");
auto lastsep = progdir.LastIndexOf('/');
if (lastsep != -1)
progdir.Truncate(lastsep + 1);
return buildargc;
}
//==========================================================================
//
// CalculateCPUSpeed
//
// Make a decent guess at how much time elapses between TSC steps. This can
// vary over runtime depending on power management settings, so should not
// be used anywhere that truely accurate timing actually matters.
//
//==========================================================================
double PerfToSec, PerfToMillisec;
#include "stats.h"
static void CalculateCPUSpeed()
{
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
if (freq.QuadPart != 0)
{
LARGE_INTEGER count1, count2;
cycle_t ClockCalibration;
DWORD min_diff;
ClockCalibration.Reset();
// Count cycles for at least 55 milliseconds.
// The performance counter may be very low resolution compared to CPU
// speeds today, so the longer we count, the more accurate our estimate.
// On the other hand, we don't want to count too long, because we don't
// want the user to notice us spend time here, since most users will
// probably never use the performance statistics.
min_diff = freq.LowPart * 11 / 200;
// Minimize the chance of task switching during the testing by going very
// high priority. This is another reason to avoid timing for too long.
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
// Make sure we start timing on a counter boundary.
QueryPerformanceCounter(&count1);
do
{
QueryPerformanceCounter(&count2);
} while (count1.QuadPart == count2.QuadPart);
// Do the timing loop.
ClockCalibration.Clock();
do
{
QueryPerformanceCounter(&count1);
} while ((count1.QuadPart - count2.QuadPart) < min_diff);
ClockCalibration.Unclock();
SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
PerfToSec = double(count1.QuadPart - count2.QuadPart) / (double(ClockCalibration.GetRawCounter()) * freq.QuadPart);
PerfToMillisec = PerfToSec * 1000.0;
}
}
class Initer
{
public:
Initer() { CalculateCPUSpeed(); }
};
static Initer initer;

View file

@ -1,8 +0,0 @@
// Windows layer-independent code
#include "compat.h"
# define WindowClass "Demolition"
extern void win_init(void);
extern int32_t win_buildargs(char **argvbuf);

View file

@ -64,7 +64,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#ifdef _WIN32 #ifdef _WIN32
# include <shellapi.h> # include <shellapi.h>
# define UPDATEINTERVAL 604800 // 1w # define UPDATEINTERVAL 604800 // 1w
# include "win32/winbits.h"
#else #else
# ifndef GEKKO # ifndef GEKKO
# include <sys/ioctl.h> # include <sys/ioctl.h>