#pragma once #include "PboReadbackRing.h" #include "VideoIOFormat.h" #include #include #include struct SystemFrame; class Bgra8ReadbackPipeline { public: using RenderCallback = std::function; using AcquireFrameCallback = std::function; using PublishFrameCallback = std::function; using CounterCallback = std::function; Bgra8ReadbackPipeline() = default; Bgra8ReadbackPipeline(const Bgra8ReadbackPipeline&) = delete; Bgra8ReadbackPipeline& operator=(const Bgra8ReadbackPipeline&) = delete; ~Bgra8ReadbackPipeline(); bool Initialize(unsigned width, unsigned height, std::size_t pboDepth); void Shutdown(); bool RenderAndQueue(uint64_t frameIndex, const RenderCallback& renderFrame); void ConsumeCompleted( const AcquireFrameCallback& acquireFrame, const PublishFrameCallback& publishFrame, const CounterCallback& onAcquireMiss = {}, const CounterCallback& onCompleted = {}); GLuint Framebuffer() const { return mFramebuffer; } unsigned Width() const { return mWidth; } unsigned Height() const { return mHeight; } unsigned RowBytes() const { return mRowBytes; } VideoIOPixelFormat PixelFormat() const { return VideoIOPixelFormat::Bgra8; } uint64_t PboQueueMisses() const { return mPboRing.QueueMisses(); } private: bool CreateRenderTarget(); void DestroyRenderTarget(); unsigned mWidth = 0; unsigned mHeight = 0; unsigned mRowBytes = 0; GLuint mFramebuffer = 0; GLuint mTexture = 0; PboReadbackRing mPboRing; };