From 3a02b2b6c01bedf50e4dbe5d28d42011cffeca61 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 1 Feb 2026 17:19:29 -0500 Subject: [PATCH] Ensure copy shader compiles, at least. --- Outputs/OpenGL/CopyShader.cpp | 3 ++- Outputs/OpenGL/ScanTarget.cpp | 47 +++++++++++++++++++---------------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/Outputs/OpenGL/CopyShader.cpp b/Outputs/OpenGL/CopyShader.cpp index 404c9cf6f..0cfca42ca 100644 --- a/Outputs/OpenGL/CopyShader.cpp +++ b/Outputs/OpenGL/CopyShader.cpp @@ -18,7 +18,8 @@ void main(void) { float lateral = float(gl_VertexID & 1); float longitudinal = float((gl_VertexID & 2) >> 1); - gl_Position = vec4) + coordinate = vec2(lateral, longitudinal); + gl_Position = vec4( lateral * 2.0 - 1.0, longitudinal * 2.0 - 1.0, 0.0, diff --git a/Outputs/OpenGL/ScanTarget.cpp b/Outputs/OpenGL/ScanTarget.cpp index 6c0460997..df3e792e6 100644 --- a/Outputs/OpenGL/ScanTarget.cpp +++ b/Outputs/OpenGL/ScanTarget.cpp @@ -12,6 +12,7 @@ #include "Outputs/ScanTargets/FilterGenerator.hpp" #include "CompositionShader.hpp" +#include "CopyShader.hpp" #include #include @@ -262,6 +263,10 @@ void ScanTarget::setup_pipeline() { const float sample_multiplier = FilterGenerator::suggested_sample_multiplier(227.5f, 1320); + if(copy_shader_.empty()) { + copy_shader_ = copy_shader(api_, GL_TEXTURE4, {}, {}); + } + if( !existing_modals_ || existing_modals_->input_data_type != modals.input_data_type || @@ -466,30 +471,30 @@ void ScanTarget::update(int, int output_height) { // Submit new scans. // First implementation: put all new scans at the start of the buffer, for a simple // glDrawArraysInstanced call below. -// scans_.bind_buffer(); -// size_t buffer_destination = 0; -// const auto submit = [&](const size_t begin, const size_t end) { -// test_gl([&]{ -// glBufferSubData( -// GL_ARRAY_BUFFER, -// buffer_destination, -// (end - begin) * sizeof(Scan), -// &scan_buffer_[begin] -// ); -// }); -// buffer_destination += (end - begin) * sizeof(Scan); -// }; -// if(area.start.scan < area.end.scan) { -// submit(area.start.scan, area.end.scan); -// } else { -// submit(area.start.scan, scan_buffer_.size()); -// submit(0, area.end.scan); -// } + scans_.bind_buffer(); + size_t buffer_destination = 0; + const auto submit = [&](const size_t begin, const size_t end) { + test_gl([&]{ + glBufferSubData( + GL_ARRAY_BUFFER, + buffer_destination, + (end - begin) * sizeof(Scan), + &scan_buffer_[begin] + ); + }); + buffer_destination += (end - begin) * sizeof(Scan); + }; + if(area.start.scan < area.end.scan) { + submit(area.start.scan, area.end.scan); + } else { + submit(area.start.scan, scan_buffer_.size()); + submit(0, area.end.scan); + } // Populate composition buffer. composition_buffer_.bind_framebuffer(); -// scans_.bind(); -// composition_shader_.bind(); + scans_.bind(); + composition_shader_.bind(); test_gl([&]{ glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, GLsizei(new_scans)); }); }