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 }