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

Method OnInit

Source/Engine/GraphicsDevice/Vulkan/GPUBufferVulkan.cpp:94–194  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

92}
93
94bool GPUBufferVulkan::OnInit()
95{
96 const bool useSRV = IsShaderResource();
97 const bool useUAV = IsUnorderedAccess();
98
99 // Setup buffer description
100 VkBufferCreateInfo bufferInfo;
101 RenderToolsVulkan::ZeroStruct(bufferInfo, VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO);
102 bufferInfo.size = _desc.Size;
103 bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
104 bufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
105 if (useSRV && !(_desc.Flags & GPUBufferFlags::Structured))
106 bufferInfo.usage |= VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
107 if (useUAV || EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::RawBuffer | GPUBufferFlags::Structured))
108 bufferInfo.usage |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
109 if (useUAV)
110 bufferInfo.usage |= VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
111 if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Argument))
112 bufferInfo.usage |= VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
113 if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Argument) && useUAV)
114 bufferInfo.usage |= VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT; // For some reason, glslang marks indirect uav buffers (UpdateProbesInitArgs, IndirectArgsBuffer) as Storage Texel Buffers
115 if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::VertexBuffer))
116 bufferInfo.usage |= VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
117 if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::IndexBuffer))
118 bufferInfo.usage |= VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
119 if (IsStaging() || EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::UnorderedAccess))
120 bufferInfo.usage |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
121
122 // Create buffer
123 VmaAllocationCreateInfo allocInfo = {};
124 switch (_desc.Usage)
125 {
126 case GPUResourceUsage::Dynamic:
127 allocInfo.usage = VMA_MEMORY_USAGE_CPU_TO_GPU;
128 break;
129 case GPUResourceUsage::StagingUpload:
130 allocInfo.usage = VMA_MEMORY_USAGE_CPU_ONLY;
131 break;
132 case GPUResourceUsage::StagingReadback:
133 allocInfo.usage = VMA_MEMORY_USAGE_GPU_TO_CPU;
134 break;
135 case GPUResourceUsage::Staging:
136 allocInfo.usage = VMA_MEMORY_USAGE_CPU_COPY;
137 break;
138 default:
139 allocInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;
140 }
141 const VkResult result = vmaCreateBuffer(_device->Allocator, &bufferInfo, &allocInfo, &_buffer, &_allocation, nullptr);
142 LOG_VULKAN_RESULT_WITH_RETURN(result);
143#if GPU_ENABLE_RESOURCE_NAMING
144 VK_SET_DEBUG_NAME(_device, _buffer, VK_OBJECT_TYPE_BUFFER, GetName());
145#endif
146 _memoryUsage = _desc.Size;
147 Access = 0;
148
149 // Check if set initial data
150 if (_desc.InitData)
151 {

Callers

nothing calls this directly

Calls 14

EnumHasAnyFlagsFunction · 0.85
vmaCreateBufferFunction · 0.85
IsDynamicFunction · 0.85
IsInMainThreadFunction · 0.85
RawFunction · 0.85
IsRenderingMethod · 0.80
IsShaderResourceFunction · 0.50
IsUnorderedAccessFunction · 0.50
StringClass · 0.50
UpdateBufferMethod · 0.45
GetMainContextMethod · 0.45
HasReferenceMethod · 0.45

Tested by

no test coverage detected