feat(rhi)!: refactor resource handles to GPUTexture/GPUBuffer
Refactored all graphics resource handles to use Handle<GPUTexture> and Handle<GPUBuffer> instead of Handle<Texture> and Handle<GraphicsBuffer>. Updated all APIs, interfaces, and implementations to use the new types, including ICommandBuffer, IResourceAllocator, ISwapChain, IRenderOutput, IRenderGraphBuilder, and related classes. Introduced TempJobAllocator for frame-latency-aware allocations. Updated ResourceHandleExtensions for new conversions. Performed minor code cleanups and removed the empty ClusterLod.cs file. BREAKING CHANGE: All usages of Handle<Texture> and Handle<GraphicsBuffer> are replaced with Handle<GPUTexture> and Handle<GPUBuffer>. This affects all APIs and resource management code. Callers must update their code to use the new handle types.
This commit is contained in:
@@ -54,12 +54,12 @@ public class TextureAsset : Asset
|
|||||||
internal const string _TYPE_ID = "0906F4EB-C3F0-431B-BCEA-132C88AB0C3F";
|
internal const string _TYPE_ID = "0906F4EB-C3F0-431B-BCEA-132C88AB0C3F";
|
||||||
internal static readonly Guid s_typeGuid = Guid.Parse(_TYPE_ID);
|
internal static readonly Guid s_typeGuid = Guid.Parse(_TYPE_ID);
|
||||||
|
|
||||||
private readonly Handle<Texture> _texture;
|
private readonly Handle<GPUTexture> _texture;
|
||||||
|
|
||||||
public override Guid TypeID => s_typeGuid;
|
public override Guid TypeID => s_typeGuid;
|
||||||
public Handle<Texture> Texture => _texture;
|
public Handle<GPUTexture> Texture => _texture;
|
||||||
|
|
||||||
public TextureAsset(Guid id, Guid[] dependencies, IAssetSettings? settings, Handle<Texture> texture)
|
public TextureAsset(Guid id, Guid[] dependencies, IAssetSettings? settings, Handle<GPUTexture> texture)
|
||||||
: base(id, dependencies, settings)
|
: base(id, dependencies, settings)
|
||||||
{
|
{
|
||||||
_texture = texture;
|
_texture = texture;
|
||||||
@@ -394,4 +394,4 @@ internal class TextureAssetHandler : IImportableAssetHandler
|
|||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
<IsAotCompatible>True</IsAotCompatible>
|
<IsAotCompatible>True</IsAotCompatible>
|
||||||
<DefineConstants>$(DefineConstants);ENABLE_DEBUG_LAYER</DefineConstants>
|
<DefineConstants>$(DefineConstants);MHP_ENABLE_SAFETY_CHECKS</DefineConstants>
|
||||||
<IsTrimmable>True</IsTrimmable>
|
<IsTrimmable>True</IsTrimmable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
@@ -19,9 +19,9 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Misaki.HighPerformance" Version="1.0.5" />
|
<PackageReference Include="Misaki.HighPerformance" Version="1.0.6" />
|
||||||
<PackageReference Include="Misaki.HighPerformance.Jobs" Version="1.5.3" />
|
<PackageReference Include="Misaki.HighPerformance.Jobs" Version="1.5.5" />
|
||||||
<PackageReference Include="Misaki.HighPerformance.LowLevel" Version="1.5.4">
|
<PackageReference Include="Misaki.HighPerformance.LowLevel" Version="1.6.1">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
|
|||||||
164
src/Runtime/Ghost.Core/TemJobAllocator.cs
Normal file
164
src/Runtime/Ghost.Core/TemJobAllocator.cs
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
using Misaki.HighPerformance.LowLevel.Buffer;
|
||||||
|
using Misaki.HighPerformance.LowLevel.Utilities;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
namespace Ghost.Core;
|
||||||
|
|
||||||
|
public unsafe partial struct TempJobAllocator
|
||||||
|
{
|
||||||
|
private static TempJobAllocator* _pAllocator;
|
||||||
|
|
||||||
|
public static AllocationHandle AllocationHandle => _pAllocator->Handle;
|
||||||
|
|
||||||
|
internal static void Initialize(nuint capacity)
|
||||||
|
{
|
||||||
|
Debug.Assert(_pAllocator == null, "TempJobAllocator is already initialized.");
|
||||||
|
_pAllocator = (TempJobAllocator*)Malloc((nuint)sizeof(TempJobAllocator));
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void Dispose()
|
||||||
|
{
|
||||||
|
if (_pAllocator == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < _FRAME_LATENCY; i++)
|
||||||
|
{
|
||||||
|
_pAllocator->_pArena[i].Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
MemoryUtility.Free(_pAllocator->_pArena);
|
||||||
|
MemoryUtility.Free(_pAllocator);
|
||||||
|
|
||||||
|
_pAllocator = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public unsafe partial struct TempJobAllocator : IAllocator
|
||||||
|
{
|
||||||
|
private const int _FRAME_LATENCY = 4;
|
||||||
|
private const int _MAGIC_ID = -559038737;
|
||||||
|
|
||||||
|
private VirtualArena* _pArena;
|
||||||
|
private int _currentFrameCount;
|
||||||
|
private int _currentFrameIndex;
|
||||||
|
private fixed int _allocationsPerFrame[_FRAME_LATENCY];
|
||||||
|
|
||||||
|
private MemoryHandle _memoryHandle;
|
||||||
|
private AllocationHandle _handle;
|
||||||
|
|
||||||
|
public readonly AllocationHandle Handle => _handle;
|
||||||
|
|
||||||
|
internal TempJobAllocator(void* pSelf, nuint capacity)
|
||||||
|
{
|
||||||
|
var memoryHandle = default(MemoryHandle);
|
||||||
|
|
||||||
|
_pArena = (VirtualArena*)Malloc((nuint)(sizeof(VirtualArena) * _FRAME_LATENCY));
|
||||||
|
_currentFrameCount = 0;
|
||||||
|
_currentFrameIndex = 0;
|
||||||
|
_memoryHandle = memoryHandle;
|
||||||
|
|
||||||
|
for (var i = 0; i < _FRAME_LATENCY; i++)
|
||||||
|
{
|
||||||
|
_pArena[i] = new VirtualArena(capacity);
|
||||||
|
_allocationsPerFrame[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
_handle = new AllocationHandle
|
||||||
|
{
|
||||||
|
State = Unsafe.AsPointer(ref this),
|
||||||
|
Alloc = &Allocate,
|
||||||
|
Realloc = &Reallocate,
|
||||||
|
Free = &Free,
|
||||||
|
#if MHP_ENABLE_SAFETY_CHECKS
|
||||||
|
IsValid = &IsValid,
|
||||||
|
#else
|
||||||
|
IsValid = null,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void* Allocate(void* instance, nuint size, nuint alignment, AllocationOption allocationOption
|
||||||
|
#if MHP_ENABLE_SAFETY_CHECKS
|
||||||
|
, MemoryHandle* pHandle
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
{
|
||||||
|
var pSelf = (TempJobAllocator*)instance;
|
||||||
|
var pCurrentArena = pSelf->_pArena + pSelf->_currentFrameIndex;
|
||||||
|
var ptr = pCurrentArena->Allocate(size, alignment, allocationOption);
|
||||||
|
if (ptr == null)
|
||||||
|
{
|
||||||
|
#if MHP_ENABLE_SAFETY_CHECKS
|
||||||
|
*pHandle = MemoryHandle.Invalid;
|
||||||
|
#endif
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Interlocked.Increment(ref pSelf->_allocationsPerFrame[pSelf->_currentFrameIndex]);
|
||||||
|
#if MHP_ENABLE_SAFETY_CHECKS
|
||||||
|
*pHandle = new MemoryHandle(_MAGIC_ID, pSelf->_currentFrameCount);
|
||||||
|
#endif
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void* Reallocate(void* instance, void* ptr, nuint oldSize, nuint newSize, nuint alignment, AllocationOption allocationOption
|
||||||
|
#if MHP_ENABLE_SAFETY_CHECKS
|
||||||
|
, MemoryHandle* pHandle
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (ptr == null)
|
||||||
|
{
|
||||||
|
return Allocate(instance, newSize, alignment, allocationOption
|
||||||
|
#if MHP_ENABLE_SAFETY_CHECKS
|
||||||
|
, pHandle
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
var pSelf = (TempJobAllocator*)instance;
|
||||||
|
var pCurrentArena = pSelf->_pArena + pSelf->_currentFrameIndex;
|
||||||
|
var newPtr = pCurrentArena->Allocate(newSize, alignment, allocationOption);
|
||||||
|
if (newPtr == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
MemCpy(ptr, newPtr, Math.Min(oldSize, newSize));
|
||||||
|
|
||||||
|
return newPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Free(void* instance, void* ptr
|
||||||
|
#if MHP_ENABLE_SAFETY_CHECKS
|
||||||
|
, MemoryHandle handle
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
{
|
||||||
|
var pSelf = (TempJobAllocator*)instance;
|
||||||
|
Interlocked.Decrement(ref pSelf->_allocationsPerFrame[pSelf->_currentFrameIndex]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if MHP_ENABLE_SAFETY_CHECKS
|
||||||
|
private static bool IsValid(void* instance, MemoryHandle handle)
|
||||||
|
{
|
||||||
|
var pSelf = (TempJobAllocator*)instance;
|
||||||
|
return handle.ID == _MAGIC_ID && handle.Generation > pSelf->_currentFrameCount - _FRAME_LATENCY;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
public int AdvanceFrame()
|
||||||
|
{
|
||||||
|
var allocations = Interlocked.Exchange(ref _allocationsPerFrame[_currentFrameIndex], 0);
|
||||||
|
|
||||||
|
_currentFrameCount++;
|
||||||
|
_currentFrameIndex = _currentFrameCount % _FRAME_LATENCY;
|
||||||
|
|
||||||
|
(_pArena + _currentFrameIndex)->Reset();
|
||||||
|
|
||||||
|
return allocations;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,8 +24,8 @@ public unsafe struct Camera : IComponent
|
|||||||
public int swapChainIndex; // The index of the swap chain to render to. -1 means render to rt only.
|
public int swapChainIndex; // The index of the swap chain to render to. -1 means render to rt only.
|
||||||
public int priority;
|
public int priority;
|
||||||
|
|
||||||
public Handle<Texture> colorTarget;
|
public Handle<GPUTexture> colorTarget;
|
||||||
public Handle<Texture> depthTarget;
|
public Handle<GPUTexture> depthTarget;
|
||||||
// TODO: Add more render targets like motion vector, etc.
|
// TODO: Add more render targets like motion vector, etc.
|
||||||
|
|
||||||
// Custim render function. If it's not null, the render system will call this function instead of the default render pipeline.
|
// Custim render function. If it's not null, the render system will call this function instead of the default render pipeline.
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using Ghost.Core;
|
||||||
using Misaki.HighPerformance.Jobs;
|
using Misaki.HighPerformance.Jobs;
|
||||||
using Misaki.HighPerformance.LowLevel.Collections;
|
using Misaki.HighPerformance.LowLevel.Collections;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
@@ -57,7 +58,7 @@ public unsafe partial struct EntityQuery
|
|||||||
throw new InvalidOperationException("The World has no JobScheduler assigned.");
|
throw new InvalidOperationException("The World has no JobScheduler assigned.");
|
||||||
}
|
}
|
||||||
|
|
||||||
var chunkInfos = new UnsafeList<ChunkInfo>(_matchingArchetypes.Count * 2, JobScheduler.TempAllocatorHandle);
|
var chunkInfos = new UnsafeList<ChunkInfo>(_matchingArchetypes.Count * 2, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
foreach (var archID in _matchingArchetypes)
|
foreach (var archID in _matchingArchetypes)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1107,14 +1107,14 @@ public unsafe partial struct EntityQuery
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 1. Flatten the World
|
// 1. Flatten the World
|
||||||
var chunks = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunks = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkVersions = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunkVersions = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkEntityCounts = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var chunkEntityCounts = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var entityOffsets = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var entityOffsets = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
// Iterate the Query's matching archetypes
|
// Iterate the Query's matching archetypes
|
||||||
foreach (var archID in _matchingArchetypes)
|
foreach (var archID in _matchingArchetypes)
|
||||||
@@ -1248,18 +1248,18 @@ public unsafe partial struct EntityQuery
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 1. Flatten the World
|
// 1. Flatten the World
|
||||||
var chunks = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunks = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkVersions = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunkVersions = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkEntityCounts = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var chunkEntityCounts = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var entityOffsets = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var entityOffsets = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
// Iterate the Query's matching archetypes
|
// Iterate the Query's matching archetypes
|
||||||
foreach (var archID in _matchingArchetypes)
|
foreach (var archID in _matchingArchetypes)
|
||||||
@@ -1415,22 +1415,22 @@ public unsafe partial struct EntityQuery
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 1. Flatten the World
|
// 1. Flatten the World
|
||||||
var chunks = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunks = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkVersions = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunkVersions = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkEntityCounts = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var chunkEntityCounts = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var entityOffsets = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var entityOffsets = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
// Iterate the Query's matching archetypes
|
// Iterate the Query's matching archetypes
|
||||||
foreach (var archID in _matchingArchetypes)
|
foreach (var archID in _matchingArchetypes)
|
||||||
@@ -1608,26 +1608,26 @@ public unsafe partial struct EntityQuery
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 1. Flatten the World
|
// 1. Flatten the World
|
||||||
var chunks = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunks = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkVersions = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunkVersions = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkEntityCounts = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var chunkEntityCounts = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var entityOffsets = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var entityOffsets = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets3 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets3 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets3 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets3 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices3 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices3 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
// Iterate the Query's matching archetypes
|
// Iterate the Query's matching archetypes
|
||||||
foreach (var archID in _matchingArchetypes)
|
foreach (var archID in _matchingArchetypes)
|
||||||
@@ -1827,30 +1827,30 @@ public unsafe partial struct EntityQuery
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 1. Flatten the World
|
// 1. Flatten the World
|
||||||
var chunks = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunks = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkVersions = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunkVersions = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkEntityCounts = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var chunkEntityCounts = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var entityOffsets = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var entityOffsets = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets3 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets3 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets3 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets3 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices3 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices3 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets4 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets4 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets4 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets4 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices4 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices4 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
// Iterate the Query's matching archetypes
|
// Iterate the Query's matching archetypes
|
||||||
foreach (var archID in _matchingArchetypes)
|
foreach (var archID in _matchingArchetypes)
|
||||||
@@ -2072,34 +2072,34 @@ public unsafe partial struct EntityQuery
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 1. Flatten the World
|
// 1. Flatten the World
|
||||||
var chunks = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunks = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkVersions = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunkVersions = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkEntityCounts = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var chunkEntityCounts = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var entityOffsets = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var entityOffsets = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets3 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets3 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets3 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets3 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices3 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices3 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets4 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets4 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets4 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets4 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices4 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices4 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets5 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets5 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets5 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets5 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices5 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices5 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
// Iterate the Query's matching archetypes
|
// Iterate the Query's matching archetypes
|
||||||
foreach (var archID in _matchingArchetypes)
|
foreach (var archID in _matchingArchetypes)
|
||||||
@@ -2343,38 +2343,38 @@ public unsafe partial struct EntityQuery
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 1. Flatten the World
|
// 1. Flatten the World
|
||||||
var chunks = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunks = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkVersions = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunkVersions = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkEntityCounts = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var chunkEntityCounts = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var entityOffsets = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var entityOffsets = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets3 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets3 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets3 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets3 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices3 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices3 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets4 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets4 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets4 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets4 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices4 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices4 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets5 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets5 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets5 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets5 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices5 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices5 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets6 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets6 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets6 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets6 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices6 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices6 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
// Iterate the Query's matching archetypes
|
// Iterate the Query's matching archetypes
|
||||||
foreach (var archID in _matchingArchetypes)
|
foreach (var archID in _matchingArchetypes)
|
||||||
@@ -2640,42 +2640,42 @@ public unsafe partial struct EntityQuery
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 1. Flatten the World
|
// 1. Flatten the World
|
||||||
var chunks = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunks = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkVersions = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunkVersions = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkEntityCounts = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var chunkEntityCounts = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var entityOffsets = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var entityOffsets = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices0 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices0 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices1 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices1 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices2 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices2 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets3 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets3 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets3 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets3 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices3 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices3 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets4 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets4 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets4 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets4 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices4 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices4 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets5 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets5 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets5 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets5 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices5 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices5 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets6 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets6 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets6 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets6 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices6 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices6 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
var offsets7 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets7 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets7 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets7 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices7 = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices7 = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
// Iterate the Query's matching archetypes
|
// Iterate the Query's matching archetypes
|
||||||
foreach (var archID in _matchingArchetypes)
|
foreach (var archID in _matchingArchetypes)
|
||||||
|
|||||||
@@ -137,15 +137,15 @@ public unsafe partial struct EntityQuery
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 1. Flatten the World
|
// 1. Flatten the World
|
||||||
var chunks = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunks = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkVersions = new UnsafeList<IntPtr>(128, JobScheduler.TempAllocatorHandle);
|
var chunkVersions = new UnsafeList<IntPtr>(128, TempJobAllocator.AllocationHandle);
|
||||||
var chunkEntityCounts = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var chunkEntityCounts = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var entityOffsets = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var entityOffsets = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
<# for (var j = 0; j < i; j++){ #>
|
<# for (var j = 0; j < i; j++){ #>
|
||||||
var offsets<#= j #> = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var offsets<#= j #> = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var bitsOffsets<#= j #> = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var bitsOffsets<#= j #> = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
var versionIndices<#= j #> = new UnsafeList<int>(128, JobScheduler.TempAllocatorHandle);
|
var versionIndices<#= j #> = new UnsafeList<int>(128, TempJobAllocator.AllocationHandle);
|
||||||
|
|
||||||
<# } #>
|
<# } #>
|
||||||
// Iterate the Query's matching archetypes
|
// Iterate the Query's matching archetypes
|
||||||
|
|||||||
@@ -307,7 +307,7 @@ internal unsafe class D3D12CommandBuffer : D3D12Object<ID3D12GraphicsCommandList
|
|||||||
pNativeObject->Barrier(groupCount, groups);
|
pNativeObject->Barrier(groupCount, groups);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetRenderTargets(ReadOnlySpan<Handle<Texture>> renderTargets, Handle<Texture> depthTarget)
|
public void SetRenderTargets(ReadOnlySpan<Handle<GPUTexture>> renderTargets, Handle<GPUTexture> depthTarget)
|
||||||
{
|
{
|
||||||
AssertNotDisposed();
|
AssertNotDisposed();
|
||||||
ThrowIfNotRecording();
|
ThrowIfNotRecording();
|
||||||
@@ -360,7 +360,7 @@ internal unsafe class D3D12CommandBuffer : D3D12Object<ID3D12GraphicsCommandList
|
|||||||
pNativeObject->OMSetRenderTargets(rtvCount, pRtvHandles, FALSE, pDsvHandle);
|
pNativeObject->OMSetRenderTargets(rtvCount, pRtvHandles, FALSE, pDsvHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ClearRenderTargetView(Handle<Texture> renderTarget, Color128 clearColor)
|
public void ClearRenderTargetView(Handle<GPUTexture> renderTarget, Color128 clearColor)
|
||||||
{
|
{
|
||||||
AssertNotDisposed();
|
AssertNotDisposed();
|
||||||
ThrowIfNotRecording();
|
ThrowIfNotRecording();
|
||||||
@@ -385,7 +385,7 @@ internal unsafe class D3D12CommandBuffer : D3D12Object<ID3D12GraphicsCommandList
|
|||||||
pNativeObject->ClearRenderTargetView(cpuHandle, (float*)&clearColor, 0, null);
|
pNativeObject->ClearRenderTargetView(cpuHandle, (float*)&clearColor, 0, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ClearDepthStencilView(Handle<Texture> depthStencil, bool inlcudeDepth, bool includeStencil, float clearDepth = 1.0f, byte clearStencil = 0)
|
public void ClearDepthStencilView(Handle<GPUTexture> depthStencil, bool inlcudeDepth, bool includeStencil, float clearDepth = 1.0f, byte clearStencil = 0)
|
||||||
{
|
{
|
||||||
AssertNotDisposed();
|
AssertNotDisposed();
|
||||||
ThrowIfNotRecording();
|
ThrowIfNotRecording();
|
||||||
@@ -631,7 +631,7 @@ internal unsafe class D3D12CommandBuffer : D3D12Object<ID3D12GraphicsCommandList
|
|||||||
pNativeObject->SetPipelineState(psor.Value);
|
pNativeObject->SetPipelineState(psor.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetConstantBufferView(uint slot, Handle<GraphicsBuffer> buffer)
|
public void SetConstantBufferView(uint slot, Handle<RHI.GPUBuffer> buffer)
|
||||||
{
|
{
|
||||||
AssertNotDisposed();
|
AssertNotDisposed();
|
||||||
ThrowIfNotRecording();
|
ThrowIfNotRecording();
|
||||||
@@ -647,7 +647,7 @@ internal unsafe class D3D12CommandBuffer : D3D12Object<ID3D12GraphicsCommandList
|
|||||||
pNativeObject->SetGraphicsRootConstantBufferView(slot, resource.Get()->GetGPUVirtualAddress());
|
pNativeObject->SetGraphicsRootConstantBufferView(slot, resource.Get()->GetGPUVirtualAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetVertexBuffer(uint slot, Handle<GraphicsBuffer> buffer, ulong offset = 0)
|
public void SetVertexBuffer(uint slot, Handle<RHI.GPUBuffer> buffer, ulong offset = 0)
|
||||||
{
|
{
|
||||||
AssertNotDisposed();
|
AssertNotDisposed();
|
||||||
ThrowIfNotRecording();
|
ThrowIfNotRecording();
|
||||||
@@ -677,7 +677,7 @@ internal unsafe class D3D12CommandBuffer : D3D12Object<ID3D12GraphicsCommandList
|
|||||||
pNativeObject->IASetVertexBuffers(slot, 1, &vbView);
|
pNativeObject->IASetVertexBuffers(slot, 1, &vbView);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetIndexBuffer(Handle<GraphicsBuffer> buffer, IndexType type, ulong offset = 0)
|
public void SetIndexBuffer(Handle<RHI.GPUBuffer> buffer, IndexType type, ulong offset = 0)
|
||||||
{
|
{
|
||||||
AssertNotDisposed();
|
AssertNotDisposed();
|
||||||
ThrowIfNotRecording();
|
ThrowIfNotRecording();
|
||||||
@@ -817,7 +817,7 @@ internal unsafe class D3D12CommandBuffer : D3D12Object<ID3D12GraphicsCommandList
|
|||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ExecuteIndirect(Handle<GraphicsBuffer> argumentBuffer, ulong argumentOffset, Handle<GraphicsBuffer> countBuffer, ulong countBufferOffset)
|
public void ExecuteIndirect(Handle<RHI.GPUBuffer> argumentBuffer, ulong argumentOffset, Handle<RHI.GPUBuffer> countBuffer, ulong countBufferOffset)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
|
|
||||||
@@ -841,7 +841,7 @@ internal unsafe class D3D12CommandBuffer : D3D12Object<ID3D12GraphicsCommandList
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UploadBuffer<T>(Handle<GraphicsBuffer> buffer, params ReadOnlySpan<T> data)
|
public void UploadBuffer<T>(Handle<RHI.GPUBuffer> buffer, params ReadOnlySpan<T> data)
|
||||||
where T : unmanaged
|
where T : unmanaged
|
||||||
{
|
{
|
||||||
static void Map(T* pData, nuint size, ulong offset, SharedPtr<ID3D12Resource> resource)
|
static void Map(T* pData, nuint size, ulong offset, SharedPtr<ID3D12Resource> resource)
|
||||||
@@ -891,7 +891,7 @@ internal unsafe class D3D12CommandBuffer : D3D12Object<ID3D12GraphicsCommandList
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UploadTexture(Handle<Texture> texture, params ReadOnlySpan<SubResourceData> subresources)
|
public void UploadTexture(Handle<GPUTexture> texture, params ReadOnlySpan<SubResourceData> subresources)
|
||||||
{
|
{
|
||||||
AssertNotDisposed();
|
AssertNotDisposed();
|
||||||
ThrowIfNotRecording();
|
ThrowIfNotRecording();
|
||||||
@@ -932,7 +932,7 @@ internal unsafe class D3D12CommandBuffer : D3D12Object<ID3D12GraphicsCommandList
|
|||||||
d3d12Subresources);
|
d3d12Subresources);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CopyBuffer(Handle<GraphicsBuffer> dst, Handle<GraphicsBuffer> src, ulong dstOffset = 0, ulong srcOffset = 0, ulong numBytes = 0)
|
public void CopyBuffer(Handle<RHI.GPUBuffer> dst, Handle<RHI.GPUBuffer> src, ulong dstOffset = 0, ulong srcOffset = 0, ulong numBytes = 0)
|
||||||
{
|
{
|
||||||
AssertNotDisposed();
|
AssertNotDisposed();
|
||||||
ThrowIfNotRecording();
|
ThrowIfNotRecording();
|
||||||
@@ -991,7 +991,7 @@ internal unsafe class D3D12CommandBuffer : D3D12Object<ID3D12GraphicsCommandList
|
|||||||
&& desc1.SampleDesc.Count == desc2.SampleDesc.Count;
|
&& desc1.SampleDesc.Count == desc2.SampleDesc.Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CopyTexture(Handle<Texture> dst, TextureRegion? dstRegion, Handle<Texture> src, TextureRegion? srcRegion)
|
public void CopyTexture(Handle<GPUTexture> dst, TextureRegion? dstRegion, Handle<GPUTexture> src, TextureRegion? srcRegion)
|
||||||
{
|
{
|
||||||
AssertNotDisposed();
|
AssertNotDisposed();
|
||||||
ThrowIfNotRecording();
|
ThrowIfNotRecording();
|
||||||
|
|||||||
@@ -454,7 +454,7 @@ internal sealed unsafe partial class D3D12ResourceAllocator : IResourceAllocator
|
|||||||
private readonly D3D12PipelineLibrary _pipelineLibrary;
|
private readonly D3D12PipelineLibrary _pipelineLibrary;
|
||||||
|
|
||||||
// TODO: We should use ring buffer pool in d3d12ma for upload buffer.
|
// TODO: We should use ring buffer pool in d3d12ma for upload buffer.
|
||||||
private readonly Handle<GraphicsBuffer> _uploadBatch;
|
private readonly Handle<RHI.GPUBuffer> _uploadBatch;
|
||||||
private ulong _uploadBatchOffset;
|
private ulong _uploadBatchOffset;
|
||||||
|
|
||||||
private bool _disposed;
|
private bool _disposed;
|
||||||
@@ -600,7 +600,7 @@ internal sealed unsafe partial class D3D12ResourceAllocator : IResourceAllocator
|
|||||||
return TrackAllocation(alloc, barrierData, ResourceViewGroup.Invalid, default, name, false);
|
return TrackAllocation(alloc, barrierData, ResourceViewGroup.Invalid, default, name, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Handle<Texture> CreateTexture(ref readonly TextureDesc desc, string name, CreationOptions options = default)
|
public Handle<GPUTexture> CreateTexture(ref readonly TextureDesc desc, string name, CreationOptions options = default)
|
||||||
{
|
{
|
||||||
Debug.Assert(!_disposed);
|
Debug.Assert(!_disposed);
|
||||||
|
|
||||||
@@ -633,7 +633,7 @@ internal sealed unsafe partial class D3D12ResourceAllocator : IResourceAllocator
|
|||||||
#if DEBUG
|
#if DEBUG
|
||||||
ThrowIfFailed(hr);
|
ThrowIfFailed(hr);
|
||||||
#endif
|
#endif
|
||||||
return Handle<Texture>.Invalid;
|
return Handle<GPUTexture>.Invalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
var isTemp = options.AllocationType == ResourceAllocationType.Temporary;
|
var isTemp = options.AllocationType == ResourceAllocationType.Temporary;
|
||||||
@@ -698,7 +698,7 @@ internal sealed unsafe partial class D3D12ResourceAllocator : IResourceAllocator
|
|||||||
return resource.AsTexture();
|
return resource.AsTexture();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Handle<Texture> CreateRenderTarget(ref readonly RenderTargetDesc desc, string name, CreationOptions options = default)
|
public Handle<GPUTexture> CreateRenderTarget(ref readonly RenderTargetDesc desc, string name, CreationOptions options = default)
|
||||||
{
|
{
|
||||||
Debug.Assert(!_disposed);
|
Debug.Assert(!_disposed);
|
||||||
|
|
||||||
@@ -706,7 +706,7 @@ internal sealed unsafe partial class D3D12ResourceAllocator : IResourceAllocator
|
|||||||
return CreateTexture(in textureDesc, name, options);
|
return CreateTexture(in textureDesc, name, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Handle<GraphicsBuffer> CreateBuffer(ref readonly BufferDesc desc, string name, CreationOptions options = default)
|
public Handle<RHI.GPUBuffer> CreateBuffer(ref readonly BufferDesc desc, string name, CreationOptions options = default)
|
||||||
{
|
{
|
||||||
Debug.Assert(!_disposed);
|
Debug.Assert(!_disposed);
|
||||||
CheckBufferSize(desc.Size);
|
CheckBufferSize(desc.Size);
|
||||||
@@ -748,7 +748,7 @@ internal sealed unsafe partial class D3D12ResourceAllocator : IResourceAllocator
|
|||||||
#if DEBUG
|
#if DEBUG
|
||||||
ThrowIfFailed(hr);
|
ThrowIfFailed(hr);
|
||||||
#endif
|
#endif
|
||||||
return Handle<GraphicsBuffer>.Invalid;
|
return Handle<RHI.GPUBuffer>.Invalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
var isTemp = options.AllocationType == ResourceAllocationType.Temporary;
|
var isTemp = options.AllocationType == ResourceAllocationType.Temporary;
|
||||||
@@ -808,7 +808,7 @@ internal sealed unsafe partial class D3D12ResourceAllocator : IResourceAllocator
|
|||||||
return resource.AsGraphicsBuffer();
|
return resource.AsGraphicsBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Handle<GraphicsBuffer> CreateTempUploadBuffer(ulong sizeInBytes, out ulong offset)
|
public Handle<RHI.GPUBuffer> CreateTempUploadBuffer(ulong sizeInBytes, out ulong offset)
|
||||||
{
|
{
|
||||||
if (sizeInBytes <= _MAX_RESOURCE_SIZE_TO_FIT_IN_UPLOAD_BATCH && sizeInBytes + _uploadBatchOffset <= _UPLOAD_BATCH_SIZE)
|
if (sizeInBytes <= _MAX_RESOURCE_SIZE_TO_FIT_IN_UPLOAD_BATCH && sizeInBytes + _uploadBatchOffset <= _UPLOAD_BATCH_SIZE)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -99,7 +99,6 @@ internal class D3D12ResourceDatabase : IResourceDatabase
|
|||||||
|
|
||||||
private readonly D3D12DescriptorAllocator _descriptorAllocator;
|
private readonly D3D12DescriptorAllocator _descriptorAllocator;
|
||||||
|
|
||||||
// TODO: Change AOS to SOA?
|
|
||||||
private UnsafeSlotMap<ResourceRecord> _resources;
|
private UnsafeSlotMap<ResourceRecord> _resources;
|
||||||
private UnsafeHashMap<SamplerDesc, Identifier<Sampler>> _samplers;
|
private UnsafeHashMap<SamplerDesc, Identifier<Sampler>> _samplers;
|
||||||
#if DEBUG || GHOST_EDITOR
|
#if DEBUG || GHOST_EDITOR
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ internal unsafe class DXGISwapChain : ISwapChain
|
|||||||
private readonly D3D12RenderDevice _device;
|
private readonly D3D12RenderDevice _device;
|
||||||
|
|
||||||
private UniquePtr<IDXGISwapChain4> _swapChain;
|
private UniquePtr<IDXGISwapChain4> _swapChain;
|
||||||
private UnsafeArray<Handle<Texture>> _backBuffers;
|
private UnsafeArray<Handle<GPUTexture>> _backBuffers;
|
||||||
|
|
||||||
private readonly object? _compositionSurface;
|
private readonly object? _compositionSurface;
|
||||||
|
|
||||||
@@ -117,7 +117,7 @@ internal unsafe class DXGISwapChain : ISwapChain
|
|||||||
var pSfwapChain = CreateSwapChain(device, desc, bufferCount);
|
var pSfwapChain = CreateSwapChain(device, desc, bufferCount);
|
||||||
_swapChain.Attach(pSfwapChain);
|
_swapChain.Attach(pSfwapChain);
|
||||||
|
|
||||||
_backBuffers = new UnsafeArray<Handle<Texture>>((int)bufferCount, Allocator.Persistent);
|
_backBuffers = new UnsafeArray<Handle<GPUTexture>>((int)bufferCount, Allocator.Persistent);
|
||||||
|
|
||||||
Width = desc.Width;
|
Width = desc.Width;
|
||||||
Height = desc.Height;
|
Height = desc.Height;
|
||||||
@@ -166,14 +166,14 @@ internal unsafe class DXGISwapChain : ISwapChain
|
|||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public Handle<Texture> GetCurrentBackBuffer()
|
public Handle<GPUTexture> GetCurrentBackBuffer()
|
||||||
{
|
{
|
||||||
Debug.Assert(!_disposed);
|
Debug.Assert(!_disposed);
|
||||||
return _backBuffers[_swapChain.Get()->GetCurrentBackBufferIndex()];
|
return _backBuffers[_swapChain.Get()->GetCurrentBackBufferIndex()];
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public ReadOnlySpan<Handle<Texture>> GetBackBuffers()
|
public ReadOnlySpan<Handle<GPUTexture>> GetBackBuffers()
|
||||||
{
|
{
|
||||||
Debug.Assert(!_disposed);
|
Debug.Assert(!_disposed);
|
||||||
return _backBuffers.AsSpan();
|
return _backBuffers.AsSpan();
|
||||||
|
|||||||
@@ -292,12 +292,12 @@ public struct RenderDesc
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The "Target" (Where to write pixels)
|
// The "Target" (Where to write pixels)
|
||||||
public Handle<Texture> Target
|
public Handle<GPUTexture> Target
|
||||||
{
|
{
|
||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Handle<Texture> DepthTarget
|
public Handle<GPUTexture> DepthTarget
|
||||||
{
|
{
|
||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
@@ -377,7 +377,7 @@ public struct SubResourceData
|
|||||||
|
|
||||||
public struct PassRenderTargetDesc
|
public struct PassRenderTargetDesc
|
||||||
{
|
{
|
||||||
public Handle<Texture> Texture
|
public Handle<GPUTexture> Texture
|
||||||
{
|
{
|
||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
@@ -407,7 +407,7 @@ public struct PassRenderTargetDesc
|
|||||||
|
|
||||||
public struct PassDepthStencilDesc
|
public struct PassDepthStencilDesc
|
||||||
{
|
{
|
||||||
public Handle<Texture> Texture
|
public Handle<GPUTexture> Texture
|
||||||
{
|
{
|
||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,14 +63,14 @@ public interface ICommandBuffer : IDisposable
|
|||||||
/// <param name="renderTargets">A read-only span of handles to textures that will be used as render targets.
|
/// <param name="renderTargets">A read-only span of handles to textures that will be used as render targets.
|
||||||
/// The order of handles determines the order in which render targets are bound.</param>
|
/// The order of handles determines the order in which render targets are bound.</param>
|
||||||
/// <param name="depthTarget">A handle to the texture to be used as the depth Target. Specify a invalid handle if no depth Target is required.</param>
|
/// <param name="depthTarget">A handle to the texture to be used as the depth Target. Specify a invalid handle if no depth Target is required.</param>
|
||||||
void SetRenderTargets(ReadOnlySpan<Handle<Texture>> renderTargets, Handle<Texture> depthTarget);
|
void SetRenderTargets(ReadOnlySpan<Handle<GPUTexture>> renderTargets, Handle<GPUTexture> depthTarget);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Clears the specified render target to a given color.
|
/// Clears the specified render target to a given color.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="renderTarget">A handle to the render target texture to be cleared. Must reference a valid render target.</param>
|
/// <param name="renderTarget">A handle to the render target texture to be cleared. Must reference a valid render target.</param>
|
||||||
/// <param name="clearColor">The color value used to clear the render target. Specifies the RGBA components to fill the target.</param>
|
/// <param name="clearColor">The color value used to clear the render target. Specifies the RGBA components to fill the target.</param>
|
||||||
void ClearRenderTargetView(Handle<Texture> renderTarget, Color128 clearColor);
|
void ClearRenderTargetView(Handle<GPUTexture> renderTarget, Color128 clearColor);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Clears the specified depth-stencil view by resetting its depth and/or stencil values.
|
/// Clears the specified depth-stencil view by resetting its depth and/or stencil values.
|
||||||
@@ -80,7 +80,7 @@ public interface ICommandBuffer : IDisposable
|
|||||||
/// <param name="includeStencil">A value indicating whether the stencil component should be cleared.</param>
|
/// <param name="includeStencil">A value indicating whether the stencil component should be cleared.</param>
|
||||||
/// <param name="clearDepth">The value to which the depth buffer will be set. Typically ranges from 0.0f (nearest) to 1.0f (farthest).</param>
|
/// <param name="clearDepth">The value to which the depth buffer will be set. Typically ranges from 0.0f (nearest) to 1.0f (farthest).</param>
|
||||||
/// <param name="clearStencil">The value to which the stencil buffer will be set. Must be a valid stencil value supported by the format.</param>
|
/// <param name="clearStencil">The value to which the stencil buffer will be set. Must be a valid stencil value supported by the format.</param>
|
||||||
void ClearDepthStencilView(Handle<Texture> depthStencil, bool inlcludeDepth, bool includeStencil, float clearDepth = 1.0f, byte clearStencil = 0);
|
void ClearDepthStencilView(Handle<GPUTexture> depthStencil, bool inlcludeDepth, bool includeStencil, float clearDepth = 1.0f, byte clearStencil = 0);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Begins a render pass with the specified render Target
|
/// Begins a render pass with the specified render Target
|
||||||
@@ -112,7 +112,7 @@ public interface ICommandBuffer : IDisposable
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="slot">The zero-based index of the slot to bind the constant buffer view to.</param>
|
/// <param name="slot">The zero-based index of the slot to bind the constant buffer view to.</param>
|
||||||
/// <param name="buffer">A graphics buffer to use as the constant buffer view.</param>
|
/// <param name="buffer">A graphics buffer to use as the constant buffer view.</param>
|
||||||
void SetConstantBufferView(uint slot, Handle<GraphicsBuffer> buffer);
|
void SetConstantBufferView(uint slot, Handle<GPUBuffer> buffer);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Binds a vertex buffer to the specified slot for subsequent draw calls.
|
/// Binds a vertex buffer to the specified slot for subsequent draw calls.
|
||||||
@@ -120,7 +120,7 @@ public interface ICommandBuffer : IDisposable
|
|||||||
/// <param name="slot">The vertex buffer slot to bind to.</param>
|
/// <param name="slot">The vertex buffer slot to bind to.</param>
|
||||||
/// <param name="buffer">The handle to the graphics buffer containing vertex data.</param>
|
/// <param name="buffer">The handle to the graphics buffer containing vertex data.</param>
|
||||||
/// <param name="offset">The Offset in bytes from the start of the buffer.</param>
|
/// <param name="offset">The Offset in bytes from the start of the buffer.</param>
|
||||||
void SetVertexBuffer(uint slot, Handle<GraphicsBuffer> buffer, ulong offset = 0);
|
void SetVertexBuffer(uint slot, Handle<GPUBuffer> buffer, ulong offset = 0);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Binds an index buffer for indexed drawing.
|
/// Binds an index buffer for indexed drawing.
|
||||||
@@ -128,7 +128,7 @@ public interface ICommandBuffer : IDisposable
|
|||||||
/// <param name="buffer">The handle to the graphics buffer containing index data.</param>
|
/// <param name="buffer">The handle to the graphics buffer containing index data.</param>
|
||||||
/// <param name="type">The space of indices (e.g., 16-bit or 32-bit).</param>
|
/// <param name="type">The space of indices (e.g., 16-bit or 32-bit).</param>
|
||||||
/// <param name="offset">The Offset in bytes from the start of the buffer.</param>
|
/// <param name="offset">The Offset in bytes from the start of the buffer.</param>
|
||||||
void SetIndexBuffer(Handle<GraphicsBuffer> buffer, IndexType type, ulong offset = 0);
|
void SetIndexBuffer(Handle<GPUBuffer> buffer, IndexType type, ulong offset = 0);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the primitive topology to be used for subsequent drawing operations.
|
/// Sets the primitive topology to be used for subsequent drawing operations.
|
||||||
@@ -192,7 +192,7 @@ public interface ICommandBuffer : IDisposable
|
|||||||
/// <param name="buffer">A handle to the buffer that will receive the uploaded data.</param>
|
/// <param name="buffer">A handle to the buffer that will receive the uploaded data.</param>
|
||||||
/// <param name="data">A read-only span containing the data to upload to the buffer. The span must contain elements of space
|
/// <param name="data">A read-only span containing the data to upload to the buffer. The span must contain elements of space
|
||||||
/// <typeparamref name="T"/>.</param>
|
/// <typeparamref name="T"/>.</param>
|
||||||
void UploadBuffer<T>(Handle<GraphicsBuffer> buffer, params ReadOnlySpan<T> data)
|
void UploadBuffer<T>(Handle<GPUBuffer> buffer, params ReadOnlySpan<T> data)
|
||||||
where T : unmanaged;
|
where T : unmanaged;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -201,7 +201,7 @@ public interface ICommandBuffer : IDisposable
|
|||||||
/// <param name="texture">The texture resource to which the subresource data will be uploaded. Must be a valid, initialized texture handle.</param>
|
/// <param name="texture">The texture resource to which the subresource data will be uploaded. Must be a valid, initialized texture handle.</param>
|
||||||
/// <param name="subresources">A reference to the structure containing the subresource data to upload. The data must match the Format and layout expected by the texture.</param>
|
/// <param name="subresources">A reference to the structure containing the subresource data to upload. The data must match the Format and layout expected by the texture.</param>
|
||||||
/// Must be greater than zero and not exceed the remaining subresources in the texture.</param>
|
/// Must be greater than zero and not exceed the remaining subresources in the texture.</param>
|
||||||
void UploadTexture(Handle<Texture> texture, params ReadOnlySpan<SubResourceData> subresources);
|
void UploadTexture(Handle<GPUTexture> texture, params ReadOnlySpan<SubResourceData> subresources);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Copies a specified number of bytes from the source graphics buffer to the destination graphics buffer.
|
/// Copies a specified number of bytes from the source graphics buffer to the destination graphics buffer.
|
||||||
@@ -211,7 +211,7 @@ public interface ICommandBuffer : IDisposable
|
|||||||
/// <param name="destOffset">The byte Offset in the destination buffer at which to begin writing. Must be zero or greater.</param>
|
/// <param name="destOffset">The byte Offset in the destination buffer at which to begin writing. Must be zero or greater.</param>
|
||||||
/// <param name="srcOffset">The byte Offset in the source buffer at which to begin reading. Must be zero or greater.</param>
|
/// <param name="srcOffset">The byte Offset in the source buffer at which to begin reading. Must be zero or greater.</param>
|
||||||
/// <param name="numBytes">The number of bytes to copy. If zero, copies the remaining bytes from the source buffer starting at <paramref name="srcOffset"/>.</param>
|
/// <param name="numBytes">The number of bytes to copy. If zero, copies the remaining bytes from the source buffer starting at <paramref name="srcOffset"/>.</param>
|
||||||
void CopyBuffer(Handle<GraphicsBuffer> dest, Handle<GraphicsBuffer> src, ulong destOffset = 0, ulong srcOffset = 0, ulong numBytes = 0);
|
void CopyBuffer(Handle<GPUBuffer> dest, Handle<GPUBuffer> src, ulong destOffset = 0, ulong srcOffset = 0, ulong numBytes = 0);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Copies a region of a source texture to a destination texture. The source and destination regions can be specified to copy a subset of the textures, or the entire textures if the regions are null.
|
/// Copies a region of a source texture to a destination texture. The source and destination regions can be specified to copy a subset of the textures, or the entire textures if the regions are null.
|
||||||
@@ -220,5 +220,5 @@ public interface ICommandBuffer : IDisposable
|
|||||||
/// <param name="dstRegion">The region of the destination texture to copy to. If null, the entire texture will be used.</param>
|
/// <param name="dstRegion">The region of the destination texture to copy to. If null, the entire texture will be used.</param>
|
||||||
/// <param name="src">The handle to the source texture from which data will be read.</param>
|
/// <param name="src">The handle to the source texture from which data will be read.</param>
|
||||||
/// <param name="srcRegion">The region of the source texture to copy from. If null, the entire texture will be used.</param>
|
/// <param name="srcRegion">The region of the source texture to copy from. If null, the entire texture will be used.</param>
|
||||||
void CopyTexture(Handle<Texture> dst, TextureRegion? dstRegion, Handle<Texture> src, TextureRegion? srcRegion);
|
void CopyTexture(Handle<GPUTexture> dst, TextureRegion? dstRegion, Handle<GPUTexture> src, TextureRegion? srcRegion);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ public interface IRenderOutput
|
|||||||
/// Gets a handle to the current render target texture.
|
/// Gets a handle to the current render target texture.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>A handle to the texture that is currently set as the render target.</returns>
|
/// <returns>A handle to the texture that is currently set as the render target.</returns>
|
||||||
Handle<Texture> GetRenderTarget();
|
Handle<GPUTexture> GetRenderTarget();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Begins a rendering operation using the specified command buffer. Typically this will include resource barriers,
|
/// Begins a rendering operation using the specified command buffer. Typically this will include resource barriers,
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ public interface IResourceAllocator : IDisposable
|
|||||||
/// <param name="name">Debug name of the resource</param>
|
/// <param name="name">Debug name of the resource</param>
|
||||||
/// <param name="options">Additional options of the resource allocation</param>
|
/// <param name="options">Additional options of the resource allocation</param>
|
||||||
/// <returns>An <see cref="Handle{Texture}"/> point to the resource</returns>
|
/// <returns>An <see cref="Handle{Texture}"/> point to the resource</returns>
|
||||||
Handle<Texture> CreateTexture(ref readonly TextureDesc desc, string name, CreationOptions options = default);
|
Handle<GPUTexture> CreateTexture(ref readonly TextureDesc desc, string name, CreationOptions options = default);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a render Target for off-screen rendering
|
/// Creates a render Target for off-screen rendering
|
||||||
@@ -107,7 +107,7 @@ public interface IResourceAllocator : IDisposable
|
|||||||
/// <param name="name">Debug name of the resource</param>
|
/// <param name="name">Debug name of the resource</param>
|
||||||
/// <param name="options">Additional options of the resource allocation</param>
|
/// <param name="options">Additional options of the resource allocation</param>
|
||||||
/// <returns>An <see cref="Handle{Texture}"/> point to the resource</returns>
|
/// <returns>An <see cref="Handle{Texture}"/> point to the resource</returns>
|
||||||
Handle<Texture> CreateRenderTarget(ref readonly RenderTargetDesc desc, string name, CreationOptions options = default);
|
Handle<GPUTexture> CreateRenderTarget(ref readonly RenderTargetDesc desc, string name, CreationOptions options = default);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a buffer resource
|
/// Creates a buffer resource
|
||||||
@@ -116,7 +116,7 @@ public interface IResourceAllocator : IDisposable
|
|||||||
/// <param name="name">Debug name of the resource</param>
|
/// <param name="name">Debug name of the resource</param>
|
||||||
/// <param name="options">Additional options of the resource allocation</param>
|
/// <param name="options">Additional options of the resource allocation</param>
|
||||||
/// <returns>An <see cref="Handle{GraphicsBuffer}"/> point to the resource</returns>
|
/// <returns>An <see cref="Handle{GraphicsBuffer}"/> point to the resource</returns>
|
||||||
Handle<GraphicsBuffer> CreateBuffer(ref readonly BufferDesc desc, string name, CreationOptions options = default);
|
Handle<GPUBuffer> CreateBuffer(ref readonly BufferDesc desc, string name, CreationOptions options = default);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a temporary upload buffer of the specified size in bytes.
|
/// Creates a temporary upload buffer of the specified size in bytes.
|
||||||
@@ -127,7 +127,7 @@ public interface IResourceAllocator : IDisposable
|
|||||||
/// <param name="sizeInBytes">The size of the upload buffer to create, in bytes.</param>
|
/// <param name="sizeInBytes">The size of the upload buffer to create, in bytes.</param>
|
||||||
/// <param name="offset">The offset within the upload buffer where the allocation begins.</param>
|
/// <param name="offset">The offset within the upload buffer where the allocation begins.</param>
|
||||||
/// <returns>An <see cref="Handle{GraphicsBuffer}"/> pointing to the created upload buffer.</returns>
|
/// <returns>An <see cref="Handle{GraphicsBuffer}"/> pointing to the created upload buffer.</returns>
|
||||||
Handle<GraphicsBuffer> CreateTempUploadBuffer(ulong sizeInBytes, out ulong offset);
|
Handle<GPUBuffer> CreateTempUploadBuffer(ulong sizeInBytes, out ulong offset);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a new sampler object using the specified sampler description.
|
/// Creates a new sampler object using the specified sampler description.
|
||||||
|
|||||||
@@ -43,13 +43,13 @@ public interface ISwapChain : IDisposable
|
|||||||
/// Gets the current back buffer texture
|
/// Gets the current back buffer texture
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>Current back buffer texture</returns>
|
/// <returns>Current back buffer texture</returns>
|
||||||
Handle<Texture> GetCurrentBackBuffer();
|
Handle<GPUTexture> GetCurrentBackBuffer();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets all back buffer textures
|
/// Gets all back buffer textures
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>AlowBufferAndTexture back buffer textures</returns>
|
/// <returns>AlowBufferAndTexture back buffer textures</returns>
|
||||||
ReadOnlySpan<Handle<Texture>> GetBackBuffers();
|
ReadOnlySpan<Handle<GPUTexture>> GetBackBuffers();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Presents the rendered frame
|
/// Presents the rendered frame
|
||||||
@@ -70,4 +70,4 @@ public interface ISwapChain : IDisposable
|
|||||||
/// <param name="scaleX">The factor by which to scale the object along the X-axis.</param>
|
/// <param name="scaleX">The factor by which to scale the object along the X-axis.</param>
|
||||||
/// <param name="scaleY">The factor by which to scale the object along the Y-axis.</param>
|
/// <param name="scaleY">The factor by which to scale the object along the Y-axis.</param>
|
||||||
void SetScale(float scaleX, float scaleY);
|
void SetScale(float scaleX, float scaleY);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,30 +3,30 @@ using Ghost.Core;
|
|||||||
namespace Ghost.Graphics.RHI;
|
namespace Ghost.Graphics.RHI;
|
||||||
|
|
||||||
public readonly struct GPUResource;
|
public readonly struct GPUResource;
|
||||||
public readonly struct Texture;
|
public readonly struct GPUTexture;
|
||||||
public readonly struct GraphicsBuffer;
|
public readonly struct GPUBuffer;
|
||||||
|
|
||||||
public readonly struct Sampler;
|
public readonly struct Sampler;
|
||||||
|
|
||||||
public static class ResourceHandleExtensions
|
public static class ResourceHandleExtensions
|
||||||
{
|
{
|
||||||
public static Handle<GPUResource> AsResource(this Handle<Texture> texture)
|
public static Handle<GPUResource> AsResource(this Handle<GPUTexture> texture)
|
||||||
{
|
{
|
||||||
return new Handle<GPUResource>(texture.ID, texture.Generation);
|
return new Handle<GPUResource>(texture.ID, texture.Generation);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Handle<GPUResource> AsResource(this Handle<GraphicsBuffer> buffer)
|
public static Handle<GPUResource> AsResource(this Handle<GPUBuffer> buffer)
|
||||||
{
|
{
|
||||||
return new Handle<GPUResource>(buffer.ID, buffer.Generation);
|
return new Handle<GPUResource>(buffer.ID, buffer.Generation);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Handle<Texture> AsTexture(this Handle<GPUResource> resource)
|
public static Handle<GPUTexture> AsTexture(this Handle<GPUResource> resource)
|
||||||
{
|
{
|
||||||
return new Handle<Texture>(resource.ID, resource.Generation);
|
return new Handle<GPUTexture>(resource.ID, resource.Generation);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Handle<GraphicsBuffer> AsGraphicsBuffer(this Handle<GPUResource> resource)
|
public static Handle<GPUBuffer> AsGraphicsBuffer(this Handle<GPUResource> resource)
|
||||||
{
|
{
|
||||||
return new Handle<GraphicsBuffer>(resource.ID, resource.Generation);
|
return new Handle<GPUBuffer>(resource.ID, resource.Generation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,16 +11,16 @@ namespace Ghost.Graphics.Core;
|
|||||||
internal struct CBufferCache : IResourceReleasable
|
internal struct CBufferCache : IResourceReleasable
|
||||||
{
|
{
|
||||||
private UnsafeArray<byte> _cpuData;
|
private UnsafeArray<byte> _cpuData;
|
||||||
private Handle<GraphicsBuffer> _gpuResource;
|
private Handle<RHI.GPUBuffer> _gpuResource;
|
||||||
private uint _size;
|
private uint _size;
|
||||||
|
|
||||||
public readonly UnsafeArray<byte> CpuData => _cpuData;
|
public readonly UnsafeArray<byte> CpuData => _cpuData;
|
||||||
public readonly Handle<GraphicsBuffer> GpuResource => _gpuResource;
|
public readonly Handle<RHI.GPUBuffer> GpuResource => _gpuResource;
|
||||||
public readonly uint Size => _size;
|
public readonly uint Size => _size;
|
||||||
|
|
||||||
public readonly bool IsCreated => _size != 0 && _gpuResource.IsValid && _cpuData.IsCreated;
|
public readonly bool IsCreated => _size != 0 && _gpuResource.IsValid && _cpuData.IsCreated;
|
||||||
|
|
||||||
public CBufferCache(Handle<GraphicsBuffer> buffer, uint bufferSize)
|
public CBufferCache(Handle<RHI.GPUBuffer> buffer, uint bufferSize)
|
||||||
{
|
{
|
||||||
_size = bufferSize;
|
_size = bufferSize;
|
||||||
_cpuData = new UnsafeArray<byte>((int)bufferSize, Allocator.Persistent);
|
_cpuData = new UnsafeArray<byte>((int)bufferSize, Allocator.Persistent);
|
||||||
@@ -37,7 +37,7 @@ internal struct CBufferCache : IResourceReleasable
|
|||||||
_cpuData.Dispose();
|
_cpuData.Dispose();
|
||||||
database.ReleaseResource(_gpuResource.AsResource());
|
database.ReleaseResource(_gpuResource.AsResource());
|
||||||
|
|
||||||
_gpuResource = Handle<GraphicsBuffer>.Invalid;
|
_gpuResource = Handle<RHI.GPUBuffer>.Invalid;
|
||||||
_size = 0;
|
_size = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ public struct Mesh : IResourceReleasable
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the handle to the vertex buffer on the GPU.
|
/// Gets the handle to the vertex buffer on the GPU.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Handle<GraphicsBuffer> VertexBuffer
|
public Handle<RHI.GPUBuffer> VertexBuffer
|
||||||
{
|
{
|
||||||
get; internal set;
|
get; internal set;
|
||||||
}
|
}
|
||||||
@@ -146,7 +146,7 @@ public struct Mesh : IResourceReleasable
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the handle to the index buffer on the GPU.
|
/// Gets the handle to the index buffer on the GPU.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Handle<GraphicsBuffer> IndexBuffer
|
public Handle<RHI.GPUBuffer> IndexBuffer
|
||||||
{
|
{
|
||||||
get; internal set;
|
get; internal set;
|
||||||
}
|
}
|
||||||
@@ -154,7 +154,7 @@ public struct Mesh : IResourceReleasable
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the handle to the meshlet buffer on the GPU.
|
/// Gets the handle to the meshlet buffer on the GPU.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Handle<GraphicsBuffer> MeshLetBuffer
|
public Handle<RHI.GPUBuffer> MeshLetBuffer
|
||||||
{
|
{
|
||||||
get; internal set;
|
get; internal set;
|
||||||
}
|
}
|
||||||
@@ -162,7 +162,7 @@ public struct Mesh : IResourceReleasable
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the handle to the meshlet vertices buffer on the GPU.
|
/// Gets the handle to the meshlet vertices buffer on the GPU.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Handle<GraphicsBuffer> MeshletVerticesBuffer
|
public Handle<RHI.GPUBuffer> MeshletVerticesBuffer
|
||||||
{
|
{
|
||||||
get; internal set;
|
get; internal set;
|
||||||
}
|
}
|
||||||
@@ -170,7 +170,7 @@ public struct Mesh : IResourceReleasable
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the handle to the meshlet triangles buffer on the GPU.
|
/// Gets the handle to the meshlet triangles buffer on the GPU.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Handle<GraphicsBuffer> MeshletTrianglesBuffer
|
public Handle<RHI.GPUBuffer> MeshletTrianglesBuffer
|
||||||
{
|
{
|
||||||
get; internal set;
|
get; internal set;
|
||||||
}
|
}
|
||||||
@@ -178,12 +178,12 @@ public struct Mesh : IResourceReleasable
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the handle to the mesh data buffer on the GPU.
|
/// Gets the handle to the mesh data buffer on the GPU.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Handle<GraphicsBuffer> ObjectDataBuffer
|
public Handle<RHI.GPUBuffer> ObjectDataBuffer
|
||||||
{
|
{
|
||||||
get; internal set;
|
get; internal set;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal Mesh(ReadOnlySpan<Vertex> vertices, ReadOnlySpan<uint> indices, Handle<GraphicsBuffer> vertexBuffer, Handle<GraphicsBuffer> indexBuffer)
|
internal Mesh(ReadOnlySpan<Vertex> vertices, ReadOnlySpan<uint> indices, Handle<RHI.GPUBuffer> vertexBuffer, Handle<RHI.GPUBuffer> indexBuffer)
|
||||||
{
|
{
|
||||||
Vertices = new UnsafeList<Vertex>(vertices.Length, Allocator.Persistent);
|
Vertices = new UnsafeList<Vertex>(vertices.Length, Allocator.Persistent);
|
||||||
Indices = new UnsafeList<uint>(indices.Length, Allocator.Persistent);
|
Indices = new UnsafeList<uint>(indices.Length, Allocator.Persistent);
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ internal class SwapChainRenderOutput : IRenderOutput
|
|||||||
Scissor = new ScissorRectDesc { Right = swapChain.Width, Bottom = swapChain.Height };
|
Scissor = new ScissorRectDesc { Right = swapChain.Width, Bottom = swapChain.Height };
|
||||||
}
|
}
|
||||||
|
|
||||||
public Handle<Texture> GetRenderTarget()
|
public Handle<GPUTexture> GetRenderTarget()
|
||||||
{
|
{
|
||||||
return _swapChain.GetCurrentBackBuffer();
|
return _swapChain.GetCurrentBackBuffer();
|
||||||
}
|
}
|
||||||
@@ -58,7 +58,7 @@ internal class SwapChainRenderOutput : IRenderOutput
|
|||||||
|
|
||||||
internal class TextureRenderOutput : IRenderOutput
|
internal class TextureRenderOutput : IRenderOutput
|
||||||
{
|
{
|
||||||
private readonly Handle<Texture> _texture;
|
private readonly Handle<GPUTexture> _texture;
|
||||||
|
|
||||||
public ViewportDesc Viewport
|
public ViewportDesc Viewport
|
||||||
{
|
{
|
||||||
@@ -70,12 +70,12 @@ internal class TextureRenderOutput : IRenderOutput
|
|||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TextureRenderOutput(Handle<Texture> texture)
|
public TextureRenderOutput(Handle<GPUTexture> texture)
|
||||||
{
|
{
|
||||||
_texture = texture;
|
_texture = texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Handle<Texture> GetRenderTarget()
|
public Handle<GPUTexture> GetRenderTarget()
|
||||||
{
|
{
|
||||||
return _texture;
|
return _texture;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -183,8 +183,8 @@ public unsafe struct RenderRequest: IDisposable
|
|||||||
public RenderView view;
|
public RenderView view;
|
||||||
|
|
||||||
public int swapChainIndex;
|
public int swapChainIndex;
|
||||||
public Handle<Texture> colorTarget;
|
public Handle<GPUTexture> colorTarget;
|
||||||
public Handle<Texture> depthTarget;
|
public Handle<GPUTexture> depthTarget;
|
||||||
|
|
||||||
public RenderList opaqueRenderList;
|
public RenderList opaqueRenderList;
|
||||||
public RenderList transparentRenderList;
|
public RenderList transparentRenderList;
|
||||||
|
|||||||
@@ -242,7 +242,7 @@ public readonly unsafe ref struct RenderingContext
|
|||||||
TransitionBarrier(bufferHandle, false, BarrierLayout.Undefined, BarrierAccess.ShaderResource, BarrierSync.PixelShading | BarrierSync.NonPixelShading);
|
TransitionBarrier(bufferHandle, false, BarrierLayout.Undefined, BarrierAccess.ShaderResource, BarrierSync.PixelShading | BarrierSync.NonPixelShading);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Handle<Texture> CreateTexture<T>(ref readonly TextureDesc desc, ReadOnlySpan<T> data, string name)
|
public Handle<GPUTexture> CreateTexture<T>(ref readonly TextureDesc desc, ReadOnlySpan<T> data, string name)
|
||||||
where T : unmanaged
|
where T : unmanaged
|
||||||
{
|
{
|
||||||
var handle = ResourceAllocator.CreateTexture(in desc, name);
|
var handle = ResourceAllocator.CreateTexture(in desc, name);
|
||||||
@@ -251,7 +251,7 @@ public readonly unsafe ref struct RenderingContext
|
|||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UploadTexture<T>(Handle<Texture> texture, ReadOnlySpan<T> data)
|
public void UploadTexture<T>(Handle<GPUTexture> texture, ReadOnlySpan<T> data)
|
||||||
where T : unmanaged
|
where T : unmanaged
|
||||||
{
|
{
|
||||||
var desc = ResourceDatabase.GetResourceDescription(texture.AsResource()).GetValueOrThrow();
|
var desc = ResourceDatabase.GetResourceDescription(texture.AsResource()).GetValueOrThrow();
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ public sealed class RenderGraph : IDisposable
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="texture">The external texture handle.</param>
|
/// <param name="texture">The external texture handle.</param>
|
||||||
/// <returns>The identifier of the imported render graph texture. Invalid if import fails.</returns>
|
/// <returns>The identifier of the imported render graph texture. Invalid if import fails.</returns>
|
||||||
public Identifier<RGTexture> ImportTexture(Handle<Texture> texture, string name,
|
public Identifier<RGTexture> ImportTexture(Handle<GPUTexture> texture, string name,
|
||||||
Color128 clearColor = default, float clearDepth = 1.0f, byte clearStencil = 0,
|
Color128 clearColor = default, float clearDepth = 1.0f, byte clearStencil = 0,
|
||||||
bool clearAtFirstUse = true, bool discardAtLastUse = true)
|
bool clearAtFirstUse = true, bool discardAtLastUse = true)
|
||||||
{
|
{
|
||||||
@@ -125,7 +125,7 @@ public sealed class RenderGraph : IDisposable
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="buffer">The external buffer handle.</param>
|
/// <param name="buffer">The external buffer handle.</param>
|
||||||
/// <returns>The identifier of the imported render graph buffer. Invalid if import fails.</returns>
|
/// <returns>The identifier of the imported render graph buffer. Invalid if import fails.</returns>
|
||||||
public Identifier<RGBuffer> ImportBuffer(Handle<GraphicsBuffer> buffer, string name)
|
public Identifier<RGBuffer> ImportBuffer(Handle<RHI.GPUBuffer> buffer, string name)
|
||||||
{
|
{
|
||||||
var r = _resourceDatabase.GetResourceDescription(buffer.AsResource());
|
var r = _resourceDatabase.GetResourceDescription(buffer.AsResource());
|
||||||
if (r.IsFailure)
|
if (r.IsFailure)
|
||||||
|
|||||||
@@ -79,6 +79,20 @@ public interface IRenderGraphBuilder : IDisposable
|
|||||||
/// <param name="hint">Optional hint about how the buffer will be used.</param>
|
/// <param name="hint">Optional hint about how the buffer will be used.</param>
|
||||||
/// <returns>An identifier for the buffer.</returns>
|
/// <returns>An identifier for the buffer.</returns>
|
||||||
Identifier<RGBuffer> UseBuffer(Identifier<RGBuffer> buffer, AccessFlags accessMode);
|
Identifier<RGBuffer> UseBuffer(Identifier<RGBuffer> buffer, AccessFlags accessMode);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Extracts the actual texture resource associated with the given identifier for use in outside of the render graph execution context.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="texture">The identifier of the texture to be extracted.</param>
|
||||||
|
/// <returns>A handle to the actual texture resource that can be used outside of the render graph execution context.</returns>
|
||||||
|
Handle<GPUTexture> ExtractTexture(Identifier<RGTexture> texture);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Extracts the actual buffer resource associated with the given identifier for use in outside of the render graph execution context.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="buffer">The identifier of the buffer to be extracted.</param>
|
||||||
|
/// <returns>A handle to the actual buffer resource that can be used outside of the render graph execution context.</returns>
|
||||||
|
Handle<GPUBuffer> ExtractBuffer(Identifier<RGBuffer> buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IRasterRenderGraphBuilder : IRenderGraphBuilder
|
public interface IRasterRenderGraphBuilder : IRenderGraphBuilder
|
||||||
@@ -254,6 +268,17 @@ internal class RenderGraphBuilder : IRasterRenderGraphBuilder, IComputeRenderGra
|
|||||||
return UseResource(buffer.AsResource(), flags, RenderGraphResourceType.Buffer).AsBuffer();
|
return UseResource(buffer.AsResource(), flags, RenderGraphResourceType.Buffer).AsBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Implement ExtractTexture and ExtractBuffer to allow users to get the actual GPU resources for use outside of the render graph execution context.
|
||||||
|
public Handle<GPUTexture> ExtractTexture(Identifier<RGTexture> texture)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Handle<GPUBuffer> ExtractBuffer(Identifier<RGBuffer> buffer)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
public Identifier<RGTexture> UseRandomAccessTexture(Identifier<RGTexture> texture)
|
public Identifier<RGTexture> UseRandomAccessTexture(Identifier<RGTexture> texture)
|
||||||
{
|
{
|
||||||
ThrowIfDisposed();
|
ThrowIfDisposed();
|
||||||
|
|||||||
@@ -11,11 +11,11 @@ public interface IRenderGraphContext
|
|||||||
IResourceDatabase ResourceDatabase { get; }
|
IResourceDatabase ResourceDatabase { get; }
|
||||||
|
|
||||||
Handle<GPUResource> GetActualResource(Identifier<RGResource> resource);
|
Handle<GPUResource> GetActualResource(Identifier<RGResource> resource);
|
||||||
Handle<Texture> GetActualTexture(Identifier<RGTexture> texture);
|
Handle<GPUTexture> GetActualTexture(Identifier<RGTexture> texture);
|
||||||
Handle<GraphicsBuffer> GetActualBuffer(Identifier<RGBuffer> buffer);
|
Handle<RHI.GPUBuffer> GetActualBuffer(Identifier<RGBuffer> buffer);
|
||||||
|
|
||||||
Handle<Texture> GetHistoryTexture(ReadOnlySpan<Identifier<RGTexture>> texture, int historyOffset);
|
Handle<GPUTexture> GetHistoryTexture(ReadOnlySpan<Identifier<RGTexture>> texture, int historyOffset);
|
||||||
Handle<GraphicsBuffer> GetHistoryBuffer(ReadOnlySpan<Identifier<RGBuffer>> buffer, int historyOffset);
|
Handle<RHI.GPUBuffer> GetHistoryBuffer(ReadOnlySpan<Identifier<RGBuffer>> buffer, int historyOffset);
|
||||||
|
|
||||||
ICommandBuffer GetCommandBufferUnsafe();
|
ICommandBuffer GetCommandBufferUnsafe();
|
||||||
}
|
}
|
||||||
@@ -60,8 +60,8 @@ internal sealed class RenderGraphContext : IUnsafeRenderContext
|
|||||||
private TextureFormat _dsvFormat;
|
private TextureFormat _dsvFormat;
|
||||||
private int _rtvCount;
|
private int _rtvCount;
|
||||||
|
|
||||||
private Handle<GraphicsBuffer> _activePerMaterialData;
|
private Handle<RHI.GPUBuffer> _activePerMaterialData;
|
||||||
private Handle<GraphicsBuffer> _activePerMeshData;
|
private Handle<RHI.GPUBuffer> _activePerMeshData;
|
||||||
private int _activeMeshIndexCount;
|
private int _activeMeshIndexCount;
|
||||||
|
|
||||||
private uint _activeFrameBuffer;
|
private uint _activeFrameBuffer;
|
||||||
@@ -115,21 +115,21 @@ internal sealed class RenderGraphContext : IUnsafeRenderContext
|
|||||||
return _resources.GetResource(resource).backingResource;
|
return _resources.GetResource(resource).backingResource;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Handle<Texture> GetActualTexture(Identifier<RGTexture> texture)
|
public Handle<GPUTexture> GetActualTexture(Identifier<RGTexture> texture)
|
||||||
{
|
{
|
||||||
return _resources.GetResource(texture.AsResource()).backingResource.AsTexture();
|
return _resources.GetResource(texture.AsResource()).backingResource.AsTexture();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Handle<GraphicsBuffer> GetActualBuffer(Identifier<RGBuffer> buffer)
|
public Handle<RHI.GPUBuffer> GetActualBuffer(Identifier<RGBuffer> buffer)
|
||||||
{
|
{
|
||||||
return _resources.GetResource(buffer.AsResource()).backingResource.AsGraphicsBuffer();
|
return _resources.GetResource(buffer.AsResource()).backingResource.AsGraphicsBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Handle<Texture> GetHistoryTexture(ReadOnlySpan<Identifier<RGTexture>> textures, int historyOffset)
|
public Handle<GPUTexture> GetHistoryTexture(ReadOnlySpan<Identifier<RGTexture>> textures, int historyOffset)
|
||||||
{
|
{
|
||||||
if (historyOffset < 0 || historyOffset >= textures.Length)
|
if (historyOffset < 0 || historyOffset >= textures.Length)
|
||||||
{
|
{
|
||||||
return Handle<Texture>.Invalid;
|
return Handle<GPUTexture>.Invalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
var index = (int)(_frameIndex % textures.Length) - historyOffset;
|
var index = (int)(_frameIndex % textures.Length) - historyOffset;
|
||||||
@@ -141,11 +141,11 @@ internal sealed class RenderGraphContext : IUnsafeRenderContext
|
|||||||
return GetActualTexture(textures[index]);
|
return GetActualTexture(textures[index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Handle<GraphicsBuffer> GetHistoryBuffer(ReadOnlySpan<Identifier<RGBuffer>> buffers, int historyOffset)
|
public Handle<RHI.GPUBuffer> GetHistoryBuffer(ReadOnlySpan<Identifier<RGBuffer>> buffers, int historyOffset)
|
||||||
{
|
{
|
||||||
if (historyOffset < 0 || historyOffset >= buffers.Length)
|
if (historyOffset < 0 || historyOffset >= buffers.Length)
|
||||||
{
|
{
|
||||||
return Handle<GraphicsBuffer>.Invalid;
|
return Handle<RHI.GPUBuffer>.Invalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
var index = (int)(_frameIndex % buffers.Length) - historyOffset;
|
var index = (int)(_frameIndex % buffers.Length) - historyOffset;
|
||||||
@@ -172,7 +172,7 @@ internal sealed class RenderGraphContext : IUnsafeRenderContext
|
|||||||
var r = _resourceManager.GetMaterialReference(material);
|
var r = _resourceManager.GetMaterialReference(material);
|
||||||
if (r.IsFailure)
|
if (r.IsFailure)
|
||||||
{
|
{
|
||||||
_activePerMaterialData = Handle<GraphicsBuffer>.Invalid;
|
_activePerMaterialData = Handle<RHI.GPUBuffer>.Invalid;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,7 +185,7 @@ internal sealed class RenderGraphContext : IUnsafeRenderContext
|
|||||||
var shaderResult = _resourceManager.GetShaderReference(material.Shader);
|
var shaderResult = _resourceManager.GetShaderReference(material.Shader);
|
||||||
if (shaderResult.IsFailure)
|
if (shaderResult.IsFailure)
|
||||||
{
|
{
|
||||||
_activePerMaterialData = Handle<GraphicsBuffer>.Invalid;
|
_activePerMaterialData = Handle<RHI.GPUBuffer>.Invalid;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,7 +230,7 @@ internal sealed class RenderGraphContext : IUnsafeRenderContext
|
|||||||
var r = _resourceManager.GetMeshReference(mesh);
|
var r = _resourceManager.GetMeshReference(mesh);
|
||||||
if (r.IsFailure)
|
if (r.IsFailure)
|
||||||
{
|
{
|
||||||
_activePerMeshData = Handle<GraphicsBuffer>.Invalid;
|
_activePerMeshData = Handle<RHI.GPUBuffer>.Invalid;
|
||||||
_activeMeshIndexCount = 0;
|
_activeMeshIndexCount = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ internal sealed class RenderGraphExecutor
|
|||||||
{
|
{
|
||||||
Texture = nativePass.hasDepthAttachment
|
Texture = nativePass.hasDepthAttachment
|
||||||
? _resources.GetResource(nativePass.depthAttachment.texture).backingResource.AsTexture()
|
? _resources.GetResource(nativePass.depthAttachment.texture).backingResource.AsTexture()
|
||||||
: Handle<Texture>.Invalid,
|
: Handle<GPUTexture>.Invalid,
|
||||||
ClearDepth = nativePass.depthAttachment.clearDepth,
|
ClearDepth = nativePass.depthAttachment.clearDepth,
|
||||||
ClearStencil = nativePass.depthAttachment.clearStencil,
|
ClearStencil = nativePass.depthAttachment.clearStencil,
|
||||||
DepthLoadOp = nativePass.hasDepthAttachment
|
DepthLoadOp = nativePass.hasDepthAttachment
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ internal sealed class RenderGraphResourceRegistry
|
|||||||
_resources.Clear();
|
_resources.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier<RGTexture> ImportTexture(ref readonly TextureDesc desc, Handle<Texture> texture, string name,
|
public Identifier<RGTexture> ImportTexture(ref readonly TextureDesc desc, Handle<GPUTexture> texture, string name,
|
||||||
Color128 clearColor, float clearDepth, byte clearStencil,
|
Color128 clearColor, float clearDepth, byte clearStencil,
|
||||||
bool clearAtFirstUse, bool discardAtLastUse)
|
bool clearAtFirstUse, bool discardAtLastUse)
|
||||||
{
|
{
|
||||||
@@ -211,7 +211,7 @@ internal sealed class RenderGraphResourceRegistry
|
|||||||
return new Identifier<RGTexture>(resource.index);
|
return new Identifier<RGTexture>(resource.index);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier<RGBuffer> ImportBuffer(ref readonly BufferDesc desc, Handle<GraphicsBuffer> buffer, string name)
|
public Identifier<RGBuffer> ImportBuffer(ref readonly BufferDesc desc, Handle<RHI.GPUBuffer> buffer, string name)
|
||||||
{
|
{
|
||||||
var resource = _pool.Rent<RenderGraphResource>();
|
var resource = _pool.Rent<RenderGraphResource>();
|
||||||
resource.name = name;
|
resource.name = name;
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using Ghost.MeshOptimizer;
|
using Ghost.MeshOptimizer;
|
||||||
using Misaki.HighPerformance.LowLevel.Buffer;
|
using Misaki.HighPerformance.LowLevel.Buffer;
|
||||||
using Misaki.HighPerformance.LowLevel.Collections;
|
using Misaki.HighPerformance.LowLevel.Collections;
|
||||||
using Misaki.HighPerformance.LowLevel.Utilities;
|
|
||||||
using Misaki.HighPerformance.Mathematics;
|
using Misaki.HighPerformance.Mathematics;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
|
||||||
@@ -19,9 +18,9 @@ internal struct Cluster : IDisposable
|
|||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
if (indices.IsCreated) indices.Dispose();
|
indices.Dispose();
|
||||||
if (uniqueVertices.IsCreated) uniqueVertices.Dispose();
|
uniqueVertices.Dispose();
|
||||||
if (localIndices.IsCreated) localIndices.Dispose();
|
localIndices.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,7 +266,7 @@ public static unsafe class MeshletUtility
|
|||||||
|
|
||||||
for (nuint j = 0; j < meshlet.triangle_count * 3; j++)
|
for (nuint j = 0; j < meshlet.triangle_count * 3; j++)
|
||||||
{
|
{
|
||||||
byte localIdx = pMeshletTriangles[meshlet.triangle_offset + j];
|
var localIdx = pMeshletTriangles[meshlet.triangle_offset + j];
|
||||||
cluster.localIndices.Add(localIdx);
|
cluster.localIndices.Add(localIdx);
|
||||||
cluster.indices.Add(pMeshletVertices[meshlet.vertex_offset + localIdx]);
|
cluster.indices.Add(pMeshletVertices[meshlet.vertex_offset + localIdx]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,14 +109,12 @@ shader "MyShader/Standard"
|
|||||||
// float4 blendedColor = (color1 + color2 + color3 + color4) * 0.25f;
|
// float4 blendedColor = (color1 + color2 + color3 + color4) * 0.25f;
|
||||||
// return perMaterialData.color * blendedColor + input.color;
|
// return perMaterialData.color * blendedColor + input.color;
|
||||||
|
|
||||||
// TODO: Randome color on meshlet.
|
|
||||||
// return 1.0;
|
|
||||||
uint hash = PCGHash(input.meshletID);
|
uint hash = PCGHash(input.meshletID);
|
||||||
|
|
||||||
float r = float((hash & 0xFF0000u) >> 16) / 255.0;
|
float r = float((hash & 0xFF0000u) >> 16) / 255.0;
|
||||||
float g = float((hash & 0x00FF00u) >> 8) / 255.0;
|
float g = float((hash & 0x00FF00u) >> 8) / 255.0;
|
||||||
float b = float((hash & 0x0000FFu)) / 255.0;
|
float b = float((hash & 0x0000FFu)) / 255.0;
|
||||||
|
|
||||||
return float4(r, g, b, 1.0);
|
return float4(r, g, b, 1.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ public unsafe partial class TestRenderPipeline : IRenderPipeline
|
|||||||
continue; // Nothing to render
|
continue; // Nothing to render
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<Texture> rt;
|
Handle<GPUTexture> rt;
|
||||||
if (request.swapChainIndex < 0)
|
if (request.swapChainIndex < 0)
|
||||||
{
|
{
|
||||||
rt = request.colorTarget;
|
rt = request.colorTarget;
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ public sealed partial class GraphicsTestWindow : Window
|
|||||||
_world.EntityManager.SetComponent(cameraEntity, new Camera
|
_world.EntityManager.SetComponent(cameraEntity, new Camera
|
||||||
{
|
{
|
||||||
swapChainIndex = 0,
|
swapChainIndex = 0,
|
||||||
depthTarget = Handle<Texture>.Invalid,
|
depthTarget = Handle<GPUTexture>.Invalid,
|
||||||
nearClipPlane = 0.1f,
|
nearClipPlane = 0.1f,
|
||||||
farClipPlane = 1000.0f,
|
farClipPlane = 1000.0f,
|
||||||
focalLength = 50.0f,
|
focalLength = 50.0f,
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace Ghost.MeshOptimizer;
|
|
||||||
|
|
||||||
internal class ClusterLod
|
|
||||||
{
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user