16#include <QtGui/private/qrhi_p.h>
24namespace score::gfx::interop
38 std::atomic<int> pending{-1};
40 void publish(std::size_t i)
noexcept
42 pending.store(
static_cast<int>(i), std::memory_order_release);
45 int consume() noexcept {
return pending.exchange(-1, std::memory_order_acquire); }
46 void reset() noexcept { pending.store(-1, std::memory_order_relaxed); }
74 static constexpr std::size_t kMaxSlots = 32;
85 const int displaced = publisher.pending.exchange(
int(i), std::memory_order_acq_rel);
86 if(displaced >= 0 && displaced !=
int(i))
88 returns.fetch_or(1u <<
unsigned(displaced), std::memory_order_release);
97 const int slot = publisher.
consume();
102 if(held >= 0 && held != slot && retireN < kMaxSlots)
103 retire[retireN++] = Retired{held, acquisitions};
106 std::uint32_t freed = 0;
107 std::size_t keep = 0;
108 for(std::size_t i = 0; i < retireN; ++i)
111 freed |= 1u << unsigned(retire[i].slot);
113 retire[keep++] = retire[i];
117 returns.fetch_or(freed, std::memory_order_release);
124 return returns.exchange(0, std::memory_order_acquire);
127 void reset() noexcept
130 returns.store(0, std::memory_order_relaxed);
142 std::atomic<std::uint32_t> returns{0};
143 Retired retire[kMaxSlots]{};
144 std::size_t retireN{0};
146 std::uint64_t acquisitions{0};
157 const QRhiTexture* tex, std::uint32_t frameByteSize,
const char* tag)
noexcept
161 const auto sz = tex->pixelSize();
162 const auto expected =
static_cast<std::uint32_t
>(sz.width()) * 4u
163 *
static_cast<std::uint32_t
>(sz.height());
164 if(expected != frameByteSize)
166 qWarning() << tag <<
"outputTexture byte size" << expected
167 <<
"!= captured frame size" << frameByteSize;
bool validateCaptureTextureBytes(const QRhiTexture *tex, std::uint32_t frameByteSize, const char *tag) noexcept
Validate that an RGBA8-typed output texture's byte footprint matches the captured frame size (width *...
Definition CaptureStrategyCommon.hpp:156
Ownership bookkeeping for capture strategies that sample the producer's own buffers instead of copyin...
Definition CaptureStrategyCommon.hpp:73
int ingest(std::size_t i) noexcept
Definition CaptureStrategyCommon.hpp:83
std::uint32_t takeReturned() noexcept
Producer thread. Bitmask of slots the renderer has finished with.
Definition CaptureStrategyCommon.hpp:122
int acquire() noexcept
Render thread. The slot to bind now, or -1 when nothing is pending.
Definition CaptureStrategyCommon.hpp:95
std::size_t retireDepth
framesInFlight + 1, from QRhi::resourceLimit(QRhi::FramesInFlight).
Definition CaptureStrategyCommon.hpp:79
Lock-free single-producer/single-consumer slot handoff.
Definition CaptureStrategyCommon.hpp:37
int consume() noexcept
Returns the published slot index, or -1 if none is pending.
Definition CaptureStrategyCommon.hpp:45