MCPcopy Create free account
hub / github.com/FlaxEngine/FlaxEngine / OnInit

Method OnInit

Source/Engine/GraphicsDevice/WebGPU/GPUBufferWebGPU.cpp:55–119  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

53}
54
55bool 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);

Callers

nothing calls this directly

Calls 7

EnumHasAllFlagsFunction · 0.85
GetObjectVersionMethod · 0.80
IsUnorderedAccessFunction · 0.50
IsShaderResourceFunction · 0.50
SetMethod · 0.45
GetMethod · 0.45
LengthMethod · 0.45

Tested by

no test coverage detected