Orange/src/Orange/Render/Window.cpp

79 lines
1.9 KiB
C++

#include "Orange/Core/Result.h"
#include "Orange/Core/Log.h"
#include <Orange/Render/Window.h>
#include <Orange/Render/RenderContext.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_error.h>
#include <SDL2/SDL_events.h>
#include <SDL2/SDL_vulkan.h>
namespace orange
{
Result<Window> Window::Create()
{
if (SDL_InitSubSystem(SDL_INIT_VIDEO) != 0)
{
log::err("Failed to initialize SDL Video: %s", Window::GetError());
return Result<Window>::Error(BasicErrorCode::Failed);
}
SDL_Window* window = nullptr;
if (!(window = SDL_CreateWindow("Orange", 0, 0, 1280, 720, SDL_WINDOW_VULKAN)))
{
log::err("Failed to create SDL window: %s", Window::GetError());
return Result<Window>::Error(BasicErrorCode::Failed);
}
return Result<Window>::Success(window);
}
Window::Window(SDL_Window* window)
: m_window{ window }
{}
Window::~Window()
{
SDL_DestroyWindow(m_window);
SDL_QuitSubSystem(SDL_INIT_VIDEO);
}
bool Window::GetInstanceExtensions(Window& window, uint32_t *count, const char **extensions)
{
return SDL_Vulkan_GetInstanceExtensions(window.m_window, count, extensions) == SDL_TRUE;
}
Result<VkSurfaceKHR> Window::CreateSurface(VkInstance instance)
{
VkSurfaceKHR surface = VK_NULL_HANDLE;
if (SDL_Vulkan_CreateSurface(m_window, instance, &surface) != SDL_TRUE)
return Result<VkSurfaceKHR>::Error(BasicErrorCode::Failed);
return Result<VkSurfaceKHR>::Success(surface);
}
const char* Window::GetError()
{
return SDL_GetError();
}
bool Window::Update()
{
bool quit = false;
SDL_Event e;
while (SDL_PollEvent(&e))
{
switch (e.type)
{
case SDL_QUIT:
quit = true;
break;
}
}
return !quit;
}
}