| 29 | { |
| 30 | |
| 31 | BufferHandle Device::createBuffer(const BufferDesc& desc) |
| 32 | { |
| 33 | // Check some basic constraints first - the validation layer is expected to handle them too |
| 34 | |
| 35 | if (desc.isVolatile && desc.maxVersions == 0) |
| 36 | return nullptr; |
| 37 | |
| 38 | if (desc.isVolatile && !desc.isConstantBuffer) |
| 39 | return nullptr; |
| 40 | |
| 41 | if (desc.byteSize == 0) |
| 42 | return nullptr; |
| 43 | |
| 44 | |
| 45 | Buffer *buffer = new Buffer(m_Context, m_Allocator); |
| 46 | buffer->desc = desc; |
| 47 | |
| 48 | vk::BufferUsageFlags usageFlags = vk::BufferUsageFlagBits::eTransferSrc | |
| 49 | vk::BufferUsageFlagBits::eTransferDst; |
| 50 | |
| 51 | if (desc.isVertexBuffer) |
| 52 | usageFlags |= vk::BufferUsageFlagBits::eVertexBuffer; |
| 53 | |
| 54 | if (desc.isIndexBuffer) |
| 55 | usageFlags |= vk::BufferUsageFlagBits::eIndexBuffer; |
| 56 | |
| 57 | if (desc.isDrawIndirectArgs) |
| 58 | usageFlags |= vk::BufferUsageFlagBits::eIndirectBuffer; |
| 59 | |
| 60 | if (desc.isConstantBuffer) |
| 61 | usageFlags |= vk::BufferUsageFlagBits::eUniformBuffer; |
| 62 | |
| 63 | if (desc.structStride != 0 || desc.canHaveUAVs || desc.canHaveRawViews) |
| 64 | usageFlags |= vk::BufferUsageFlagBits::eStorageBuffer; |
| 65 | |
| 66 | if (desc.canHaveTypedViews) |
| 67 | usageFlags |= vk::BufferUsageFlagBits::eUniformTexelBuffer; |
| 68 | |
| 69 | if (desc.canHaveTypedViews && desc.canHaveUAVs) |
| 70 | usageFlags |= vk::BufferUsageFlagBits::eStorageTexelBuffer; |
| 71 | |
| 72 | if (desc.isAccelStructBuildInput) |
| 73 | usageFlags |= vk::BufferUsageFlagBits::eAccelerationStructureBuildInputReadOnlyKHR; |
| 74 | |
| 75 | if (desc.isAccelStructStorage) |
| 76 | usageFlags |= vk::BufferUsageFlagBits::eAccelerationStructureStorageKHR; |
| 77 | |
| 78 | if (desc.isShaderBindingTable) |
| 79 | usageFlags |= vk::BufferUsageFlagBits::eShaderBindingTableKHR; |
| 80 | |
| 81 | if (m_Context.extensions.buffer_device_address) |
| 82 | usageFlags |= vk::BufferUsageFlagBits::eShaderDeviceAddress; |
| 83 | |
| 84 | uint64_t size = desc.byteSize; |
| 85 | |
| 86 | if (desc.isVolatile) |
| 87 | { |
| 88 | assert(!desc.isVirtual); |
no test coverage detected