From 5dfe0d077d8b58eb04e99e4fd1ec257d3b9dc488 Mon Sep 17 00:00:00 2001
From: Philip Rebohle <philip.rebohle@tu-dortmund.de>
Date: Tue, 19 Jun 2018 11:28:54 +0200
Subject: [PATCH] [d3d11] Fix render target layouts for linar tiling

There currently doesn't seem to be a game which actually renders
to images with linear tiling, but we should handle this anyway.
Only the GENERAL layout is allowed if the tiling is not OPTIMAL.
---
 src/d3d11/d3d11_view_dsv.h | 22 +++++++++++++---------
 src/d3d11/d3d11_view_rtv.h |  5 +++--
 2 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/src/d3d11/d3d11_view_dsv.h b/src/d3d11/d3d11_view_dsv.h
index 71232bb4..f3d471dc 100644
--- a/src/d3d11/d3d11_view_dsv.h
+++ b/src/d3d11/d3d11_view_dsv.h
@@ -46,15 +46,19 @@ namespace dxvk {
     }
     
     VkImageLayout GetRenderLayout() const {
-      switch (m_desc.Flags & (D3D11_DSV_READ_ONLY_DEPTH | D3D11_DSV_READ_ONLY_STENCIL)) {
-        default:  // case 0
-          return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
-        case D3D11_DSV_READ_ONLY_DEPTH:
-          return VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR;
-        case D3D11_DSV_READ_ONLY_STENCIL:
-          return VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR;
-        case D3D11_DSV_READ_ONLY_DEPTH | D3D11_DSV_READ_ONLY_STENCIL:
-          return VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
+      if (m_view->imageInfo().tiling == VK_IMAGE_TILING_OPTIMAL) {
+        switch (m_desc.Flags & (D3D11_DSV_READ_ONLY_DEPTH | D3D11_DSV_READ_ONLY_STENCIL)) {
+          default:  // case 0
+            return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+          case D3D11_DSV_READ_ONLY_DEPTH:
+            return VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR;
+          case D3D11_DSV_READ_ONLY_STENCIL:
+            return VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR;
+          case D3D11_DSV_READ_ONLY_DEPTH | D3D11_DSV_READ_ONLY_STENCIL:
+            return VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
+        }
+      } else {
+        return VK_IMAGE_LAYOUT_GENERAL;
       }
     }
     
diff --git a/src/d3d11/d3d11_view_rtv.h b/src/d3d11/d3d11_view_rtv.h
index 7927e387..a5134371 100644
--- a/src/d3d11/d3d11_view_rtv.h
+++ b/src/d3d11/d3d11_view_rtv.h
@@ -42,8 +42,9 @@ namespace dxvk {
     }
     
     VkImageLayout GetRenderLayout() const {
-      // Currently no reason to use anything else
-      return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+      return m_view->imageInfo().tiling == VK_IMAGE_TILING_OPTIMAL
+        ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
+        : VK_IMAGE_LAYOUT_GENERAL;
     }
     
     static HRESULT GetDescFromResource(