| 53 | } |
| 54 | |
| 55 | bool GPUBufferWebGPU::OnInit() |
| 56 | { |
| 57 | // Create buffer |
| 58 | WGPUBufferDescriptor bufferDesc = WGPU_BUFFER_DESCRIPTOR_INIT; |
| 59 | #if GPU_ENABLE_RESOURCE_NAMING |
| 60 | _name.Set(_namePtr, _nameSize); |
| 61 | bufferDesc.label = { _name.Get(), (size_t)_name.Length() }; |
| 62 | #endif |
| 63 | if (EnumHasAllFlags(_desc.Flags, GPUBufferFlags::IndexBuffer)) |
| 64 | bufferDesc.usage |= WGPUBufferUsage_Index; |
| 65 | else if (EnumHasAllFlags(_desc.Flags, GPUBufferFlags::VertexBuffer)) |
| 66 | bufferDesc.usage |= WGPUBufferUsage_Vertex; |
| 67 | else if (EnumHasAllFlags(_desc.Flags, GPUBufferFlags::Argument)) |
| 68 | bufferDesc.usage |= WGPUBufferUsage_Indirect; |
| 69 | if (IsUnorderedAccess() || IsShaderResource()) // SRV buffers need to be bind as read-only storage |
| 70 | bufferDesc.usage |= WGPUBufferUsage_Storage; |
| 71 | switch (_desc.Usage) |
| 72 | { |
| 73 | case GPUResourceUsage::Default: |
| 74 | bufferDesc.usage |= WGPUBufferUsage_CopyDst; |
| 75 | if (IsUnorderedAccess()) |
| 76 | bufferDesc.usage |= WGPUBufferUsage_CopySrc; // eg. GPU particles copy particle counter between buffers |
| 77 | break; |
| 78 | case GPUResourceUsage::Dynamic: |
| 79 | if (bufferDesc.usage == 0) // WebGPU doesn't allow to map-write Index/Vertex/Storage buffers |
| 80 | bufferDesc.usage = WGPUBufferUsage_MapWrite; |
| 81 | else |
| 82 | bufferDesc.usage |= WGPUBufferUsage_CopyDst; |
| 83 | break; |
| 84 | case GPUResourceUsage::StagingUpload: |
| 85 | bufferDesc.usage |= WGPUBufferUsage_MapWrite | WGPUBufferUsage_CopySrc; |
| 86 | break; |
| 87 | case GPUResourceUsage::StagingReadback: |
| 88 | bufferDesc.usage |= WGPUBufferUsage_MapRead; |
| 89 | break; |
| 90 | case GPUResourceUsage::Staging: |
| 91 | bufferDesc.usage |= WGPUBufferUsage_MapRead | WGPUBufferUsage_MapWrite | WGPUBufferUsage_CopySrc; |
| 92 | break; |
| 93 | } |
| 94 | bufferDesc.size = (_desc.Size + 3) & ~0x3; // Align up to the multiple of 4 bytes |
| 95 | bufferDesc.mappedAtCreation = _desc.InitData != nullptr && (bufferDesc.usage & WGPUBufferUsage_MapWrite); |
| 96 | Buffer = wgpuDeviceCreateBuffer(_device->Device, &bufferDesc); |
| 97 | if (!Buffer) |
| 98 | return true; |
| 99 | _memoryUsage = bufferDesc.size; |
| 100 | Usage = bufferDesc.usage; |
| 101 | _view.Ptr.ObjectVersion = _device->GetObjectVersion(); |
| 102 | |
| 103 | // Initialize with a data if provided |
| 104 | if (bufferDesc.mappedAtCreation) |
| 105 | { |
| 106 | //wgpuBufferWriteMappedRange(Buffer, 0, _desc.InitData, _desc.Size); |
| 107 | Platform::MemoryCopy(wgpuBufferGetMappedRange(Buffer, 0, _desc.Size), _desc.InitData, _desc.Size); |
| 108 | wgpuBufferUnmap(Buffer); |
| 109 | } |
| 110 | else if (_desc.InitData) |
| 111 | { |
| 112 | wgpuQueueWriteBuffer(_device->Queue, Buffer, 0, _desc.InitData, bufferDesc.size); |
nothing calls this directly
no test coverage detected