diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index e8fa541c3..249a8c15c 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -2275,6 +2275,20 @@ string ToStrHelper::Get(const VkRect2D &el) return StringFormat::Fmt("VkRect2D<%dx%d+%d+%d>", el.extent.width, el.extent.height, el.offset.x, el.offset.y); } +template<> +string ToStrHelper::Get(const VkClearRect &el) +{ + return StringFormat::Fmt("VkClearRect<%dx%d+%d+%d %u->%u>", + el.rect.extent.width, el.rect.extent.height, el.rect.offset.x, el.rect.offset.y, + el.baseArrayLayer, el.baseArrayLayer+el.layerCount); +} + +template<> +string ToStrHelper::Get(const VkClearAttachment &el) +{ + return StringFormat::Fmt("%s[%u] = %s", ToStr::Get((VkImageAspectFlagBits)el.aspectMask).c_str(), el.colorAttachment, ToStr::Get(el.clearValue).c_str()); +} + template<> string ToStrHelper::Get(const VkExtent2D &el) { @@ -2890,6 +2904,15 @@ void Serialiser::Serialise(const char *name, VkSparseImageMemoryBind &el) Serialise("flags", (VkSparseMemoryBindFlagBits &)el.flags); } +template<> +void Serialiser::Serialise(const char *name, VkSparseImageMemoryBindInfo &el) +{ + ScopedContext scope(this, name, "VkSparseImageMemoryBindInfo", 0, true); + + SerialiseObject(VkImage, "image", el.image); + SerialiseComplexArray("pBinds", (VkSparseImageMemoryBind *&)el.pBinds, el.bindCount); +} + template<> void Serialiser::Serialise(const char *name, VkBindSparseInfo &el) { @@ -3837,6 +3860,39 @@ void Serialiser::Deserialise(const VkDescriptorPoolCreateInfo* const el) const } } +template<> +void Serialiser::Serialise(const char *name, VkDescriptorSetAllocateInfo &el) +{ + ScopedContext scope(this, name, "VkDescriptorSetAllocateInfo", 0, true); + + RDCASSERT(m_Mode < WRITING || el.sType == VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO); + SerialiseNext(this, el.sType, el.pNext); + + SerialiseObject(VkDescriptorPool, "descriptorPool", el.descriptorPool); + + // need to do this one by hand since it's just an array of objects that don't themselves have + // a Serialise overload + Serialise("setLayoutCount", el.setLayoutCount); + + if(m_Mode == READING) + el.pSetLayouts = el.setLayoutCount ? new VkDescriptorSetLayout[el.setLayoutCount] : NULL; + + // cast away const on array so we can assign to it on reading + VkDescriptorSetLayout* layouts = (VkDescriptorSetLayout*)el.pSetLayouts; + for(uint32_t i=0; i < el.setLayoutCount; i++) + SerialiseObject(VkDescriptorSetLayout, "pSetLayouts", layouts[i]); +} + +template<> +void Serialiser::Deserialise(const VkDescriptorSetAllocateInfo* const el) const +{ + if(m_Mode == READING) + { + RDCASSERT(el->pNext == NULL); // otherwise delete + delete [] el->pSetLayouts; + } +} + template<> void Serialiser::Serialise(const char *name, VkDescriptorImageInfo &el) { @@ -4114,3 +4170,18 @@ void Serialiser::Serialise(const char *name, VkSwapchainCreateInfoKHR &el) // don't need the old swap chain } + +// this isn't a real vulkan type, it's our own "anything that could be in a descriptor" +// structure that +template<> void Serialiser::Serialise(const char *name, DescriptorSetSlot &el) +{ + SerialiseObject(VkBuffer, "bufferInfo.buffer", el.bufferInfo.buffer); + Serialise("bufferInfo.offset", el.bufferInfo.offset); + Serialise("bufferInfo.range", el.bufferInfo.range); + + SerialiseObject(VkSampler, "imageInfo.sampler", el.imageInfo.sampler); + SerialiseObject(VkImageView, "imageInfo.imageView", el.imageInfo.imageView); + Serialise("imageInfo.imageLayout", el.imageInfo.imageLayout); + + SerialiseObject(VkBufferView, "texelBufferView", el.texelBufferView); +} diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index dea393571..90fb6787d 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -70,6 +70,7 @@ template<> void Serialiser::Serialise(const char *name, VkBufferCreateInfo &el); template<> void Serialiser::Serialise(const char *name, VkBufferViewCreateInfo &el); template<> void Serialiser::Serialise(const char *name, VkImageCreateInfo &el); template<> void Serialiser::Serialise(const char *name, VkImageViewCreateInfo &el); +template<> void Serialiser::Serialise(const char *name, VkSparseMemoryBind &el); template<> void Serialiser::Serialise(const char *name, VkBindSparseInfo &el); template<> void Serialiser::Serialise(const char *name, VkFramebufferCreateInfo &el); template<> void Serialiser::Serialise(const char *name, VkRenderPassCreateInfo &el); @@ -87,6 +88,7 @@ template<> void Serialiser::Serialise(const char *name, VkPushConstantRange &el) template<> void Serialiser::Serialise(const char *name, VkDescriptorSetLayoutBinding &el); template<> void Serialiser::Serialise(const char *name, VkDescriptorSetLayoutCreateInfo &el); template<> void Serialiser::Serialise(const char *name, VkDescriptorPoolCreateInfo &el); +template<> void Serialiser::Serialise(const char *name, VkDescriptorSetAllocateInfo &el); template<> void Serialiser::Serialise(const char *name, VkWriteDescriptorSet &el); template<> void Serialiser::Serialise(const char *name, VkCopyDescriptorSet &el); template<> void Serialiser::Serialise(const char *name, VkCommandPoolCreateInfo &el); @@ -119,10 +121,14 @@ template<> void Serialiser::Serialise(const char *name, VkImageResolve &el); template<> void Serialiser::Serialise(const char *name, VkSwapchainCreateInfoKHR &el); +struct DescriptorSetSlot; +template<> void Serialiser::Serialise(const char *name, DescriptorSetSlot &el); + template<> void Serialiser::Deserialise(const VkDeviceCreateInfo* const el) const; template<> void Serialiser::Deserialise(const VkBufferCreateInfo* const el) const; template<> void Serialiser::Deserialise(const VkImageCreateInfo* const el) const; template<> void Serialiser::Deserialise(const VkBindSparseInfo* const el) const; +template<> void Serialiser::Deserialise(const VkDescriptorSetAllocateInfo* const el) const; template<> void Serialiser::Deserialise(const VkFramebufferCreateInfo* const el) const; template<> void Serialiser::Deserialise(const VkRenderPassCreateInfo* const el) const; template<> void Serialiser::Deserialise(const VkRenderPassBeginInfo* const el) const; diff --git a/renderdoc/driver/vulkan/vk_resources.cpp b/renderdoc/driver/vulkan/vk_resources.cpp index 2d62e7441..3a5b33c07 100644 --- a/renderdoc/driver/vulkan/vk_resources.cpp +++ b/renderdoc/driver/vulkan/vk_resources.cpp @@ -52,6 +52,7 @@ WRAPPED_POOL_INST(WrappedVkFramebuffer) WRAPPED_POOL_INST(WrappedVkCommandPool) WRAPPED_POOL_INST(WrappedVkSwapchainKHR) +WRAPPED_POOL_INST(WrappedVkSurfaceKHR) byte VkResourceRecord::markerValue[32] = { 0xaa, 0xbb, 0xcc, 0xdd, diff --git a/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs b/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs index 338bb4372..807c284de 100644 --- a/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs @@ -2023,7 +2023,7 @@ namespace renderdocui.Windows.PipelineState string slotname = bindMap.bind.ToString(); slotname += ": " + b.name; - for (int a = 0; a < bind.arraySize; a++) + for (int a = 0; a < bind.descriptorCount; a++) { var descriptorBind = bind.binds[a]; @@ -2093,7 +2093,7 @@ namespace renderdocui.Windows.PipelineState string slotname = bindMap.bind.ToString(); slotname += ": " + b.name; - for (int a = 0; a < bind.arraySize; a++) + for (int a = 0; a < bind.descriptorCount; a++) { var descriptorBind = bind.binds[a]; @@ -2209,7 +2209,7 @@ namespace renderdocui.Windows.PipelineState string slotname = bindMap.bind.ToString(); slotname += ": " + b.name; - for (int a = 0; a < bind.arraySize; a++) + for (int a = 0; a < bind.descriptorCount; a++) { var descriptorBind = bind.binds[a];