Skip to content

Commit

Permalink
Remove Monitor calls
Browse files Browse the repository at this point in the history
  • Loading branch information
Selinux24 committed May 1, 2024
1 parent 2e250c7 commit c164ed6
Show file tree
Hide file tree
Showing 8 changed files with 111 additions and 192 deletions.
13 changes: 1 addition & 12 deletions Engine/BuiltIn/BuiltInShaders.cs
Original file line number Diff line number Diff line change
Expand Up @@ -153,18 +153,7 @@ public static void DisposeResources()
/// <exception cref="EngineException">Throws an exception when the shader cannot be added to the shader cache</exception>
private static T CompileShader<T>(string name, Func<T> compiler) where T : class, IEngineShader
{
if (shaders.TryGetValue(name, out var sh))
{
return sh as T;
}

sh = compiler.Invoke();
if (shaders.TryAdd(name, sh))
{
return sh as T;
}

throw new EngineException($"Error adding shader to collection in {nameof(CompileShader)}");
return shaders.GetOrAdd(name, (key) => compiler.Invoke()) as T;
}
/// <summary>
/// Compiles a shader or retrieves it from the shader cache
Expand Down
27 changes: 14 additions & 13 deletions Engine/Common/BufferDescriptorRequestIndices.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,31 +27,26 @@ class BufferDescriptorRequestIndices : IBufferDescriptorRequest
public BufferDescriptor Descriptor { get; set; } = new BufferDescriptor();

/// <inheritdoc/>
public void Process(BufferManager bufferManager)
public async Task ProcessAsync(BufferManager bufferManager)
{
Processed = ProcessedStages.InProcess;

if (Action == BufferDescriptorRequestActions.Add)
{
Add(bufferManager);
await Add(bufferManager);
}
else if (Action == BufferDescriptorRequestActions.Remove)
{
Remove(bufferManager);
await Remove(bufferManager);
}

Processed = ProcessedStages.Processed;
}
/// <inheritdoc/>
public async Task ProcessAsync(BufferManager bufferManager)
{
await Task.Run(() => Process(bufferManager));
}
/// <summary>
/// Assign the descriptor to the buffer manager
/// </summary>
/// <param name="request">Buffer request</param>
private void Add(BufferManager bufferManager)
private async Task Add(BufferManager bufferManager)
{
if (Data?.Any() != true)
{
Expand All @@ -65,7 +60,7 @@ private void Add(BufferManager bufferManager)
int slot = bufferManager.FindIndexBufferDescription(Dynamic);
if (slot < 0)
{
descriptor = new BufferManagerIndices(Dynamic);
descriptor = new(Dynamic);
slot = bufferManager.AddIndexBufferDescription(descriptor);
}
else
Expand All @@ -74,23 +69,29 @@ private void Add(BufferManager bufferManager)
descriptor.ReallocationNeeded = true;
}

descriptor.AddDescriptor(Descriptor, Id, slot, Data);
await descriptor.AddDescriptor(Descriptor, Id, slot, Data);
}
/// <summary>
/// Remove the descriptor from de internal buffers of the buffer manager
/// </summary>
/// <param name="request">Buffer request</param>
private void Remove(BufferManager bufferManager)
private async Task Remove(BufferManager bufferManager)
{
if (Descriptor?.Ready == true)
{
var descriptor = bufferManager.GetIndexBufferDescription(Descriptor.BufferDescriptionIndex);

Logger.WriteTrace(this, $"Remove BufferDescriptor {(descriptor.Dynamic ? "dynamic" : "static")} {typeof(uint)} [{Descriptor.Id}]");

descriptor.RemoveDescriptor(Descriptor);
await descriptor.RemoveDescriptor(Descriptor);
descriptor.ReallocationNeeded = true;
}
}

/// <inheritdoc/>
public override string ToString()
{
return $"{Id} => {Action} {Processed}; {Descriptor}";
}
}
}
25 changes: 13 additions & 12 deletions Engine/Common/BufferDescriptorRequestInstancing.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,31 +25,26 @@ class BufferDescriptorRequestInstancing : IBufferDescriptorRequest
public BufferDescriptor Descriptor { get; set; } = new BufferDescriptor();

/// <inheritdoc/>
public void Process(BufferManager bufferManager)
public async Task ProcessAsync(BufferManager bufferManager)
{
Processed = ProcessedStages.InProcess;

if (Action == BufferDescriptorRequestActions.Add)
{
Add(bufferManager);
await Add(bufferManager);
}
else if (Action == BufferDescriptorRequestActions.Remove)
{
Remove(bufferManager);
await Remove(bufferManager);
}

Processed = ProcessedStages.Processed;
}
/// <inheritdoc/>
public async Task ProcessAsync(BufferManager bufferManager)
{
await Task.Run(() => Process(bufferManager));
}
/// <summary>
/// Assign the descriptor to the buffer manager
/// </summary>
/// <param name="request">Buffer request</param>
private void Add(BufferManager bufferManager)
private async Task Add(BufferManager bufferManager)
{
BufferManagerInstances<VertexInstancingData> descriptor;

Expand All @@ -67,23 +62,29 @@ private void Add(BufferManager bufferManager)
descriptor.ReallocationNeeded = true;
}

descriptor.AddDescriptor(Descriptor, Id, slot, Instances);
await descriptor.AddDescriptor(Descriptor, Id, slot, Instances);
}
/// <summary>
/// Remove the descriptor from de internal buffers of the buffer manager
/// </summary>
/// <param name="request">Buffer request</param>
private void Remove(BufferManager bufferManager)
private async Task Remove(BufferManager bufferManager)
{
if (Descriptor?.Ready == true)
{
var descriptor = bufferManager.GetInstancingBufferDescription(Descriptor.BufferDescriptionIndex);

Logger.WriteTrace(this, $"Remove BufferDescriptor {(descriptor.Dynamic ? "dynamic" : "static")} {typeof(VertexInstancingData)} [{Descriptor.Id}]");

descriptor.RemoveDescriptor(Descriptor, Instances);
await descriptor.RemoveDescriptor(Descriptor, Instances);
descriptor.ReallocationNeeded = true;
}
}

/// <inheritdoc/>
public override string ToString()
{
return $"{Id} => {Action} {Processed}; {Descriptor}";
}
}
}
27 changes: 14 additions & 13 deletions Engine/Common/BufferDescriptorRequestVertices.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,38 +24,33 @@ class BufferDescriptorRequestVertices : IBufferDescriptorRequest
/// <summary>
/// Vertex buffer descriptor
/// </summary>
public BufferDescriptor VertexDescriptor { get; set; } = new BufferDescriptor();
public BufferDescriptor VertexDescriptor { get; set; } = new();
/// <summary>
/// Instancing buffer descriptor
/// </summary>
public BufferDescriptor InstancingDescriptor { get; set; } = null;

/// <inheritdoc/>
public void Process(BufferManager bufferManager)
public async Task ProcessAsync(BufferManager bufferManager)
{
Processed = ProcessedStages.InProcess;

if (Action == BufferDescriptorRequestActions.Add)
{
Add(bufferManager);
await Add(bufferManager);
}
else if (Action == BufferDescriptorRequestActions.Remove)
{
Remove(bufferManager);
await Remove(bufferManager);
}

Processed = ProcessedStages.Processed;
}
/// <inheritdoc/>
public async Task ProcessAsync(BufferManager bufferManager)
{
await Task.Run(() => Process(bufferManager));
}
/// <summary>
/// Adds the descriptor to the buffer manager
/// </summary>
/// <param name="bufferManager">Buffer manager</param>
private void Add(BufferManager bufferManager)
private async Task Add(BufferManager bufferManager)
{
if (Data?.Any() != true)
{
Expand Down Expand Up @@ -88,23 +83,29 @@ private void Add(BufferManager bufferManager)
descriptor.InstancingDescriptor = InstancingDescriptor;
}

descriptor.AddDescriptor(VertexDescriptor, Id, slot, Data);
await descriptor.AddDescriptor(VertexDescriptor, Id, slot, Data);
}
/// <summary>
/// Removes the descriptor from de internal buffers of the buffer manager
/// </summary>
/// <param name="bufferManager">Buffer manager</param>
private void Remove(BufferManager bufferManager)
private async Task Remove(BufferManager bufferManager)
{
if (VertexDescriptor?.Ready == true)
{
var descriptor = bufferManager.GetVertexBufferDescription(VertexDescriptor.BufferDescriptionIndex);

Logger.WriteTrace(this, $"Remove BufferDescriptor {(descriptor.Dynamic ? "dynamic" : "static")} {descriptor.Type} [{VertexDescriptor.Id}]");

descriptor.RemoveDescriptor(VertexDescriptor);
await descriptor.RemoveDescriptor(VertexDescriptor);
descriptor.ReallocationNeeded = true;
}
}

/// <inheritdoc/>
public override string ToString()
{
return $"{Id} => {Action} {Processed}; {VertexDescriptor}";
}
}
}
81 changes: 27 additions & 54 deletions Engine/Common/BufferManagerIndices.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace Engine.Common
{
Expand Down Expand Up @@ -60,44 +60,31 @@ public bool Dirty
/// <param name="bufferDescriptionIndex">Buffer description index</param>
/// <param name="indices">Index list</param>
/// <returns>Returns the new registerd descriptor</returns>
public void AddDescriptor(BufferDescriptor descriptor, string id, int bufferDescriptionIndex, IEnumerable<uint> indices)
public async Task AddDescriptor(BufferDescriptor descriptor, string id, int bufferDescriptionIndex, IEnumerable<uint> indices)
{
int offset;

Monitor.Enter(data);
try
{
//Store current data index as descriptor offset
offset = data.Count;
//Add items to data list
data.AddRange(indices);
}
finally
{
Monitor.Exit(data);
}
//Store current data index as descriptor offset
offset = data.Count;

//Add items to data list
data.AddRange(indices);

//Create and add the new descriptor to main descriptor list
descriptor.Id = id;
descriptor.BufferDescriptionIndex = bufferDescriptionIndex;
descriptor.BufferOffset = offset;
descriptor.Count = indices.Count();

Monitor.Enter(descriptors);
try
{
descriptors.Add(descriptor);
}
finally
{
Monitor.Exit(descriptors);
}
descriptors.Add(descriptor);

await Task.CompletedTask;
}
/// <summary>
/// Removes a buffer descriptor from the internal list
/// </summary>
/// <param name="descriptor">Buffer descriptor to remove</param>
public void RemoveDescriptor(BufferDescriptor descriptor)
public async Task RemoveDescriptor(BufferDescriptor descriptor)
{
//Find descriptor
var index = descriptors.IndexOf(descriptor);
Expand All @@ -108,42 +95,28 @@ public void RemoveDescriptor(BufferDescriptor descriptor)

if (descriptor.Count > 0)
{
Monitor.Enter(data);
try
{
//If descriptor has items, remove from buffer descriptors
data.RemoveRange(descriptor.BufferOffset, descriptor.Count);
}
finally
{
Monitor.Exit(data);
}
//If descriptor has items, remove from buffer descriptors
data.RemoveRange(descriptor.BufferOffset, descriptor.Count);
}

Monitor.Enter(descriptors);
try
{
//Remove from descriptors list
descriptors.RemoveAt(index);

if (descriptors.Count == 0)
{
return;
}

//Reallocate descriptor offsets
descriptors[0].BufferOffset = 0;
for (int i = 1; i < descriptors.Count; i++)
{
var prev = descriptors[i - 1];
//Remove from descriptors list
descriptors.RemoveAt(index);

descriptors[i].BufferOffset = prev.BufferOffset + prev.Count;
}
if (descriptors.Count == 0)
{
return;
}
finally

//Reallocate descriptor offsets
descriptors[0].BufferOffset = 0;
for (int i = 1; i < descriptors.Count; i++)
{
Monitor.Exit(descriptors);
var prev = descriptors[i - 1];

descriptors[i].BufferOffset = prev.BufferOffset + prev.Count;
}

await Task.CompletedTask;
}

/// <inheritdoc/>
Expand Down
Loading

0 comments on commit c164ed6

Please sign in to comment.