From 4078baa42475930d256403d70243bf702cc2c7b1 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 3 Jul 2022 21:54:28 -0400 Subject: [PATCH] Capture up to eight scans per submission group. --- Outputs/SoftwareRendering/ScanTarget.cpp | 3 ++- Outputs/SoftwareRendering/ScanTarget.hpp | 28 ++++++++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Outputs/SoftwareRendering/ScanTarget.cpp b/Outputs/SoftwareRendering/ScanTarget.cpp index 613fc2346..6ed6ab477 100644 --- a/Outputs/SoftwareRendering/ScanTarget.cpp +++ b/Outputs/SoftwareRendering/ScanTarget.cpp @@ -23,5 +23,6 @@ void ScanTarget::set_modals(Modals m) { } void ScanTarget::submit() { - printf(""); + scan_buffer_pointer_ = sample_buffer_pointer_ = 0; + has_failed_ = false; } diff --git a/Outputs/SoftwareRendering/ScanTarget.hpp b/Outputs/SoftwareRendering/ScanTarget.hpp index adb439657..1d8839272 100644 --- a/Outputs/SoftwareRendering/ScanTarget.hpp +++ b/Outputs/SoftwareRendering/ScanTarget.hpp @@ -28,7 +28,20 @@ class ScanTarget: public Outputs::Display::ScanTarget { // some notes on their meaning to this specific scan target are given below. void set_modals(Modals) override; - Scan *begin_scan() override { return ¤t_scan_; } + + Scan *begin_scan() override { + if(has_failed_ || scan_buffer_pointer_ == 8) { + has_failed_ = true; + return nullptr; + } + + vended_buffer_ = &scan_buffer_[scan_buffer_pointer_]; + ++scan_buffer_pointer_; + return vended_buffer_; + } + void end_scan() override { + // TODO: adjust sample buffer locations. + } uint8_t *begin_data(size_t, size_t required_alignment) override { // Achieve required alignment. @@ -36,6 +49,8 @@ class ScanTarget: public Outputs::Display::ScanTarget { // Return target. return &sample_buffer_[sample_buffer_pointer_]; + + // TODO: nullptr case. } void end_data(size_t actual_length) override { sample_buffer_pointer_ += actual_length; @@ -46,13 +61,18 @@ class ScanTarget: public Outputs::Display::ScanTarget { template void process(); - // Temporaries; each scan is rasterised synchronously and upon - // completion, so the storage here is a lot simpler than for + // Temporaries; each set of scans is rasterised synchronously upon + // its submit, so the storage here is a lot simpler than for // the GPU-powered scan targets. - Scan current_scan_; + std::array scan_buffer_; + Scan *vended_buffer_ = nullptr; + size_t scan_buffer_pointer_ = 0; + std::array sample_buffer_; size_t sample_buffer_pointer_ = 0; + bool has_failed_ = false; + }; }