From a875e045c5a3e10dba145334e2d2215b40eafb5a Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 11 Jan 2018 20:31:18 +0100 Subject: [PATCH] [dxvk] Moved descriptor set updates into DxvkContext --- src/dxvk/dxvk_cmdlist.cpp | 46 --------------------------------------- src/dxvk/dxvk_cmdlist.h | 29 ++++++++++++++++++------ src/dxvk/dxvk_context.cpp | 35 ++++++++++++++++++++++------- 3 files changed, 49 insertions(+), 61 deletions(-) diff --git a/src/dxvk/dxvk_cmdlist.cpp b/src/dxvk/dxvk_cmdlist.cpp index 50bc387b..e3585e20 100644 --- a/src/dxvk/dxvk_cmdlist.cpp +++ b/src/dxvk/dxvk_cmdlist.cpp @@ -88,52 +88,6 @@ namespace dxvk { } - void DxvkCommandList::bindResourceDescriptors( - VkPipelineBindPoint pipeline, - VkPipelineLayout pipelineLayout, - VkDescriptorSetLayout descriptorLayout, - uint32_t descriptorCount, - const DxvkDescriptorSlot* descriptorSlots, - const DxvkDescriptorInfo* descriptorInfos, - const DxvkBindingState& bindingState) { - - // Allocate a new descriptor set - VkDescriptorSet dset = m_descAlloc.alloc(descriptorLayout); - - // Write data to the descriptor set - std::array descriptorWrites; - uint32_t writeId = 0; - - for (uint32_t i = 0; i < descriptorCount; i++) { - if (bindingState.isBound(i)) { - auto& curr = descriptorWrites[writeId++]; - auto& binding = descriptorSlots[i]; - - curr.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - curr.pNext = nullptr; - curr.dstSet = dset; - curr.dstBinding = i; - curr.dstArrayElement = 0; - curr.descriptorCount = 1; - curr.descriptorType = binding.type; - curr.pImageInfo = &descriptorInfos[i].image; - curr.pBufferInfo = &descriptorInfos[i].buffer; - curr.pTexelBufferView = &descriptorInfos[i].texelBuffer; - } - } - - m_vkd->vkUpdateDescriptorSets( - m_vkd->device(), writeId, - descriptorWrites.data(), - 0, nullptr); - - // Bind descriptor set to the pipeline - m_vkd->vkCmdBindDescriptorSets(m_buffer, - pipeline, pipelineLayout, 0, 1, - &dset, 0, nullptr); - } - - DxvkStagingBufferSlice DxvkCommandList::stagedAlloc(VkDeviceSize size) { return m_stagingAlloc.alloc(size); } diff --git a/src/dxvk/dxvk_cmdlist.h b/src/dxvk/dxvk_cmdlist.h index 4f6611a5..7a940bae 100644 --- a/src/dxvk/dxvk_cmdlist.h +++ b/src/dxvk/dxvk_cmdlist.h @@ -82,14 +82,19 @@ namespace dxvk { */ void reset(); - void bindResourceDescriptors( - VkPipelineBindPoint pipeline, - VkPipelineLayout pipelineLayout, - VkDescriptorSetLayout descriptorLayout, + VkDescriptorSet allocateDescriptorSet( + VkDescriptorSetLayout descriptorLayout) { + return m_descAlloc.alloc(descriptorLayout); + } + + + void updateDescriptorSet( uint32_t descriptorCount, - const DxvkDescriptorSlot* descriptorSlots, - const DxvkDescriptorInfo* descriptorInfos, - const DxvkBindingState& bindingState); + const VkWriteDescriptorSet* descriptorWrites) { + m_vkd->vkUpdateDescriptorSets(m_vkd->device(), + descriptorCount, descriptorWrites, 0, nullptr); + } + void cmdBeginRenderPass( const VkRenderPassBeginInfo* pRenderPassBegin, @@ -99,6 +104,16 @@ namespace dxvk { } + void cmdBindDescriptorSet( + VkPipelineBindPoint pipeline, + VkPipelineLayout pipelineLayout, + VkDescriptorSet descriptorSet) { + m_vkd->vkCmdBindDescriptorSets(m_buffer, + pipeline, pipelineLayout, 0, 1, + &descriptorSet, 0, nullptr); + } + + void cmdBindIndexBuffer( VkBuffer buffer, VkDeviceSize offset, diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 2e9d0a6c..f5399f1c 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -1130,14 +1130,33 @@ namespace dxvk { VkPipelineBindPoint bindPoint, const DxvkBindingState& bindingState, const Rc& layout) { - m_cmd->bindResourceDescriptors( - bindPoint, - layout->pipelineLayout(), - layout->descriptorSetLayout(), - layout->bindingCount(), - layout->bindings(), - m_descriptors.data(), - bindingState); + std::array writes; + + const VkDescriptorSet dset = + m_cmd->allocateDescriptorSet( + layout->descriptorSetLayout()); + + size_t writeId = 0; + + for (uint32_t i = 0; i < layout->bindingCount(); i++) { + if (bindingState.isBound(i)) { + writes[writeId].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + writes[writeId].pNext = nullptr; + writes[writeId].dstSet = dset; + writes[writeId].dstBinding = i; + writes[writeId].dstArrayElement = 0; + writes[writeId].descriptorCount = 1; + writes[writeId].descriptorType = layout->binding(i).type; + writes[writeId].pImageInfo = &m_descriptors[i].image; + writes[writeId].pBufferInfo = &m_descriptors[i].buffer; + writes[writeId].pTexelBufferView = &m_descriptors[i].texelBuffer; + writeId++; + } + } + + m_cmd->updateDescriptorSet(writeId, writes.data()); + m_cmd->cmdBindDescriptorSet(bindPoint, + layout->pipelineLayout(), dset); }