From 2c34df1e642206897db2093ebaa42bc5599f75d3 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sun, 30 Aug 2015 22:09:23 +0200 Subject: [PATCH] implement vkCmdBindVertexBuffers and vkFreeDescriptorSets --- renderdoc/driver/vulkan/vk_common.h | 1 + renderdoc/driver/vulkan/vk_core.cpp | 95 +++++++++++++++++++++++ renderdoc/driver/vulkan/vk_core.h | 13 ++++ renderdoc/driver/vulkan/vk_hookset_defs.h | 4 + 4 files changed, 113 insertions(+) diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index dd38e74a3..628c360fd 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -176,6 +176,7 @@ enum VulkanChunkType BIND_CB_STATE, BIND_DS_STATE, BIND_DESCRIPTOR_SET, + BIND_VERTEX_BUFFERS, BIND_INDEX_BUFFER, COPY_BUF2IMG, COPY_IMG2BUF, diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 70fe61273..15a6b03c6 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -109,6 +109,7 @@ const char *VkChunkNames[] = "vkCmdBindDynamicColorBlendState", "vkCmdBindDynamicDepthStencilState", "vkCmdBindDescriptorSet", + "vkCmdBindVertexBuffers", "vkCmdBindIndexBuffer", "vkCmdCopyBufferToImage", "vkCmdCopyImageToBuffer", @@ -3127,6 +3128,32 @@ VkResult WrappedVulkan::vkAllocDescriptorSets( return ret; } +VkResult WrappedVulkan::vkFreeDescriptorSets( + VkDevice device, + VkDescriptorPool descriptorPool, + uint32_t count, + const VkDescriptorSet* pDescriptorSets) +{ + VkResult ret = m_Real.vkFreeDescriptorSets(device, descriptorPool, count, pDescriptorSets); + + if(ret == VK_SUCCESS) + { + for(uint32_t i=0; i < count; i++) + { + VkResource res = MakeRes(pDescriptorSets[i]); + ResourceId id = GetResourceManager()->GetID(res); + + GetResourceManager()->MarkCleanResource(id); + VkResourceRecord *record = GetResourceManager()->GetResourceRecord(id); + if(record) + record->Delete(GetResourceManager()); + GetResourceManager()->UnregisterResource(res); + } + } + + return ret; +} + bool WrappedVulkan::Serialise_vkUpdateDescriptorSets( VkDevice device, uint32_t writeCount, @@ -3779,6 +3806,71 @@ void WrappedVulkan::vkCmdBindDynamicDepthStencilState( } } +bool WrappedVulkan::Serialise_vkCmdBindVertexBuffers( + VkCmdBuffer cmdBuffer, + uint32_t startBinding, + uint32_t bindingCount, + const VkBuffer* pBuffers, + const VkDeviceSize* pOffsets) +{ + SERIALISE_ELEMENT(ResourceId, cmdid, GetResourceManager()->GetID(MakeRes(cmdBuffer))); + SERIALISE_ELEMENT(uint32_t, start, startBinding); + SERIALISE_ELEMENT(uint32_t, count, bindingCount); + + vector bufs; + vector offs; + + for(uint32_t i=0; i < count; i++) + { + ResourceId id; + VkDeviceSize o; + if(m_State >= WRITING) + { + id = GetResourceManager()->GetID(MakeRes(pBuffers[i])); + o = pOffsets[i]; + } + + m_pSerialiser->Serialise("pBuffers[]", id); + m_pSerialiser->Serialise("pOffsets[]", o); + + if(m_State < WRITING) + { + bufs.push_back((VkBuffer)GetResourceManager()->GetLiveResource(id).handle); + offs.push_back(o); + } + } + + if(m_State < WRITING) + { + cmdBuffer = (VkCmdBuffer)GetResourceManager()->GetLiveResource(cmdid).handle; + + m_Real.vkCmdBindVertexBuffers(cmdBuffer, start, count, &bufs[0], &offs[0]); + } + + return true; +} + +void WrappedVulkan::vkCmdBindVertexBuffers( + VkCmdBuffer cmdBuffer, + uint32_t startBinding, + uint32_t bindingCount, + const VkBuffer* pBuffers, + const VkDeviceSize* pOffsets) +{ + m_Real.vkCmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets); + + if(m_State >= WRITING) + { + VkResourceRecord *record = GetResourceManager()->GetResourceRecord(MakeRes(cmdBuffer)); + + SCOPED_SERIALISE_CONTEXT(BIND_VERTEX_BUFFERS); + Serialise_vkCmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets); + + record->AddChunk(scope.Get()); + } +} + + bool WrappedVulkan::Serialise_vkCmdBindIndexBuffer( VkCmdBuffer cmdBuffer, VkBuffer buffer, @@ -6082,6 +6174,9 @@ void WrappedVulkan::ProcessChunk(uint64_t offset, VulkanChunkType context) case BIND_INDEX_BUFFER: Serialise_vkCmdBindIndexBuffer(VK_NULL_HANDLE, VK_NULL_HANDLE, 0, VK_INDEX_TYPE_MAX_ENUM); break; + case BIND_VERTEX_BUFFERS: + Serialise_vkCmdBindVertexBuffers(VK_NULL_HANDLE, 0, 0, NULL, NULL); + break; case COPY_BUF2IMG: Serialise_vkCmdCopyBufferToImage(VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE, VK_IMAGE_LAYOUT_MAX_ENUM, 0, NULL); break; diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 550f390f3..5c506be9b 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -611,6 +611,12 @@ public: uint32_t copyCount, const VkCopyDescriptorSet* pDescriptorCopies)); + IMPLEMENT_FUNCTION_SERIALISED(VkResult, vkFreeDescriptorSets( + VkDevice device, + VkDescriptorPool descriptorPool, + uint32_t count, + const VkDescriptorSet* pDescriptorSets)); + // State object functions IMPLEMENT_FUNCTION_SERIALISED(VkResult, vkCreateDynamicViewportState( @@ -726,6 +732,13 @@ public: VkDeviceSize offset, VkIndexType indexType)); + IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdBindVertexBuffers( + VkCmdBuffer cmdBuffer, + uint32_t startBinding, + uint32_t bindingCount, + const VkBuffer* pBuffers, + const VkDeviceSize* pOffsets)); + IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdDraw( VkCmdBuffer cmdBuffer, uint32_t firstVertex, diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 3fe929656..76c74c77f 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -84,6 +84,7 @@ HookInit(vkDestroyDescriptorPool); \ HookInit(vkAllocDescriptorSets); \ HookInit(vkUpdateDescriptorSets); \ + HookInit(vkFreeDescriptorSets); \ HookInit(vkCreateDynamicViewportState); \ HookInit(vkDestroyDynamicViewportState); \ HookInit(vkCreateDynamicRasterState); \ @@ -106,6 +107,7 @@ HookInit(vkCmdBindDynamicColorBlendState); \ HookInit(vkCmdBindDynamicDepthStencilState); \ HookInit(vkCmdBindDescriptorSets); \ + HookInit(vkCmdBindVertexBuffers); \ HookInit(vkCmdBindIndexBuffer); \ HookInit(vkCmdDraw); \ HookInit(vkCmdDrawIndirect); \ @@ -201,6 +203,7 @@ HookDefine2(VkResult, vkDestroyDescriptorPool, VkDevice, device, VkDescriptorPool, descriptorPool); \ HookDefine7(VkResult, vkAllocDescriptorSets, VkDevice, device, VkDescriptorPool, descriptorPool, VkDescriptorSetUsage, setUsage, uint32_t, count, const VkDescriptorSetLayout*, pSetLayouts, VkDescriptorSet*, pDescriptorSets, uint32_t*, pCount); \ HookDefine5(VkResult, vkUpdateDescriptorSets, VkDevice, device, uint32_t, writeCount, const VkWriteDescriptorSet*, pDescriptorWrites, uint32_t, copyCount, const VkCopyDescriptorSet*, pDescriptorCopies); \ + HookDefine4(VkResult, vkFreeDescriptorSets, VkDevice, device, VkDescriptorPool, descriptorPool, uint32_t, count, const VkDescriptorSet*, pDescriptorSets); \ HookDefine3(VkResult, vkCreateDynamicViewportState, VkDevice, device, const VkDynamicViewportStateCreateInfo*, pCreateInfo, VkDynamicViewportState*, pState); \ HookDefine2(VkResult, vkDestroyDynamicViewportState, VkDevice, device, VkDynamicViewportState, state); \ HookDefine3(VkResult, vkCreateDynamicRasterState, VkDevice, device, const VkDynamicRasterStateCreateInfo*, pCreateInfo, VkDynamicRasterState*, pState); \ @@ -224,6 +227,7 @@ HookDefine2(void, vkCmdBindDynamicDepthStencilState, VkCmdBuffer, cmdBuffer, VkDynamicDepthStencilState, dynamicDepthStencilState); \ HookDefine8(void, vkCmdBindDescriptorSets, VkCmdBuffer, cmdBuffer, VkPipelineBindPoint, pipelineBindPoint, VkPipelineLayout, layout, uint32_t, firstSet, uint32_t, setCount, const VkDescriptorSet*, pDescriptorSets, uint32_t, dynamicOffsetCount, const uint32_t*, pDynamicOffsets); \ HookDefine4(void, vkCmdBindIndexBuffer, VkCmdBuffer, cmdBuffer, VkBuffer, buffer, VkDeviceSize, offset, VkIndexType, indexType); \ + HookDefine5(void, vkCmdBindVertexBuffers, VkCmdBuffer, cmdBuffer, uint32_t, startBinding, uint32_t, bindingCount, const VkBuffer*, pBuffers, const VkDeviceSize*, pOffsets); \ HookDefine5(void, vkCmdDraw, VkCmdBuffer, cmdBuffer, uint32_t, firstVertex, uint32_t, vertexCount, uint32_t, firstInstance, uint32_t, instanceCount); \ HookDefine6(void, vkCmdDrawIndexed, VkCmdBuffer, cmdBuffer, uint32_t, firstIndex, uint32_t, indexCount, int32_t, vertexOffset, uint32_t, firstInstance, uint32_t, instanceCount); \ HookDefine5(void, vkCmdDrawIndirect, VkCmdBuffer, cmdBuffer, VkBuffer, buffer, VkDeviceSize, offset, uint32_t, count, uint32_t, stride); \