Skip to content

Commit fcc9ef4

Browse files
committed
Buffer Upload
1 parent e94caec commit fcc9ef4

File tree

13 files changed

+182
-74
lines changed

13 files changed

+182
-74
lines changed

Coplt.Graphics.Core/Core/CommandList.cs

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,7 @@ public void Dispatch(
466466

467467
#region BufferCopy
468468

469-
public void BufferCopy(
469+
public void Copy(
470470
GpuBuffer Dst,
471471
GpuBuffer Src,
472472
ulong DstOffset = 0,
@@ -507,5 +507,48 @@ public void BufferCopy(
507507

508508
#endregion
509509

510+
#region BufferUpload
511+
512+
public void Upload<T>(
513+
GpuBuffer Dst,
514+
ReadOnlySpan<T> Data,
515+
ulong DstOffset = 0,
516+
CommandFlags flags = CommandFlags.None
517+
) where T : unmanaged => Upload(Dst, MemoryMarshal.AsBytes(Data), DstOffset, flags);
518+
519+
public void Upload(
520+
GpuBuffer Dst,
521+
ReadOnlySpan<byte> Data,
522+
ulong DstOffset = 0,
523+
CommandFlags flags = CommandFlags.None
524+
)
525+
{
526+
if (Data.Length == 0) return;
527+
var Size = Math.Min(Dst.Size, (uint)Data.Length);
528+
var dst = AddResource(Dst);
529+
var src = m_queue.WriteToUpload(Data);
530+
var cmd = new FCommandBufferCopy
531+
{
532+
Size = Size,
533+
DstOffset = DstOffset,
534+
SrcOffset = src.Offset,
535+
DstType = FBufferRefType.Buffer,
536+
SrcType = FBufferRefType.Upload,
537+
};
538+
cmd.Dst.Buffer = new(dst);
539+
cmd.Src.Upload = new(src);
540+
m_commands.Add(
541+
new()
542+
{
543+
Type = FCommandType.BufferCopy,
544+
Flags = (FCommandFlags)flags,
545+
BufferCopy = cmd,
546+
}
547+
);
548+
Dst.UnsafeChangeState(FResourceState.CopyDst);
549+
}
550+
551+
#endregion
552+
510553
#endregion
511554
}

Coplt.Graphics.Core/Core/GpuQueue.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,4 +161,36 @@ public GpuBuffer CreateBuffer(
161161
}
162162

163163
#endregion
164+
165+
#region WriteToUpload
166+
167+
public UploadLoc WriteToUpload(ReadOnlySpan<byte> Data)
168+
{
169+
using var _ = m_lock.EnterScope();
170+
ref var upload_buffers = ref m_ptr->m_context->m_upload_buffer;
171+
for (nuint i = 0; i < upload_buffers.LongLength; i++)
172+
{
173+
ref var block = ref upload_buffers[i];
174+
if (block.cur_offset + (uint)Data.Length < block.size)
175+
{
176+
Data.CopyTo(new Span<byte>(block.mapped_ptr, (int)block.size)[(int)block.cur_offset..]);
177+
var loc = new UploadLoc(i, block.cur_offset);
178+
block.cur_offset += (uint)Data.Length;
179+
return loc;
180+
}
181+
}
182+
m_ptr->m_context->GrowUploadBuffer((uint)Data.Length).TryThrow();
183+
upload_buffers = ref m_ptr->m_context->m_upload_buffer;
184+
{
185+
var i = upload_buffers.LongLength - 1;
186+
ref var block = ref upload_buffers[i];
187+
if (block.cur_offset + (uint)Data.Length >= block.size) throw new OutOfMemoryException();
188+
Data.CopyTo(new Span<byte>(block.mapped_ptr, (int)block.size)[(int)block.cur_offset..]);
189+
var loc = new UploadLoc(i, block.cur_offset);
190+
block.cur_offset += (uint)Data.Length;
191+
return loc;
192+
}
193+
}
194+
195+
#endregion
164196
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
namespace Coplt.Graphics.Core;
2+
3+
public record struct UploadLoc(nuint Index, ulong Offset);

Coplt.Graphics.Core/Native/FResourceSrc.cs renamed to Coplt.Graphics.Core/Native/FResourceRef.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
namespace Coplt.Graphics.Native;
22

3-
public partial struct FResourceSrc
3+
public partial struct FResourceRef
44
{
5-
public FResourceSrc(uint index)
5+
public FResourceRef(uint index)
66
{
77
ResourceIndex = index;
88
}
9-
public FResourceSrc(int index)
9+
public FResourceRef(int index)
1010
{
1111
ResourceIndex = (uint)index;
1212
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using Coplt.Graphics.Core;
2+
3+
namespace Coplt.Graphics.Native;
4+
5+
public partial struct FUploadLoc
6+
{
7+
public FUploadLoc(in UploadLoc loc)
8+
{
9+
Index = (uint)loc.Index;
10+
}
11+
}

Coplt.Graphics.Core/Native/Native.cs

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2103,7 +2103,7 @@ public unsafe partial struct _Anonymous_e__Union
21032103
}
21042104
}
21052105

2106-
public partial struct FResourceSrc
2106+
public partial struct FResourceRef
21072107
{
21082108
[NativeTypeName("Coplt::u32")]
21092109
public uint ResourceIndex;
@@ -2147,8 +2147,8 @@ public partial struct FViewport
21472147

21482148
public partial struct FCommandTransition
21492149
{
2150-
[NativeTypeName("Coplt::FResourceSrc")]
2151-
public FResourceSrc Resource;
2150+
[NativeTypeName("Coplt::FResourceRef")]
2151+
public FResourceRef Resource;
21522152

21532153
[NativeTypeName("Coplt::FResourceState")]
21542154
public FResourceState SrcState;
@@ -2159,8 +2159,8 @@ public partial struct FCommandTransition
21592159

21602160
public partial struct FCommandPresent
21612161
{
2162-
[NativeTypeName("Coplt::FResourceSrc")]
2163-
public FResourceSrc Image;
2162+
[NativeTypeName("Coplt::FResourceRef")]
2163+
public FResourceRef Image;
21642164
}
21652165

21662166
public partial struct FCommandClearColor
@@ -2171,8 +2171,8 @@ public partial struct FCommandClearColor
21712171
[NativeTypeName("Coplt::u32")]
21722172
public uint RectIndex;
21732173

2174-
[NativeTypeName("Coplt::FResourceSrc")]
2175-
public FResourceSrc Image;
2174+
[NativeTypeName("Coplt::FResourceRef")]
2175+
public FResourceRef Image;
21762176

21772177
[NativeTypeName("f32[4]")]
21782178
public _Color_e__FixedBuffer Color;
@@ -2200,8 +2200,8 @@ public partial struct FCommandClearDepthStencil
22002200
[NativeTypeName("Coplt::u32")]
22012201
public uint RectIndex;
22022202

2203-
[NativeTypeName("Coplt::FResourceSrc")]
2204-
public FResourceSrc Image;
2203+
[NativeTypeName("Coplt::FResourceRef")]
2204+
public FResourceRef Image;
22052205

22062206
[NativeTypeName("Coplt::f32")]
22072207
public float Depth;
@@ -2215,13 +2215,13 @@ public partial struct FCommandClearDepthStencil
22152215

22162216
public partial struct FCommandSetRenderTargets
22172217
{
2218-
[NativeTypeName("Coplt::FResourceSrc")]
2219-
public FResourceSrc Dsv;
2218+
[NativeTypeName("Coplt::FResourceRef")]
2219+
public FResourceRef Dsv;
22202220

22212221
[NativeTypeName("Coplt::u32")]
22222222
public uint NumRtv;
22232223

2224-
[NativeTypeName("FResourceSrc[8]")]
2224+
[NativeTypeName("FResourceRef[8]")]
22252225
public _Rtv_e__FixedBuffer Rtv;
22262226

22272227
[NativeTypeName("Coplt::u32")]
@@ -2239,7 +2239,7 @@ public partial struct FCommandSetRenderTargets
22392239
[InlineArray(8)]
22402240
public partial struct _Rtv_e__FixedBuffer
22412241
{
2242-
public FResourceSrc e0;
2242+
public FResourceRef e0;
22432243
}
22442244
}
22452245

@@ -2314,23 +2314,29 @@ public unsafe partial struct FCommandDispatch
23142314
public FDispatchType Type;
23152315
}
23162316

2317+
public partial struct FUploadLoc
2318+
{
2319+
[NativeTypeName("Coplt::u32")]
2320+
public uint Index;
2321+
}
2322+
23172323
[StructLayout(LayoutKind.Explicit)]
2318-
public unsafe partial struct FBufferRef
2324+
public partial struct FBufferRef
23192325
{
23202326
[FieldOffset(0)]
2321-
[NativeTypeName("Coplt::FResourceSrc")]
2322-
public FResourceSrc Buffer;
2327+
[NativeTypeName("Coplt::FResourceRef")]
2328+
public FResourceRef Buffer;
23232329

23242330
[FieldOffset(0)]
2325-
[NativeTypeName("Coplt::FBlob *")]
2326-
public FBlob* Blob;
2331+
[NativeTypeName("Coplt::FUploadLoc")]
2332+
public FUploadLoc Upload;
23272333
}
23282334

23292335
[NativeTypeName("Coplt::u8")]
23302336
public enum FBufferRefType : byte
23312337
{
23322338
Buffer = 0,
2333-
Blob,
2339+
Upload,
23342340
}
23352341

23362342
public partial struct FCommandBufferCopy
@@ -2365,7 +2371,7 @@ public partial struct FCommandItem
23652371
[NativeTypeName("Coplt::FCommandFlags")]
23662372
public FCommandFlags Flags;
23672373

2368-
[NativeTypeName("__AnonymousRecord_Command_L238_C9")]
2374+
[NativeTypeName("__AnonymousRecord_Command_L245_C9")]
23692375
public _Anonymous_e__Union Anonymous;
23702376

23712377
[UnscopedRef]

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

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ namespace Coplt
6868
#endif
6969
};
7070

71-
struct FResourceSrc
71+
struct FResourceRef
7272
{
7373
// u32::max 表示 empty
7474
u32 ResourceIndex{};
@@ -103,14 +103,14 @@ namespace Coplt
103103

104104
struct FCommandTransition
105105
{
106-
FResourceSrc Resource{};
106+
FResourceRef Resource{};
107107
FResourceState SrcState{};
108108
FResourceState DstState{};
109109
};
110110

111111
struct FCommandPresent
112112
{
113-
FResourceSrc Image{};
113+
FResourceRef Image{};
114114
};
115115

116116
struct FCommandClearColor
@@ -119,7 +119,7 @@ namespace Coplt
119119
u32 RectCount{};
120120
// Payload 内的索引
121121
u32 RectIndex{};
122-
FResourceSrc Image{};
122+
FResourceRef Image{};
123123
f32 Color[4]{};
124124
};
125125

@@ -136,7 +136,7 @@ namespace Coplt
136136
u32 RectCount{};
137137
// Payload 内的索引
138138
u32 RectIndex{};
139-
FResourceSrc Image{};
139+
FResourceRef Image{};
140140
f32 Depth{};
141141
u8 Stencil{};
142142
FDepthStencilClearFlags Clear{};
@@ -145,9 +145,9 @@ namespace Coplt
145145
struct FCommandSetRenderTargets
146146
{
147147
// 可选
148-
FResourceSrc Dsv{};
148+
FResourceRef Dsv{};
149149
u32 NumRtv{};
150-
FResourceSrc Rtv[8]{};
150+
FResourceRef Rtv[8]{};
151151

152152
// 有多少个 Viewport
153153
u32 ViewportCount{};
@@ -206,16 +206,23 @@ namespace Coplt
206206
FDispatchType Type{};
207207
};
208208

209+
struct FUploadLoc
210+
{
211+
u32 Index{};
212+
};
213+
209214
union FBufferRef
210215
{
211-
FResourceSrc Buffer{};
212-
FBlob* Blob;
216+
FResourceRef Buffer;
217+
FUploadLoc Upload;
213218
};
214219

215220
enum class FBufferRefType : u8
216221
{
222+
// GpuBuffer 对象资源引用
217223
Buffer = 0,
218-
Blob,
224+
// 当前帧上下文中第几个上传缓冲区
225+
Upload,
219226
};
220227

221228
struct FCommandBufferCopy
@@ -266,7 +273,7 @@ namespace Coplt
266273

267274
#ifdef FFI_SRC
268275

269-
inline FResourceMeta& FResourceSrc::Get(const FCommandSubmit& submit) const
276+
inline FResourceMeta& FResourceRef::Get(const FCommandSubmit& submit) const
270277
{
271278
return submit.Resources[ResourceIndex];
272279
}

0 commit comments

Comments
 (0)