#include "RenderCommandQueue.h" void RenderCommandQueue::RequestPreviewPresent(const RenderPreviewPresentRequest& request) { std::lock_guard lock(mMutex); if (mHasPreviewPresentRequest) ++mCoalescedCount; else ++mEnqueuedCount; mPreviewPresentRequest = request; mHasPreviewPresentRequest = true; } bool RenderCommandQueue::TryTakePreviewPresent(RenderPreviewPresentRequest& request) { std::lock_guard lock(mMutex); if (!mHasPreviewPresentRequest) return false; request = mPreviewPresentRequest; mPreviewPresentRequest = {}; mHasPreviewPresentRequest = false; return true; } void RenderCommandQueue::RequestScreenshotCapture(const RenderScreenshotCaptureRequest& request) { std::lock_guard lock(mMutex); if (mHasScreenshotCaptureRequest) ++mCoalescedCount; else ++mEnqueuedCount; mScreenshotCaptureRequest = request; mHasScreenshotCaptureRequest = true; } bool RenderCommandQueue::TryTakeScreenshotCapture(RenderScreenshotCaptureRequest& request) { std::lock_guard lock(mMutex); if (!mHasScreenshotCaptureRequest) return false; request = mScreenshotCaptureRequest; mScreenshotCaptureRequest = {}; mHasScreenshotCaptureRequest = false; return true; } void RenderCommandQueue::RequestRenderReset(RenderCommandResetScope scope) { if (scope == RenderCommandResetScope::None) return; std::lock_guard lock(mMutex); if (mRenderResetScope != RenderCommandResetScope::None) ++mCoalescedCount; else ++mEnqueuedCount; mRenderResetScope = MergeResetScopes(mRenderResetScope, scope); } bool RenderCommandQueue::TryTakeRenderReset(RenderCommandResetScope& scope) { std::lock_guard lock(mMutex); if (mRenderResetScope == RenderCommandResetScope::None) return false; scope = mRenderResetScope; mRenderResetScope = RenderCommandResetScope::None; return true; } RenderCommandQueueMetrics RenderCommandQueue::GetMetrics() const { std::lock_guard lock(mMutex); RenderCommandQueueMetrics metrics; metrics.depth = (mHasPreviewPresentRequest ? 1u : 0u) + (mHasScreenshotCaptureRequest ? 1u : 0u) + (mRenderResetScope != RenderCommandResetScope::None ? 1u : 0u); metrics.enqueuedCount = mEnqueuedCount; metrics.coalescedCount = mCoalescedCount; return metrics; } RenderCommandResetScope RenderCommandQueue::MergeResetScopes(RenderCommandResetScope current, RenderCommandResetScope requested) { if (current == RenderCommandResetScope::TemporalHistoryAndFeedback || requested == RenderCommandResetScope::TemporalHistoryAndFeedback) { return RenderCommandResetScope::TemporalHistoryAndFeedback; } if ((current == RenderCommandResetScope::TemporalHistoryOnly && requested == RenderCommandResetScope::ShaderFeedbackOnly) || (current == RenderCommandResetScope::ShaderFeedbackOnly && requested == RenderCommandResetScope::TemporalHistoryOnly)) { return RenderCommandResetScope::TemporalHistoryAndFeedback; } if (current == RenderCommandResetScope::TemporalHistoryOnly || requested == RenderCommandResetScope::TemporalHistoryOnly) { return RenderCommandResetScope::TemporalHistoryOnly; } if (current == RenderCommandResetScope::ShaderFeedbackOnly || requested == RenderCommandResetScope::ShaderFeedbackOnly) { return RenderCommandResetScope::ShaderFeedbackOnly; } return RenderCommandResetScope::None; }