* Manifest mode is very convient but doesn't provide the flexibility we
need. The main issue is that there is no way to conditionally install
libraries. To bypass this we can invoke vcpkg directly using a helper
function vcpkg_add_package that installs the library when invoked.
* Citra's fork of dynarmic is getting old quite fast and accumulating
technical debt which gets harder and harder to account for as time
goes on. So to have the access to the latest and greatest features we
need to use the upstream version which yuzu also uses. This requires
some extra patches which are contained in the following commits.
* shaderc is notoriously hard to link to and often causes link errors.
glslang seems to work better and is a smaller library overall so
that's a win for the backend.
* Manually including libraries into the project while a perfectly acceptable solution
leads to slow updates and large maintainance costs. To address this
shortcoming we are introducing a package manager namely vcpkg into the
codebase to handle the download and build of most external dependencies. Conan
was also considered but vcpkg was chosen due to the centralized nature
of the project. To achieve the integration the CMake configuration has
been altered but not by much:
1. Packages handled by vcpkg have been moved from
externals/CMakeLists.txt to the root one to make them available to
all subdirectories.
2. In addition now find_package is used in accordance to the vcpkg
recommendations.
3. All libraries built by vcpkg have been updated to their latest
available version, except for Qt because our codebase isn't
compatible with Qt 6.0 yet.
Currently there are build issues caused by the fmtlib upgrade.
Another question is how to handle large libraries like Qt, Boost and
SDL2 which will be addressed in a later commit.
* Add a staging buffer to each texture. This is suboptimal since it
causes many small allocations, will only be here until I implement
a global staging buffer with memory tracking
* Make the task scheduler accept generic functions which allows for more
powerful resource control
* The old manager class had unnecessary complexity and Dolphin specific stuff
that we didn't need. So this commit completely rewrites the class to make the
implementation simpler and more robust. It does three things:
1. Make use of Vulkan timeline semaphores
2. Remove submission thread
3. Rename VKCommandManager to VKTaskScheduler
* In addition remove Unique handles from textures and buffers and give the
responsibility of their deletion to the scheduler.