mirror of
https://github.com/love2d/love.git
synced 2026-08-19 12:14:20 +02:00
vulkan: keep track of device/instance api version
This commit is contained in:
@@ -82,7 +82,7 @@ Graphics::Graphics()
|
|||||||
|
|
||||||
volkInitializeCustom((PFN_vkGetInstanceProcAddr)SDL_Vulkan_GetVkGetInstanceProcAddr());
|
volkInitializeCustom((PFN_vkGetInstanceProcAddr)SDL_Vulkan_GetVkGetInstanceProcAddr());
|
||||||
|
|
||||||
vulkanApiVersion = volkGetInstanceVersion();
|
instanceVersion = volkGetInstanceVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
Graphics::~Graphics()
|
Graphics::~Graphics()
|
||||||
@@ -1295,7 +1295,7 @@ void Graphics::createVulkanInstance()
|
|||||||
appInfo.applicationVersion = VK_MAKE_API_VERSION(0, 1, 0, 0); // get this version from somewhere else?
|
appInfo.applicationVersion = VK_MAKE_API_VERSION(0, 1, 0, 0); // get this version from somewhere else?
|
||||||
appInfo.pEngineName = "LOVE Game Framework";
|
appInfo.pEngineName = "LOVE Game Framework";
|
||||||
appInfo.engineVersion = VK_MAKE_API_VERSION(0, VERSION_MAJOR, VERSION_MINOR, VERSION_REV);
|
appInfo.engineVersion = VK_MAKE_API_VERSION(0, VERSION_MAJOR, VERSION_MINOR, VERSION_REV);
|
||||||
appInfo.apiVersion = vulkanApiVersion;
|
appInfo.apiVersion = instanceVersion;
|
||||||
|
|
||||||
VkInstanceCreateInfo createInfo{};
|
VkInstanceCreateInfo createInfo{};
|
||||||
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
|
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
|
||||||
@@ -1330,11 +1330,6 @@ void Graphics::createVulkanInstance()
|
|||||||
createInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size());
|
createInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size());
|
||||||
createInfo.ppEnabledLayerNames = validationLayers.data();
|
createInfo.ppEnabledLayerNames = validationLayers.data();
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
createInfo.enabledLayerCount = 0;
|
|
||||||
createInfo.ppEnabledLayerNames = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS)
|
if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS)
|
||||||
throw love::Exception("couldn't create vulkan instance");
|
throw love::Exception("couldn't create vulkan instance");
|
||||||
@@ -1354,12 +1349,14 @@ bool Graphics::checkValidationSupport()
|
|||||||
{
|
{
|
||||||
bool layerFound = false;
|
bool layerFound = false;
|
||||||
|
|
||||||
for (const auto &layerProperties : availableLayers)
|
for (const auto& layerProperties : availableLayers)
|
||||||
|
{
|
||||||
if (strcmp(layerName, layerProperties.layerName) == 0)
|
if (strcmp(layerName, layerProperties.layerName) == 0)
|
||||||
{
|
{
|
||||||
layerFound = true;
|
layerFound = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!layerFound)
|
if (!layerFound)
|
||||||
return false;
|
return false;
|
||||||
@@ -1395,6 +1392,7 @@ void Graphics::pickPhysicalDevice()
|
|||||||
VkPhysicalDeviceProperties properties;
|
VkPhysicalDeviceProperties properties;
|
||||||
vkGetPhysicalDeviceProperties(physicalDevice, &properties);
|
vkGetPhysicalDeviceProperties(physicalDevice, &properties);
|
||||||
minUniformBufferOffsetAlignment = properties.limits.minUniformBufferOffsetAlignment;
|
minUniformBufferOffsetAlignment = properties.limits.minUniformBufferOffsetAlignment;
|
||||||
|
deviceApiVersion = properties.apiVersion;
|
||||||
|
|
||||||
msaaSamples = getMsaaCount(requestedMsaa);
|
msaaSamples = getMsaaCount(requestedMsaa);
|
||||||
}
|
}
|
||||||
@@ -1556,7 +1554,7 @@ void Graphics::createLogicalDevice()
|
|||||||
optionalDeviceFeatures.memoryBudget = false;
|
optionalDeviceFeatures.memoryBudget = false;
|
||||||
if (optionalDeviceFeatures.spirv14 && !optionalDeviceFeatures.shaderFloatControls)
|
if (optionalDeviceFeatures.spirv14 && !optionalDeviceFeatures.shaderFloatControls)
|
||||||
optionalDeviceFeatures.spirv14 = false;
|
optionalDeviceFeatures.spirv14 = false;
|
||||||
if (optionalDeviceFeatures.spirv14 && vulkanApiVersion < VK_API_VERSION_1_1)
|
if (optionalDeviceFeatures.spirv14 && deviceApiVersion < VK_API_VERSION_1_1)
|
||||||
optionalDeviceFeatures.spirv14 = false;
|
optionalDeviceFeatures.spirv14 = false;
|
||||||
|
|
||||||
VkPhysicalDeviceFeatures deviceFeatures{};
|
VkPhysicalDeviceFeatures deviceFeatures{};
|
||||||
@@ -1584,7 +1582,7 @@ void Graphics::createLogicalDevice()
|
|||||||
enabledExtensions.push_back(VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME);
|
enabledExtensions.push_back(VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME);
|
||||||
if (optionalDeviceFeatures.spirv14)
|
if (optionalDeviceFeatures.spirv14)
|
||||||
enabledExtensions.push_back(VK_KHR_SPIRV_1_4_EXTENSION_NAME);
|
enabledExtensions.push_back(VK_KHR_SPIRV_1_4_EXTENSION_NAME);
|
||||||
if (vulkanApiVersion >= VK_API_VERSION_1_1)
|
if (deviceApiVersion >= VK_API_VERSION_1_1)
|
||||||
enabledExtensions.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
|
enabledExtensions.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
|
||||||
|
|
||||||
createInfo.enabledExtensionCount = static_cast<uint32_t>(enabledExtensions.size());
|
createInfo.enabledExtensionCount = static_cast<uint32_t>(enabledExtensions.size());
|
||||||
@@ -1595,8 +1593,6 @@ void Graphics::createLogicalDevice()
|
|||||||
createInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size());
|
createInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size());
|
||||||
createInfo.ppEnabledLayerNames = validationLayers.data();
|
createInfo.ppEnabledLayerNames = validationLayers.data();
|
||||||
}
|
}
|
||||||
else
|
|
||||||
createInfo.enabledLayerCount = 0;
|
|
||||||
|
|
||||||
VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures{};
|
VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures{};
|
||||||
extendedDynamicStateFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT;
|
extendedDynamicStateFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT;
|
||||||
@@ -1617,7 +1613,7 @@ void Graphics::createLogicalDevice()
|
|||||||
void Graphics::initVMA()
|
void Graphics::initVMA()
|
||||||
{
|
{
|
||||||
VmaAllocatorCreateInfo allocatorCreateInfo = {};
|
VmaAllocatorCreateInfo allocatorCreateInfo = {};
|
||||||
allocatorCreateInfo.vulkanApiVersion = vulkanApiVersion;
|
allocatorCreateInfo.vulkanApiVersion = deviceApiVersion;
|
||||||
allocatorCreateInfo.physicalDevice = physicalDevice;
|
allocatorCreateInfo.physicalDevice = physicalDevice;
|
||||||
allocatorCreateInfo.device = device;
|
allocatorCreateInfo.device = device;
|
||||||
allocatorCreateInfo.instance = instance;
|
allocatorCreateInfo.instance = instance;
|
||||||
|
|||||||
@@ -365,9 +365,10 @@ private:
|
|||||||
VkSampler createSampler(const SamplerState &sampler);
|
VkSampler createSampler(const SamplerState &sampler);
|
||||||
void cleanupUnusedObjects();
|
void cleanupUnusedObjects();
|
||||||
|
|
||||||
uint32_t vulkanApiVersion = VK_VERSION_1_0;
|
uint32_t instanceVersion = VK_API_VERSION_1_0;
|
||||||
VkInstance instance = VK_NULL_HANDLE;
|
VkInstance instance = VK_NULL_HANDLE;
|
||||||
VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
|
VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
|
||||||
|
uint32_t deviceApiVersion = VK_API_VERSION_1_0;
|
||||||
bool windowHasStencil = false;
|
bool windowHasStencil = false;
|
||||||
int requestedMsaa = 0;
|
int requestedMsaa = 0;
|
||||||
VkDevice device = VK_NULL_HANDLE;
|
VkDevice device = VK_NULL_HANDLE;
|
||||||
|
|||||||
Reference in New Issue
Block a user