71 lines
2.3 KiB
C++
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;
|
|
};
|
|
|
|
} |