mirror of
https://git.naxdy.org/Mirror/Ryujinx.git
synced 2025-02-21 00:23:36 +00:00
- Pools for Instructions and LiteralIntegers. Can be passed in when creating the generator module. - NewInstruction is called instead of new Instruction() - Ryujinx SpirvGenerator passes in some pools that are static. The idea is for these to be shared between threads eventually. - Estimate code size when creating the output MemoryStream - LiteralInteger pools using ThreadStatic pools that are initialized before and after creation... not sure of a better way since the way these are created is via implicit cast. Also, cache delegates for Spv.Generator for functions that are passed around to GenerateBinary etc, since passing the function raw creates a delegate on each call. TODO: update python spv cs generator to make the coregrammar with NewInstruction and the `params` overloads.
58 lines
1.3 KiB
C#
58 lines
1.3 KiB
C#
using System.Collections.Generic;
|
|
|
|
namespace Spv.Generator
|
|
{
|
|
public class GeneratorPool<T> where T : class, new()
|
|
{
|
|
private List<T[]> _pool;
|
|
private int _chunkIndex = -1;
|
|
private int _poolIndex = -1;
|
|
private int _initialSize;
|
|
private int _poolSizeIncrement;
|
|
|
|
public GeneratorPool(): this(1000, 200) { }
|
|
|
|
public GeneratorPool(int chunkSizeLimit, int poolSizeIncrement)
|
|
{
|
|
_initialSize = chunkSizeLimit;
|
|
_poolSizeIncrement = poolSizeIncrement;
|
|
|
|
_pool = new(chunkSizeLimit * 2);
|
|
|
|
AddChunkIfNeeded();
|
|
}
|
|
|
|
public T Allocate()
|
|
{
|
|
if (++_poolIndex >= _poolSizeIncrement)
|
|
{
|
|
AddChunkIfNeeded();
|
|
|
|
_poolIndex = 0;
|
|
}
|
|
|
|
return _pool[_chunkIndex][_poolIndex];
|
|
}
|
|
|
|
private void AddChunkIfNeeded()
|
|
{
|
|
if (++_chunkIndex >= _pool.Count)
|
|
{
|
|
T[] pool = new T[_poolSizeIncrement];
|
|
|
|
for (int i = 0; i < _poolSizeIncrement; i++)
|
|
{
|
|
pool[i] = new T();
|
|
}
|
|
|
|
_pool.Add(pool);
|
|
}
|
|
}
|
|
|
|
public void Clear()
|
|
{
|
|
_chunkIndex = 0;
|
|
_poolIndex = -1;
|
|
}
|
|
}
|
|
}
|