mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-04-12 03:02:33 +02:00
[dxvk] Rearrange descriptor sets
This allows us not to unnecessarily dirty the FS UBO set when changing tetxure bindings, leading to a cleaner separation.
This commit is contained in:
parent
4a30933359
commit
a8f9fdb21d
@ -1792,14 +1792,16 @@ namespace dxvk {
|
|||||||
~(VK_BUFFER_USAGE_TRANSFER_DST_BIT |
|
~(VK_BUFFER_USAGE_TRANSFER_DST_BIT |
|
||||||
VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
|
VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
|
||||||
|
|
||||||
if (usage & (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT))
|
// Fast early-out for plain uniform buffers, very common
|
||||||
|
if (likely(usage == VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
|
||||||
|
m_descriptorState.dirtyBuffers(buffer->getShaderStages());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (usage & (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT))
|
||||||
m_descriptorState.dirtyBuffers(buffer->getShaderStages());
|
m_descriptorState.dirtyBuffers(buffer->getShaderStages());
|
||||||
|
|
||||||
// Fast early-out for plain buffers, very common
|
if (usage & (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT))
|
||||||
if (likely(!(usage & ~(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT))))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (usage & (VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT))
|
|
||||||
m_descriptorState.dirtyViews(buffer->getShaderStages());
|
m_descriptorState.dirtyViews(buffer->getShaderStages());
|
||||||
|
|
||||||
if (usage & VK_BUFFER_USAGE_INDEX_BUFFER_BIT)
|
if (usage & VK_BUFFER_USAGE_INDEX_BUFFER_BIT)
|
||||||
|
@ -14,11 +14,9 @@ namespace dxvk {
|
|||||||
return DxvkDescriptorSets::CsAll;
|
return DxvkDescriptorSets::CsAll;
|
||||||
} else if (stage == VK_SHADER_STAGE_FRAGMENT_BIT) {
|
} else if (stage == VK_SHADER_STAGE_FRAGMENT_BIT) {
|
||||||
// For fragment shaders, create a separate set for UBOs
|
// For fragment shaders, create a separate set for UBOs
|
||||||
if (descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
|
return uboSet
|
||||||
|| descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
|
? DxvkDescriptorSets::FsBuffers
|
||||||
return DxvkDescriptorSets::FsBuffers;
|
: DxvkDescriptorSets::FsViews;
|
||||||
|
|
||||||
return DxvkDescriptorSets::FsViews;
|
|
||||||
} else {
|
} else {
|
||||||
// Put all vertex shader resources into the last set.
|
// Put all vertex shader resources into the last set.
|
||||||
// Vertex shader UBOs are usually updated every draw,
|
// Vertex shader UBOs are usually updated every draw,
|
||||||
|
@ -552,7 +552,7 @@ namespace dxvk {
|
|||||||
if (m_dirtyBuffers & VK_SHADER_STAGE_FRAGMENT_BIT)
|
if (m_dirtyBuffers & VK_SHADER_STAGE_FRAGMENT_BIT)
|
||||||
result |= (1u << DxvkDescriptorSets::FsBuffers);
|
result |= (1u << DxvkDescriptorSets::FsBuffers);
|
||||||
if (m_dirtyViews & VK_SHADER_STAGE_FRAGMENT_BIT)
|
if (m_dirtyViews & VK_SHADER_STAGE_FRAGMENT_BIT)
|
||||||
result |= (1u << DxvkDescriptorSets::FsViews) | (1u << DxvkDescriptorSets::FsBuffers);
|
result |= (1u << DxvkDescriptorSets::FsViews);
|
||||||
if ((m_dirtyBuffers | m_dirtyViews) & (VK_SHADER_STAGE_ALL_GRAPHICS & ~VK_SHADER_STAGE_FRAGMENT_BIT))
|
if ((m_dirtyBuffers | m_dirtyViews) & (VK_SHADER_STAGE_ALL_GRAPHICS & ~VK_SHADER_STAGE_FRAGMENT_BIT))
|
||||||
result |= (1u << DxvkDescriptorSets::VsAll);
|
result |= (1u << DxvkDescriptorSets::VsAll);
|
||||||
return result;
|
return result;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user