win32: detect platform. SDL support

This commit is contained in:
flyinghead 2019-12-22 23:49:52 +01:00
parent 424a02cdf3
commit 3415ce5577
6 changed files with 69 additions and 16 deletions

View File

@ -3,6 +3,9 @@
#include "oslib.h"
#include <initguid.h>
#include <dsound.h>
#ifdef USE_SDL
#include "sdl/sdl.h"
#endif
#define verifyc(x) verify(!FAILED(x))
@ -18,7 +21,11 @@ static void directsound_init()
{
verifyc(DirectSoundCreate8(NULL,&dsound,NULL));
#ifdef USE_SDL
verifyc(dsound->SetCooperativeLevel(sdl_get_native_hwnd(), DSSCL_PRIORITY));
#else
verifyc(dsound->SetCooperativeLevel((HWND)libPvr_GetRenderTarget(), DSSCL_PRIORITY));
#endif
IDirectSoundBuffer* buffer_;
WAVEFORMATEX wfx;

View File

@ -669,7 +669,13 @@ bool VulkanContext::Init()
{
std::vector<const char *> extensions;
extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
#if defined(_WIN32)
#if defined(USE_SDL)
sdl_recreate_window(SDL_WINDOW_VULKAN);
uint32_t extensionsCount = 0;
SDL_Vulkan_GetInstanceExtensions((SDL_Window *)window, &extensionsCount, NULL);
extensions.resize(extensionsCount + 1);
SDL_Vulkan_GetInstanceExtensions((SDL_Window *)window, &extensionsCount, &extensions[1]);
#elif defined(_WIN32)
os_CreateWindow();
extensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
#elif defined(__MACH__)
@ -678,17 +684,15 @@ bool VulkanContext::Init()
extensions.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
#elif defined(__ANDROID__)
extensions.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
#elif defined(USE_SDL)
sdl_recreate_window(SDL_WINDOW_VULKAN);
uint32_t extensionsCount = 0;
SDL_Vulkan_GetInstanceExtensions((SDL_Window *)window, &extensionsCount, NULL);
extensions.resize(extensionsCount + 1);
SDL_Vulkan_GetInstanceExtensions((SDL_Window *)window, &extensionsCount, &extensions[1]);
#endif
if (!InitInstance(&extensions[0], extensions.size()))
return false;
#if defined(_WIN32)
#if defined(USE_SDL)
VkSurfaceKHR surface;
if (SDL_Vulkan_CreateSurface((SDL_Window *)window, *instance, (VkSurfaceKHR *)&this->surface) == 0)
return false;
#elif defined(_WIN32)
vk::Win32SurfaceCreateInfoKHR createInfo(vk::Win32SurfaceCreateFlagsKHR(), GetModuleHandle(NULL), (HWND)window);
surface = instance->createWin32SurfaceKHRUnique(createInfo);
#elif defined(SUPPORT_X11)
@ -697,10 +701,6 @@ bool VulkanContext::Init()
#elif defined(__ANDROID__)
vk::AndroidSurfaceCreateInfoKHR createInfo(vk::AndroidSurfaceCreateFlagsKHR(), (struct ANativeWindow*)window);
surface = instance->createAndroidSurfaceKHRUnique(createInfo);
#elif defined(USE_SDL)
VkSurfaceKHR surface;
if (SDL_Vulkan_CreateSurface((SDL_Window *)window, *instance, (VkSurfaceKHR *)&this->surface) == 0)
return false;
#endif
return InitDevice();

View File

@ -4,6 +4,7 @@
#include "cfg/cfg.h"
#include "linux-dist/main.h"
#include "sdl/sdl.h"
#include <SDL2/SDL_syswm.h>
#endif
#include "hw/maple/maple_devs.h"
#include "sdl_gamepad.h"
@ -246,5 +247,13 @@ void sdl_window_destroy()
TermRenderApi();
SDL_DestroyWindow(window);
}
HWND sdl_get_native_hwnd()
{
SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version);
SDL_GetWindowWMInfo(window, &wmInfo);
return wmInfo.info.win.window;
}
#endif

View File

@ -8,3 +8,6 @@ extern void sdl_window_create();
extern void sdl_window_set_text(const char* text);
extern void sdl_window_destroy();
extern void sdl_recreate_window(u32 flags);
#ifdef WIN32
HWND sdl_get_native_hwnd();
#endif

View File

@ -9,6 +9,9 @@
#include "hw/sh4/dyna/blockmanager.h"
#include "log/LogManager.h"
#include "wsi/context.h"
#if defined(USE_SDL)
#include "sdl/sdl.h"
#endif
#define _WIN32_WINNT 0x0500
#include <windows.h>
@ -122,11 +125,15 @@ static std::shared_ptr<WinMouseGamepadDevice> mouse_gamepad;
void os_SetupInput()
{
#if defined(USE_SDL)
input_sdl_init();
#else
XInputGamepadDevice::CreateDevices();
kb_gamepad = std::make_shared<WinKbGamepadDevice>(0);
GamepadDevice::Register(kb_gamepad);
mouse_gamepad = std::make_shared<WinMouseGamepadDevice>(0);
GamepadDevice::Register(mouse_gamepad);
#endif
}
LONG ExeptionHandler(EXCEPTION_POINTERS *ExceptionInfo)
@ -216,6 +223,9 @@ void ToggleFullscreen();
void UpdateInputState(u32 port)
{
#if defined(USE_SDL)
input_sdl_handle(port);
#else
/*
Disabled for now. Need new EMU_BTN_ANA_LEFT/RIGHT/.. virtual controller keys
@ -234,6 +244,7 @@ void UpdateInputState(u32 port)
std::shared_ptr<XInputGamepadDevice> gamepad = XInputGamepadDevice::GetXInputDevice(port);
if (gamepad != NULL)
gamepad->ReadInput();
#endif
}
// Windows class name to register
@ -373,6 +384,9 @@ static int window_x, window_y;
void os_CreateWindow()
{
#if defined(USE_SDL)
sdl_window_create();
#else
if (hWnd != NULL)
return;
HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(0);
@ -411,6 +425,8 @@ void os_CreateWindow()
#endif
theGLContext.SetWindow(hWnd);
theGLContext.SetDeviceContext(GetDC(hWnd));
InitRenderApi();
#endif // !USE_SDL
}
void DestroyWindow()
@ -492,10 +508,14 @@ BOOL CtrlHandler( DWORD fdwCtrlType )
void os_SetWindowText(const char* text)
{
#if defined(USE_SDL)
sdl_window_set_text(text);
#else
if (GetWindowLong(hWnd, GWL_STYLE) & WS_BORDER)
{
SetWindowText(hWnd, text);
}
#endif
}
void ReserveBottomMemory()
@ -739,7 +759,6 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
#ifdef _WIN64
setup_seh();
#endif
InitRenderApi();
rend_thread(NULL);

View File

@ -42,6 +42,16 @@ endif
# Platform auto-detection
# Can be overridden by using:
# make platform=x64
ifeq (,$(platform))
UNAME = $(shell uname -a)
ifeq ($(UNAME),)
platform = win32
else ifneq ($(findstring MINGW,$(UNAME)),)
platform = win32
else ifneq ($(findstring win,$(UNAME)),)
platform = win32
endif
endif
ifeq (,$(platform))
ARCH = $(shell uname -m)
ifeq ($(ARCH), $(filter $(ARCH), i386 i686))
@ -302,9 +312,14 @@ MENUENTRY_DIR ?= ${PREFIX}/share/applications
ICON_DIR ?= ${PREFIX}/share/pixmaps
ifdef USE_SDL
ifdef FOR_WINDOWS
CXXFLAGS += -D USE_SDL
LIBS += -lsdl2.dll
else
CXXFLAGS += `sdl2-config --cflags` -D USE_SDL
LIBS += `sdl2-config --libs`
endif
endif
ifdef PGO_MAKE
CFLAGS += -fprofile-generate -pg