Browse Source

vulkan: fix linux build

niki 2 years ago
parent
commit
82f079eebd

+ 25 - 3
src/modules/graphics/vulkan/Graphics.cpp

@@ -504,10 +504,12 @@ void Graphics::setFrontFaceWinding(Winding winding)
 
 
 	states.back().winding = winding;
 	states.back().winding = winding;
 
 
+#ifdef VK_EXT_extended_dynamic_state
 	if (optionalDeviceFeatures.extendedDynamicState)
 	if (optionalDeviceFeatures.extendedDynamicState)
 		vkCmdSetFrontFaceEXT(
 		vkCmdSetFrontFaceEXT(
 			commandBuffers.at(currentFrame),
 			commandBuffers.at(currentFrame),
 			Vulkan::getFrontFace(winding));
 			Vulkan::getFrontFace(winding));
+#endif
 }
 }
 
 
 void Graphics::setColorMask(ColorChannelMask mask)
 void Graphics::setColorMask(ColorChannelMask mask)
@@ -724,12 +726,14 @@ void Graphics::setStencilMode(StencilAction action, CompareMode compare, int val
 	vkCmdSetStencilCompareMask(commandBuffers.at(currentFrame), VK_STENCIL_FACE_FRONT_AND_BACK, readmask);
 	vkCmdSetStencilCompareMask(commandBuffers.at(currentFrame), VK_STENCIL_FACE_FRONT_AND_BACK, readmask);
 	vkCmdSetStencilReference(commandBuffers.at(currentFrame), VK_STENCIL_FACE_FRONT_AND_BACK, value);
 	vkCmdSetStencilReference(commandBuffers.at(currentFrame), VK_STENCIL_FACE_FRONT_AND_BACK, value);
 
 
+#ifdef VK_EXT_extended_dynamic_state
 	if (optionalDeviceFeatures.extendedDynamicState)
 	if (optionalDeviceFeatures.extendedDynamicState)
 		vkCmdSetStencilOpEXT(
 		vkCmdSetStencilOpEXT(
 			commandBuffers.at(currentFrame),
 			commandBuffers.at(currentFrame),
 			VK_STENCIL_FACE_FRONT_AND_BACK,
 			VK_STENCIL_FACE_FRONT_AND_BACK,
 			VK_STENCIL_OP_KEEP, Vulkan::getStencilOp(action),
 			VK_STENCIL_OP_KEEP, Vulkan::getStencilOp(action),
 			VK_STENCIL_OP_KEEP, Vulkan::getCompareOp(compare));
 			VK_STENCIL_OP_KEEP, Vulkan::getCompareOp(compare));
+#endif
 
 
 	states.back().stencil.action = action;
 	states.back().stencil.action = action;
 	states.back().stencil.compare = compare;
 	states.back().stencil.compare = compare;
@@ -742,6 +746,7 @@ void Graphics::setDepthMode(CompareMode compare, bool write)
 {
 {
 	flushBatchedDraws();
 	flushBatchedDraws();
 
 
+#ifdef VK_EXT_extended_dynamic_state
 	if (optionalDeviceFeatures.extendedDynamicState)
 	if (optionalDeviceFeatures.extendedDynamicState)
 	{
 	{
 		vkCmdSetDepthCompareOpEXT(
 		vkCmdSetDepthCompareOpEXT(
@@ -750,6 +755,7 @@ void Graphics::setDepthMode(CompareMode compare, bool write)
 		vkCmdSetDepthWriteEnableEXT(
 		vkCmdSetDepthWriteEnableEXT(
 			commandBuffers.at(currentFrame), Vulkan::getBool(write));
 			commandBuffers.at(currentFrame), Vulkan::getBool(write));
 	}
 	}
+#endif
 
 
 	states.back().depthTest = compare;
 	states.back().depthTest = compare;
 	states.back().depthWrite = write;
 	states.back().depthWrite = write;
@@ -868,6 +874,7 @@ void Graphics::initDynamicState()
 	vkCmdSetStencilCompareMask(commandBuffers.at(currentFrame), VK_STENCIL_FACE_FRONT_AND_BACK, states.back().stencil.readMask);
 	vkCmdSetStencilCompareMask(commandBuffers.at(currentFrame), VK_STENCIL_FACE_FRONT_AND_BACK, states.back().stencil.readMask);
 	vkCmdSetStencilReference(commandBuffers.at(currentFrame), VK_STENCIL_FACE_FRONT_AND_BACK, states.back().stencil.value);
 	vkCmdSetStencilReference(commandBuffers.at(currentFrame), VK_STENCIL_FACE_FRONT_AND_BACK, states.back().stencil.value);
 
 
+#ifdef VK_EXT_extended_dynamic_state
 	if (optionalDeviceFeatures.extendedDynamicState)
 	if (optionalDeviceFeatures.extendedDynamicState)
 	{
 	{
 		 vkCmdSetStencilOpEXT(
 		 vkCmdSetStencilOpEXT(
@@ -885,6 +892,7 @@ void Graphics::initDynamicState()
 		vkCmdSetFrontFaceEXT(
 		vkCmdSetFrontFaceEXT(
 			commandBuffers.at(currentFrame), Vulkan::getFrontFace(states.back().winding));
 			commandBuffers.at(currentFrame), Vulkan::getFrontFace(states.back().winding));
 	}
 	}
+#endif
 }
 }
 
 
 void Graphics::beginFrame()
 void Graphics::beginFrame()
@@ -1091,9 +1099,9 @@ void Graphics::createVulkanInstance()
 	VkApplicationInfo appInfo{};
 	VkApplicationInfo appInfo{};
 	appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
 	appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
 	appInfo.pApplicationName = "LOVE";
 	appInfo.pApplicationName = "LOVE";
-	appInfo.applicationVersion = VK_MAKE_API_VERSION(0, 1, 0, 0);	//todo, get this version from somewhere else?
 	appInfo.pEngineName = "LOVE Engine";
 	appInfo.pEngineName = "LOVE Engine";
-	appInfo.engineVersion = VK_MAKE_API_VERSION(0, VERSION_MAJOR, VERSION_MINOR, VERSION_REV);
+	appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);	//todo, get this version from somewhere else?
+	appInfo.engineVersion = VK_MAKE_VERSION(VERSION_MAJOR, VERSION_MINOR, VERSION_REV);
 	appInfo.apiVersion = vulkanApiVersion;
 	appInfo.apiVersion = vulkanApiVersion;
 
 
 	VkInstanceCreateInfo createInfo{};
 	VkInstanceCreateInfo createInfo{};
@@ -1303,8 +1311,10 @@ static void findOptionalDeviceExtensions(VkPhysicalDevice physicalDevice, Option
 
 
 	for (const auto& extension : availableExtensions)
 	for (const auto& extension : availableExtensions)
 	{
 	{
+#ifdef VK_EXT_extended_dynamic_state
 		if (strcmp(extension.extensionName, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME) == 0)
 		if (strcmp(extension.extensionName, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME) == 0)
 			optionalDeviceFeatures.extendedDynamicState = true;
 			optionalDeviceFeatures.extendedDynamicState = true;
+#endif
 		if (strcmp(extension.extensionName, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME) == 0)
 		if (strcmp(extension.extensionName, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME) == 0)
 			optionalDeviceFeatures.memoryRequirements2 = true;
 			optionalDeviceFeatures.memoryRequirements2 = true;
 		if (strcmp(extension.extensionName, VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0)
 		if (strcmp(extension.extensionName, VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0)
@@ -1364,8 +1374,10 @@ void Graphics::createLogicalDevice()
 	createInfo.pEnabledFeatures = &deviceFeatures;
 	createInfo.pEnabledFeatures = &deviceFeatures;
 
 
 	std::vector<const char*> enabledExtensions(deviceExtensions.begin(), deviceExtensions.end());
 	std::vector<const char*> enabledExtensions(deviceExtensions.begin(), deviceExtensions.end());
+#ifdef VK_EXT_extended_dynamic_state
 	if (optionalDeviceFeatures.extendedDynamicState)
 	if (optionalDeviceFeatures.extendedDynamicState)
 		enabledExtensions.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
 		enabledExtensions.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+#endif
 	if (optionalDeviceFeatures.memoryRequirements2)
 	if (optionalDeviceFeatures.memoryRequirements2)
 		enabledExtensions.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
 		enabledExtensions.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
 	if (optionalDeviceFeatures.dedicatedAllocation)
 	if (optionalDeviceFeatures.dedicatedAllocation)
@@ -1392,12 +1404,14 @@ void Graphics::createLogicalDevice()
 	else
 	else
 		createInfo.enabledLayerCount = 0;
 		createInfo.enabledLayerCount = 0;
 
 
+#ifdef VK_EXT_extended_dynamic_state
 	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;
 	extendedDynamicStateFeatures.extendedDynamicState = Vulkan::getBool(optionalDeviceFeatures.extendedDynamicState);
 	extendedDynamicStateFeatures.extendedDynamicState = Vulkan::getBool(optionalDeviceFeatures.extendedDynamicState);
 	extendedDynamicStateFeatures.pNext = nullptr;
 	extendedDynamicStateFeatures.pNext = nullptr;
 
 
 	createInfo.pNext = &extendedDynamicStateFeatures;
 	createInfo.pNext = &extendedDynamicStateFeatures;
+#endif
 
 
 	if (vkCreateDevice(physicalDevice, &createInfo, nullptr, &device) != VK_SUCCESS)
 	if (vkCreateDevice(physicalDevice, &createInfo, nullptr, &device) != VK_SUCCESS)
 		throw love::Exception("failed to create logical device");
 		throw love::Exception("failed to create logical device");
@@ -1444,8 +1458,10 @@ void Graphics::initVMA()
 	vulkanFunctions.vkBindImageMemory2KHR = vkBindImageMemory2KHR;
 	vulkanFunctions.vkBindImageMemory2KHR = vkBindImageMemory2KHR;
 	vulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR = vkGetPhysicalDeviceMemoryProperties2KHR;
 	vulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR = vkGetPhysicalDeviceMemoryProperties2KHR;
 
 
+#ifdef VK_KHR_maintenance4
 	vulkanFunctions.vkGetDeviceBufferMemoryRequirements = vkGetDeviceBufferMemoryRequirements;
 	vulkanFunctions.vkGetDeviceBufferMemoryRequirements = vkGetDeviceBufferMemoryRequirements;
 	vulkanFunctions.vkGetDeviceImageMemoryRequirements = vkGetDeviceImageMemoryRequirements;
 	vulkanFunctions.vkGetDeviceImageMemoryRequirements = vkGetDeviceImageMemoryRequirements;
+#endif
 
 
 	allocatorCreateInfo.pVulkanFunctions = &vulkanFunctions;
 	allocatorCreateInfo.pVulkanFunctions = &vulkanFunctions;
 
 
@@ -1974,7 +1990,11 @@ void Graphics::prepareDraw(const VertexAttributes &attributes, const BufferBindi
 	configuration.primitiveType = primitiveType;
 	configuration.primitiveType = primitiveType;
 
 
 	if (optionalDeviceFeatures.extendedDynamicState)
 	if (optionalDeviceFeatures.extendedDynamicState)
+#ifdef VK_EXT_extended_dynamic_state
 		vkCmdSetCullModeEXT(commandBuffers.at(currentFrame), Vulkan::getCullMode(cullmode));
 		vkCmdSetCullModeEXT(commandBuffers.at(currentFrame), Vulkan::getCullMode(cullmode));
+#else
+		;
+#endif
 	else
 	else
 	{
 	{
 		configuration.dynamicState.winding = states.back().winding;
 		configuration.dynamicState.winding = states.back().winding;
@@ -2311,7 +2331,8 @@ VkPipeline Graphics::createGraphicsPipeline(GraphicsPipelineConfiguration &confi
 	colorBlending.blendConstants[3] = 0.0f;
 	colorBlending.blendConstants[3] = 0.0f;
 
 
 	std::vector<VkDynamicState> dynamicStates;
 	std::vector<VkDynamicState> dynamicStates;
-	
+
+#ifdef VK_EXT_extended_dynamic_state
 	if (optionalDeviceFeatures.extendedDynamicState)
 	if (optionalDeviceFeatures.extendedDynamicState)
 		dynamicStates = {
 		dynamicStates = {
 			VK_DYNAMIC_STATE_SCISSOR,
 			VK_DYNAMIC_STATE_SCISSOR,
@@ -2326,6 +2347,7 @@ VkPipeline Graphics::createGraphicsPipeline(GraphicsPipelineConfiguration &confi
 			VK_DYNAMIC_STATE_STENCIL_OP_EXT,
 			VK_DYNAMIC_STATE_STENCIL_OP_EXT,
 		};
 		};
 	else
 	else
+#endif
 		dynamicStates = {
 		dynamicStates = {
 			VK_DYNAMIC_STATE_SCISSOR,
 			VK_DYNAMIC_STATE_SCISSOR,
 			VK_DYNAMIC_STATE_VIEWPORT,
 			VK_DYNAMIC_STATE_VIEWPORT,

+ 20 - 0
src/modules/graphics/vulkan/VulkanWrapper.h

@@ -1,5 +1,25 @@
 #pragma once
 #pragma once
 
 
+#define VK_NO_PROTOTYPES
+#include <vulkan/vulkan.h>
+
+#ifndef VK_MAKE_API_VERSION 
+#define VK_MAKE_API_VERSION(variant, major, minor, patch) \
+    ((((uint32_t)(variant)) << 29) | (((uint32_t)(major)) << 22) | (((uint32_t)(minor)) << 12) | ((uint32_t)(patch)))
+#endif
+
+#ifndef VK_API_VERSION_MAJOR
+#define VK_API_VERSION_MAJOR(version) (((uint32_t)(version) >> 22) & 0x7FU)
+#endif
+
+#ifndef VK_API_VERSION_MINOR
+#define VK_API_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3FFU)
+#endif
+
+#ifndef VK_API_VERSION_PATCH
+#define VK_API_VERSION_PATCH(version) ((uint32_t)(version) & 0xFFFU)
+#endif
+
 #include "volk.h"
 #include "volk.h"
 #define VMA_STATIC_VULKAN_FUNCTIONS 0
 #define VMA_STATIC_VULKAN_FUNCTIONS 0
 #define VMA_DYNAMIC_VULKAN_FUNCTIONS 0
 #define VMA_DYNAMIC_VULKAN_FUNCTIONS 0