TextureVk: Replace swapchain specific layout getter with general one

The swapchain needs to get the current layout of the only subresource of
some textures when it needs to do a blit. This helper isn't just useful
for swapchains so make it more general to get the layout of any specific
subresource.

Change-Id: I7ddd019e1cc7c44f9394d9c75336206aebdbce94
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/207674
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Loko Kung <lokokung@google.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/dawn/native/vulkan/SwapChainVk.cpp b/src/dawn/native/vulkan/SwapChainVk.cpp
index 19a7ddc..5e52789 100644
--- a/src/dawn/native/vulkan/SwapChainVk.cpp
+++ b/src/dawn/native/vulkan/SwapChainVk.cpp
@@ -411,9 +411,9 @@
                                 static_cast<int32_t>(mTexture->GetHeight(Aspect::Color)), 1};
 
         device->fn.CmdBlitImage(recordingContext->commandBuffer, mBlitTexture->GetHandle(),
-                                mBlitTexture->GetCurrentLayoutForSwapChain(), mTexture->GetHandle(),
-                                mTexture->GetCurrentLayoutForSwapChain(), 1, &region,
-                                VK_FILTER_LINEAR);
+                                mBlitTexture->GetCurrentLayout(Aspect::Color),
+                                mTexture->GetHandle(), mTexture->GetCurrentLayout(Aspect::Color), 1,
+                                &region, VK_FILTER_LINEAR);
 
         // TODO(crbug.com/dawn/269): Find a way to reuse the blit texture between frames
         // instead of creating a new one every time. This will involve "un-destroying" the
diff --git a/src/dawn/native/vulkan/TextureVk.cpp b/src/dawn/native/vulkan/TextureVk.cpp
index 81f5a9d..99d0223 100644
--- a/src/dawn/native/vulkan/TextureVk.cpp
+++ b/src/dawn/native/vulkan/TextureVk.cpp
@@ -1241,9 +1241,12 @@
     return {};
 }
 
-VkImageLayout Texture::GetCurrentLayoutForSwapChain() const {
+VkImageLayout Texture::GetCurrentLayout(Aspect aspect,
+                                        uint32_t arrayLayer,
+                                        uint32_t mipLevel) const {
     DAWN_ASSERT(GetFormat().aspects == Aspect::Color);
-    return VulkanImageLayout(GetFormat(), mSubresourceLastSyncInfos.Get(Aspect::Color, 0, 0).usage);
+    return VulkanImageLayout(GetFormat(),
+                             mSubresourceLastSyncInfos.Get(aspect, arrayLayer, mipLevel).usage);
 }
 
 bool Texture::UseCombinedAspects() const {
@@ -1607,18 +1610,16 @@
 MaybeError ImportedTextureBase::EndAccess(ExternalSemaphoreHandle* handle,
                                           VkImageLayout* releasedOldLayout,
                                           VkImageLayout* releasedNewLayout) {
+    DAWN_ASSERT(GetNumMipLevels() == 1 && GetArrayLayers() == 1);
+
     // Release the texture
     mExternalState = ExternalState::Released;
 
-    DAWN_ASSERT(GetNumMipLevels() == 1 && GetArrayLayers() == 1);
-    wgpu::TextureUsage usage =
-        mSubresourceLastSyncInfos.Get(GetDisjointVulkanAspects(), 0, 0).usage;
-
     // Compute the layouts for the queue transition for export. desiredLayout == UNDEFINED is a tag
     // value used to export with whatever the current layout is. However queue transitioning to the
     // UNDEFINED layout is disallowed so we handle the case where currentLayout is UNDEFINED by
     // promoting to GENERAL.
-    VkImageLayout currentLayout = VulkanImageLayout(GetFormat(), usage);
+    VkImageLayout currentLayout = GetCurrentLayout(GetDisjointVulkanAspects());
     VkImageLayout targetLayout;
     if (currentLayout != VK_IMAGE_LAYOUT_UNDEFINED) {
         targetLayout = currentLayout;
diff --git a/src/dawn/native/vulkan/TextureVk.h b/src/dawn/native/vulkan/TextureVk.h
index 93edce0..fd39adb 100644
--- a/src/dawn/native/vulkan/TextureVk.h
+++ b/src/dawn/native/vulkan/TextureVk.h
@@ -75,7 +75,9 @@
     // Returns the aspects used for tracking of Vulkan state. These can be the combined aspects.
     Aspect GetDisjointVulkanAspects() const;
 
-    VkImageLayout GetCurrentLayoutForSwapChain() const;
+    VkImageLayout GetCurrentLayout(Aspect aspect,
+                                   uint32_t arrayLayer = 0,
+                                   uint32_t mipLevel = 0) const;
 
     // Transitions the texture to be used as `usage`, recording any necessary barrier in
     // `commands`.