A game about forced loneliness, made by TACStudios
at master 179 lines 6.5 kB view raw
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}