feat(render): refactor pipeline & shader system for DX12 WG
Major refactor of render pipeline and shader system: - Replaced legacy shader properties with source generator and attribute-based HLSL struct generation. - Introduced ShaderPropertiesRegistry for runtime property layout/code registration. - Added modular IRenderPipeline, IRenderPipelineSettings, and IRenderPayload interfaces. - Implemented GhostRenderPipeline and ECS-driven GPUScene management. - Added experimental DirectX 12 Work Graph support. - Refactored shader compilation, variant hashing, and caching. - Updated APIs for consistency and improved codegen for registration. These changes modernize the rendering infrastructure for advanced features like work graphs and dynamic pipelines. BREAKING CHANGE: Shader DSL, pipeline, and property APIs have changed. Existing shaders and pipeline integrations must be updated.
This commit is contained in:
52
src/Runtime/Ghost.Engine/Systems/AddGPUInstanceSystem.cs
Normal file
52
src/Runtime/Ghost.Engine/Systems/AddGPUInstanceSystem.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
using Ghost.Core;
|
||||
using Ghost.Engine.Components;
|
||||
using Ghost.Engine.RenderPipeline;
|
||||
using Ghost.Entities;
|
||||
using Ghost.Graphics;
|
||||
using Misaki.HighPerformance.Utilities;
|
||||
|
||||
namespace Ghost.Engine.Systems;
|
||||
|
||||
[RenderPipelineSystem<GhostRenderPipelineSettings>]
|
||||
internal class AddGPUInstanceSystem : SystemBase
|
||||
{
|
||||
private RenderSystem _renderSystem = null!;
|
||||
|
||||
private Identifier<EntityQuery> _meshInstanceQueryID;
|
||||
|
||||
protected override void OnInitialize(ref readonly SystemAPI systemAPI)
|
||||
{
|
||||
_renderSystem = systemAPI.World.GetService<RenderSystem>();
|
||||
|
||||
_meshInstanceQueryID = QueryBuilder.Create()
|
||||
.WithAll<MeshInstance, LocalToWorld>()
|
||||
.WithAbsent<GPUInstanceRef>()
|
||||
.Build(systemAPI.World, true);
|
||||
|
||||
RequireQueryForUpdate(_meshInstanceQueryID);
|
||||
}
|
||||
|
||||
protected override void OnUpdate(ref readonly SystemAPI systemAPI)
|
||||
{
|
||||
var payload = (GhostRenderPayload)_renderSystem.GetCurrentFramePayload();
|
||||
|
||||
ref var meshInstanceQuery = ref systemAPI.World.ComponentManager.GetEntityQueryReference(_meshInstanceQueryID);
|
||||
|
||||
foreach (var chunk in meshInstanceQuery.GetChunkIterator())
|
||||
{
|
||||
var meshInstances = chunk.GetComponentData<MeshInstance>();
|
||||
var localToWorlds = chunk.GetComponentData<LocalToWorld>();
|
||||
var entities = chunk.GetEntities();
|
||||
|
||||
for (var i = 0; i < chunk.EntityCount; i++)
|
||||
{
|
||||
ref readonly var meshInstance = ref meshInstances.GetElementUnsafe(i);
|
||||
var localToWorld = localToWorlds.GetElementUnsafe(i);
|
||||
var entity = entities.GetElementUnsafe(i);
|
||||
|
||||
var index = payload.AddInstance(localToWorld.matrix, in meshInstance);
|
||||
systemAPI.World.EntityCommandBuffer.AddComponent(entity, new GPUInstanceRef { gpuSceneIndex = index });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user