/ src / Ryujinx.Graphics.Vulkan / ResourceArray.cs
ResourceArray.cs
 1  using Silk.NET.Vulkan;
 2  using System;
 3  using System.Diagnostics;
 4  
 5  namespace Ryujinx.Graphics.Vulkan
 6  {
 7      class ResourceArray : IDisposable
 8      {
 9          private DescriptorSet[] _cachedDescriptorSets;
10  
11          private ShaderCollection _cachedDscProgram;
12          private int _cachedDscSetIndex;
13          private int _cachedDscIndex;
14  
15          private int _bindCount;
16  
17          protected void SetDirty(VulkanRenderer gd, bool isImage)
18          {
19              ReleaseDescriptorSet();
20  
21              if (_bindCount != 0)
22              {
23                  if (isImage)
24                  {
25                      gd.PipelineInternal.ForceImageDirty();
26                  }
27                  else
28                  {
29                      gd.PipelineInternal.ForceTextureDirty();
30                  }
31              }
32          }
33  
34          public bool TryGetCachedDescriptorSets(CommandBufferScoped cbs, ShaderCollection program, int setIndex, out DescriptorSet[] sets)
35          {
36              if (_cachedDescriptorSets != null)
37              {
38                  _cachedDscProgram.UpdateManualDescriptorSetCollectionOwnership(cbs, _cachedDscSetIndex, _cachedDscIndex);
39  
40                  sets = _cachedDescriptorSets;
41  
42                  return true;
43              }
44  
45              var dsc = program.GetNewManualDescriptorSetCollection(cbs, setIndex, out _cachedDscIndex).Get(cbs);
46  
47              sets = dsc.GetSets();
48  
49              _cachedDescriptorSets = sets;
50              _cachedDscProgram = program;
51              _cachedDscSetIndex = setIndex;
52  
53              return false;
54          }
55  
56          public void IncrementBindCount()
57          {
58              _bindCount++;
59          }
60  
61          public void DecrementBindCount()
62          {
63              int newBindCount = --_bindCount;
64              Debug.Assert(newBindCount >= 0);
65          }
66  
67          private void ReleaseDescriptorSet()
68          {
69              if (_cachedDescriptorSets != null)
70              {
71                  _cachedDscProgram.ReleaseManualDescriptorSetCollection(_cachedDscSetIndex, _cachedDscIndex);
72                  _cachedDescriptorSets = null;
73              }
74          }
75  
76          public void Dispose()
77          {
78              ReleaseDescriptorSet();
79          }
80      }
81  }