46 SharedTextureOutputTarget(
const VulkanCore& core, vk::Extent2D preferred_extent, uint32_t image_count = 3);
47 ~SharedTextureOutputTarget()
override;
49 SharedTextureOutputTarget(
const SharedTextureOutputTarget&) =
delete;
50 auto operator=(
const SharedTextureOutputTarget&) -> SharedTextureOutputTarget& =
delete;
51 SharedTextureOutputTarget(SharedTextureOutputTarget&&) =
delete;
52 auto operator=(SharedTextureOutputTarget&&) -> SharedTextureOutputTarget& =
delete;
55 auto getExtent()
const -> vk::Extent2D
override {
60 auto getColorFormat()
const -> vk::Format
override {
61 return m_color_format;
65 auto getImageCount()
const -> uint32_t
override {
66 return static_cast<uint32_t
>(m_images.size());
70 auto getColorImage(uint32_t index)
const ->
const vk::Image&
override;
72 auto getColorAttachment(uint32_t index)
const ->
const vk::raii::ImageView&
override;
74 auto acquireNextImage(uint64_t timeout, vk::Semaphore image_available, vk::Fence in_flight_fence)
75 -> vk::ResultValue<uint32_t>
override;
77 auto present(uint32_t image_index, vk::Semaphore render_finished) -> vk::Result
override;
80 auto usesAcquirePresentSemaphores()
const ->
bool override {
84 void recordFinalize(vk::CommandBuffer command_buffer, uint32_t image_index)
override;
85 void onImageRenderComplete(uint32_t image_index)
override;
89 void recreate(vk::Extent2D extent)
override;
106 void disableSharedTextures();
115 auto holdSharedSlot(uint64_t generation, uint32_t slot) -> bool;
117 void releaseSharedSlot(uint64_t generation, uint32_t slot,
bool consumed);
121 std::optional<vma::raii::Image> image;
122 std::optional<vk::raii::ImageView> view;
123 std::optional<vma::raii::Buffer> staging;
124 void* mapped =
nullptr;
125 bool read_back =
false;
131 enum class SharingState : uint8_t {
138 void allocateResources(vk::Extent2D extent);
139 void createInterop();
142 auto imageByteSize()
const -> vk::DeviceSize {
143 return static_cast<vk::DeviceSize
>(m_extent.width) * m_extent.height * 4;
147 vk::Extent2D m_extent;
148 vk::Format m_color_format = vk::Format::eB8G8R8A8Unorm;
150 std::mutex m_frame_mutex;
151 std::vector<SharedImage> m_images;
152 uint32_t m_next_acquire_index = 0;
154 std::atomic<int32_t> m_latest_ready {-1};
155 std::atomic<int32_t> m_latest_readback {-1};
156 int32_t m_reading = -1;
157 std::condition_variable m_reading_done;
158 std::atomic<uint64_t> m_frame_counter {0};
159 std::unique_ptr<Interop> m_interop;
160 std::atomic<SharingState> m_sharing {SharingState::off};
161 std::atomic<bool> m_readback_requested {
false};
auto enableSharedTextures(uint64_t adapter_luid, const uint8_t *adapter_uuid) -> bool
Hands frames over as shared textures from the next acquired image on, and stops reading every frame b...
Definition shared_texture_output_target.cpp:548
void requestReadback()
Reads the next frame back to the CPU even while textures are shared.
Definition shared_texture_output_target.cpp:536
auto copyLatestFrame(void *dst, uint32_t dst_capacity, ViewportFrameDesc *out) -> int
Definition shared_texture_output_target.cpp:500
Definition shared_texture_output_target.cpp:76