diff --git a/Outputs/OpenGL/ScanTarget.cpp b/Outputs/OpenGL/ScanTarget.cpp index f9b119fe2..7a77da148 100644 --- a/Outputs/OpenGL/ScanTarget.cpp +++ b/Outputs/OpenGL/ScanTarget.cpp @@ -100,12 +100,21 @@ Outputs::Display::ScanTarget::Scan *ScanTarget::begin_scan() { write_pointers_.scan_buffer = next_write_pointer; // Fill in extra OpenGL-specific details. -// result->data_y = write_pointers_.write_area; - result->composite_y = 0; + result->composite_y = 0; // TODO. + vended_scan_ = result; return static_cast(result); } +void ScanTarget::end_scan() { + if(vended_scan_) { + vended_scan_->data_y = TextureAddressGetY(vended_write_area_pointer_); + vended_scan_->end_points[0].data_offset += TextureAddressGetX(vended_write_area_pointer_); + vended_scan_->end_points[1].data_offset += TextureAddressGetX(vended_write_area_pointer_); + } + vended_scan_ = nullptr; +} + uint8_t *ScanTarget::begin_data(size_t required_length, size_t required_alignment) { if(allocation_has_failed_) return nullptr; @@ -138,7 +147,7 @@ uint8_t *ScanTarget::begin_data(size_t required_length, size_t required_alignmen } // Everything checks out, return the pointer. - write_pointers_.write_area = TextureAddress(aligned_start_x, output_y); + vended_write_area_pointer_ = write_pointers_.write_area = TextureAddress(aligned_start_x, output_y); return &write_area_texture_[size_t(write_pointers_.write_area) * data_type_size_]; // Note state at exit: diff --git a/Outputs/OpenGL/ScanTarget.hpp b/Outputs/OpenGL/ScanTarget.hpp index 149762c59..58bf5ed0e 100644 --- a/Outputs/OpenGL/ScanTarget.hpp +++ b/Outputs/OpenGL/ScanTarget.hpp @@ -30,6 +30,7 @@ class ScanTarget: public Outputs::Display::ScanTarget { // Outputs::Display::ScanTarget overrides. void set_modals(Modals) override; Scan *begin_scan() override; + void end_scan() override; uint8_t *begin_data(size_t required_length, size_t required_alignment) override; void end_data(size_t actual_length) override; void submit() override; @@ -74,6 +75,10 @@ class ScanTarget: public Outputs::Display::ScanTarget { GLuint write_area_texture_name_ = 0; bool texture_exists_ = false; + // Ephemeral information for the begin/end functions. + Scan *vended_scan_ = nullptr; + int vended_write_area_pointer_ = 0; + // Track allocation failures. bool allocation_has_failed_ = false;