Files
RobustToolbox/Robust.Client.Graphics.Rhi/WebGpu/RhiWebGpu.Queue.cs
PJB3005 b7a3526131 Move RHI to its own project
Move some of Robust.Shared to a new project so it can be depended upon without adding longer dependency chains.
2025-10-07 18:18:48 +02:00

86 lines
2.4 KiB
C#

namespace Robust.Client.Graphics.Rhi.WebGpu;
internal sealed unsafe partial class RhiWebGpu
{
public override RhiQueue Queue { get; }
// queue is ignored as parameter, since WebGPU only supports one queue for now.
internal override void QueueWriteTexture(
RhiQueue queue,
in RhiImageCopyTexture destination,
ReadOnlySpan<byte> data,
in RhiImageDataLayout dataLayout,
RhiExtent3D size)
{
// TODO: Thread safety
var nativeTexture = _textureRegistry[destination.Texture.Handle].Native;
var nativeDestination = new WGPUTexelCopyTextureInfo
{
aspect = (WGPUTextureAspect)ValidateTextureAspect(destination.Aspect),
texture = nativeTexture,
origin = WgpuOrigin3D(destination.Origin),
mipLevel = destination.MipLevel
};
var nativeDataLayout = new WGPUTexelCopyBufferLayout
{
// TODO: Validation
offset = dataLayout.Offset,
bytesPerRow = dataLayout.BytesPerRow,
rowsPerImage = dataLayout.RowsPerImage
};
var nativeSize = WgpuExtent3D(size);
fixed (byte* pData = data)
{
wgpuQueueWriteTexture(
_wgpuQueue,
&nativeDestination,
pData, (nuint) data.Length,
&nativeDataLayout,
&nativeSize
);
}
}
public override void QueueWriteBuffer(RhiBuffer buffer, ulong bufferOffset, ReadOnlySpan<byte> data)
{
var nativeBuffer = _bufferRegistry[buffer.Handle].Native;
fixed (byte* pData = data)
{
wgpuQueueWriteBuffer(
_wgpuQueue,
nativeBuffer,
bufferOffset,
pData,
(nuint) data.Length);
}
}
internal override void QueueSubmit(RhiQueue queue, RhiCommandBuffer[] commandBuffers)
{
// TODO: Safety
var pBuffers = stackalloc WGPUCommandBuffer[commandBuffers.Length];
for (var i = 0; i < commandBuffers.Length; i++)
{
pBuffers[i] = _commandBufferRegistry[commandBuffers[i].Handle].Native;
}
wgpuQueueSubmit(
_wgpuQueue,
(uint) commandBuffers.Length,
pBuffers
);
foreach (var commandBuffer in commandBuffers)
{
CommandBufferDropped(commandBuffer);
}
}
}