diff --git a/src/dxvk/dxvk_state_cache.cpp b/src/dxvk/dxvk_state_cache.cpp index e2b5a8ad..a400f423 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 80fab912..f4992e33 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