blob: e7c4356706fa322189800fd5323c197c9e3b49fa (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
using Ryujinx.Graphics.GAL;
using Silk.NET.Vulkan;
using System;
using System.Collections.Concurrent;
using System.Collections.ObjectModel;
namespace Ryujinx.Graphics.Vulkan
{
class PipelineLayoutCache
{
private readonly struct PlceKey : IEquatable<PlceKey>
{
public readonly ReadOnlyCollection<ResourceDescriptorCollection> SetDescriptors;
public readonly bool UsePushDescriptors;
public PlceKey(ReadOnlyCollection<ResourceDescriptorCollection> setDescriptors, bool usePushDescriptors)
{
SetDescriptors = setDescriptors;
UsePushDescriptors = usePushDescriptors;
}
public override int GetHashCode()
{
HashCode hasher = new HashCode();
if (SetDescriptors != null)
{
foreach (var setDescriptor in SetDescriptors)
{
hasher.Add(setDescriptor);
}
}
hasher.Add(UsePushDescriptors);
return hasher.ToHashCode();
}
public override bool Equals(object obj)
{
return obj is PlceKey other && Equals(other);
}
public bool Equals(PlceKey other)
{
if ((SetDescriptors == null) != (other.SetDescriptors == null))
{
return false;
}
if (SetDescriptors != null)
{
if (SetDescriptors.Count != other.SetDescriptors.Count)
{
return false;
}
for (int index = 0; index < SetDescriptors.Count; index++)
{
if (!SetDescriptors[index].Equals(other.SetDescriptors[index]))
{
return false;
}
}
}
return UsePushDescriptors == other.UsePushDescriptors;
}
}
private readonly ConcurrentDictionary<PlceKey, PipelineLayoutCacheEntry> _plces;
public PipelineLayoutCache()
{
_plces = new ConcurrentDictionary<PlceKey, PipelineLayoutCacheEntry>();
}
public PipelineLayoutCacheEntry GetOrCreate(
VulkanRenderer gd,
Device device,
ReadOnlyCollection<ResourceDescriptorCollection> setDescriptors,
bool usePushDescriptors)
{
var key = new PlceKey(setDescriptors, usePushDescriptors);
return _plces.GetOrAdd(key, (newKey) => new PipelineLayoutCacheEntry(gd, device, setDescriptors, usePushDescriptors));
}
protected virtual unsafe void Dispose(bool disposing)
{
if (disposing)
{
foreach (var plce in _plces.Values)
{
plce.Dispose();
}
_plces.Clear();
}
}
public void Dispose()
{
Dispose(true);
}
}
}
|