Implement bind groups in WebGPU to provide resources to shaders

This commit is contained in:
Wojtek Figat
2026-02-25 18:22:55 +01:00
parent 9d95bbaa8c
commit b535791c66
9 changed files with 444 additions and 125 deletions

View File

@@ -71,11 +71,13 @@ bool GPUBufferWebGPU::OnInit()
switch (_desc.Usage)
{
case GPUResourceUsage::Default:
if (!_desc.InitData)
bufferDesc.usage |= WGPUBufferUsage_CopyDst;
bufferDesc.usage |= WGPUBufferUsage_CopyDst;
break;
case GPUResourceUsage::Dynamic:
bufferDesc.usage |= WGPUBufferUsage_MapWrite;
if (bufferDesc.usage == 0) // WebGPU doesn't allow to map-write Index/Vertex/Storage buffers
bufferDesc.usage = WGPUBufferUsage_MapWrite;
else
bufferDesc.usage |= WGPUBufferUsage_CopyDst;
break;
case GPUResourceUsage::StagingUpload:
bufferDesc.usage |= WGPUBufferUsage_MapWrite | WGPUBufferUsage_CopySrc;
@@ -88,19 +90,24 @@ bool GPUBufferWebGPU::OnInit()
break;
}
bufferDesc.size = _desc.Size;
bufferDesc.mappedAtCreation = _desc.InitData != nullptr;
bufferDesc.mappedAtCreation = _desc.InitData != nullptr && (bufferDesc.usage & WGPUBufferUsage_MapWrite);
Buffer = wgpuDeviceCreateBuffer(_device->Device, &bufferDesc);
if (!Buffer)
return true;
_memoryUsage = _desc.Size;
Usage = bufferDesc.usage;
// Initialize with a data if provided
if (_desc.InitData)
if (bufferDesc.mappedAtCreation)
{
//wgpuBufferWriteMappedRange(Buffer, 0, _desc.InitData, _desc.Size);
Platform::MemoryCopy(wgpuBufferGetMappedRange(Buffer, 0, _desc.Size), _desc.InitData, _desc.Size);
wgpuBufferUnmap(Buffer);
}
else if (_desc.InitData)
{
wgpuQueueWriteBuffer(_device->Queue, Buffer, 0, _desc.InitData, _desc.Size);
}
// Create view
_view.Set(this, Buffer);