Move bind extra sets logic to new method
This commit is contained in:
parent
9563dead44
commit
8c0b49299c
1 changed files with 53 additions and 48 deletions
|
@ -636,7 +636,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
{
|
{
|
||||||
if (program.UsePushDescriptors)
|
if (program.UsePushDescriptors)
|
||||||
{
|
{
|
||||||
UpdateAndBindUniformBufferPd(cbs, pbp);
|
UpdateAndBindUniformBufferPd(cbs);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -663,52 +663,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
{
|
{
|
||||||
// Program is using extra sets, we need to bind those too.
|
// Program is using extra sets, we need to bind those too.
|
||||||
|
|
||||||
for (int setIndex = PipelineBase.DescriptorSetLayouts; setIndex < program.BindingSegments.Length; setIndex++)
|
BindExtraSets(cbs, program, pbp);
|
||||||
{
|
|
||||||
var bindingSegments = program.BindingSegments[setIndex];
|
|
||||||
|
|
||||||
if (bindingSegments.Length == 0)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResourceBindingSegment segment = bindingSegments[0];
|
|
||||||
|
|
||||||
if (segment.IsArray)
|
|
||||||
{
|
|
||||||
DescriptorSet[] sets = null;
|
|
||||||
|
|
||||||
if (segment.Type == ResourceType.Texture ||
|
|
||||||
segment.Type == ResourceType.Sampler ||
|
|
||||||
segment.Type == ResourceType.TextureAndSampler ||
|
|
||||||
segment.Type == ResourceType.BufferTexture)
|
|
||||||
{
|
|
||||||
sets = _textureArrayExtraRefs[setIndex - PipelineBase.DescriptorSetLayouts].Array.GetDescriptorSets(
|
|
||||||
_device,
|
|
||||||
cbs,
|
|
||||||
_templateUpdater,
|
|
||||||
program,
|
|
||||||
setIndex,
|
|
||||||
_dummyTexture,
|
|
||||||
_dummySampler);
|
|
||||||
}
|
|
||||||
else if (segment.Type == ResourceType.Image || segment.Type == ResourceType.BufferImage)
|
|
||||||
{
|
|
||||||
sets = _imageArrayExtraRefs[setIndex - PipelineBase.DescriptorSetLayouts].Array.GetDescriptorSets(
|
|
||||||
_device,
|
|
||||||
cbs,
|
|
||||||
_templateUpdater,
|
|
||||||
program,
|
|
||||||
setIndex,
|
|
||||||
_dummyTexture);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sets != null)
|
|
||||||
{
|
|
||||||
_gd.Api.CmdBindDescriptorSets(cbs.CommandBuffer, pbp, _program.PipelineLayout, (uint)setIndex, 1, sets, 0, ReadOnlySpan<uint>.Empty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_dirty = DirtyFlags.None;
|
_dirty = DirtyFlags.None;
|
||||||
|
@ -958,7 +913,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
private void UpdateAndBindUniformBufferPd(CommandBufferScoped cbs, PipelineBindPoint pbp)
|
private void UpdateAndBindUniformBufferPd(CommandBufferScoped cbs)
|
||||||
{
|
{
|
||||||
int sequence = _pdSequence;
|
int sequence = _pdSequence;
|
||||||
var bindingSegments = _program.BindingSegments[PipelineBase.UniformSetIndex];
|
var bindingSegments = _program.BindingSegments[PipelineBase.UniformSetIndex];
|
||||||
|
@ -1022,6 +977,56 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void BindExtraSets(CommandBufferScoped cbs, ShaderCollection program, PipelineBindPoint pbp)
|
||||||
|
{
|
||||||
|
for (int setIndex = PipelineBase.DescriptorSetLayouts; setIndex < program.BindingSegments.Length; setIndex++)
|
||||||
|
{
|
||||||
|
var bindingSegments = program.BindingSegments[setIndex];
|
||||||
|
|
||||||
|
if (bindingSegments.Length == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ResourceBindingSegment segment = bindingSegments[0];
|
||||||
|
|
||||||
|
if (segment.IsArray)
|
||||||
|
{
|
||||||
|
DescriptorSet[] sets = null;
|
||||||
|
|
||||||
|
if (segment.Type == ResourceType.Texture ||
|
||||||
|
segment.Type == ResourceType.Sampler ||
|
||||||
|
segment.Type == ResourceType.TextureAndSampler ||
|
||||||
|
segment.Type == ResourceType.BufferTexture)
|
||||||
|
{
|
||||||
|
sets = _textureArrayExtraRefs[setIndex - PipelineBase.DescriptorSetLayouts].Array.GetDescriptorSets(
|
||||||
|
_device,
|
||||||
|
cbs,
|
||||||
|
_templateUpdater,
|
||||||
|
program,
|
||||||
|
setIndex,
|
||||||
|
_dummyTexture,
|
||||||
|
_dummySampler);
|
||||||
|
}
|
||||||
|
else if (segment.Type == ResourceType.Image || segment.Type == ResourceType.BufferImage)
|
||||||
|
{
|
||||||
|
sets = _imageArrayExtraRefs[setIndex - PipelineBase.DescriptorSetLayouts].Array.GetDescriptorSets(
|
||||||
|
_device,
|
||||||
|
cbs,
|
||||||
|
_templateUpdater,
|
||||||
|
program,
|
||||||
|
setIndex,
|
||||||
|
_dummyTexture);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sets != null)
|
||||||
|
{
|
||||||
|
_gd.Api.CmdBindDescriptorSets(cbs.CommandBuffer, pbp, _program.PipelineLayout, (uint)setIndex, 1, sets, 0, ReadOnlySpan<uint>.Empty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void SignalCommandBufferChange()
|
public void SignalCommandBufferChange()
|
||||||
{
|
{
|
||||||
_updateDescriptorCacheCbIndex = true;
|
_updateDescriptorCacheCbIndex = true;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue