mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-11 21:58:31 +09:00
[Feat] (MG_Backend/DirectVulkan): refactor queue family stuff
This commit is contained in:
@@ -235,10 +235,11 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
|||||||
VK_VERSION_MAJOR(apiVersion), VK_VERSION_MINOR(apiVersion), VK_VERSION_PATCH(apiVersion),
|
VK_VERSION_MAJOR(apiVersion), VK_VERSION_MINOR(apiVersion), VK_VERSION_PATCH(apiVersion),
|
||||||
deviceTypeToStr(deviceProperties.deviceType));
|
deviceTypeToStr(deviceProperties.deviceType));
|
||||||
// TODO: Properly check device eligibility
|
// TODO: Properly check device eligibility
|
||||||
Int gfxQueueIndex = GetGraphicsQueueFamilyIndexOfPhysicalDevice(device);
|
m_queueFamilies = GetQueueFamilyFromPhysicalDevice(device);
|
||||||
if (m_physicalDevice == VK_NULL_HANDLE && gfxQueueIndex != -1) {
|
auto gfxQueueFamily = GetQueueFamilyIndex(m_queueFamilies, VK_QUEUE_GRAPHICS_BIT);
|
||||||
|
if (m_physicalDevice == VK_NULL_HANDLE && gfxQueueFamily != -1) {
|
||||||
m_physicalDevice = device;
|
m_physicalDevice = device;
|
||||||
m_graphicsQueueFamilyIndex = gfxQueueIndex;
|
m_queueFamilyIndices.graphicsFamily = gfxQueueFamily;
|
||||||
MGLOG_I("Physical device picked.");
|
MGLOG_I("Physical device picked.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -253,7 +254,7 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
|||||||
void VulkanRenderer::CreateLogicalDevice() {
|
void VulkanRenderer::CreateLogicalDevice() {
|
||||||
VkDeviceQueueCreateInfo queueCreateInfo{};
|
VkDeviceQueueCreateInfo queueCreateInfo{};
|
||||||
queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
|
queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
|
||||||
queueCreateInfo.queueFamilyIndex = m_graphicsQueueFamilyIndex;
|
queueCreateInfo.queueFamilyIndex = m_queueFamilyIndices.graphicsFamily;
|
||||||
queueCreateInfo.queueCount = 1;
|
queueCreateInfo.queueCount = 1;
|
||||||
Float queuePriority = 1.0f;
|
Float queuePriority = 1.0f;
|
||||||
queueCreateInfo.pQueuePriorities = &queuePriority;
|
queueCreateInfo.pQueuePriorities = &queuePriority;
|
||||||
@@ -273,7 +274,7 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
|||||||
deviceCreateInfo.enabledLayerCount = 0;
|
deviceCreateInfo.enabledLayerCount = 0;
|
||||||
}
|
}
|
||||||
VK_VERIFY(vkCreateDevice(m_physicalDevice, &deviceCreateInfo, nullptr, &m_device), "vkCreateDevice");
|
VK_VERIFY(vkCreateDevice(m_physicalDevice, &deviceCreateInfo, nullptr, &m_device), "vkCreateDevice");
|
||||||
vkGetDeviceQueue(m_device, m_graphicsQueueFamilyIndex, 0, &m_graphicsQueue);
|
vkGetDeviceQueue(m_device, m_queueFamilyIndices.graphicsFamily, 0, &m_graphicsQueue);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VulkanRenderer::CreateSurface() {
|
void VulkanRenderer::CreateSurface() {
|
||||||
@@ -298,15 +299,18 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
Int VulkanRenderer::GetGraphicsQueueFamilyIndexOfPhysicalDevice(VkPhysicalDevice device) {
|
Vector<VkQueueFamilyProperties> VulkanRenderer::GetQueueFamilyFromPhysicalDevice(VkPhysicalDevice device) {
|
||||||
Uint32 queueFamilyCount = 0;
|
Uint32 queueFamilyCount = 0;
|
||||||
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr);
|
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr);
|
||||||
|
|
||||||
Vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount);
|
Vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount);
|
||||||
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data());
|
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data());
|
||||||
|
return queueFamilies;
|
||||||
|
}
|
||||||
|
|
||||||
for (Int i = 0; i < queueFamilies.size(); ++i) {
|
Uint32 VulkanRenderer::GetQueueFamilyIndex(const Vector<VkQueueFamilyProperties>& queueFamilies, VkQueueFlagBits flag) {
|
||||||
if (queueFamilies[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
|
for (Uint32 i = 0; i < queueFamilies.size(); i++) {
|
||||||
|
if (queueFamilies[i].queueFlags & flag) {
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,11 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
|||||||
void Present();
|
void Present();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
struct QueueFamilyIndices {
|
||||||
|
Int32 graphicsFamily = -1;
|
||||||
|
Int32 presentFamily = -1;
|
||||||
|
};
|
||||||
|
|
||||||
NativeWindowType m_window = 0;
|
NativeWindowType m_window = 0;
|
||||||
RendererConfig m_config;
|
RendererConfig m_config;
|
||||||
|
|
||||||
@@ -53,10 +58,11 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
|||||||
VkInstance m_instance = VK_NULL_HANDLE;
|
VkInstance m_instance = VK_NULL_HANDLE;
|
||||||
VkDebugUtilsMessengerEXT m_debugMessenger = VK_NULL_HANDLE;
|
VkDebugUtilsMessengerEXT m_debugMessenger = VK_NULL_HANDLE;
|
||||||
VkPhysicalDevice m_physicalDevice = VK_NULL_HANDLE;
|
VkPhysicalDevice m_physicalDevice = VK_NULL_HANDLE;
|
||||||
Int m_graphicsQueueFamilyIndex = -1;
|
|
||||||
VkDevice m_device = VK_NULL_HANDLE;
|
VkDevice m_device = VK_NULL_HANDLE;
|
||||||
VkQueue m_graphicsQueue = VK_NULL_HANDLE;
|
VkQueue m_graphicsQueue = VK_NULL_HANDLE;
|
||||||
VkSurfaceKHR m_surface = VK_NULL_HANDLE;
|
VkSurfaceKHR m_surface = VK_NULL_HANDLE;
|
||||||
|
Vector<VkQueueFamilyProperties> m_queueFamilies;
|
||||||
|
QueueFamilyIndices m_queueFamilyIndices;
|
||||||
|
|
||||||
void CreateInstance();
|
void CreateInstance();
|
||||||
void DestroyInstance();
|
void DestroyInstance();
|
||||||
@@ -67,7 +73,8 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
|||||||
void CreateLogicalDevice();
|
void CreateLogicalDevice();
|
||||||
void CreateSurface();
|
void CreateSurface();
|
||||||
|
|
||||||
static Int GetGraphicsQueueFamilyIndexOfPhysicalDevice(VkPhysicalDevice device);
|
static Vector<VkQueueFamilyProperties> GetQueueFamilyFromPhysicalDevice(VkPhysicalDevice device);
|
||||||
|
static Uint32 GetQueueFamilyIndex(const Vector<VkQueueFamilyProperties>& queueFamilies, VkQueueFlagBits flag);
|
||||||
static Vector<VkExtensionProperties> EnumerateInstanceExtensions();
|
static Vector<VkExtensionProperties> EnumerateInstanceExtensions();
|
||||||
static constexpr const char* s_validationLayerNames[] = {
|
static constexpr const char* s_validationLayerNames[] = {
|
||||||
"VK_LAYER_KHRONOS_validation"
|
"VK_LAYER_KHRONOS_validation"
|
||||||
|
|||||||
Reference in New Issue
Block a user