64 lines
1.9 KiB
C++
64 lines
1.9 KiB
C++
#include "Orange/Core/Log.h"
|
|
#include "Orange/Core/Result.h"
|
|
#include <Orange/Render/Renderer.h>
|
|
|
|
namespace orange
|
|
{
|
|
static VkDevice CreateDevice(PhysicalDevice physDev)
|
|
{
|
|
constexpr float queuePriority = 1.0f;
|
|
VkDeviceQueueCreateInfo queueInfo =
|
|
{
|
|
.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
|
|
.queueFamilyIndex = physDev.GraphicsQueueFamilyIndex(),
|
|
.queueCount = 1,
|
|
.pQueuePriorities = &queuePriority,
|
|
};
|
|
|
|
VkPhysicalDeviceFeatures features{};
|
|
|
|
VkDeviceCreateInfo deviceInfo =
|
|
{
|
|
.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
|
|
.queueCreateInfoCount = 1,
|
|
.pQueueCreateInfos = &queueInfo,
|
|
.pEnabledFeatures = &features,
|
|
};
|
|
|
|
VkDevice device = VK_NULL_HANDLE;
|
|
if (vkCreateDevice(*physDev, &deviceInfo, nullptr, &device) != VK_SUCCESS)
|
|
{
|
|
log::err("Failed to create Vulkan logical device");
|
|
return VK_NULL_HANDLE;
|
|
}
|
|
|
|
return device;
|
|
}
|
|
|
|
Result<Device> Device::Create(Instance& instance, PhysicalDevice physicalDevice)
|
|
{
|
|
VkDevice device = VK_NULL_HANDLE;
|
|
if (!(device = CreateDevice(physicalDevice)))
|
|
{
|
|
log::err("Failed to create Vulkan device");
|
|
return Result<Device>::Error(BasicErrorCode::Failed);
|
|
}
|
|
|
|
return Result<Device>::Success(instance, physicalDevice, device);
|
|
}
|
|
|
|
Device::Device(Instance& instance, PhysicalDevice physicalDevice, VkDevice device)
|
|
: m_instance { instance }
|
|
, m_physicalDevice{ physicalDevice }
|
|
, m_device { device }
|
|
{
|
|
vkGetDeviceQueue(m_device, m_physicalDevice.GraphicsQueueFamilyIndex(), 0, &m_queue);
|
|
}
|
|
|
|
Device::~Device()
|
|
{
|
|
vkDestroyDevice(m_device, nullptr);
|
|
}
|
|
|
|
}
|