#include "SDL3/SDL_error.h" #include "igamewindow.h" #include "tier1/interface.h" #include "tier0/lib.h" #include "tier0/platform.h" #define SDL_MAIN_HANDLED #include "SDL3/SDL.h" #include "SDL3/SDL_init.h" #include "SDL3/SDL_video.h" #include "SDL3/SDL_vulkan.h" #include "SDL3/SDL_events.h" class CSDLGameWindow: public IGameWindow { public: virtual void Init() override; virtual void Shutdown() override; virtual void UpdateWindow() override; virtual EGraphicsAPI GetGraphicsAPI() override; virtual int GetVulkanInstanceExtensionCount() override; virtual const char **GetVulkanInstanceExtensions() override; virtual void CreateVulkanSurface( void *pInstance ) override; virtual void DestroyVulkanSurface( void *pInstance ) override; virtual void *GetVulkanSurface() override; private: SDL_Window *m_pWindow; EGraphicsAPI m_ePreferredGraphicsAPI; void *m_pVulkanSurface; }; CSDLGameWindow g_sdlGameWindow; IGameWindow *gamewindow = &g_sdlGameWindow; void CSDLGameWindow::Init() { m_ePreferredGraphicsAPI = GRAPHICS_API_VULKAN; if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS | SDL_INIT_GAMEPAD)) Plat_FatalErrorFunc("SDL_Init: %s\n", SDL_GetError()); m_pWindow = SDL_CreateWindow("funnygame", 1280, 720, SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE); if (!m_pWindow) Plat_FatalErrorFunc("SDL_CreateWindow: %s\n", SDL_GetError()); } void CSDLGameWindow::Shutdown() { } void CSDLGameWindow::UpdateWindow() { SDL_Event event; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED: break; case SDL_EVENT_QUIT: SDL_Quit(); Plat_Exit(0); break; default: break; } } } EGraphicsAPI CSDLGameWindow::GetGraphicsAPI() { return GRAPHICS_API_VULKAN; } int CSDLGameWindow::GetVulkanInstanceExtensionCount() { if ( m_ePreferredGraphicsAPI != GRAPHICS_API_VULKAN ) return -1; uint32_t nCount; SDL_Vulkan_GetInstanceExtensions(&nCount); return nCount; } const char **CSDLGameWindow::GetVulkanInstanceExtensions() { if ( m_ePreferredGraphicsAPI != GRAPHICS_API_VULKAN ) return 0; uint32_t nCount; return (const char **)SDL_Vulkan_GetInstanceExtensions(&nCount); } void CSDLGameWindow::CreateVulkanSurface( void *pInstance ) { if ( m_ePreferredGraphicsAPI != GRAPHICS_API_VULKAN ) return; SDL_Vulkan_CreateSurface(m_pWindow, (VkInstance)pInstance, NULL, (VkSurfaceKHR*)&m_pVulkanSurface); } void CSDLGameWindow::DestroyVulkanSurface( void *pInstance ) { SDL_Vulkan_DestroySurface((VkInstance)pInstance, (VkSurfaceKHR)m_pVulkanSurface, NULL); } void *CSDLGameWindow::GetVulkanSurface() { if ( m_ePreferredGraphicsAPI != GRAPHICS_API_VULKAN ) return 0; return m_pVulkanSurface; }