Skip to content

Commit f9b5867

Browse files
committed
save
1 parent 5a9940c commit f9b5867

File tree

13 files changed

+355
-130
lines changed

13 files changed

+355
-130
lines changed

Coplt.Graphics.Core/Core/CommandList.cs

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Runtime.CompilerServices;
1+
using System.Diagnostics;
2+
using System.Runtime.CompilerServices;
23
using System.Runtime.InteropServices;
34
using Coplt.Graphics.Native;
45

@@ -28,6 +29,7 @@ public sealed unsafe class CommandList
2829
internal readonly HashSet<object> m_objects = new();
2930
internal readonly List<byte> m_payload = new();
3031
internal GpuOutput? m_current_output;
32+
internal ShaderPipeline? m_current_pipeline;
3133

3234
#endregion
3335

@@ -337,7 +339,7 @@ public void SetViewportScissor(
337339

338340
public void SetPipeline(ShaderPipeline Pipeline, CommandFlags Flags = CommandFlags.None)
339341
{
340-
AddObject(Pipeline);
342+
AddObject(m_current_pipeline = Pipeline);
341343
var cmd = new FCommandSetPipeline
342344
{
343345
Pipeline = Pipeline.m_ptr,
@@ -425,6 +427,14 @@ public void SetMeshBuffers(
425427
SetMeshBuffers = cmd,
426428
}
427429
);
430+
if (IndexBuffer.HasValue)
431+
{
432+
IndexBuffer.Value.Buffer.UnsafeChangeState(FResourceState.IndexBuffer);
433+
}
434+
foreach (var buffer in VertexBuffers)
435+
{
436+
buffer.Buffer.UnsafeChangeState(FResourceState.VertexBuffer);
437+
}
428438
}
429439

430440
#endregion
@@ -466,10 +476,17 @@ public void Draw(
466476
{
467477
if (Pipeline != null)
468478
{
479+
m_current_pipeline = Pipeline;
469480
if (!Pipeline.Shader.Stages.HasFlags(ShaderStageFlags.Vertex))
470481
throw new ArgumentException("Non Vertex pipelines cannot use Draw");
471482
AddObject(Pipeline);
472483
}
484+
else
485+
{
486+
if (m_current_pipeline == null) throw new InvalidOperationException("Pipeline is not set");
487+
if (!m_current_pipeline.Shader.Stages.HasFlags(ShaderStageFlags.Vertex))
488+
throw new ArgumentException("Non Vertex pipelines cannot use Draw");
489+
}
473490
var cmd = new FCommandDraw
474491
{
475492
Pipeline = Pipeline == null ? null : Pipeline.m_ptr,
@@ -518,17 +535,42 @@ public void Dispatch(
518535
{
519536
if (Pipeline != null)
520537
{
538+
m_current_pipeline = Pipeline;
521539
if (!Pipeline.Shader.Stages.HasAnyFlags(ShaderStageFlags.Compute | ShaderStageFlags.Mesh))
522540
throw new ArgumentException("Non Mesh and Compute pipelines cannot use Dispatch");
523541
AddObject(Pipeline);
542+
if (Type == DispatchType.Auto)
543+
{
544+
if (Pipeline.Shader.Stages.HasFlags(ShaderStageFlags.Compute)) Type = DispatchType.Compute;
545+
else if (Pipeline.Shader.Stages.HasFlags(ShaderStageFlags.Mesh)) Type = DispatchType.Mesh;
546+
else throw new UnreachableException();
547+
}
548+
}
549+
else
550+
{
551+
if (m_current_pipeline == null) throw new InvalidOperationException("Pipeline is not set");
552+
if (!m_current_pipeline.Shader.Stages.HasAnyFlags(ShaderStageFlags.Compute | ShaderStageFlags.Mesh))
553+
throw new ArgumentException("Non Mesh and Compute pipelines cannot use Dispatch");
554+
if (Type == DispatchType.Auto)
555+
{
556+
if (m_current_pipeline.Shader.Stages.HasFlags(ShaderStageFlags.Compute)) Type = DispatchType.Compute;
557+
else if (m_current_pipeline.Shader.Stages.HasFlags(ShaderStageFlags.Mesh)) Type = DispatchType.Mesh;
558+
else throw new UnreachableException();
559+
}
524560
}
525561
var cmd = new FCommandDispatch
526562
{
527563
Pipeline = Pipeline == null ? null : Pipeline.m_ptr,
528564
GroupCountX = GroupCountX,
529565
GroupCountY = GroupCountY,
530566
GroupCountZ = GroupCountZ,
531-
Type = (FDispatchType)Type,
567+
Type = Type switch
568+
{
569+
DispatchType.Auto => throw new UnreachableException(),
570+
DispatchType.Compute => FDispatchType.Compute,
571+
DispatchType.Mesh => FDispatchType.Mesh,
572+
_ => throw new ArgumentOutOfRangeException(nameof(Type), Type, null)
573+
},
532574
};
533575
m_commands.Add(
534576
new()

Coplt.Graphics.Core/Native/Native.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2337,7 +2337,6 @@ public unsafe partial struct FCommandDraw
23372337
[NativeTypeName("Coplt::u8")]
23382338
public enum FDispatchType : byte
23392339
{
2340-
Auto,
23412340
Compute,
23422341
Mesh,
23432342
}
@@ -2417,7 +2416,7 @@ public partial struct FCommandItem
24172416
[NativeTypeName("Coplt::FCommandFlags")]
24182417
public FCommandFlags Flags;
24192418

2420-
[NativeTypeName("__AnonymousRecord_Command_L272_C9")]
2419+
[NativeTypeName("__AnonymousRecord_Command_L271_C9")]
24212420
public _Anonymous_e__Union Anonymous;
24222421

24232422
[UnscopedRef]

Coplt.Graphics.Native/Api/FFI/Command.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,6 @@ namespace Coplt
218218

219219
enum class FDispatchType : u8
220220
{
221-
Auto,
222221
Compute,
223222
Mesh,
224223
};

Coplt.Graphics.Native/Api/FFI/Layout.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ namespace Coplt
122122
struct FMeshLayoutCreateOptions
123123
{
124124
Str8or16 Name{};
125+
// Buffers 按顺序定义到 InputSlot,不允许随机隔空的 InputSlot
125126
FMeshBufferDefine* Buffers{};
126127
FMeshBufferElement* Elements{};
127128
u32 BufferCount{};
@@ -130,19 +131,19 @@ namespace Coplt
130131

131132
COPLT_INTERFACE_DEFINE(FMeshLayout, "8fe5121f-c2ce-46f5-aa14-f28595f35361", FGpuObject)
132133
{
133-
virtual const FMeshBufferDefine* GetBuffers(u32* out_count) noexcept = 0;
134-
virtual const FMeshBufferElement* GetElements(u32* out_count) noexcept = 0;
134+
virtual const FMeshBufferDefine* GetBuffers(u32* out_count) const noexcept = 0;
135+
virtual const FMeshBufferElement* GetElements(u32* out_count) const noexcept = 0;
135136

136-
virtual const FMeshBufferElement* TryGetElement(u32 SlotId, u32 SlotIndex) noexcept = 0;
137+
virtual const FMeshBufferElement* TryGetElement(u32 SlotId, u32 SlotIndex) const noexcept = 0;
137138

138139
#if FFI_SRC
139-
std::span<const FMeshBufferDefine> GetBuffers() noexcept
140+
std::span<const FMeshBufferDefine> GetBuffers() const noexcept
140141
{
141142
u32 count{};
142143
return std::span{GetBuffers(&count), static_cast<usize>(count)};
143144
}
144145

145-
std::span<const FMeshBufferElement> GetElements() noexcept
146+
std::span<const FMeshBufferElement> GetElements() const noexcept
146147
{
147148
u32 count{};
148149
return std::span{GetElements(&count), static_cast<usize>(count)};

Coplt.Graphics.Native/Api/FFI/Pipeline.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,9 @@ namespace Coplt
3333
COPLT_INTERFACE_DEFINE(FGraphicsShaderPipeline, "32a67d44-132c-449b-972d-bad3413783e5", FShaderPipeline)
3434
{
3535
virtual const FGraphicsPipelineState* GetGraphicsState() noexcept = 0;
36+
// 可空
37+
virtual const FShaderInputLayout* GetInputLayout() noexcept = 0;
38+
// 可空
39+
virtual const FMeshLayout* GetMeshLayout() noexcept = 0;
3640
};
3741
}

Coplt.Graphics.Native/D3d12/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ add_library(${target_name} SHARED
3636
Src/Resource.cc
3737
Src/Context.h
3838
Src/Context.cc
39+
Include/States.h
3940
)
4041
set_target_properties(${target_name} PROPERTIES LINKER_LANGUAGE CXX)
4142
set_target_properties(${target_name} PROPERTIES OUTPUT_NAME "Coplt.Graphics.Native.D3d12")
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#pragma once
2+
3+
#include <directx/d3d12.h>
4+
5+
namespace Coplt
6+
{
7+
constexpr D3D12_RESOURCE_STATES AllReadStates =
8+
D3D12_RESOURCE_STATE_GENERIC_READ | D3D12_RESOURCE_STATE_DEPTH_READ |
9+
D3D12_RESOURCE_STATE_RESOLVE_SOURCE | D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE;
10+
11+
inline bool ContainsOnly(const D3D12_RESOURCE_STATES value, const D3D12_RESOURCE_STATES other)
12+
{
13+
return (value & ~other) == 0;
14+
}
15+
16+
inline bool Contains(const D3D12_RESOURCE_STATES value, const D3D12_RESOURCE_STATES other)
17+
{
18+
return (value & other) != 0;
19+
}
20+
21+
inline bool IsReadOnly(const D3D12_RESOURCE_STATES value)
22+
{
23+
return ContainsOnly(value, AllReadStates);
24+
}
25+
26+
inline bool IsCompatible(const D3D12_RESOURCE_STATES value, const D3D12_RESOURCE_STATES other)
27+
{
28+
if (value == other) return true;
29+
if (IsReadOnly(value) && IsReadOnly(other)) return true;
30+
return false;
31+
}
32+
33+
inline D3D12_RESOURCE_STATES ChangeState(const D3D12_RESOURCE_STATES value, const D3D12_RESOURCE_STATES state)
34+
{
35+
if (IsCompatible(value, state)) return value | state;
36+
return state;
37+
}
38+
39+
inline D3D12_RESOURCE_STATES ToDx(const FResourceState state)
40+
{
41+
switch (state)
42+
{
43+
case FResourceState::Common:
44+
case FResourceState::Present:
45+
return D3D12_RESOURCE_STATE_COMMON;
46+
case FResourceState::RenderTarget:
47+
return D3D12_RESOURCE_STATE_RENDER_TARGET;
48+
case FResourceState::DepthWrite:
49+
return D3D12_RESOURCE_STATE_DEPTH_WRITE;
50+
case FResourceState::UnorderedAccess:
51+
return D3D12_RESOURCE_STATE_UNORDERED_ACCESS;
52+
case FResourceState::CopyDst:
53+
return D3D12_RESOURCE_STATE_COPY_DEST;
54+
case FResourceState::ResolveDst:
55+
return D3D12_RESOURCE_STATE_RESOLVE_DEST;
56+
case FResourceState::RayTracing:
57+
return D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE;
58+
case FResourceState::ShadingRate:
59+
return D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE;
60+
case FResourceState::StreamOutput:
61+
return D3D12_RESOURCE_STATE_STREAM_OUT;
62+
default:
63+
break;
64+
}
65+
D3D12_RESOURCE_STATES r = D3D12_RESOURCE_STATE_COMMON;
66+
if (HasAnyFlags(state, FResourceState::ConstantBuffer | FResourceState::VertexBuffer))
67+
r |= D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER;
68+
if (HasFlags(state, FResourceState::IndexBuffer)) r |= D3D12_RESOURCE_STATE_INDEX_BUFFER;
69+
if (HasFlags(state, FResourceState::IndirectBuffer)) r |= D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT;
70+
if (HasFlags(state, FResourceState::DepthRead)) r |= D3D12_RESOURCE_STATE_DEPTH_READ;
71+
if (HasFlags(state, FResourceState::ShaderResource)) r |= D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE;
72+
if (HasFlags(state, FResourceState::CopySrc)) r |= D3D12_RESOURCE_STATE_COPY_SOURCE;
73+
if (HasFlags(state, FResourceState::ResolveSrc)) r |= D3D12_RESOURCE_STATE_RESOLVE_SOURCE;
74+
return r;
75+
}
76+
}

0 commit comments

Comments
 (0)