mirror of
https://github.com/PancakeTAS/lsfg-vk.git
synced 2025-10-30 07:01:10 +00:00
80 lines
3 KiB
C++
80 lines
3 KiB
C++
#pragma once
|
|
|
|
#include "hooks.hpp"
|
|
#include "mini/commandbuffer.hpp"
|
|
#include "mini/commandpool.hpp"
|
|
#include "mini/image.hpp"
|
|
#include "mini/semaphore.hpp"
|
|
|
|
#include <vulkan/vulkan_core.h>
|
|
|
|
#include <array>
|
|
#include <cstdint>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
///
|
|
/// This class is the frame generation context. There should be one instance per swapchain.
|
|
///
|
|
class LsContext {
|
|
public:
|
|
///
|
|
/// Create the swapchain context.
|
|
///
|
|
/// @param info The device information to use.
|
|
/// @param swapchain The Vulkan swapchain to use.
|
|
/// @param extent The extent of the swapchain images.
|
|
/// @param swapchainImages The swapchain images to use.
|
|
///
|
|
/// @throws LSFG::vulkan_error if any Vulkan call fails.
|
|
///
|
|
LsContext(const Hooks::DeviceInfo& info, VkSwapchainKHR swapchain,
|
|
VkExtent2D extent, const std::vector<VkImage>& swapchainImages);
|
|
|
|
///
|
|
/// Custom present logic.
|
|
///
|
|
/// @param info The device information to use.
|
|
/// @param pNext Unknown pointer set in the present info structure.
|
|
/// @param queue The Vulkan queue to present the frame on.
|
|
/// @param gameRenderSemaphores The semaphores to wait on before presenting.
|
|
/// @param presentIdx The index of the swapchain image to present.
|
|
/// @return The result of the Vulkan present operation, which can be VK_SUCCESS or VK_SUBOPTIMAL_KHR.
|
|
///
|
|
/// @throws LSFG::vulkan_error if any Vulkan call fails.
|
|
///
|
|
VkResult present(const Hooks::DeviceInfo& info, const void* pNext, VkQueue queue,
|
|
const std::vector<VkSemaphore>& gameRenderSemaphores, uint32_t presentIdx);
|
|
|
|
// Non-copyable, trivially moveable and destructible
|
|
LsContext(const LsContext&) = delete;
|
|
LsContext& operator=(const LsContext&) = delete;
|
|
LsContext(LsContext&&) = default;
|
|
LsContext& operator=(LsContext&&) = default;
|
|
~LsContext() = default;
|
|
private:
|
|
VkSwapchainKHR swapchain;
|
|
std::vector<VkImage> swapchainImages;
|
|
VkExtent2D extent;
|
|
|
|
std::shared_ptr<int32_t> lsfgCtxId; // lsfg context id
|
|
Mini::Image frame_0, frame_1; // frames shared with lsfg. write to frame_0 when fc % 2 == 0
|
|
std::vector<Mini::Image> out_n; // output images shared with lsfg, indexed by framegen id
|
|
|
|
Mini::CommandPool cmdPool;
|
|
uint64_t frameIdx{0};
|
|
|
|
struct RenderPassInfo {
|
|
Mini::CommandBuffer preCopyBuf; // copy from swapchain image to frame_0/frame_1
|
|
std::array<Mini::Semaphore, 2> preCopySemaphores; // signal when preCopyBuf is done
|
|
|
|
std::vector<Mini::Semaphore> renderSemaphores; // signal when lsfg is done with frame n
|
|
|
|
std::vector<Mini::Semaphore> acquireSemaphores; // signal for swapchain image n
|
|
|
|
std::vector<Mini::CommandBuffer> postCopyBufs; // copy from out_n to swapchain image
|
|
std::vector<Mini::Semaphore> postCopySemaphores; // signal when postCopyBuf is done
|
|
std::vector<Mini::Semaphore> prevPostCopySemaphores; // signal for previous postCopyBuf
|
|
}; // data for a single render pass
|
|
std::array<RenderPassInfo, 8> passInfos; // allocate 8 because why not
|
|
};
|