From 827a48fe5748736d91d807ec5d08287b7e4083fa Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 15 Mar 2021 14:39:21 +0000 Subject: [PATCH] Check sampler validity against immutable samplers on serialise --- renderdoc/driver/vulkan/vk_serialise.cpp | 12 ++++++++++++ util/test/demos/vk/vk_parameter_zoo.cpp | 11 +++++++++++ 2 files changed, 23 insertions(+) diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index c509b19f9..106ebfc35 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -23,6 +23,7 @@ ******************************************************************************/ #include "vk_common.h" +#include "vk_info.h" #include "vk_manager.h" #include "vk_resources.h" @@ -3250,8 +3251,19 @@ void DoSerialise(SerialiserType &ser, VkWriteDescriptorSet &el) if(el.descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER || el.descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) + { validity = validity | VkDescriptorImageInfoValidity::Sampler; + // on writing check if this is an immutable samplers binding. If it is we can't treat the + // sampler as valid. On replay we don't have to do this because invalid samplers got + // serialised as NULL safely. + if(ser.IsWriting() && el.dstSet != VK_NULL_HANDLE) + { + if(GetRecord(el.dstSet)->descInfo->layout->bindings[el.dstBinding].immutableSampler != NULL) + validity = validity & ~VkDescriptorImageInfoValidity::Sampler; + } + } + if(el.descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER || el.descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE || el.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE || diff --git a/util/test/demos/vk/vk_parameter_zoo.cpp b/util/test/demos/vk/vk_parameter_zoo.cpp index caeae6718..b1f125c22 100644 --- a/util/test/demos/vk/vk_parameter_zoo.cpp +++ b/util/test/demos/vk/vk_parameter_zoo.cpp @@ -1236,6 +1236,17 @@ void main() Submit(0, 4, {cmd}); } + // try writing with an invalid sampler to the immutable, it should be ignored + vkh::updateDescriptorSets( + device, + { + vkh::WriteDescriptorSet( + immutdescset, 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + { + vkh::DescriptorImageInfo(validImgView, VK_IMAGE_LAYOUT_GENERAL, invalidSampler), + }), + }); + // do a bunch of spinning on fences/semaphores that should not be serialised exhaustively VkResult status = VK_SUCCESS; for(size_t i = 0; i < 1000; i++)