A game about forced loneliness, made by TACStudios
1using System;
2using System.Diagnostics;
3using UnityEngine.Scripting.APIUpdating;
4
5namespace UnityEngine.Rendering.RenderGraphModule
6{
7 /// <summary>
8 /// Graphics Buffer resource handle.
9 /// </summary>
10 [DebuggerDisplay("Buffer ({handle.index})")]
11 [MovedFrom(true, "UnityEngine.Experimental.Rendering.RenderGraphModule", "UnityEngine.Rendering.RenderGraphModule")]
12 public struct BufferHandle
13 {
14 // Minor Warning: This calls the zeroing constructor this means that the embedded ResourceHandle struct will also be zero-ed
15 // which then means ResourceHandle.type will be set to zero == Texture. As this is an "invalid" bufferhandle I guess setting it
16 // to type texture just makes it even more properly invalid and not a big issue. But something to keep in mind for tooling/logging.
17 private static BufferHandle s_NullHandle = new BufferHandle();
18
19 /// <summary>
20 /// Returns a null graphics buffer handle
21 /// </summary>
22 /// <value>A null graphics buffer handle.</value>
23 public static BufferHandle nullHandle { get { return s_NullHandle; } }
24
25 internal ResourceHandle handle;
26
27 internal BufferHandle(in ResourceHandle h) { handle = h; }
28
29 internal BufferHandle(int handle, bool shared = false) { this.handle = new ResourceHandle(handle, RenderGraphResourceType.Buffer, shared); }
30
31 /// <summary>
32 /// Cast to GraphicsBuffer
33 /// </summary>
34 /// <param name="buffer">Input BufferHandle</param>
35 /// <returns>Resource as a Graphics Buffer.</returns>
36 public static implicit operator GraphicsBuffer(BufferHandle buffer) => buffer.IsValid() ? RenderGraphResourceRegistry.current.GetBuffer(buffer) : null;
37
38 /// <summary>
39 /// Return true if the handle is valid.
40 /// </summary>
41 /// <returns>True if the handle is valid.</returns>
42 public bool IsValid() => handle.IsValid();
43 }
44
45 /// <summary>
46 /// Descriptor used to create graphics buffer resources
47 /// </summary>
48 public struct BufferDesc
49 {
50 ///<summary>Number of elements in the buffer..</summary>
51 public int count;
52 ///<summary>Size of one element in the buffer. Has to match size of buffer type in the shader.</summary>
53 public int stride;
54 /// <summary>Graphics Buffer name.</summary>
55 public string name;
56 /// <summary>The intended usage of a GraphicsBuffer.</summary>
57 public GraphicsBuffer.Target target;
58 /// <summary>The intended update mode of a GraphicsBuffer.</summary>
59 public GraphicsBuffer.UsageFlags usageFlags;
60
61 /// <summary>
62 /// BufferDesc constructor.
63 /// </summary>
64 /// <param name="count">Number of elements in the buffer.</param>
65 /// <param name="stride">Size of one element in the buffer.</param>
66 public BufferDesc(int count, int stride)
67 : this()
68 {
69 this.count = count;
70 this.stride = stride;
71 this.target = GraphicsBuffer.Target.Structured;
72 this.usageFlags = GraphicsBuffer.UsageFlags.None;
73 }
74
75 /// <summary>
76 /// BufferDesc constructor.
77 /// </summary>
78 /// <param name="count">Number of elements in the buffer.</param>
79 /// <param name="stride">Size of one element in the buffer.</param>
80 /// <param name="target">Type of the buffer.</param>
81 public BufferDesc(int count, int stride, GraphicsBuffer.Target target)
82 : this()
83 {
84 this.count = count;
85 this.stride = stride;
86 this.target = target;
87 this.usageFlags = GraphicsBuffer.UsageFlags.None;
88 }
89
90 /// <summary>
91 /// Hash function
92 /// </summary>
93 /// <returns>The texture descriptor hash.</returns>
94 public override int GetHashCode()
95 {
96 var hashCode = HashFNV1A32.Create();
97 hashCode.Append(count);
98 hashCode.Append(stride);
99 hashCode.Append((int) target);
100 hashCode.Append((int) usageFlags);
101 return hashCode.value;
102 }
103 }
104
105
106 [DebuggerDisplay("BufferResource ({desc.name})")]
107 class BufferResource : RenderGraphResource<BufferDesc, GraphicsBuffer>
108 {
109 public override string GetName()
110 {
111 if (imported)
112 return "ImportedGraphicsBuffer"; // No getter for graphics buffer name.
113 else
114 return desc.name;
115 }
116
117 public override int GetDescHashCode() { return desc.GetHashCode(); }
118
119 public override void CreateGraphicsResource()
120 {
121 var name = GetName();
122 graphicsResource = new GraphicsBuffer(desc.target, desc.usageFlags, desc.count, desc.stride);
123#if DEVELOPMENT_BUILD || UNITY_EDITOR
124 graphicsResource.name = name == "" ? $"RenderGraphBuffer_{desc.count}_{desc.stride}_{desc.target}" : name;
125#endif
126 }
127
128 public override void UpdateGraphicsResource()
129 {
130 if (graphicsResource != null)
131 graphicsResource.name = GetName();
132 }
133
134 public override void ReleaseGraphicsResource()
135 {
136 if (graphicsResource != null)
137 graphicsResource.Release();
138 base.ReleaseGraphicsResource();
139 }
140
141 public override void LogCreation(RenderGraphLogger logger)
142 {
143 logger.LogLine($"Created GraphicsBuffer: {desc.name}");
144 }
145
146 public override void LogRelease(RenderGraphLogger logger)
147 {
148 logger.LogLine($"Released GraphicsBuffer: {desc.name}");
149 }
150 }
151
152 class BufferPool : RenderGraphResourcePool<GraphicsBuffer>
153 {
154 protected override void ReleaseInternalResource(GraphicsBuffer res)
155 {
156 res.Release();
157 }
158
159 protected override string GetResourceName(in GraphicsBuffer res)
160 {
161 return "GraphicsBufferNameNotAvailable"; // GraphicsBuffer.name is a setter only :(
162 }
163
164 protected override long GetResourceSize(in GraphicsBuffer res)
165 {
166 return res.count * res.stride;
167 }
168
169 override protected string GetResourceTypeName()
170 {
171 return "GraphicsBuffer";
172 }
173
174 override protected int GetSortIndex(GraphicsBuffer res)
175 {
176 return res.GetHashCode();
177 }
178 }
179}