Skip to content

Commit

Permalink
Squashed commit of the following: (#1248)
Browse files Browse the repository at this point in the history
commit bbfb934
Author: Rachael Alexanderson <madame-rachelle@users.noreply.github.com>
Date:   Sun Dec 6 23:50:15 2020 -0500

    - and now it builds! but ... does it run?

commit 67096c8
Author: Rachael Alexanderson <madame-rachelle@users.noreply.github.com>
Date:   Sun Dec 6 22:25:13 2020 -0500

    - one more step closer to compile

commit 5a0c84d
Author: Rachael Alexanderson <madame-rachelle@users.noreply.github.com>
Date:   Sun Dec 6 22:13:39 2020 -0500

    - set up dynamic opengl load for windows

commit 6ef8118
Author: Rachael Alexanderson <madame-rachelle@users.noreply.github.com>
Date:   Sat Dec 5 16:38:53 2020 -0500

    - allow compiling for win-arm64

commit 7d6f379
Author: Rachael Alexanderson <madame-rachelle@users.noreply.github.com>
Date:   Fri Dec 4 05:18:29 2020 -0500

    - allow targeting ARM64 on Windows

Co-authored-by: Rachael Alexanderson <madame-rachelle@users.noreply.github.com>
  • Loading branch information
madame-rachelle and madame-rachelle committed Dec 10, 2020
1 parent f223005 commit 64ff15b
Show file tree
Hide file tree
Showing 9 changed files with 98 additions and 19 deletions.
Binary file added bin/windows/zmusic/arm64/zmusic.dll
Binary file not shown.
Binary file added bin/windows/zmusic/arm64/zmusic.lib
Binary file not shown.
2 changes: 1 addition & 1 deletion cmake/TargetArch.cmake
Expand Up @@ -29,7 +29,7 @@
# "There are many more known variants/revisions that we do not handle/detect."

set(archdetect_c_code "
#if defined(__arm__) || defined(__TARGET_ARCH_ARM)
#if defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM64)
#if defined(__ARM_ARCH_7__) \\
|| defined(__ARM_ARCH_7A__) \\
|| defined(__ARM_ARCH_7R__) \\
Expand Down
15 changes: 13 additions & 2 deletions src/CMakeLists.txt
Expand Up @@ -20,13 +20,17 @@ else()
find_package( ZMusic REQUIRED )
endif()

message("Building for target architecture: ${ZDOOM_TARGET_ARCH}")

if( MSVC AND NOT ZMUSIC_FOUND )
# Use prebuilt library
set( ZMUSIC_ROOT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../bin/windows/zmusic" )
set( ZMUSIC_INCLUDE_DIR ${ZMUSIC_ROOT_PATH}/include )
set( ZMUSIC_LIBRARIES zmusic )
if( ${ZDOOM_TARGET_ARCH} MATCHES "x86_64" )
link_directories( ${ZMUSIC_ROOT_PATH}/64bit )
elseif( ${ZDOOM_TARGET_ARCH} MATCHES "arm" )
link_directories( ${ZMUSIC_ROOT_PATH}/arm64 )
else()
link_directories( ${ZMUSIC_ROOT_PATH}/32bit )
endif()
Expand Down Expand Up @@ -97,7 +101,6 @@ if( WIN32 )
endif()

set( ZDOOM_LIBS
opengl32
wsock32
winmm
"${DX_dinput8_LIBRARY}"
Expand Down Expand Up @@ -425,7 +428,6 @@ endif()
set( PLAT_WIN32_SOURCES
win32/i_steam.cpp
common/platform/win32/hardware.cpp
common/platform/win32/i_crash.cpp
common/platform/win32/i_input.cpp
common/platform/win32/i_keyboard.cpp
common/platform/win32/i_mouse.cpp
Expand All @@ -446,6 +448,15 @@ set( PLAT_WIN32_SOURCES
if (HAVE_VULKAN)
set (PLAT_WIN32_SOURCES ${PLAT_WIN32_SOURCES} common/platform/win32/win32vulkanvideo.cpp )
endif()

# todo: implement an actual crash catcher for ARM
# for now this is purely experimental
if (NOT ${ZDOOM_TARGET_ARCH} MATCHES "arm" )
set (PLAT_WIN32_SOURCES ${PLAT_WIN32_SOURCES} common/platform/win32/i_crash.cpp )
endif()
if (MSVC AND ${ZDOOM_TARGET_ARCH} MATCHES "arm")
add_definitions( -DNO_SSE -D__ARM__ -DRAPIDJSON_ENDIAN=RAPIDJSON_LITTLEENDIAN)
endif()

set( PLAT_POSIX_SOURCES
posix/i_steam.cpp
Expand Down
10 changes: 9 additions & 1 deletion src/common/engine/stats.h
Expand Up @@ -97,11 +97,13 @@ class cycle_t
#else

// Windows and macOS
#ifndef _M_ARM
#include "x86.h"
#endif

extern double PerfToSec, PerfToMillisec;

#ifdef _MSC_VER
#if defined(_MSC_VER) && !defined(_M_ARM64)
// Trying to include intrin.h here results in some bizarre errors, so I'm just
// going to duplicate the function prototype instead.
//#include <intrin.h>
Expand All @@ -111,6 +113,12 @@ inline unsigned __int64 rdtsc()
{
return __rdtsc();
}
#elif defined(_MSC_VER) && defined(_M_ARM64)
#include <intrin.h>
inline unsigned __int64 rdtsc()
{
return _ReadStatusReg(ARM64_SYSREG(0b11, 0b011, 0b1001, 0b1101, 0b000)); //_ReadStatusReg(PMCCNTR_EL0);
}
#elif defined __APPLE__ && (defined __i386__ || defined __x86_64__)
inline uint64_t rdtsc()
{
Expand Down
8 changes: 5 additions & 3 deletions src/common/platform/win32/gl_sysfb.cpp
Expand Up @@ -52,6 +52,8 @@

extern HWND Window;

extern "C" PROC zd_wglGetProcAddress(LPCSTR name);

PFNWGLSWAPINTERVALEXTPROC myWglSwapIntervalExtProc;

//==========================================================================
Expand All @@ -78,15 +80,15 @@ SystemGLFrameBuffer::SystemGLFrameBuffer(void *hMonitor, bool fullscreen) : Syst
HDC hDC = GetDC(Window);
const char *wglext = nullptr;

myWglSwapIntervalExtProc = (PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT");
auto myWglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB");
myWglSwapIntervalExtProc = (PFNWGLSWAPINTERVALEXTPROC)zd_wglGetProcAddress("wglSwapIntervalEXT");
auto myWglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)zd_wglGetProcAddress("wglGetExtensionsStringARB");
if (myWglGetExtensionsStringARB)
{
wglext = myWglGetExtensionsStringARB(hDC);
}
else
{
auto myWglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)wglGetProcAddress("wglGetExtensionsStringEXT");
auto myWglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)zd_wglGetProcAddress("wglGetExtensionsStringEXT");
if (myWglGetExtensionsStringEXT)
{
wglext = myWglGetExtensionsStringEXT();
Expand Down
10 changes: 10 additions & 0 deletions src/common/platform/win32/i_main.cpp
Expand Up @@ -1076,10 +1076,13 @@ void CALLBACK ExitFatally (ULONG_PTR dummy)
SetUnhandledExceptionFilter (ExitMessedUp);
I_ShutdownGraphics ();
RestoreConView ();
#ifndef _M_ARM64
DisplayCrashLog ();
#endif
exit(-1);
}

#ifndef _M_ARM64
//==========================================================================
//
// CatchAllExceptions
Expand Down Expand Up @@ -1132,6 +1135,7 @@ LONG WINAPI CatchAllExceptions (LPEXCEPTION_POINTERS info)
}
return EXCEPTION_CONTINUE_EXECUTION;
}
#endif // !_M_ARM64

//==========================================================================
//
Expand All @@ -1155,7 +1159,11 @@ static void infiniterecursion(int foo)
// which offers the very important feature to open a debugger and see the crash in context right away.
CUSTOM_CVAR(Bool, disablecrashlog, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
{
#ifndef _M_ARM64
SetUnhandledExceptionFilter(!*self ? CatchAllExceptions : nullptr);
#else
SetUnhandledExceptionFilter(nullptr);
#endif
}

//==========================================================================
Expand Down Expand Up @@ -1217,7 +1225,9 @@ int WINAPI wWinMain (HINSTANCE hInstance, HINSTANCE nothing, LPWSTR cmdline, int
#ifndef _DEBUG
if (MainThread != INVALID_HANDLE_VALUE)
{
#ifndef _M_ARM64
SetUnhandledExceptionFilter (CatchAllExceptions);
#endif

#ifdef _M_X64
static bool setJumpResult = false;
Expand Down
29 changes: 18 additions & 11 deletions src/common/platform/win32/win32glvideo.cpp
Expand Up @@ -55,6 +55,13 @@

#include "gl_framebuffer.h"

extern "C" {
HGLRC zd_wglCreateContext(HDC Arg1);
BOOL zd_wglDeleteContext(HGLRC Arg1);
BOOL zd_wglMakeCurrent(HDC Arg1, HGLRC Arg2);
PROC zd_wglGetProcAddress(LPCSTR name);
}

EXTERN_CVAR(Int, vid_adapter)
EXTERN_CVAR(Bool, vid_hdr)

Expand All @@ -74,7 +81,7 @@ CUSTOM_CVAR(Bool, vr_enable_quadbuffered, false, CVAR_ARCHIVE | CVAR_GLOBALCONFI
extern bool vid_hdr_active;

// these get used before GLEW is initialized so we have to use separate pointers with different names
PFNWGLCHOOSEPIXELFORMATARBPROC myWglChoosePixelFormatARB; // = (PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB");
PFNWGLCHOOSEPIXELFORMATARBPROC myWglChoosePixelFormatARB; // = (PFNWGLCHOOSEPIXELFORMATARBPROC)zd_wglGetProcAddress("wglChoosePixelFormatARB");
PFNWGLCREATECONTEXTATTRIBSARBPROC myWglCreateContextAttribsARB;


Expand Down Expand Up @@ -224,15 +231,15 @@ bool Win32GLVideo::SetPixelFormat()

::SetPixelFormat(hDC, pixelFormat, &pfd);

hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
hRC = zd_wglCreateContext(hDC);
zd_wglMakeCurrent(hDC, hRC);

myWglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB");
myWglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress("wglCreateContextAttribsARB");
myWglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)zd_wglGetProcAddress("wglChoosePixelFormatARB");
myWglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)zd_wglGetProcAddress("wglCreateContextAttribsARB");
// any extra stuff here?

wglMakeCurrent(NULL, NULL);
wglDeleteContext(hRC);
zd_wglMakeCurrent(NULL, NULL);
zd_wglDeleteContext(hRC);
ReleaseDC(dummy, hDC);
ShutdownDummy(dummy);

Expand Down Expand Up @@ -436,7 +443,7 @@ bool Win32GLVideo::InitHardware(HWND Window, int multisample)

if (m_hRC == NULL && prof == WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB)
{
m_hRC = wglCreateContext(m_hDC);
m_hRC = zd_wglCreateContext(m_hDC);
if (m_hRC == NULL)
{
I_Error("R_OPENGL: Unable to create an OpenGL render context.\n");
Expand All @@ -446,7 +453,7 @@ bool Win32GLVideo::InitHardware(HWND Window, int multisample)

if (m_hRC != NULL)
{
wglMakeCurrent(m_hDC, m_hRC);
zd_wglMakeCurrent(m_hDC, m_hRC);
return true;
}
}
Expand All @@ -465,8 +472,8 @@ void Win32GLVideo::Shutdown()
{
if (m_hRC)
{
wglMakeCurrent(0, 0);
wglDeleteContext(m_hRC);
zd_wglMakeCurrent(0, 0);
zd_wglDeleteContext(m_hRC);
}
if (m_hDC) ReleaseDC(m_Window, m_hDC);
}
Expand Down
43 changes: 42 additions & 1 deletion src/common/rendering/gl_load/gl_load.c
Expand Up @@ -67,10 +67,51 @@ static int TestPointer(const PROC pTest)
return 1;
}

static HMODULE opengl32dll;
static HGLRC(WINAPI* createcontext)(HDC);
static BOOL(WINAPI* deletecontext)(HGLRC);
static BOOL(WINAPI* makecurrent)(HDC, HGLRC);
static PROC(WINAPI* getprocaddress)(LPCSTR name);
static void CheckOpenGL(void)
{
if (opengl32dll == 0)
{
opengl32dll = LoadLibrary(L"OpenGL32.DLL");
createcontext = (HGLRC(WINAPI*)(HDC)) GetProcAddress(opengl32dll, "wglCreateContext");
deletecontext = (BOOL(WINAPI*)(HGLRC)) GetProcAddress(opengl32dll, "wglDeleteContext");
makecurrent = (BOOL(WINAPI*)(HDC, HGLRC)) GetProcAddress(opengl32dll, "wglMakeCurrent");
getprocaddress = (PROC(WINAPI*)(LPCSTR)) GetProcAddress(opengl32dll, "wglGetProcAddress");
}
}

HGLRC zd_wglCreateContext(HDC dc)
{
CheckOpenGL();
return createcontext(dc);
}

BOOL zd_wglDeleteContext(HGLRC context)
{
CheckOpenGL();
return deletecontext(context);
}

BOOL zd_wglMakeCurrent(HDC dc, HGLRC context)
{
CheckOpenGL();
return makecurrent(dc, context);
}

PROC zd_wglGetProcAddress(LPCSTR name)
{
CheckOpenGL();
return getprocaddress(name);
}

static PROC WinGetProcAddress(const char *name)
{
HMODULE glMod = NULL;
PROC pFunc = wglGetProcAddress((LPCSTR)name);
PROC pFunc = zd_wglGetProcAddress((LPCSTR)name);
if(TestPointer(pFunc))
{
return pFunc;
Expand Down

0 comments on commit 64ff15b

Please sign in to comment.