Orange/include/Orange/Render/Renderer.h

71 lines
2.3 KiB
C++

#pragma once
#include <Orange/Core/Types.h>
#include <Orange/Core/SmallVector.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_vulkan.h>
#include <vulkan/vulkan_core.h>
namespace orange
{
class Renderer
{
public:
~Renderer() = default;
protected:
Renderer() = default;
static VkInstance createInstance(SDL_Window* window, const char* name)
{
uint32_t instanceExtensionCount = {};
if (SDL_Vulkan_GetInstanceExtensions(window, &instanceExtensionCount, nullptr) != SDL_TRUE)
{
//std::cerr << "Failed to get SDL instance extension count.\n";
return VK_NULL_HANDLE;
}
SmallVector<const char *, 8> instanceExtensions{ instanceExtensionCount };
if (SDL_Vulkan_GetInstanceExtensions(window, &instanceExtensionCount, instanceExtensions.Data()) != SDL_TRUE)
{
//std::cerr << "Failed to get SDL instance extensions.\n";
return VK_NULL_HANDLE;
}
VkApplicationInfo appInfo =
{
.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
.pApplicationName = name,
.applicationVersion = VK_MAKE_VERSION(1, 0, 0),
.pEngineName = "Orange",
.engineVersion = VK_MAKE_VERSION(1, 0, 0),
.apiVersion = VK_API_VERSION_1_3,
};
VkInstanceCreateInfo instanceInfo =
{
.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
.pApplicationInfo = &appInfo,
.enabledExtensionCount = instanceExtensionCount,
.ppEnabledExtensionNames = instanceExtensions.Data(),
};
VkResult result = VK_SUCCESS;
VkInstance instance;
if ((result = vkCreateInstance(&instanceInfo, nullptr, &instance)) != VK_SUCCESS)
{
//std::cerr << "Failed to create Vulkan instance.\n";
return VK_NULL_HANDLE;
}
return instance;
}
VkInstance m_instance = VK_NULL_HANDLE;
VkPhysicalDevice m_physicalDevice = VK_NULL_HANDLE;
VkDevice m_device = VK_NULL_HANDLE;
};
}