diff --git a/src/posix/cocoa/i_video.mm b/src/posix/cocoa/i_video.mm index 57d2f3bdb..1b6b5815f 100644 --- a/src/posix/cocoa/i_video.mm +++ b/src/posix/cocoa/i_video.mm @@ -95,6 +95,7 @@ EXTERN_CVAR(Bool, vid_vsync) EXTERN_CVAR(Bool, vid_hidpi) EXTERN_CVAR(Int, vid_defwidth) EXTERN_CVAR(Int, vid_defheight) +EXTERN_CVAR(Int, vid_backend) CUSTOM_CVAR(Bool, vid_autoswitch, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { @@ -342,7 +343,7 @@ class CocoaVideo : public IVideo public: CocoaVideo() { - ms_isVulkanSupported = true; // todo + ms_isVulkanEnabled = vid_backend == 0 && NSAppKitVersionNumber >= 1404; // NSAppKitVersionNumber10_11 } ~CocoaVideo() @@ -359,7 +360,7 @@ public: SystemBaseFrameBuffer *fb = nullptr; - if (ms_isVulkanSupported) + if (ms_isVulkanEnabled) { const NSRect contentRect = [ms_window contentRectForFrameRect:[ms_window frame]]; @@ -380,7 +381,7 @@ public: } catch (std::exception const&) { - ms_isVulkanSupported = false; + ms_isVulkanEnabled = false; SetupOpenGLView(ms_window); } @@ -402,23 +403,18 @@ public: return ms_window; } - static bool IsVulkanSupported() - { - return ms_isVulkanSupported; - } - private: VulkanDevice *m_vulkanDevice = nullptr; static CocoaWindow* ms_window; - static bool ms_isVulkanSupported; + static bool ms_isVulkanEnabled; }; CocoaWindow* CocoaVideo::ms_window; -bool CocoaVideo::ms_isVulkanSupported; +bool CocoaVideo::ms_isVulkanEnabled; // --------------------------------------------------------------------------- diff --git a/src/posix/sdl/sdlglvideo.cpp b/src/posix/sdl/sdlglvideo.cpp index 2b261de43..188b3c265 100644 --- a/src/posix/sdl/sdlglvideo.cpp +++ b/src/posix/sdl/sdlglvideo.cpp @@ -72,6 +72,7 @@ EXTERN_CVAR (Int, vid_displaybits) EXTERN_CVAR (Int, vid_maxfps) EXTERN_CVAR (Int, vid_defwidth) EXTERN_CVAR (Int, vid_defheight) +EXTERN_CVAR (Int, vid_backend) EXTERN_CVAR (Bool, cl_capfps) // PUBLIC DATA DEFINITIONS ------------------------------------------------- @@ -111,7 +112,7 @@ namespace Priv static const int MIN_HEIGHT = 200; SDL_Window *window; - bool vulkanSupported; + bool vulkanEnabled; bool fullscreenSwitch; void CreateWindow(uint32_t extraFlags) @@ -197,7 +198,7 @@ private: void I_GetVulkanDrawableSize(int *width, int *height) { - assert(Priv::vulkanSupported); + assert(Priv::vulkanEnabled); assert(Priv::window != nullptr); assert(Priv::Vulkan_GetDrawableSize); Priv::Vulkan_GetDrawableSize(Priv::window, width, height); @@ -205,17 +206,15 @@ void I_GetVulkanDrawableSize(int *width, int *height) bool I_GetVulkanPlatformExtensions(unsigned int *count, const char **names) { - assert(Priv::vulkanSupported); + assert(Priv::vulkanEnabled); assert(Priv::window != nullptr); - assert(Priv::Vulkan_GetInstanceExtensions); return Priv::Vulkan_GetInstanceExtensions(Priv::window, count, names) == SDL_TRUE; } bool I_CreateVulkanSurface(VkInstance instance, VkSurfaceKHR *surface) { - assert(Priv::vulkanSupported); + assert(Priv::vulkanEnabled); assert(Priv::window != nullptr); - assert(Priv::Vulkan_CreateSurface); return Priv::Vulkan_CreateSurface(Priv::window, instance, surface) == SDL_TRUE; } @@ -234,15 +233,16 @@ SDLVideo::SDLVideo () Priv::library.Load({ "libSDL2.so", "libSDL2-2.0.so" }); } - Priv::vulkanSupported = Priv::Vulkan_GetDrawableSize && Priv::Vulkan_GetInstanceExtensions && Priv::Vulkan_CreateSurface; + Priv::vulkanEnabled = vid_backend == 0 + && Priv::Vulkan_GetDrawableSize && Priv::Vulkan_GetInstanceExtensions && Priv::Vulkan_CreateSurface; - if (Priv::vulkanSupported) + if (Priv::vulkanEnabled) { Priv::CreateWindow(Priv::VulkanWindowFlag | SDL_WINDOW_HIDDEN); if (Priv::window == nullptr) { - Priv::vulkanSupported = false; + Priv::vulkanEnabled = false; } } } @@ -257,7 +257,7 @@ DFrameBuffer *SDLVideo::CreateFrameBuffer () SystemBaseFrameBuffer *fb = nullptr; // first try Vulkan, if that fails OpenGL - if (Priv::vulkanSupported) + if (Priv::vulkanEnabled) { try { @@ -267,7 +267,7 @@ DFrameBuffer *SDLVideo::CreateFrameBuffer () } catch (CRecoverableError const&) { - Priv::vulkanSupported = false; + Priv::vulkanEnabled = false; } } @@ -302,7 +302,7 @@ int SystemBaseFrameBuffer::GetClientWidth() { int width = 0; - assert(Priv::vulkanSupported); + assert(Priv::vulkanEnabled); Priv::Vulkan_GetDrawableSize(Priv::window, &width, nullptr); return width; @@ -312,7 +312,7 @@ int SystemBaseFrameBuffer::GetClientHeight() { int height = 0; - assert(Priv::vulkanSupported); + assert(Priv::vulkanEnabled); Priv::Vulkan_GetDrawableSize(Priv::window, nullptr, &height); return height; diff --git a/src/v_video.cpp b/src/v_video.cpp index 61a9ceb7b..d0085a153 100644 --- a/src/v_video.cpp +++ b/src/v_video.cpp @@ -113,6 +113,15 @@ CUSTOM_CVAR(Int, vid_rendermode, 4, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOIN // No further checks needed. All this changes now is which scene drawer the render backend calls. } +CUSTOM_CVAR(Int, vid_backend, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) +{ + // [SP] This may seem pointless - but I don't want to implement live switching just + // yet - I'm pretty sure it's going to require a lot of reinits and destructions to + // do it right without memory leaks + + Printf("Changing the video backend requires a restart for " GAMENAME ".\n"); +} + CVAR(Int, vid_renderer, 1, 0) // for some stupid mods which threw caution out of the window... diff --git a/src/win32/hardware.cpp b/src/win32/hardware.cpp index 75026ab36..22ccf999e 100644 --- a/src/win32/hardware.cpp +++ b/src/win32/hardware.cpp @@ -50,15 +50,7 @@ #include "swrenderer/r_swrenderer.h" EXTERN_CVAR(Int, vid_maxfps) - -CUSTOM_CVAR(Int, vid_backend, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITCALL) -{ - // [SP] This may seem pointless - but I don't want to implement live switching just - // yet - I'm pretty sure it's going to require a lot of reinits and destructions to - // do it right without memory leaks - - Printf("Changing the video backend requires a restart for " GAMENAME ".\n"); -} +EXTERN_CVAR(Int, vid_backend) extern HWND Window;