From 8c34f4ff8ad9e20fa293892529b5cc53983d23a7 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sun, 27 Oct 2019 00:04:57 +0200 Subject: [PATCH] [dxvk] Validate image layouts in render pass formats read from cache This will discard invalid cache entries generated by DXVK 1.4.3. --- src/dxvk/dxvk_state_cache.cpp | 26 ++++++++++++++++++++++++++ src/dxvk/dxvk_state_cache.h | 3 +++ 2 files changed, 29 insertions(+) diff --git a/src/dxvk/dxvk_state_cache.cpp b/src/dxvk/dxvk_state_cache.cpp index e2b5a8ad1..a400f4238 100644 --- a/src/dxvk/dxvk_state_cache.cpp +++ b/src/dxvk/dxvk_state_cache.cpp @@ -553,6 +553,9 @@ namespace dxvk { entry.format.color[i].layout = unpackImageLayout(imageLayout); } + if (!validateRenderPassFormat(entry.format)) + return false; + // Read common pipeline state if (!data.read(entry.gpState.bsBindingMask) || !data.read(entry.gpState.ia) @@ -985,4 +988,27 @@ namespace dxvk { } } + + bool DxvkStateCache::validateRenderPassFormat( + const DxvkRenderPassFormat& format) { + bool valid = true; + + if (format.depth.format) { + valid &= format.depth.layout == VK_IMAGE_LAYOUT_GENERAL + || format.depth.layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL + || format.depth.layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL + || format.depth.layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL + || format.depth.layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL; + } + + for (uint32_t i = 0; i < MaxNumRenderTargets && valid; i++) { + if (format.color[i].format) { + valid &= format.color[i].layout == VK_IMAGE_LAYOUT_GENERAL + || format.color[i].layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + } + } + + return valid; + } + } diff --git a/src/dxvk/dxvk_state_cache.h b/src/dxvk/dxvk_state_cache.h index 80fab9126..f4992e330 100644 --- a/src/dxvk/dxvk_state_cache.h +++ b/src/dxvk/dxvk_state_cache.h @@ -186,6 +186,9 @@ namespace dxvk { static VkImageLayout unpackImageLayout( uint8_t layout); + static bool validateRenderPassFormat( + const DxvkRenderPassFormat& format); + }; } \ No newline at end of file