Просмотр исходного кода

When changingVulkan storage texture layouts, always change the entire texture, instead of a single surface

BearishSun 9 лет назад
Родитель
Сommit
e04b076426
1 измененных файлов с 8 добавлено и 4 удалено
  1. 8 4
      Source/BansheeVulkanRenderAPI/Source/BsVulkanGpuParams.cpp

+ 8 - 4
Source/BansheeVulkanRenderAPI/Source/BsVulkanGpuParams.cpp

@@ -368,16 +368,20 @@ namespace bs
 			if (resource == nullptr)
 			if (resource == nullptr)
 				continue;
 				continue;
 
 
+			const TextureProperties& props = element->getProperties();
 			VkAccessFlags accessFlags = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;
 			VkAccessFlags accessFlags = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;
 			VulkanUseFlags useFlags = VulkanUseFlag::Read | VulkanUseFlag::Write;
 			VulkanUseFlags useFlags = VulkanUseFlag::Read | VulkanUseFlag::Write;
 
 
 			const TextureSurface& surface = mLoadStoreSurfaces[i];
 			const TextureSurface& surface = mLoadStoreSurfaces[i];
 			VkImageSubresourceRange range;
 			VkImageSubresourceRange range;
 			range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
 			range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
-			range.baseArrayLayer = surface.arraySlice;
-			range.layerCount = surface.numArraySlices;
-			range.baseMipLevel = surface.mipLevel;
-			range.levelCount = surface.numMipLevels;
+
+			// Note: Currently layout transitions are only supported for entire images, not individual subresources, so
+			// make sure to bind all faces/mipmaps
+			range.baseArrayLayer = 0;
+			range.layerCount = props.getNumFaces();
+			range.baseMipLevel = 0;
+			range.levelCount = props.getNumMipmaps();
 
 
 			buffer.registerResource(resource, accessFlags, VK_IMAGE_LAYOUT_GENERAL, range, useFlags);
 			buffer.registerResource(resource, accessFlags, VK_IMAGE_LAYOUT_GENERAL, range, useFlags);
 		}
 		}