#include "RenderCommandQueue.h" #include namespace { int gFailures = 0; void Expect(bool condition, const char* message) { if (condition) return; std::cerr << "FAIL: " << message << "\n"; ++gFailures; } void TestPreviewRequestUsesLatestValue() { RenderCommandQueue queue; queue.RequestPreviewPresent({ 1920, 1080 }); queue.RequestPreviewPresent({ 1280, 720 }); const RenderCommandQueueMetrics metrics = queue.GetMetrics(); Expect(metrics.depth == 1, "preview requests coalesce to one pending command"); Expect(metrics.enqueuedCount == 1, "first preview request is counted as enqueued"); Expect(metrics.coalescedCount == 1, "second preview request is counted as coalesced"); RenderPreviewPresentRequest request; Expect(queue.TryTakePreviewPresent(request), "preview request can be consumed"); Expect(request.outputFrameWidth == 1280 && request.outputFrameHeight == 720, "latest preview request wins"); Expect(!queue.TryTakePreviewPresent(request), "preview request is removed after consume"); Expect(queue.GetMetrics().depth == 0, "preview consume empties queue depth"); } void TestScreenshotRequestUsesLatestValue() { RenderCommandQueue queue; queue.RequestScreenshotCapture({ 640, 360 }); queue.RequestScreenshotCapture({ 3840, 2160 }); RenderScreenshotCaptureRequest request; Expect(queue.TryTakeScreenshotCapture(request), "screenshot request can be consumed"); Expect(request.width == 3840 && request.height == 2160, "latest screenshot request wins"); Expect(!queue.TryTakeScreenshotCapture(request), "screenshot request is removed after consume"); } void TestRenderResetScopesCoalesceToStrongestRequest() { RenderCommandQueue queue; queue.RequestRenderReset(RenderCommandResetScope::TemporalHistoryOnly); queue.RequestRenderReset(RenderCommandResetScope::ShaderFeedbackOnly); RenderCommandResetScope scope = RenderCommandResetScope::None; Expect(queue.TryTakeRenderReset(scope), "render reset request can be consumed"); Expect(scope == RenderCommandResetScope::TemporalHistoryAndFeedback, "temporal and feedback reset requests merge"); Expect(!queue.TryTakeRenderReset(scope), "render reset request is removed after consume"); queue.RequestRenderReset(RenderCommandResetScope::None); Expect(queue.GetMetrics().depth == 0, "none reset request is ignored"); } void TestIndependentCommandKindsShareDepth() { RenderCommandQueue queue; queue.RequestPreviewPresent({ 1, 2 }); queue.RequestScreenshotCapture({ 3, 4 }); queue.RequestRenderReset(RenderCommandResetScope::TemporalHistoryOnly); Expect(queue.GetMetrics().depth == 3, "independent command kinds each contribute to depth"); } } int main() { TestPreviewRequestUsesLatestValue(); TestScreenshotRequestUsesLatestValue(); TestRenderResetScopesCoalesceToStrongestRequest(); TestIndependentCommandKindsShareDepth(); if (gFailures != 0) { std::cerr << gFailures << " RenderCommandQueue test failure(s).\n"; return 1; } std::cout << "RenderCommandQueue tests passed.\n"; return 0; }