#include "SDL3/SDL_error.h" #include "igamewindow.h" #include "tier0/lib.h" #include "tier0/platform.h" #include "tier1/interface.h" #include "tier1/utlvector.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 Tick( float fDelta ) override; virtual void Frame( float fDelta ) override; virtual uint32_t GetRenderWidth() override; virtual uint32_t GetRenderHeight() override; virtual void *CreateVulkanSurface( void *pInstance ) override; virtual void DestroyVulkanSurface( void *pInstance ) override; private: VkSurfaceKHR m_hSurface; SDL_Window *m_pWindow; }; void CSDLGameWindow::Init() { 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::Frame( float fDelta ) { 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; } } } void CSDLGameWindow::Tick( float fDelta ) { }; uint32_t CSDLGameWindow::GetRenderWidth() { return 0; } uint32_t CSDLGameWindow::GetRenderHeight() { return 0; } void *CSDLGameWindow::CreateVulkanSurface( void *pInstance ) { SDL_Vulkan_CreateSurface(m_pWindow, (VkInstance)pInstance, NULL, (VkSurfaceKHR*)&m_hSurface); return (void*)m_hSurface; } void CSDLGameWindow::DestroyVulkanSurface( void *pInstance ) { SDL_Vulkan_DestroySurface((VkInstance)pInstance, (VkSurfaceKHR)m_hSurface, NULL); } class CSDLGameWindowManager: public IGameWindowManager { virtual void Init() override; virtual void Tick( float fDelta ) override; virtual void Frame( float fDelta ) override; virtual void Shutdown() override; virtual IGameWindow *CreateWindow() override; virtual void DestroyWindow( IGameWindow* pWindow ) override; virtual int GetVulkanInstanceExtensionCount() override; virtual const char **GetVulkanInstanceExtensions() override; }; void CSDLGameWindowManager::Init() { } void CSDLGameWindowManager::Tick( float fDelta ) { } void CSDLGameWindowManager::Frame( float fDelta ) { } void CSDLGameWindowManager::Shutdown() { } IGameWindow *CSDLGameWindowManager::CreateWindow() { } void CSDLGameWindowManager::DestroyWindow( IGameWindow* pWindow ) { } int CSDLGameWindowManager::GetVulkanInstanceExtensionCount() { uint32_t nCount; SDL_Vulkan_GetInstanceExtensions(&nCount); return nCount; } const char **CSDLGameWindowManager::GetVulkanInstanceExtensions() { uint32_t nCount; return (const char **)SDL_Vulkan_GetInstanceExtensions(&nCount); }