#pragma once #include #include #include enum class RenderCommandResetScope { None, ShaderFeedbackOnly, TemporalHistoryOnly, TemporalHistoryAndFeedback }; struct RenderPreviewPresentRequest { unsigned outputFrameWidth = 0; unsigned outputFrameHeight = 0; }; struct RenderScreenshotCaptureRequest { unsigned width = 0; unsigned height = 0; }; struct RenderCommandQueueMetrics { std::size_t depth = 0; uint64_t enqueuedCount = 0; uint64_t coalescedCount = 0; }; class RenderCommandQueue { public: void RequestPreviewPresent(const RenderPreviewPresentRequest& request); bool TryTakePreviewPresent(RenderPreviewPresentRequest& request); void RequestScreenshotCapture(const RenderScreenshotCaptureRequest& request); bool TryTakeScreenshotCapture(RenderScreenshotCaptureRequest& request); void RequestRenderReset(RenderCommandResetScope scope); bool TryTakeRenderReset(RenderCommandResetScope& scope); RenderCommandQueueMetrics GetMetrics() const; private: static RenderCommandResetScope MergeResetScopes(RenderCommandResetScope current, RenderCommandResetScope requested); mutable std::mutex mMutex; bool mHasPreviewPresentRequest = false; RenderPreviewPresentRequest mPreviewPresentRequest; bool mHasScreenshotCaptureRequest = false; RenderScreenshotCaptureRequest mScreenshotCaptureRequest; RenderCommandResetScope mRenderResetScope = RenderCommandResetScope::None; uint64_t mEnqueuedCount = 0; uint64_t mCoalescedCount = 0; };