Browse Source

Some Vulkan additions

Panagiotis Christopoulos Charitos 9 years ago
parent
commit
f0c018c05e
3 changed files with 41 additions and 3 deletions
  1. 1 0
      src/anki/core/Config.cpp
  2. 38 2
      src/anki/gr/vulkan/GrManagerImpl.cpp
  3. 2 1
      tests/gr/Gr.cpp

+ 1 - 0
src/anki/core/Config.cpp

@@ -88,6 +88,7 @@ Config::Config()
 	newOption("glminor", 5);
 	newOption("glminor", 5);
 	newOption("fullscreenDesktopResolution", false);
 	newOption("fullscreenDesktopResolution", false);
 	newOption("debugContext", false);
 	newOption("debugContext", false);
+	newOption("vsync", false);
 }
 }
 
 
 Config::~Config()
 Config::~Config()

+ 38 - 2
src/anki/gr/vulkan/GrManagerImpl.cpp

@@ -354,6 +354,42 @@ Error GrManagerImpl::initSwapchain(const GrManagerInitInfo& init)
 		return ErrorCode::FUNCTION_FAILED;
 		return ErrorCode::FUNCTION_FAILED;
 	}
 	}
 
 
+	// Chose present mode
+	uint32_t presentModeCount;
+	vkGetPhysicalDeviceSurfacePresentModesKHR(m_physicalDevice, m_surface, &presentModeCount, nullptr);
+	presentModeCount = min(presentModeCount, 4u);
+	Array<VkPresentModeKHR, 4> presentModes;
+	vkGetPhysicalDeviceSurfacePresentModesKHR(m_physicalDevice, m_surface, &presentModeCount, &presentModes[0]);
+
+	VkPresentModeKHR presentMode = VK_PRESENT_MODE_MAX_ENUM_KHR;
+	if(init.m_config->getNumber("vsync"))
+	{
+		presentMode = VK_PRESENT_MODE_FIFO_KHR;
+	}
+	else
+	{
+		for(U i = 0; i < presentModeCount; ++i)
+		{
+			if(presentModes[i] == VK_PRESENT_MODE_MAILBOX_KHR)
+			{
+				presentMode = VK_PRESENT_MODE_MAILBOX_KHR;
+				break;
+			}
+			else if(presentModes[i] == VK_PRESENT_MODE_IMMEDIATE_KHR)
+			{
+				presentMode = VK_PRESENT_MODE_IMMEDIATE_KHR;
+				break;
+			}
+		}
+	}
+
+	if(presentMode == VK_PRESENT_MODE_MAX_ENUM_KHR)
+	{
+		ANKI_LOGE("VK: Couldn't find a present mode");
+		return ErrorCode::FUNCTION_FAILED;
+	}
+
+	// Create swapchain
 	VkSwapchainCreateInfoKHR ci = {};
 	VkSwapchainCreateInfoKHR ci = {};
 	ci.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
 	ci.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
 	ci.surface = m_surface;
 	ci.surface = m_surface;
@@ -368,7 +404,7 @@ Error GrManagerImpl::initSwapchain(const GrManagerInitInfo& init)
 	ci.pQueueFamilyIndices = &m_queueIdx;
 	ci.pQueueFamilyIndices = &m_queueIdx;
 	ci.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
 	ci.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
 	ci.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
 	ci.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
-	ci.presentMode = VK_PRESENT_MODE_FIFO_KHR;
+	ci.presentMode = presentMode;
 	ci.clipped = false;
 	ci.clipped = false;
 	ci.oldSwapchain = VK_NULL_HANDLE;
 	ci.oldSwapchain = VK_NULL_HANDLE;
 
 
@@ -383,7 +419,7 @@ Error GrManagerImpl::initSwapchain(const GrManagerInitInfo& init)
 		return ErrorCode::FUNCTION_FAILED;
 		return ErrorCode::FUNCTION_FAILED;
 	}
 	}
 
 
-	ANKI_LOGI("VK: Swapchain images count %u", count);
+	ANKI_LOGI("VK: Created a swapchain. Image count: %u, present mode: %u", count, presentMode);
 
 
 	Array<VkImage, MAX_FRAMES_IN_FLIGHT> images;
 	Array<VkImage, MAX_FRAMES_IN_FLIGHT> images;
 	ANKI_VK_CHECK(vkGetSwapchainImagesKHR(m_device, m_swapchain, &count, &images[0]));
 	ANKI_VK_CHECK(vkGetSwapchainImagesKHR(m_device, m_swapchain, &count, &images[0]));

+ 2 - 1
tests/gr/Gr.cpp

@@ -288,7 +288,8 @@ static void createGrManager(NativeWindow*& win, GrManager*& gr)
 	gr = new GrManager();
 	gr = new GrManager();
 
 
 	Config cfg;
 	Config cfg;
-	cfg.set("debugContext", 1);
+	cfg.set("debugContext", true);
+	cfg.set("vsync", false);
 	GrManagerInitInfo inf;
 	GrManagerInitInfo inf;
 	inf.m_allocCallback = allocAligned;
 	inf.m_allocCallback = allocAligned;
 	inf.m_cacheDirectory = "./";
 	inf.m_cacheDirectory = "./";