From a66a20f7fed64fbd9e90813125c180d464678b63 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Fri, 23 Nov 2018 22:54:52 -0500 Subject: [PATCH] Manages to get a brilliant white out of the new pipeline. --- Outputs/OpenGL/ScanTarget.cpp | 30 ++++++++++------------ Outputs/OpenGL/ScanTargetGLSLFragments.cpp | 6 ++--- Outputs/ScanTarget.hpp | 2 +- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/Outputs/OpenGL/ScanTarget.cpp b/Outputs/OpenGL/ScanTarget.cpp index 547f850f6..2c147ae61 100644 --- a/Outputs/OpenGL/ScanTarget.cpp +++ b/Outputs/OpenGL/ScanTarget.cpp @@ -28,11 +28,8 @@ constexpr GLenum SVideoLineBufferTextureUnit = GL_TEXTURE4; /// The texture unit which contains line-by-line records of luminance and separated, demodulated chrominance. constexpr GLenum RGBLineBufferTextureUnit = GL_TEXTURE5; -/// The texture unit which contains line-by-line RGB. -constexpr GLenum LineBufferTextureUnit = GL_TEXTURE6; - /// The texture unit that contains the current display. -constexpr GLenum AccumulationTextureUnit = GL_TEXTURE7; +constexpr GLenum AccumulationTextureUnit = GL_TEXTURE6; #define TextureAddress(x, y) (((y) << 11) | (x)) #define TextureAddressGetY(v) uint16_t((v) >> 11) @@ -148,21 +145,10 @@ void ScanTarget::set_modals(Modals modals) { glBindVertexArray(line_vertex_array_); glBindBuffer(GL_ARRAY_BUFFER, line_buffer_name_); enable_vertex_attributes(ShaderType::Line, *output_shader_); - set_uniforms(ShaderType::Line, *output_shader_); output_shader_->set_uniform("origin", modals.visible_area.origin.x, modals.visible_area.origin.y); output_shader_->set_uniform("size", modals.visible_area.size.width, modals.visible_area.size.height); - // Establish an input shader. - input_shader_ = input_shader(modals_.input_data_type, modals_.display_type); - - glBindVertexArray(scan_vertex_array_); - glBindBuffer(GL_ARRAY_BUFFER, scan_buffer_name_); - enable_vertex_attributes(ShaderType::InputScan, *input_shader_); - - set_uniforms(ShaderType::InputScan, *input_shader_); - input_shader_->set_uniform("textureName", GLint(SourceData1BppTextureUnit - GL_TEXTURE0)); - // Establish such intermediary shaders as are required. pipeline_stages_.clear(); if(modals_.display_type == DisplayType::CompositeColour) { @@ -173,16 +159,28 @@ void ScanTarget::set_modals(Modals modals) { if(modals_.display_type == DisplayType::SVideo || modals_.display_type == DisplayType::CompositeColour) { pipeline_stages_.emplace_back( svideo_to_rgb_shader(modals_.colour_cycle_numerator, modals_.colour_cycle_denominator, processing_width_).release(), - RGBLineBufferTextureUnit); + (modals_.display_type == DisplayType::CompositeColour) ? RGBLineBufferTextureUnit : SVideoLineBufferTextureUnit); } + // Establish an input shader. + input_shader_ = input_shader(modals_.input_data_type, modals_.display_type); + + glBindVertexArray(scan_vertex_array_); + glBindBuffer(GL_ARRAY_BUFFER, scan_buffer_name_); + enable_vertex_attributes(ShaderType::InputScan, *input_shader_); + set_uniforms(ShaderType::InputScan, *input_shader_); + input_shader_->set_uniform("textureName", GLint(SourceData1BppTextureUnit - GL_TEXTURE0)); + // Cascade the texture units in use as per the pipeline stages. std::vector input_shaders = {input_shader_.get()}; GLint texture_unit = GLint(UnprocessedLineBufferTextureUnit - GL_TEXTURE0); for(const auto &stage: pipeline_stages_) { input_shaders.push_back(stage.shader.get()); + stage.shader->set_uniform("textureName", texture_unit); set_uniforms(ShaderType::ProcessedScan, *stage.shader); + enable_vertex_attributes(ShaderType::ProcessedScan, *stage.shader); + ++texture_unit; } output_shader_->set_uniform("textureName", texture_unit); diff --git a/Outputs/OpenGL/ScanTargetGLSLFragments.cpp b/Outputs/OpenGL/ScanTargetGLSLFragments.cpp index 23163e770..e262ccea5 100644 --- a/Outputs/OpenGL/ScanTargetGLSLFragments.cpp +++ b/Outputs/OpenGL/ScanTargetGLSLFragments.cpp @@ -89,7 +89,7 @@ std::string ScanTarget::glsl_default_vertex_shader(ShaderType type) { "vec2 eyePosition = vec2(mix(startPoint.x, endPoint.x, lateral) * processingWidth, lineY + longitudinal) / vec2(scale.x, 2048.0);"; } else { result += - "vec2 eyePosition = vec2(mix(startDataX, endDataX, lateral) - 10.0 + lateral*20.0, dataY);" + "vec2 eyePosition = vec2(mix(startDataX, endDataX, lateral) - 10.0 + lateral*20.0, dataY + longitudinal);" "textureCoordinates[0] = (eyePosition - vec2(5.0, 0.0)) / textureSize(textureName, 0);" "textureCoordinates[1] = (eyePosition - vec2(4.0, 0.0)) / textureSize(textureName, 0);" @@ -284,7 +284,7 @@ std::unique_ptr ScanTarget::input_shader(InputDataType input_data_type, )); } -std::unique_ptr ScanTarget::composite_to_svideo_shader(int colour_cycle_numerator, int colour_cycle_denominator, int processing_width) { +std::unique_ptr ScanTarget::svideo_to_rgb_shader(int colour_cycle_numerator, int colour_cycle_denominator, int processing_width) { /* Composite to S-Video conversion is achieved by filtering the input signal to obtain luminance, and then subtracting that from the original to get chrominance. @@ -312,7 +312,7 @@ std::unique_ptr ScanTarget::composite_to_svideo_shader(int colour_cycle_ return shader; } -std::unique_ptr ScanTarget::svideo_to_rgb_shader(int colour_cycle_numerator, int colour_cycle_denominator, int processing_width) { +std::unique_ptr ScanTarget::composite_to_svideo_shader(int colour_cycle_numerator, int colour_cycle_denominator, int processing_width) { const float cycles_per_expanded_line = (float(colour_cycle_numerator) / float(colour_cycle_denominator)) / (float(processing_width) / float(LineBufferWidth)); const SignalProcessing::FIRFilter filter(11, float(LineBufferWidth), 0.0f, cycles_per_expanded_line * 0.5f); const auto coefficients = filter.get_coefficients(); diff --git a/Outputs/ScanTarget.hpp b/Outputs/ScanTarget.hpp index fa6ccd5d7..8da3c97b5 100644 --- a/Outputs/ScanTarget.hpp +++ b/Outputs/ScanTarget.hpp @@ -141,7 +141,7 @@ struct ScanTarget { InputDataType input_data_type; /// Describes the type of display that the data is being shown on. - DisplayType display_type = DisplayType::RGB; + DisplayType display_type = DisplayType::SVideo; /// If being fed composite data, this defines the colour space in use. ColourSpace composite_colour_space;