Pablo Escobar 5 лет назад
Родитель
Сommit
1c9e6e6bb6
1 измененных файлов с 61 добавлено и 122 удалено
  1. 61 122
      src/renderer_vk.cpp

+ 61 - 122
src/renderer_vk.cpp

@@ -898,6 +898,15 @@ VK_IMPORT_DEVICE
 				return VK_ERROR_INITIALIZATION_FAILED;
 			}
 
+			if (m_numSwapchainImages > BX_COUNTOF(m_backBufferColorImage))
+			{
+				BX_TRACE("Create swapchain error: vkGetSwapchainImagesKHR: numSwapchainImages %d > countof(m_backBufferColorImage) %d."
+					, m_numSwapchainImages
+					, BX_COUNTOF(m_backBufferColorImage)
+				);
+				return VK_ERROR_INITIALIZATION_FAILED;
+			}
+
 			result = vkGetSwapchainImagesKHR(m_device, m_swapchain, &m_numSwapchainImages, &m_backBufferColorImage[0]);
 			if (VK_SUCCESS != result && VK_INCOMPLETE != result)
 			{
@@ -937,18 +946,7 @@ VK_IMPORT_DEVICE
 			VkMemoryRequirements mr;
 			vkGetImageMemoryRequirements(m_device, m_backBufferDepthStencilImage, &mr);
 
-			VkMemoryAllocateInfo ma;
-			ma.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
-			ma.pNext = NULL;
-			ma.allocationSize = mr.size;
-			ma.memoryTypeIndex = selectMemoryType(mr.memoryTypeBits
-				, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
-			);
-			result = vkAllocateMemory(m_device
-				, &ma
-				, m_allocatorCb
-				, &m_backBufferDepthStencilMemory
-			);
+			result = allocateMemory(&mr, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &m_backBufferDepthStencilMemory);
 
 			if (VK_SUCCESS != result)
 			{
@@ -1299,21 +1297,17 @@ VK_IMPORT
 					BX_UNUSED(s_allocationCb);
 				}
 
-				result = vkCreateInstance(&ici
-						, m_allocatorCb
-						, &m_instance
-						);
-
-				if (result == VK_ERROR_LAYER_NOT_PRESENT)
-                {
-					ici.enabledLayerCount   = BX_COUNTOF(fallbackLayerNames) - 1;
-					ici.ppEnabledLayerNames = fallbackLayerNames;
-
+				do
+				{
 					result = vkCreateInstance(&ici
 							, m_allocatorCb
 							, &m_instance
 							);
+
+					ici.enabledLayerCount   = ici.ppEnabledLayerNames != fallbackLayerNames ? BX_COUNTOF(fallbackLayerNames) - 1 : 0;
+					ici.ppEnabledLayerNames = ici.ppEnabledLayerNames != fallbackLayerNames ? fallbackLayerNames : NULL;
 				}
+				while (result == VK_ERROR_LAYER_NOT_PRESENT);
 			}
 
 			if (VK_SUCCESS != result)
@@ -1939,7 +1933,7 @@ VK_IMPORT_DEVICE
 				m_sci.pNext = NULL;
 				m_sci.flags = 0;
 				m_sci.surface = m_surface;
-				m_sci.minImageCount   = 2;
+				m_sci.minImageCount   = surfaceCapabilities.minImageCount;
 				m_sci.imageFormat     = m_backBufferColorFormat.format;
 				m_sci.imageColorSpace = m_backBufferColorFormat.colorSpace;
 				m_sci.imageExtent.width  = width;
@@ -4071,9 +4065,9 @@ VK_IMPORT_DEVICE
 //			VK_CHECK(vkWaitForFences(m_device, 1, &m_fence, true, INT64_MAX) );
 		}
 
-		uint32_t selectMemoryType(uint32_t _memoryTypeBits, uint32_t _propertyFlags) const
+		int32_t selectMemoryType(uint32_t _memoryTypeBits, uint32_t _propertyFlags, int32_t _startIndex = 0) const
 		{
-			for (uint32_t ii = 0, num = m_memoryProperties.memoryTypeCount; ii < num; ++ii)
+			for (int32_t ii = _startIndex, num = m_memoryProperties.memoryTypeCount; ii < num; ++ii)
 			{
 				const VkMemoryType& memType = m_memoryProperties.memoryTypes[ii];
 				if ( (0 != ( (1<<ii) & _memoryTypeBits) )
@@ -4084,7 +4078,35 @@ VK_IMPORT_DEVICE
 			}
 
 			BX_TRACE("Failed to find memory that supports flags 0x%08x.", _propertyFlags);
-			return 0;
+			return -1;
+		}
+
+		VkResult allocateMemory(const VkMemoryRequirements* requirements, VkMemoryPropertyFlags propertyFlags, VkDeviceMemory* memory) const
+		{
+			VkMemoryAllocateInfo ma;
+			ma.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+			ma.pNext = NULL;
+			ma.allocationSize = requirements->size;
+
+			VkResult result = VK_ERROR_UNKNOWN;
+			int32_t searchIndex = -1;
+			do
+			{
+				searchIndex++;
+				searchIndex = selectMemoryType(requirements->memoryTypeBits, propertyFlags, searchIndex);
+				if (searchIndex >= 0)
+				{
+					ma.memoryTypeIndex = searchIndex;
+					result = vkAllocateMemory(m_device
+						, &ma
+						, m_allocatorCb
+						, memory
+					);
+				}
+			}
+			while ((result == VK_ERROR_OUT_OF_HOST_MEMORY || result == VK_ERROR_OUT_OF_DEVICE_MEMORY) && searchIndex >= 0);
+
+			return result;
 		}
 
 		VkCommandBuffer beginNewCommand(VkCommandBufferUsageFlagBits commandBufferUsageFlag = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT)
@@ -4277,25 +4299,14 @@ VK_DESTROY
 			, &mr
 			);
 
-		VkMemoryAllocateInfo ma;
-		ma.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
-		ma.pNext = NULL;
-		ma.allocationSize  = mr.size;
-		ma.memoryTypeIndex = s_renderVK->selectMemoryType(mr.memoryTypeBits
-			, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
-			);
-		VK_CHECK(vkAllocateMemory(device
-			, &ma
-			, allocatorCb
-			, &m_deviceMem
-			) );
+		VK_CHECK(s_renderVK->allocateMemory(&mr, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &m_deviceMem) );
 
 		m_size = (uint32_t)mr.size;
 		m_pos  = 0;
 
 		VK_CHECK(vkBindBufferMemory(device, m_buffer, m_deviceMem, 0) );
 
-		VK_CHECK(vkMapMemory(device, m_deviceMem, 0, ma.allocationSize, 0, (void**)&m_data) );
+		VK_CHECK(vkMapMemory(device, m_deviceMem, 0, m_size, 0, (void**)&m_data) );
 	}
 
 	void ScratchBufferVK::destroy()
@@ -4368,15 +4379,7 @@ VK_DESTROY
 		VkMemoryRequirements mr;
 		vkGetImageMemoryRequirements(device, m_image, &mr);
 
-		VkMemoryAllocateInfo ma;
-		ma.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
-		ma.pNext = NULL;
-		ma.allocationSize  = mr.size;
-		ma.memoryTypeIndex = s_renderVK->selectMemoryType(
-			  mr.memoryTypeBits
-			, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
-			);
-		result = vkAllocateMemory(device, &ma, allocatorCb, &m_memory);
+		result = s_renderVK->allocateMemory(&mr, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &m_memory);
 
 		if (VK_SUCCESS != result)
 		{
@@ -4473,15 +4476,7 @@ VK_DESTROY
 		VkMemoryRequirements mr;
 		vkGetBufferMemoryRequirements(device, m_buffer, &mr);
 
-		VkMemoryAllocateInfo ma;
-		ma.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
-		ma.pNext = NULL;
-		ma.allocationSize  = mr.size;
-		ma.memoryTypeIndex = s_renderVK->selectMemoryType(
-			  mr.memoryTypeBits
-			, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
-			);
-		VK_CHECK(vkAllocateMemory(device, &ma, allocatorCb, &m_deviceMem) );
+		VK_CHECK(s_renderVK->allocateMemory(&mr, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &m_deviceMem));
 
 		VK_CHECK(vkBindBufferMemory(device, m_buffer, m_deviceMem, 0));
 
@@ -4512,22 +4507,12 @@ VK_DESTROY
 
 			vkGetBufferMemoryRequirements(device, stagingBuffer, &mr);
 
-			ma.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
-			ma.pNext = NULL;
-			ma.allocationSize = mr.size;
-			ma.memoryTypeIndex = s_renderVK->selectMemoryType(mr.memoryTypeBits
-				, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
-			);
-			VK_CHECK(vkAllocateMemory(device
-				, &ma
-				, allocatorCb
-				, &stagingMem
-			));
+			VK_CHECK(s_renderVK->allocateMemory(&mr, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &stagingMem));
 
 			VK_CHECK(vkBindBufferMemory(device, stagingBuffer, stagingMem, 0));
 
 			void* dst;
-			VK_CHECK(vkMapMemory(device, stagingMem, 0, ma.allocationSize, 0, &dst));
+			VK_CHECK(vkMapMemory(device, stagingMem, 0, mr.size, 0, &dst));
 			bx::memCopy(dst, _data, _size);
 			vkUnmapMemory(device, stagingMem);
 
@@ -4584,23 +4569,12 @@ VK_DESTROY
 			, &mr
 		);
 
-		VkMemoryAllocateInfo ma;
-		ma.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
-		ma.pNext = NULL;
-		ma.allocationSize = mr.size;
-		ma.memoryTypeIndex = s_renderVK->selectMemoryType(mr.memoryTypeBits
-			, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
-		);
-		VK_CHECK(vkAllocateMemory(device
-			, &ma
-			, allocatorCb
-			, &stagingMem
-		));
+		VK_CHECK(s_renderVK->allocateMemory(&mr, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &stagingMem));
 
 		VK_CHECK(vkBindBufferMemory(device, stagingBuffer, stagingMem, 0));
 
 		void* dst;
-		VK_CHECK(vkMapMemory(device, stagingMem, 0, ma.allocationSize, 0, &dst));
+		VK_CHECK(vkMapMemory(device, stagingMem, 0, mr.size, 0, &dst));
 		bx::memCopy(dst, _data, _size);
 		vkUnmapMemory(device, stagingMem);
 
@@ -5276,20 +5250,7 @@ VK_DESTROY
 					, &mr
 					);
 
-				VkMemoryAllocateInfo ma;
-				ma.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
-				ma.pNext = NULL;
-				ma.allocationSize = mr.size;
-				ma.memoryTypeIndex = s_renderVK->selectMemoryType(
-					  mr.memoryTypeBits
-					, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
-					);
-				VK_CHECK(vkAllocateMemory(
-					  device
-					, &ma
-					, allocatorCb
-					, &stagingDeviceMem
-					));
+				VK_CHECK(s_renderVK->allocateMemory(&mr, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &stagingDeviceMem));
 
 				VK_CHECK(vkBindBufferMemory(
 					  device
@@ -5301,7 +5262,7 @@ VK_DESTROY
 					  device
 					, stagingDeviceMem
 					, 0
-					, ma.allocationSize
+					, mr.size
 					, 0
 					, (void**)& m_directAccessPtr
 					));
@@ -5360,16 +5321,7 @@ VK_DESTROY
 			VkMemoryRequirements imageMemReq;
 			vkGetImageMemoryRequirements(device, m_textureImage, &imageMemReq);
 
-			VkMemoryAllocateInfo imai;
-			imai.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
-			imai.pNext = NULL;
-			imai.allocationSize = imageMemReq.size;
-			imai.memoryTypeIndex = s_renderVK->selectMemoryType(
-				  imageMemReq.memoryTypeBits
-				, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
-				);
-
-			VK_CHECK(vkAllocateMemory(device, &imai, allocatorCb, &m_textureDeviceMem));
+			VK_CHECK(s_renderVK->allocateMemory(&imageMemReq, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &m_textureDeviceMem));
 
 			vkBindImageMemory(device, m_textureImage, m_textureDeviceMem, 0);
 
@@ -5527,24 +5479,11 @@ VK_DESTROY
 			, &mr
 			);
 
-		VkMemoryAllocateInfo ma;
-		ma.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
-		ma.pNext = NULL;
-		ma.allocationSize = mr.size;
-		ma.memoryTypeIndex = s_renderVK->selectMemoryType(
-			  mr.memoryTypeBits
-			, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
-			);
-		VK_CHECK(vkAllocateMemory(
-			  device
-			, &ma
-			, allocatorCb
-			, &stagingDeviceMem
-			));
+		VK_CHECK(s_renderVK->allocateMemory(&mr, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &stagingDeviceMem));
 
 		void* directAccessPtr = NULL;
 		VK_CHECK(vkBindBufferMemory(device, stagingBuffer, stagingDeviceMem, 0));
-		VK_CHECK(vkMapMemory(device, stagingDeviceMem, 0, ma.allocationSize, 0, (void**)&directAccessPtr));
+		VK_CHECK(vkMapMemory(device, stagingDeviceMem, 0, mr.size, 0, (void**)&directAccessPtr));
 		bx::memCopy(directAccessPtr, _mem->data, size_t(bci.size));
 		vkUnmapMemory(device, stagingDeviceMem);