internal void TransitionImageLayout( VkCommandBuffer cb, uint baseMipLevel, uint levelCount, uint baseArrayLayer, uint layerCount, VkImageLayout newLayout) { if (_stagingBuffer != Vulkan.VkBuffer.Null) { return; } VkImageLayout oldLayout = _imageLayouts[CalculateSubresource(baseMipLevel, baseArrayLayer)]; #if DEBUG for (uint level = 0; level < levelCount; level++) { for (uint layer = 0; layer < layerCount; layer++) { if (_imageLayouts[CalculateSubresource(baseMipLevel + level, baseArrayLayer + layer)] != oldLayout) { throw new VeldridException("Unexpected image layout."); } } } #endif if (oldLayout != newLayout) { VkImageAspectFlags aspectMask; if ((Usage & TextureUsage.DepthStencil) != 0) { aspectMask = FormatHelpers.IsStencilFormat(Format) ? aspectMask = VkImageAspectFlags.Depth | VkImageAspectFlags.Stencil : aspectMask = VkImageAspectFlags.Depth; } else { aspectMask = VkImageAspectFlags.Color; } VulkanUtil.TransitionImageLayout( cb, OptimalDeviceImage, baseMipLevel, levelCount, baseArrayLayer, layerCount, aspectMask, _imageLayouts[CalculateSubresource(baseMipLevel, baseArrayLayer)], newLayout); for (uint level = 0; level < levelCount; level++) { for (uint layer = 0; layer < layerCount; layer++) { _imageLayouts[CalculateSubresource(baseMipLevel + level, baseArrayLayer + layer)] = newLayout; } } } }
internal void TransitionImageLayoutNonmatching( VkCommandBuffer cb, uint baseMipLevel, uint levelCount, uint baseArrayLayer, uint layerCount, VkImageLayout newLayout) { if (_stagingBuffer != Vulkan.VkBuffer.Null) { return; } for (uint level = baseMipLevel; level < baseMipLevel + levelCount; level++) { for (uint layer = baseArrayLayer; layer < baseArrayLayer + layerCount; layer++) { uint subresource = CalculateSubresource(level, layer); VkImageLayout oldLayout = _imageLayouts[subresource]; if (oldLayout != newLayout) { VkImageAspectFlags aspectMask; if ((Usage & TextureUsage.DepthStencil) != 0) { aspectMask = FormatHelpers.IsStencilFormat(Format) ? VkImageAspectFlags.Depth | VkImageAspectFlags.Stencil : VkImageAspectFlags.Depth; } else { aspectMask = VkImageAspectFlags.Color; } VulkanUtil.TransitionImageLayout( cb, OptimalDeviceImage, level, 1, layer, 1, aspectMask, oldLayout, newLayout); _imageLayouts[subresource] = newLayout; } } } }
internal void TransitionImageLayout( VkCommandBuffer cb, uint baseMipLevel, uint levelCount, uint baseArrayLayer, uint layerCount, VkImageLayout newLayout) { if (_stagingBuffer != Vulkan.VkBuffer.Null) { return; } VkImageLayout oldLayout = _imageLayouts[CalculateSubresource(baseMipLevel, baseArrayLayer)]; #if DEBUG for (uint level = 0; level < levelCount; level++) { for (uint layer = 0; layer < layerCount; layer++) { if (_imageLayouts[CalculateSubresource(baseMipLevel + level, baseArrayLayer + layer)] != oldLayout) { throw new VeldridException("Unexpected image layout."); } } } #endif if (oldLayout != newLayout) { VulkanUtil.TransitionImageLayout( cb, OptimalDeviceImage, baseMipLevel, levelCount, baseArrayLayer, layerCount, _imageLayouts[CalculateSubresource(baseMipLevel, baseArrayLayer)], newLayout); for (uint level = 0; level < levelCount; level++) { for (uint layer = 0; layer < layerCount; layer++) { _imageLayouts[CalculateSubresource(baseMipLevel + level, baseArrayLayer + layer)] = newLayout; } } } }
internal void TransitionImageLayout( VkCommandBuffer cb, uint baseMipLevel, uint levelCount, uint baseArrayLayer, uint layerCount, VkImageLayout newLayout) { VkImageLayout oldLayout = _imageLayouts[CalculateSubresource(baseMipLevel, baseArrayLayer)]; #if DEBUG for (uint level = 0; level < levelCount; level++) { for (uint layer = 0; layer < layerCount; layer++) { if (_imageLayouts[CalculateSubresource(baseMipLevel + level, baseArrayLayer + layer)] != oldLayout) { throw new VeldridException("Unexpected image layout."); } } } #endif if (oldLayout != newLayout) { if (_stagingImages == null) { VulkanUtil.TransitionImageLayout( cb, OptimalDeviceImage, baseMipLevel, levelCount, baseArrayLayer, layerCount, _imageLayouts[CalculateSubresource(baseMipLevel, baseArrayLayer)], newLayout); for (uint level = 0; level < levelCount; level++) { for (uint layer = 0; layer < layerCount; layer++) { _imageLayouts[CalculateSubresource(baseMipLevel + level, baseArrayLayer + layer)] = newLayout; } } } else { // Transition each staging image one-by-one. for (uint arrayLayer = baseArrayLayer; arrayLayer < baseArrayLayer + layerCount; arrayLayer++) { for (uint level = baseMipLevel; level < baseMipLevel + levelCount; level++) { uint subresource = CalculateSubresource(level, arrayLayer); VkImage image = _stagingImages[subresource]; VulkanUtil.TransitionImageLayout( cb, image, 0, 1, 0, 1, _imageLayouts[subresource], newLayout); _imageLayouts[subresource] = newLayout; } } } } }