Parcourir la source

Feature: Vulkan now properly supports read-only depth + writable stencil (and vice versa)
- Required Vulkan SDK version was updated to 1.0.65.1

BearishSun il y a 8 ans
Parent
commit
1cebaa278f

+ 1 - 1
Documentation/GitHub/compiling.md

@@ -89,7 +89,7 @@ The following dependencies will need to be installed manually. Which ones are re
   - (Or equivalent packages for your distribution)
   - (Or equivalent packages for your distribution)
 
 
 **All OS**
 **All OS**
-  - **Vulkan SDK** (Optional) 
+  - **Vulkan SDK 1.0.65.1** (Optional) 
     - Only needed if you selected the Vulkan render API during build configuration
     - Only needed if you selected the Vulkan render API during build configuration
     - https://lunarg.com/vulkan-sdk/
     - https://lunarg.com/vulkan-sdk/
     - Set up VULKAN_SDK environment variable pointing to your instalation
     - Set up VULKAN_SDK environment variable pointing to your instalation

+ 9 - 3
Source/BansheeVulkanRenderAPI/BsVulkanCommandBuffer.cpp

@@ -1739,10 +1739,16 @@ namespace bs { namespace ct
 							if (readMask.isSet(RT_STENCIL))
 							if (readMask.isSet(RT_STENCIL))
 								return VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
 								return VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
 							else // Depth readable but stencil isn't
 							else // Depth readable but stencil isn't
-								return VK_IMAGE_LAYOUT_GENERAL;
+								return VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR;
+						}
+						else
+						{
+							if (readMask.isSet(RT_STENCIL)) // Stencil readable but depth isn't
+								return VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR;
+							else 
+								return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+							
 						}
 						}
-
-						return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
 					}
 					}
 					else // It is a color attachment
 					else // It is a color attachment
 					{
 					{

+ 2 - 1
Source/BansheeVulkanRenderAPI/BsVulkanDevice.cpp

@@ -80,7 +80,8 @@ namespace bs { namespace ct
 		// Create logical device
 		// Create logical device
 		const char* extensions[] = { 
 		const char* extensions[] = { 
 			VK_KHR_SWAPCHAIN_EXTENSION_NAME,
 			VK_KHR_SWAPCHAIN_EXTENSION_NAME,
-			VK_KHR_MAINTENANCE1_EXTENSION_NAME
+			VK_KHR_MAINTENANCE1_EXTENSION_NAME,
+			VK_KHR_MAINTENANCE2_EXTENSION_NAME
 		};
 		};
 		uint32_t numExtensions = sizeof(extensions) / sizeof(extensions[0]);
 		uint32_t numExtensions = sizeof(extensions) / sizeof(extensions[0]);
 
 

+ 7 - 2
Source/BansheeVulkanRenderAPI/BsVulkanFramebuffer.cpp

@@ -254,10 +254,15 @@ namespace bs { namespace ct
 				if (readMask.isSet(RT_STENCIL))
 				if (readMask.isSet(RT_STENCIL))
 					attachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
 					attachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
 				else // Depth readable but stencil isn't
 				else // Depth readable but stencil isn't
-					attachmentRef.layout = VK_IMAGE_LAYOUT_GENERAL;
+					attachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR;
 			}
 			}
 			else
 			else
-				attachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+			{
+				if (readMask.isSet(RT_STENCIL)) // Stencil readable but depth isn't
+					attachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR;
+				else 
+					attachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+			}
 		}
 		}
 
 
 		VkDevice device = mOwner->getDevice().getLogical();
 		VkDevice device = mOwner->getDevice().getLogical();

+ 2 - 0
Source/BansheeVulkanRenderAPI/BsVulkanTexture.cpp

@@ -375,6 +375,8 @@ namespace bs { namespace ct
 			accessFlags = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
 			accessFlags = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
 			break;
 			break;
 		case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
 		case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
+		case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR:
+		case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR:
 			accessFlags = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT;
 			accessFlags = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT;
 			break;
 			break;
 		case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
 		case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: