mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-01-07 07:46:19 +01:00
[dxvk] Don't use MaxNumActiveBindings for descriptor updates
This commit is contained in:
parent
6fba4c47fe
commit
b950102233
@ -21,16 +21,6 @@ namespace dxvk {
|
|||||||
// Init framebuffer info with default render pass in case
|
// Init framebuffer info with default render pass in case
|
||||||
// the app does not explicitly bind any render targets
|
// the app does not explicitly bind any render targets
|
||||||
m_state.om.framebufferInfo = makeFramebufferInfo(m_state.om.renderTargets);
|
m_state.om.framebufferInfo = makeFramebufferInfo(m_state.om.renderTargets);
|
||||||
|
|
||||||
for (uint32_t i = 0; i < MaxNumActiveBindings; i++) {
|
|
||||||
m_descriptorWrites[i] = { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET };
|
|
||||||
m_descriptorWrites[i].descriptorCount = 1;
|
|
||||||
m_descriptorWrites[i].descriptorType = VK_DESCRIPTOR_TYPE_MAX_ENUM;
|
|
||||||
m_descriptorWrites[i].pImageInfo = &m_descriptors[i].image;
|
|
||||||
m_descriptorWrites[i].pBufferInfo = &m_descriptors[i].buffer;
|
|
||||||
m_descriptorWrites[i].pTexelBufferView = &m_descriptors[i].texelBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_descriptorManager = new DxvkDescriptorManager(device.ptr(), type);
|
m_descriptorManager = new DxvkDescriptorManager(device.ptr(), type);
|
||||||
|
|
||||||
// Default destination barriers for graphics pipelines
|
// Default destination barriers for graphics pipelines
|
||||||
@ -4661,6 +4651,10 @@ namespace dxvk {
|
|||||||
void DxvkContext::updateResourceBindings(const DxvkBindingLayoutObjects* layout) {
|
void DxvkContext::updateResourceBindings(const DxvkBindingLayoutObjects* layout) {
|
||||||
const auto& bindings = layout->layout();
|
const auto& bindings = layout->layout();
|
||||||
|
|
||||||
|
// Ensure that the arrays we write descriptor info to are big enough
|
||||||
|
if (unlikely(layout->getBindingCount() > m_descriptors.size()))
|
||||||
|
this->resizeDescriptorArrays(layout->getBindingCount());
|
||||||
|
|
||||||
// On 32-bit wine, vkUpdateDescriptorSets has significant overhead due
|
// On 32-bit wine, vkUpdateDescriptorSets has significant overhead due
|
||||||
// to struct conversion, so we should use descriptor update templates.
|
// to struct conversion, so we should use descriptor update templates.
|
||||||
// For 64-bit applications, using templates is slower on some drivers.
|
// For 64-bit applications, using templates is slower on some drivers.
|
||||||
@ -5849,4 +5843,20 @@ namespace dxvk {
|
|||||||
return m_zeroBuffer;
|
return m_zeroBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DxvkContext::resizeDescriptorArrays(
|
||||||
|
uint32_t bindingCount) {
|
||||||
|
m_descriptors.resize(bindingCount);
|
||||||
|
m_descriptorWrites.resize(bindingCount);
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < bindingCount; i++) {
|
||||||
|
m_descriptorWrites[i] = { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET };
|
||||||
|
m_descriptorWrites[i].descriptorCount = 1;
|
||||||
|
m_descriptorWrites[i].descriptorType = VK_DESCRIPTOR_TYPE_MAX_ENUM;
|
||||||
|
m_descriptorWrites[i].pImageInfo = &m_descriptors[i].image;
|
||||||
|
m_descriptorWrites[i].pBufferInfo = &m_descriptors[i].buffer;
|
||||||
|
m_descriptorWrites[i].pTexelBufferView = &m_descriptors[i].texelBuffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1237,8 +1237,8 @@ namespace dxvk {
|
|||||||
|
|
||||||
std::vector<DxvkDeferredClear> m_deferredClears;
|
std::vector<DxvkDeferredClear> m_deferredClears;
|
||||||
|
|
||||||
std::array<VkWriteDescriptorSet, MaxNumActiveBindings> m_descriptorWrites;
|
std::vector<VkWriteDescriptorSet> m_descriptorWrites;
|
||||||
std::array<DxvkDescriptorInfo, MaxNumActiveBindings> m_descriptors;
|
std::vector<DxvkDescriptorInfo> m_descriptors;
|
||||||
|
|
||||||
std::array<DxvkShaderResourceSlot, MaxNumResourceSlots> m_rc;
|
std::array<DxvkShaderResourceSlot, MaxNumResourceSlots> m_rc;
|
||||||
std::array<DxvkGraphicsPipeline*, 4096> m_gpLookupCache = { };
|
std::array<DxvkGraphicsPipeline*, 4096> m_gpLookupCache = { };
|
||||||
@ -1499,6 +1499,9 @@ namespace dxvk {
|
|||||||
Rc<DxvkBuffer> createZeroBuffer(
|
Rc<DxvkBuffer> createZeroBuffer(
|
||||||
VkDeviceSize size);
|
VkDeviceSize size);
|
||||||
|
|
||||||
|
void resizeDescriptorArrays(
|
||||||
|
uint32_t bindingCount);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -324,8 +324,10 @@ namespace dxvk {
|
|||||||
m_mapping.insert({ binding.resourceBinding, mapping });
|
m_mapping.insert({ binding.resourceBinding, mapping });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bindingCount)
|
if (bindingCount) {
|
||||||
|
m_bindingCount += bindingCount;
|
||||||
m_setMask |= 1u << i;
|
m_setMask |= 1u << i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -411,6 +411,14 @@ namespace dxvk {
|
|||||||
return m_layout;
|
return m_layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Queries total number of bindings
|
||||||
|
* \returns Binding count in all sets
|
||||||
|
*/
|
||||||
|
uint32_t getBindingCount() const {
|
||||||
|
return m_bindingCount;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Queries active descriptor set mask
|
* \brief Queries active descriptor set mask
|
||||||
* \returns Bit mask of non-empty descriptor sets
|
* \returns Bit mask of non-empty descriptor sets
|
||||||
@ -483,6 +491,7 @@ namespace dxvk {
|
|||||||
VkPipelineLayout m_completeLayout = VK_NULL_HANDLE;
|
VkPipelineLayout m_completeLayout = VK_NULL_HANDLE;
|
||||||
VkPipelineLayout m_independentLayout = VK_NULL_HANDLE;
|
VkPipelineLayout m_independentLayout = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
uint32_t m_bindingCount = 0;
|
||||||
uint32_t m_setMask = 0;
|
uint32_t m_setMask = 0;
|
||||||
|
|
||||||
std::array<const DxvkBindingSetLayout*, DxvkDescriptorSets::SetCount> m_bindingObjects = { };
|
std::array<const DxvkBindingSetLayout*, DxvkDescriptorSets::SetCount> m_bindingObjects = { };
|
||||||
|
Loading…
Reference in New Issue
Block a user