feat(renderer): Add vulkan renderer stub
Some checks failed
Ubuntu Cross to Win64 / Cross Compile with ming64 (1.4.0, ubuntu-latest) (push) Failing after 1m26s
Some checks failed
Ubuntu Cross to Win64 / Cross Compile with ming64 (1.4.0, ubuntu-latest) (push) Failing after 1m26s
This commit is contained in:
parent
92fbe1ece4
commit
f98d64b927
@ -1,179 +0,0 @@
|
|||||||
# 3.0.1 (2022-05-26)
|
|
||||||
|
|
||||||
- Fixes in defragmentation algorithm.
|
|
||||||
- Fixes in GpuMemDumpVis.py regarding image height calculation.
|
|
||||||
- Other bug fixes, optimizations, and improvements in the code and documentation.
|
|
||||||
|
|
||||||
# 3.0.0 (2022-03-25)
|
|
||||||
|
|
||||||
It has been a long time since the previous official release, so hopefully everyone has been using the latest code from "master" branch, which is always maintained in a good state, not the old version. For completeness, here is the list of changes since v2.3.0. The major version number has changed, so there are some compatibility-breaking changes, but the basic API stays the same and is mostly backward-compatible.
|
|
||||||
|
|
||||||
Major features added (some compatibility-breaking):
|
|
||||||
|
|
||||||
- Added new API for selecting preferred memory type: flags `VMA_MEMORY_USAGE_AUTO`, `VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE`, `VMA_MEMORY_USAGE_AUTO_PREFER_HOST`, `VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT`, `VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT`, `VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT`. Old values like `VMA_MEMORY_USAGE_GPU_ONLY` still work as before, for backward compatibility, but are not recommended.
|
|
||||||
- Added new defragmentation API and algorithm, replacing the old one. See structure `VmaDefragmentationInfo`, `VmaDefragmentationMove`, `VmaDefragmentationPassMoveInfo`, `VmaDefragmentationStats`, function `vmaBeginDefragmentation`, `vmaEndDefragmentation`, `vmaBeginDefragmentationPass`, `vmaEndDefragmentationPass`.
|
|
||||||
- Redesigned API for statistics, replacing the old one. See structures: `VmaStatistics`, `VmaDetailedStatistics`, `VmaTotalStatistics`. `VmaBudget`, functions: `vmaGetHeapBudgets`, `vmaCalculateStatistics`, `vmaGetPoolStatistics`, `vmaCalculatePoolStatistics`, `vmaGetVirtualBlockStatistics`, `vmaCalculateVirtualBlockStatistics`.
|
|
||||||
- Added "Virtual allocator" feature - possibility to use core allocation algorithms for allocation of custom memory, not necessarily Vulkan device memory. See functions like `vmaCreateVirtualBlock`, `vmaDestroyVirtualBlock` and many more.
|
|
||||||
- `VmaAllocation` now keeps both `void* pUserData` and `char* pName`. Added function `vmaSetAllocationName`, member `VmaAllocationInfo::pName`. Flag `VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT` is now deprecated.
|
|
||||||
- Clarified and cleaned up various ways of importing Vulkan functions. See macros `VMA_STATIC_VULKAN_FUNCTIONS`, `VMA_DYNAMIC_VULKAN_FUNCTIONS`, structure `VmaVulkanFunctions`. Added members `VmaVulkanFunctions::vkGetInstanceProcAddr`, `vkGetDeviceProcAddr`, which are now required when using `VMA_DYNAMIC_VULKAN_FUNCTIONS`.
|
|
||||||
|
|
||||||
Removed (compatibility-breaking):
|
|
||||||
|
|
||||||
- Removed whole "lost allocations" feature. Removed from the interface: `VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT`, `VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT`, `vmaCreateLostAllocation`, `vmaMakePoolAllocationsLost`, `vmaTouchAllocation`, `VmaAllocatorCreateInfo::frameInUseCount`, `VmaPoolCreateInfo::frameInUseCount`.
|
|
||||||
- Removed whole "record & replay" feature. Removed from the API: `VmaAllocatorCreateInfo::pRecordSettings`, `VmaRecordSettings`, `VmaRecordFlagBits`, `VmaRecordFlags`. Removed VmaReplay application.
|
|
||||||
- Removed "buddy" algorithm - removed flag `VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT`.
|
|
||||||
|
|
||||||
Minor but compatibility-breaking changes:
|
|
||||||
|
|
||||||
- Changes in `ALLOCATION_CREATE_STRATEGY` flags. Removed flags: `VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT`, `VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT`, `VMA_VIRTUAL_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT`, which were aliases to other existing flags.
|
|
||||||
- Added a member `void* pUserData` to `VmaDeviceMemoryCallbacks`. Updated `PFN_vmaAllocateDeviceMemoryFunction`, `PFN_vmaFreeDeviceMemoryFunction` to use the new `pUserData` member.
|
|
||||||
- Removed function `vmaResizeAllocation` that was already deprecated.
|
|
||||||
|
|
||||||
Other major changes:
|
|
||||||
|
|
||||||
- Added new features to custom pools: support for dedicated allocations, new member `VmaPoolCreateInfo::pMemoryAllocateNext`, `minAllocationAlignment`.
|
|
||||||
- Added support for Vulkan 1.2, 1.3.
|
|
||||||
- Added support for VK_KHR_buffer_device_address extension - flag `VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT`.
|
|
||||||
- Added support for VK_EXT_memory_priority extension - flag `VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT`, members `VmaAllocationCreateInfo::priority`, `VmaPoolCreateInfo::priority`.
|
|
||||||
- Added support for VK_AMD_device_coherent_memory extension - flag `VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT`.
|
|
||||||
- Added member `VmaAllocatorCreateInfo::pTypeExternalMemoryHandleTypes`.
|
|
||||||
- Added function `vmaGetAllocatorInfo`, structure `VmaAllocatorInfo`.
|
|
||||||
- Added functions `vmaFlushAllocations`, `vmaInvalidateAllocations` for multiple allocations at once.
|
|
||||||
- Added flag `VMA_ALLOCATION_CREATE_CAN_ALIAS_BIT`.
|
|
||||||
- Added function `vmaCreateBufferWithAlignment`.
|
|
||||||
- Added convenience function `vmaGetAllocationMemoryProperties`.
|
|
||||||
- Added convenience functions: `vmaCreateAliasingBuffer`, `vmaCreateAliasingImage`.
|
|
||||||
|
|
||||||
Other minor changes:
|
|
||||||
|
|
||||||
- Implemented Two-Level Segregated Fit (TLSF) allocation algorithm, replacing previous default one. It is much faster, especially when freeing many allocations at once or when `bufferImageGranularity` is large.
|
|
||||||
- Renamed debug macro `VMA_DEBUG_ALIGNMENT` to `VMA_MIN_ALIGNMENT`.
|
|
||||||
- Added CMake support - CMakeLists.txt files. Removed Premake support.
|
|
||||||
- Changed `vmaInvalidateAllocation` and `vmaFlushAllocation` to return `VkResult`.
|
|
||||||
- Added nullability annotations for Clang: `VMA_NULLABLE`, `VMA_NOT_NULL`, `VMA_NULLABLE_NON_DISPATCHABLE`, `VMA_NOT_NULL_NON_DISPATCHABLE`, `VMA_LEN_IF_NOT_NULL`.
|
|
||||||
- JSON dump format has changed.
|
|
||||||
- Countless fixes and improvements, including performance optimizations, compatibility with various platforms and compilers, documentation.
|
|
||||||
|
|
||||||
# 2.3.0 (2019-12-04)
|
|
||||||
|
|
||||||
Major release after a year of development in "master" branch and feature branches. Notable new features: supporting Vulkan 1.1, supporting query for memory budget.
|
|
||||||
|
|
||||||
Major changes:
|
|
||||||
|
|
||||||
- Added support for Vulkan 1.1.
|
|
||||||
- Added member `VmaAllocatorCreateInfo::vulkanApiVersion`.
|
|
||||||
- When Vulkan 1.1 is used, there is no need to enable VK_KHR_dedicated_allocation or VK_KHR_bind_memory2 extensions, as they are promoted to Vulkan itself.
|
|
||||||
- Added support for query for memory budget and staying within the budget.
|
|
||||||
- Added function `vmaGetBudget`, structure `VmaBudget`. This can also serve as simple statistics, more efficient than `vmaCalculateStats`.
|
|
||||||
- By default the budget it is estimated based on memory heap sizes. It may be queried from the system using VK_EXT_memory_budget extension if you use `VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT` flag and `VmaAllocatorCreateInfo::instance` member.
|
|
||||||
- Added flag `VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT` that fails an allocation if it would exceed the budget.
|
|
||||||
- Added new memory usage options:
|
|
||||||
- `VMA_MEMORY_USAGE_CPU_COPY` for memory that is preferably not `DEVICE_LOCAL` but not guaranteed to be `HOST_VISIBLE`.
|
|
||||||
- `VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED` for memory that is `LAZILY_ALLOCATED`.
|
|
||||||
- Added support for VK_KHR_bind_memory2 extension:
|
|
||||||
- Added `VMA_ALLOCATION_CREATE_DONT_BIND_BIT` flag that lets you create both buffer/image and allocation, but don't bind them together.
|
|
||||||
- Added flag `VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT`, functions `vmaBindBufferMemory2`, `vmaBindImageMemory2` that let you specify additional local offset and `pNext` pointer while binding.
|
|
||||||
- Added functions `vmaSetPoolName`, `vmaGetPoolName` that let you assign string names to custom pools. JSON dump file format and VmaDumpVis tool is updated to show these names.
|
|
||||||
- Defragmentation is legal only on buffers and images in `VK_IMAGE_TILING_LINEAR`. This is due to the way it is currently implemented in the library and the restrictions of the Vulkan specification. Clarified documentation in this regard. See discussion in #59.
|
|
||||||
|
|
||||||
Minor changes:
|
|
||||||
|
|
||||||
- Made `vmaResizeAllocation` function deprecated, always returning failure.
|
|
||||||
- Made changes in the internal algorithm for the choice of memory type. Be careful! You may now get a type that is not `HOST_VISIBLE` or `HOST_COHERENT` if it's not stated as always ensured by some `VMA_MEMORY_USAGE_*` flag.
|
|
||||||
- Extended VmaReplay application with more detailed statistics printed at the end.
|
|
||||||
- Added macros `VMA_CALL_PRE`, `VMA_CALL_POST` that let you decorate declarations of all library functions if you want to e.g. export/import them as dynamically linked library.
|
|
||||||
- Optimized `VmaAllocation` objects to be allocated out of an internal free-list allocator. This makes allocation and deallocation causing 0 dynamic CPU heap allocations on average.
|
|
||||||
- Updated recording CSV file format version to 1.8, to support new functions.
|
|
||||||
- Many additions and fixes in documentation. Many compatibility fixes for various compilers and platforms. Other internal bugfixes, optimizations, updates, refactoring...
|
|
||||||
|
|
||||||
# 2.2.0 (2018-12-13)
|
|
||||||
|
|
||||||
Major release after many months of development in "master" branch and feature branches. Notable new features: defragmentation of GPU memory, buddy algorithm, convenience functions for sparse binding.
|
|
||||||
|
|
||||||
Major changes:
|
|
||||||
|
|
||||||
- New, more powerful defragmentation:
|
|
||||||
- Added structure `VmaDefragmentationInfo2`, functions `vmaDefragmentationBegin`, `vmaDefragmentationEnd`.
|
|
||||||
- Added support for defragmentation of GPU memory.
|
|
||||||
- Defragmentation of CPU memory now uses `memmove`, so it can move data to overlapping regions.
|
|
||||||
- Defragmentation of CPU memory is now available for memory types that are `HOST_VISIBLE` but not `HOST_COHERENT`.
|
|
||||||
- Added structure member `VmaVulkanFunctions::vkCmdCopyBuffer`.
|
|
||||||
- Major internal changes in defragmentation algorithm.
|
|
||||||
- VmaReplay: added parameters: `--DefragmentAfterLine`, `--DefragmentationFlags`.
|
|
||||||
- Old interface (structure `VmaDefragmentationInfo`, function `vmaDefragment`) is now deprecated.
|
|
||||||
- Added buddy algorithm, available for custom pools - flag `VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT`.
|
|
||||||
- Added convenience functions for multiple allocations and deallocations at once, intended for sparse binding resources - functions `vmaAllocateMemoryPages`, `vmaFreeMemoryPages`.
|
|
||||||
- Added function that tries to resize existing allocation in place: `vmaResizeAllocation`.
|
|
||||||
- Added flags for allocation strategy: `VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT`, `VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT`, `VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT`, and their aliases: `VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT`, `VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT`, `VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT`.
|
|
||||||
|
|
||||||
Minor changes:
|
|
||||||
|
|
||||||
- Changed behavior of allocation functions to return `VK_ERROR_VALIDATION_FAILED_EXT` when trying to allocate memory of size 0, create buffer with size 0, or image with one of the dimensions 0.
|
|
||||||
- VmaReplay: Added support for Windows end of lines.
|
|
||||||
- Updated recording CSV file format version to 1.5, to support new functions.
|
|
||||||
- Internal optimization: using read-write mutex on some platforms.
|
|
||||||
- Many additions and fixes in documentation. Many compatibility fixes for various compilers. Other internal bugfixes, optimizations, refactoring, added more internal validation...
|
|
||||||
|
|
||||||
# 2.1.0 (2018-09-10)
|
|
||||||
|
|
||||||
Minor bugfixes.
|
|
||||||
|
|
||||||
# 2.1.0-beta.1 (2018-08-27)
|
|
||||||
|
|
||||||
Major release after many months of development in "development" branch and features branches. Many new features added, some bugs fixed. API stays backward-compatible.
|
|
||||||
|
|
||||||
Major changes:
|
|
||||||
|
|
||||||
- Added linear allocation algorithm, accessible for custom pools, that can be used as free-at-once, stack, double stack, or ring buffer. See "Linear allocation algorithm" documentation chapter.
|
|
||||||
- Added `VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT`, `VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT`.
|
|
||||||
- Added feature to record sequence of calls to the library to a file and replay it using dedicated application. See documentation chapter "Record and replay".
|
|
||||||
- Recording: added `VmaAllocatorCreateInfo::pRecordSettings`.
|
|
||||||
- Replaying: added VmaReplay project.
|
|
||||||
- Recording file format: added document "docs/Recording file format.md".
|
|
||||||
- Improved support for non-coherent memory.
|
|
||||||
- Added functions: `vmaFlushAllocation`, `vmaInvalidateAllocation`.
|
|
||||||
- `nonCoherentAtomSize` is now respected automatically.
|
|
||||||
- Added `VmaVulkanFunctions::vkFlushMappedMemoryRanges`, `vkInvalidateMappedMemoryRanges`.
|
|
||||||
- Improved debug features related to detecting incorrect mapped memory usage. See documentation chapter "Debugging incorrect memory usage".
|
|
||||||
- Added debug macro `VMA_DEBUG_DETECT_CORRUPTION`, functions `vmaCheckCorruption`, `vmaCheckPoolCorruption`.
|
|
||||||
- Added debug macro `VMA_DEBUG_INITIALIZE_ALLOCATIONS` to initialize contents of allocations with a bit pattern.
|
|
||||||
- Changed behavior of `VMA_DEBUG_MARGIN` macro - it now adds margin also before first and after last allocation in a block.
|
|
||||||
- Changed format of JSON dump returned by `vmaBuildStatsString` (not backward compatible!).
|
|
||||||
- Custom pools and memory blocks now have IDs that don't change after sorting.
|
|
||||||
- Added properties: "CreationFrameIndex", "LastUseFrameIndex", "Usage".
|
|
||||||
- Changed VmaDumpVis tool to use these new properties for better coloring.
|
|
||||||
- Changed behavior of `vmaGetAllocationInfo` and `vmaTouchAllocation` to update `allocation.lastUseFrameIndex` even if allocation cannot become lost.
|
|
||||||
|
|
||||||
Minor changes:
|
|
||||||
|
|
||||||
- Changes in custom pools:
|
|
||||||
- Added new structure member `VmaPoolStats::blockCount`.
|
|
||||||
- Changed behavior of `VmaPoolCreateInfo::blockSize` = 0 (default) - it now means that pool may use variable block sizes, just like default pools do.
|
|
||||||
- Improved logic of `vmaFindMemoryTypeIndex` for some cases, especially integrated GPUs.
|
|
||||||
- VulkanSample application: Removed dependency on external library MathFu. Added own vector and matrix structures.
|
|
||||||
- Changes that improve compatibility with various platforms, including: Visual Studio 2012, 32-bit code, C compilers.
|
|
||||||
- Changed usage of "VK_KHR_dedicated_allocation" extension in the code to be optional, driven by macro `VMA_DEDICATED_ALLOCATION`, for compatibility with Android.
|
|
||||||
- Many additions and fixes in documentation, including description of new features, as well as "Validation layer warnings".
|
|
||||||
- Other bugfixes.
|
|
||||||
|
|
||||||
# 2.0.0 (2018-03-19)
|
|
||||||
|
|
||||||
A major release with many compatibility-breaking changes.
|
|
||||||
|
|
||||||
Notable new features:
|
|
||||||
|
|
||||||
- Introduction of `VmaAllocation` handle that you must retrieve from allocation functions and pass to deallocation functions next to normal `VkBuffer` and `VkImage`.
|
|
||||||
- Introduction of `VmaAllocationInfo` structure that you can retrieve from `VmaAllocation` handle to access parameters of the allocation (like `VkDeviceMemory` and offset) instead of retrieving them directly from allocation functions.
|
|
||||||
- Support for reference-counted mapping and persistently mapped allocations - see `vmaMapMemory`, `VMA_ALLOCATION_CREATE_MAPPED_BIT`.
|
|
||||||
- Support for custom memory pools - see `VmaPool` handle, `VmaPoolCreateInfo` structure, `vmaCreatePool` function.
|
|
||||||
- Support for defragmentation (compaction) of allocations - see function `vmaDefragment` and related structures.
|
|
||||||
- Support for "lost allocations" - see appropriate chapter on documentation Main Page.
|
|
||||||
|
|
||||||
# 1.0.1 (2017-07-04)
|
|
||||||
|
|
||||||
- Fixes for Linux GCC compilation.
|
|
||||||
- Changed "CONFIGURATION SECTION" to contain #ifndef so you can define these macros before including this header, not necessarily change them in the file.
|
|
||||||
|
|
||||||
# 1.0.0 (2017-06-16)
|
|
||||||
|
|
||||||
First public release.
|
|
@ -1,19 +0,0 @@
|
|||||||
Copyright (c) 2017-2022 Advanced Micro Devices, Inc. All rights reserved.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
@ -1,175 +0,0 @@
|
|||||||
# Vulkan Memory Allocator
|
|
||||||
|
|
||||||
Easy to integrate Vulkan memory allocation library.
|
|
||||||
|
|
||||||
**Documentation:** Browse online: [Vulkan Memory Allocator](https://gpuopen-librariesandsdks.github.io/VulkanMemoryAllocator/html/) (generated from Doxygen-style comments in [include/vk_mem_alloc.h](include/vk_mem_alloc.h))
|
|
||||||
|
|
||||||
**License:** MIT. See [LICENSE.txt](LICENSE.txt)
|
|
||||||
|
|
||||||
**Changelog:** See [CHANGELOG.md](CHANGELOG.md)
|
|
||||||
|
|
||||||
**Product page:** [Vulkan Memory Allocator on GPUOpen](https://gpuopen.com/gaming-product/vulkan-memory-allocator/)
|
|
||||||
|
|
||||||
**Build status:**
|
|
||||||
|
|
||||||
- Windows: [](https://ci.appveyor.com/project/adam-sawicki-amd/vulkanmemoryallocator/branch/master)
|
|
||||||
- Linux: [](https://app.travis-ci.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator)
|
|
||||||
|
|
||||||
[](http://isitmaintained.com/project/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator "Average time to resolve an issue")
|
|
||||||
|
|
||||||
# Problem
|
|
||||||
|
|
||||||
Memory allocation and resource (buffer and image) creation in Vulkan is difficult (comparing to older graphics APIs, like D3D11 or OpenGL) for several reasons:
|
|
||||||
|
|
||||||
- It requires a lot of boilerplate code, just like everything else in Vulkan, because it is a low-level and high-performance API.
|
|
||||||
- There is additional level of indirection: `VkDeviceMemory` is allocated separately from creating `VkBuffer`/`VkImage` and they must be bound together.
|
|
||||||
- Driver must be queried for supported memory heaps and memory types. Different GPU vendors provide different types of it.
|
|
||||||
- It is recommended to allocate bigger chunks of memory and assign parts of them to particular resources, as there is a limit on maximum number of memory blocks that can be allocated.
|
|
||||||
|
|
||||||
# Features
|
|
||||||
|
|
||||||
This library can help game developers to manage memory allocations and resource creation by offering some higher-level functions:
|
|
||||||
|
|
||||||
1. Functions that help to choose correct and optimal memory type based on intended usage of the memory.
|
|
||||||
- Required or preferred traits of the memory are expressed using higher-level description comparing to Vulkan flags.
|
|
||||||
2. Functions that allocate memory blocks, reserve and return parts of them (`VkDeviceMemory` + offset + size) to the user.
|
|
||||||
- Library keeps track of allocated memory blocks, used and unused ranges inside them, finds best matching unused ranges for new allocations, respects all the rules of alignment and buffer/image granularity.
|
|
||||||
3. Functions that can create an image/buffer, allocate memory for it and bind them together - all in one call.
|
|
||||||
|
|
||||||
Additional features:
|
|
||||||
|
|
||||||
- Well-documented - description of all functions and structures provided, along with chapters that contain general description and example code.
|
|
||||||
- Thread-safety: Library is designed to be used in multithreaded code. Access to a single device memory block referred by different buffers and textures (binding, mapping) is synchronized internally. Memory mapping is reference-counted.
|
|
||||||
- Configuration: Fill optional members of `VmaAllocatorCreateInfo` structure to provide custom CPU memory allocator, pointers to Vulkan functions and other parameters.
|
|
||||||
- Customization and integration with custom engines: Predefine appropriate macros to provide your own implementation of all external facilities used by the library like assert, mutex, atomic.
|
|
||||||
- Support for memory mapping, reference-counted internally. Support for persistently mapped memory: Just allocate with appropriate flag and access the pointer to already mapped memory.
|
|
||||||
- Support for non-coherent memory. Functions that flush/invalidate memory. `nonCoherentAtomSize` is respected automatically.
|
|
||||||
- Support for resource aliasing (overlap).
|
|
||||||
- Support for sparse binding and sparse residency: Convenience functions that allocate or free multiple memory pages at once.
|
|
||||||
- Custom memory pools: Create a pool with desired parameters (e.g. fixed or limited maximum size) and allocate memory out of it.
|
|
||||||
- Linear allocator: Create a pool with linear algorithm and use it for much faster allocations and deallocations in free-at-once, stack, double stack, or ring buffer fashion.
|
|
||||||
- Support for Vulkan 1.0, 1.1, 1.2, 1.3.
|
|
||||||
- Support for extensions (and equivalent functionality included in new Vulkan versions):
|
|
||||||
- VK_KHR_dedicated_allocation: Just enable it and it will be used automatically by the library.
|
|
||||||
- VK_KHR_buffer_device_address: Flag `VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR` is automatically added to memory allocations where needed.
|
|
||||||
- VK_EXT_memory_budget: Used internally if available to query for current usage and budget. If not available, it falls back to an estimation based on memory heap sizes.
|
|
||||||
- VK_EXT_memory_priority: Set `priority` of allocations or custom pools and it will be set automatically using this extension.
|
|
||||||
- VK_AMD_device_coherent_memory
|
|
||||||
- Defragmentation of GPU and CPU memory: Let the library move data around to free some memory blocks and make your allocations better compacted.
|
|
||||||
- Statistics: Obtain brief or detailed statistics about the amount of memory used, unused, number of allocated blocks, number of allocations etc. - globally, per memory heap, and per memory type.
|
|
||||||
- Debug annotations: Associate custom `void* pUserData` and debug `char* pName` with each allocation.
|
|
||||||
- JSON dump: Obtain a string in JSON format with detailed map of internal state, including list of allocations, their string names, and gaps between them.
|
|
||||||
- Convert this JSON dump into a picture to visualize your memory. See [tools/GpuMemDumpVis](tools/GpuMemDumpVis/README.md).
|
|
||||||
- Debugging incorrect memory usage: Enable initialization of all allocated memory with a bit pattern to detect usage of uninitialized or freed memory. Enable validation of a magic number after every allocation to detect out-of-bounds memory corruption.
|
|
||||||
- Support for interoperability with OpenGL.
|
|
||||||
- Virtual allocator: Interface for using core allocation algorithm to allocate any custom data, e.g. pieces of one large buffer.
|
|
||||||
|
|
||||||
# Prerequisites
|
|
||||||
|
|
||||||
- Self-contained C++ library in single header file. No external dependencies other than standard C and C++ library and of course Vulkan. Some features of C++14 used. STL containers, RTTI, or C++ exceptions are not used.
|
|
||||||
- Public interface in C, in same convention as Vulkan API. Implementation in C++.
|
|
||||||
- Error handling implemented by returning `VkResult` error codes - same way as in Vulkan.
|
|
||||||
- Interface documented using Doxygen-style comments.
|
|
||||||
- Platform-independent, but developed and tested on Windows using Visual Studio. Continuous integration setup for Windows and Linux. Used also on Android, MacOS, and other platforms.
|
|
||||||
|
|
||||||
# Example
|
|
||||||
|
|
||||||
Basic usage of this library is very simple. Advanced features are optional. After you created global `VmaAllocator` object, a complete code needed to create a buffer may look like this:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
|
|
||||||
bufferInfo.size = 65536;
|
|
||||||
bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
|
|
||||||
|
|
||||||
VmaAllocationCreateInfo allocInfo = {};
|
|
||||||
allocInfo.usage = VMA_MEMORY_USAGE_AUTO;
|
|
||||||
|
|
||||||
VkBuffer buffer;
|
|
||||||
VmaAllocation allocation;
|
|
||||||
vmaCreateBuffer(allocator, &bufferInfo, &allocInfo, &buffer, &allocation, nullptr);
|
|
||||||
```
|
|
||||||
|
|
||||||
With this one function call:
|
|
||||||
|
|
||||||
1. `VkBuffer` is created.
|
|
||||||
2. `VkDeviceMemory` block is allocated if needed.
|
|
||||||
3. An unused region of the memory block is bound to this buffer.
|
|
||||||
|
|
||||||
`VmaAllocation` is an object that represents memory assigned to this buffer. It can be queried for parameters like `VkDeviceMemory` handle and offset.
|
|
||||||
|
|
||||||
# How to build
|
|
||||||
|
|
||||||
On Windows it is recommended to use [CMake UI](https://cmake.org/runningcmake/). Alternatively you can generate a Visual Studio project map using CMake in command line: `cmake -B./build/ -DCMAKE_BUILD_TYPE=Debug -G "Visual Studio 16 2019" -A x64 ./`
|
|
||||||
|
|
||||||
On Linux:
|
|
||||||
|
|
||||||
```
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
cmake ..
|
|
||||||
make
|
|
||||||
```
|
|
||||||
|
|
||||||
The following targets are available
|
|
||||||
|
|
||||||
| Target | Description | CMake option | Default setting |
|
|
||||||
| ------------- | ------------- | ------------- | ------------- |
|
|
||||||
| VmaSample | VMA sample application | `VMA_BUILD_SAMPLE` | `OFF` |
|
|
||||||
| VmaBuildSampleShaders | Shaders for VmaSample | `VMA_BUILD_SAMPLE_SHADERS` | `OFF` |
|
|
||||||
|
|
||||||
Please note that while VulkanMemoryAllocator library is supported on other platforms besides Windows, VmaSample is not.
|
|
||||||
|
|
||||||
These CMake options are available
|
|
||||||
|
|
||||||
| CMake option | Description | Default setting |
|
|
||||||
| ------------- | ------------- | ------------- |
|
|
||||||
| `VMA_RECORDING_ENABLED` | Enable VMA memory recording for debugging | `OFF` |
|
|
||||||
| `VMA_USE_STL_CONTAINERS` | Use C++ STL containers instead of VMA's containers | `OFF` |
|
|
||||||
| `VMA_STATIC_VULKAN_FUNCTIONS` | Link statically with Vulkan API | `OFF` |
|
|
||||||
| `VMA_DYNAMIC_VULKAN_FUNCTIONS` | Fetch pointers to Vulkan functions internally (no static linking) | `ON` |
|
|
||||||
| `VMA_DEBUG_ALWAYS_DEDICATED_MEMORY` | Every allocation will have its own memory block | `OFF` |
|
|
||||||
| `VMA_DEBUG_INITIALIZE_ALLOCATIONS` | Automatically fill new allocations and destroyed allocations with some bit pattern | `OFF` |
|
|
||||||
| `VMA_DEBUG_GLOBAL_MUTEX` | Enable single mutex protecting all entry calls to the library | `OFF` |
|
|
||||||
| `VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT` | Never exceed [VkPhysicalDeviceLimits::maxMemoryAllocationCount](https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#limits-maxMemoryAllocationCount) and return error | `OFF` |
|
|
||||||
|
|
||||||
# Binaries
|
|
||||||
|
|
||||||
The release comes with precompiled binary executable for "VulkanSample" application which contains test suite. It is compiled using Visual Studio 2019, so it requires appropriate libraries to work, including "MSVCP140.dll", "VCRUNTIME140.dll", "VCRUNTIME140_1.dll". If the launch fails with error message telling about those files missing, please download and install [Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads), "x64" version.
|
|
||||||
|
|
||||||
# Read more
|
|
||||||
|
|
||||||
See **[Documentation](https://gpuopen-librariesandsdks.github.io/VulkanMemoryAllocator/html/)**.
|
|
||||||
|
|
||||||
# Software using this library
|
|
||||||
|
|
||||||
- **[X-Plane](https://x-plane.com/)**
|
|
||||||
- **[Detroit: Become Human](https://gpuopen.com/learn/porting-detroit-3/)**
|
|
||||||
- **[Vulkan Samples](https://github.com/LunarG/VulkanSamples)** - official Khronos Vulkan samples. License: Apache-style.
|
|
||||||
- **[Anvil](https://github.com/GPUOpen-LibrariesAndSDKs/Anvil)** - cross-platform framework for Vulkan. License: MIT.
|
|
||||||
- **[Filament](https://github.com/google/filament)** - physically based rendering engine for Android, Windows, Linux and macOS, from Google. Apache License 2.0.
|
|
||||||
- **[Atypical Games - proprietary game engine](https://developer.samsung.com/galaxy-gamedev/gamedev-blog/infinitejet.html)**
|
|
||||||
- **[Flax Engine](https://flaxengine.com/)**
|
|
||||||
- **[Godot Engine](https://github.com/godotengine/godot/)** - multi-platform 2D and 3D game engine. License: MIT.
|
|
||||||
- **[Lightweight Java Game Library (LWJGL)](https://www.lwjgl.org/)** - includes binding of the library for Java. License: BSD.
|
|
||||||
- **[PowerVR SDK](https://github.com/powervr-graphics/Native_SDK)** - C++ cross-platform 3D graphics SDK, from Imagination. License: MIT.
|
|
||||||
- **[Skia](https://github.com/google/skia)** - complete 2D graphic library for drawing Text, Geometries, and Images, from Google.
|
|
||||||
- **[The Forge](https://github.com/ConfettiFX/The-Forge)** - cross-platform rendering framework. Apache License 2.0.
|
|
||||||
- **[VK9](https://github.com/disks86/VK9)** - Direct3D 9 compatibility layer using Vulkan. Zlib lincese.
|
|
||||||
- **[vkDOOM3](https://github.com/DustinHLand/vkDOOM3)** - Vulkan port of GPL DOOM 3 BFG Edition. License: GNU GPL.
|
|
||||||
- **[vkQuake2](https://github.com/kondrak/vkQuake2)** - vanilla Quake 2 with Vulkan support. License: GNU GPL.
|
|
||||||
- **[Vulkan Best Practice for Mobile Developers](https://github.com/ARM-software/vulkan_best_practice_for_mobile_developers)** from ARM. License: MIT.
|
|
||||||
- **[RPCS3](https://github.com/RPCS3/rpcs3)** - PlayStation 3 emulator/debugger. License: GNU GPLv2.
|
|
||||||
- **[PPSSPP](https://github.com/hrydgard/ppsspp)** - Playstation Portable emulator/debugger. License: GNU GPLv2+.
|
|
||||||
|
|
||||||
[Many other projects on GitHub](https://github.com/search?q=AMD_VULKAN_MEMORY_ALLOCATOR_H&type=Code) and some game development studios that use Vulkan in their games.
|
|
||||||
|
|
||||||
# See also
|
|
||||||
|
|
||||||
- **[D3D12 Memory Allocator](https://github.com/GPUOpen-LibrariesAndSDKs/D3D12MemoryAllocator)** - equivalent library for Direct3D 12. License: MIT.
|
|
||||||
- **[Awesome Vulkan](https://github.com/vinjn/awesome-vulkan)** - a curated list of awesome Vulkan libraries, debuggers and resources.
|
|
||||||
- **[VulkanMemoryAllocator-Hpp](https://github.com/malte-v/VulkanMemoryAllocator-Hpp)** - C++ binding for this library. License: CC0-1.0.
|
|
||||||
- **[PyVMA](https://github.com/realitix/pyvma)** - Python wrapper for this library. Author: Jean-Sébastien B. (@realitix). License: Apache 2.0.
|
|
||||||
- **[vk-mem](https://github.com/gwihlidal/vk-mem-rs)** - Rust binding for this library. Author: Graham Wihlidal. License: Apache 2.0 or MIT.
|
|
||||||
- **[Haskell bindings](https://hackage.haskell.org/package/VulkanMemoryAllocator)**, **[github](https://github.com/expipiplus1/vulkan/tree/master/VulkanMemoryAllocator)** - Haskell bindings for this library. Author: Ellie Hermaszewska (@expipiplus1). License BSD-3-Clause.
|
|
||||||
- **[vma_sample_sdl](https://github.com/rextimmy/vma_sample_sdl)** - SDL port of the sample app of this library (with the goal of running it on multiple platforms, including MacOS). Author: @rextimmy. License: MIT.
|
|
||||||
- **[vulkan-malloc](https://github.com/dylanede/vulkan-malloc)** - Vulkan memory allocation library for Rust. Based on version 1 of this library. Author: Dylan Ede (@dylanede). License: MIT / Apache 2.0.
|
|
File diff suppressed because it is too large
Load Diff
@ -69,7 +69,6 @@ fs = import('fs')
|
|||||||
# Gather dependencies
|
# Gather dependencies
|
||||||
thread_dep = dependency('threads')
|
thread_dep = dependency('threads')
|
||||||
m_dep = compiler.find_library('m', required : false)
|
m_dep = compiler.find_library('m', required : false)
|
||||||
vk_dep = dependency('vulkan', required : false)
|
|
||||||
|
|
||||||
# Subprojects installed via wraps
|
# Subprojects installed via wraps
|
||||||
meshoptimizer_proj = subproject('meshoptimizer', default_options: ['warning_level=0', 'werror=false'] )
|
meshoptimizer_proj = subproject('meshoptimizer', default_options: ['warning_level=0', 'werror=false'] )
|
||||||
|
@ -5,4 +5,5 @@ option('enable_dxc_shader_compiler', type : 'boolean', value : true, description
|
|||||||
option('enable_dx11_shader_compiler', type : 'boolean', value : true, description : 'Enables building the dx11-bases shader compiler.')
|
option('enable_dx11_shader_compiler', type : 'boolean', value : true, description : 'Enables building the dx11-bases shader compiler.')
|
||||||
option('game_as_subdir', type : 'boolean', value : false, description : 'If true, adds the directory "src/game" to the build.')
|
option('game_as_subdir', type : 'boolean', value : false, description : 'If true, adds the directory "src/game" to the build.')
|
||||||
option('build_dx11', type : 'boolean', value : true, description : 'Enables/disables the build of the dx11 renderer.')
|
option('build_dx11', type : 'boolean', value : true, description : 'Enables/disables the build of the dx11 renderer.')
|
||||||
|
option('build_vk', type : 'boolean', value : true, description : 'Enables/disables the build of the vulkan renderer.')
|
||||||
option('build_experiments', type : 'boolean', value : false, description : 'Enables/disables building the experiments in src/experimental.')
|
option('build_experiments', type : 'boolean', value : false, description : 'Enables/disables building the experiments in src/experimental.')
|
||||||
|
@ -4,6 +4,7 @@ subdir('app_framework')
|
|||||||
|
|
||||||
subdir('renderer/common')
|
subdir('renderer/common')
|
||||||
subdir('renderer/dx11')
|
subdir('renderer/dx11')
|
||||||
|
subdir('renderer/vk')
|
||||||
|
|
||||||
if get_option('build_experiments')
|
if get_option('build_experiments')
|
||||||
subdir('experimental')
|
subdir('experimental')
|
||||||
|
17
src/renderer/vk/init.c
Normal file
17
src/renderer/vk/init.c
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#include "renderer/common/renderer_api.h"
|
||||||
|
|
||||||
|
rt_result VkInit(const rt_renderer_init_info *info) {
|
||||||
|
return RT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VkShutdown(void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called by the application to retrieve the renderer api
|
||||||
|
RT_DLLEXPORT rt_renderer_api rtLoadRendererImpl(void) {
|
||||||
|
rt_renderer_api api = {
|
||||||
|
.Init = VkInit,
|
||||||
|
.Shutdown = VkShutdown,
|
||||||
|
};
|
||||||
|
return api;
|
||||||
|
}
|
25
src/renderer/vk/meson.build
Normal file
25
src/renderer/vk/meson.build
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
if get_option('build_vk')
|
||||||
|
#dx11_dep = declare_dependency(link_args: ['-ld3d11', '-ldxgi', '-lwinmm', '-ldxguid'])
|
||||||
|
vma_proj = subproject('vulkan-memory-allocator', default_options: ['warning_level=0', 'werror=false'])
|
||||||
|
vma_dep = vma_proj.get_variable('vma_allocator_dep')
|
||||||
|
|
||||||
|
vk_dep = dependency('vulkan', required : true)
|
||||||
|
vk_inc_dep = vk_dep.partial_dependency(compile_args: true, includes: true)
|
||||||
|
|
||||||
|
vk_renderer_lib = library('rtvk',
|
||||||
|
'init.c',
|
||||||
|
|
||||||
|
'../../../contrib/volk/volk.c',
|
||||||
|
'../../../contrib/volk/volk.h',
|
||||||
|
|
||||||
|
dependencies: [m_dep, vk_inc_dep, vma_dep, thread_dep],
|
||||||
|
include_directories: [engine_incdir, contrib_incdir],
|
||||||
|
link_with: [runtime_lib, common_renderer_lib],
|
||||||
|
cpp_pch: 'pch/vk_pch.h',
|
||||||
|
override_options: ['b_sanitize=none'],
|
||||||
|
install: true)
|
||||||
|
|
||||||
|
engine_libs += vk_renderer_lib
|
||||||
|
engine_lib_paths += vk_renderer_lib.full_path()
|
||||||
|
endif
|
||||||
|
|
0
src/renderer/vk/pch/vk_pch.h
Normal file
0
src/renderer/vk/pch/vk_pch.h
Normal file
@ -268,7 +268,7 @@ RT_DLLEXPORT bool rtSyncReadWholeFile(const char *path, void *dest, size_t dest_
|
|||||||
fclose(f);
|
fclose(f);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
size_t n = fread(dest, 1 fsz, f);
|
size_t n = fread(dest, 1, fsz, f);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return n == fsz;
|
return n == fsz;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
#include "timing.h"
|
#include "timing.h"
|
||||||
|
#include "runtime.h"
|
||||||
|
#include <bits/time.h>
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
@ -27,6 +29,44 @@ RT_DLLEXPORT rt_timestamp rtTimeNow(void) {
|
|||||||
return (rt_timestamp){.ticks = qpc.QuadPart, .ticks_per_second = _QPC_freq};
|
return (rt_timestamp){.ticks = qpc.QuadPart, .ticks_per_second = _QPC_freq};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif defined(__linux__)
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
static uint64_t _gettime_freq = 0u;
|
||||||
|
static clockid_t _clock_id = CLOCK_REALTIME;
|
||||||
|
|
||||||
|
rt_result InitTiming(void) {
|
||||||
|
|
||||||
|
struct timespec res;
|
||||||
|
_clock_id = CLOCK_PROCESS_CPUTIME_ID;
|
||||||
|
if (clock_getres(CLOCK_PROCESS_CPUTIME_ID, &res) != 0){
|
||||||
|
/* Fallback to CLOCK_REALTIME */
|
||||||
|
_clock_id = CLOCK_REALTIME;
|
||||||
|
if (clock_getres(CLOCK_REALTIME, &res) != 0) {
|
||||||
|
return RT_UNKNOWN_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res.tv_sec > 0) {
|
||||||
|
rtReportError("TIMING", "Clock reports resolution greater than 1 second.");
|
||||||
|
return RT_INVALID_VALUE;
|
||||||
|
}
|
||||||
|
_gettime_freq = res.tv_nsec * 1000000000;
|
||||||
|
double us_res = (double)res.tv_nsec / 1e3;
|
||||||
|
|
||||||
|
rtLog("TIMING", "clock_gettime resolution: %.3lf us.", us_res);
|
||||||
|
return RT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
RT_DLLEXPORT rt_timestamp rtTimeNow(void) {
|
||||||
|
struct timespec ts;
|
||||||
|
clock_gettime(_clock_id, &ts );
|
||||||
|
return (rt_timestamp){.ticks = ts.tv_nsec, .ticks_per_second = _gettime_freq};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
RT_DLLEXPORT rt_time_delta rtTimeBetween(rt_timestamp a, rt_timestamp b) {
|
RT_DLLEXPORT rt_time_delta rtTimeBetween(rt_timestamp a, rt_timestamp b) {
|
||||||
double a_secs, b_secs;
|
double a_secs, b_secs;
|
||||||
a_secs = (double)a.ticks / (double)a.ticks_per_second;
|
a_secs = (double)a.ticks / (double)a.ticks_per_second;
|
||||||
@ -34,4 +74,3 @@ RT_DLLEXPORT rt_time_delta rtTimeBetween(rt_timestamp a, rt_timestamp b) {
|
|||||||
return b_secs - a_secs;
|
return b_secs - a_secs;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
13
subprojects/vulkan-memory-allocator.wrap
Normal file
13
subprojects/vulkan-memory-allocator.wrap
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
[wrap-file]
|
||||||
|
directory = VulkanMemoryAllocator-3.1.0
|
||||||
|
source_url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/archive/refs/tags/v3.1.0.tar.gz
|
||||||
|
source_filename = VulkanMemoryAllocator-3.1.0.tar.gz
|
||||||
|
source_hash = ae134ecc37c55634f108e926f85d5d887b670360e77cd107affaf3a9539595f2
|
||||||
|
patch_filename = vulkan-memory-allocator_3.1.0-1_patch.zip
|
||||||
|
patch_url = https://wrapdb.mesonbuild.com/v2/vulkan-memory-allocator_3.1.0-1/get_patch
|
||||||
|
patch_hash = d62a983856146f4529c5c5a46b13c0451a4f7e02d0966606dcd054a204c5fd80
|
||||||
|
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/vulkan-memory-allocator_3.1.0-1/VulkanMemoryAllocator-3.1.0.tar.gz
|
||||||
|
wrapdb_version = 3.1.0-1
|
||||||
|
|
||||||
|
[provide]
|
||||||
|
vulkan-memory-allocator = vma_allocator_dep
|
Loading…
Reference in New Issue
Block a user