From d061ea232b2b7e2539b0f0acbff964ab79125487 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Wed, 4 Apr 2018 19:01:01 -0400 Subject: [PATCH 1/4] Ensures no attempt to compile an SVideo shader without appropriate source. --- Outputs/CRT/Internals/CRTOpenGL.cpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/Outputs/CRT/Internals/CRTOpenGL.cpp b/Outputs/CRT/Internals/CRTOpenGL.cpp index 67feeda9e..0a3eef923 100644 --- a/Outputs/CRT/Internals/CRTOpenGL.cpp +++ b/Outputs/CRT/Internals/CRTOpenGL.cpp @@ -315,20 +315,22 @@ void OpenGLOutputBuilder::prepare_composite_input_shaders() { } void OpenGLOutputBuilder::prepare_svideo_input_shaders() { - svideo_input_shader_program_ = OpenGL::IntermediateShader::make_svideo_source_shader(svideo_shader_, rgb_shader_); - svideo_input_shader_program_->set_source_texture_unit(source_data_texture_unit); - svideo_input_shader_program_->set_output_size(IntermediateBufferWidth, IntermediateBufferHeight); + if(!svideo_shader_.empty() || !rgb_shader_.empty()) { + svideo_input_shader_program_ = OpenGL::IntermediateShader::make_svideo_source_shader(svideo_shader_, rgb_shader_); + svideo_input_shader_program_->set_source_texture_unit(source_data_texture_unit); + svideo_input_shader_program_->set_output_size(IntermediateBufferWidth, IntermediateBufferHeight); - // TODO: the below is related to texture fencing, which is not yet implemented correctly, so not yet enabled. - if(work_texture_) { - svideo_input_shader_program_->set_is_double_height(true, 0.0f, 0.0f); - } else { - svideo_input_shader_program_->set_is_double_height(false); + // TODO: the below is related to texture fencing, which is not yet implemented correctly, so not yet enabled. + if(work_texture_) { + svideo_input_shader_program_->set_is_double_height(true, 0.0f, 0.0f); + } else { + svideo_input_shader_program_->set_is_double_height(false); + } } } void OpenGLOutputBuilder::prepare_rgb_input_shaders() { - if(rgb_shader_.size()) { + if(!rgb_shader_.empty()) { rgb_input_shader_program_ = OpenGL::IntermediateShader::make_rgb_source_shader(rgb_shader_); rgb_input_shader_program_->set_source_texture_unit(source_data_texture_unit); rgb_input_shader_program_->set_output_size(IntermediateBufferWidth, IntermediateBufferHeight); @@ -340,11 +342,13 @@ void OpenGLOutputBuilder::prepare_rgb_input_shaders() { } void OpenGLOutputBuilder::prepare_source_vertex_array() { - if(composite_input_shader_program_) { + if(composite_input_shader_program_ || svideo_input_shader_program_) { glBindVertexArray(source_vertex_array_); array_builder.bind_input(); + } - using Shader = OpenGL::IntermediateShader; + using Shader = OpenGL::IntermediateShader; + if(composite_input_shader_program_) { composite_input_shader_program_->enable_vertex_attribute_with_pointer( Shader::get_input_name(Shader::Input::InputStart), 2, GL_UNSIGNED_SHORT, GL_FALSE, SourceVertexSize, @@ -364,7 +368,9 @@ void OpenGLOutputBuilder::prepare_source_vertex_array() { Shader::get_input_name(Shader::Input::PhaseTimeAndAmplitude), 3, GL_UNSIGNED_BYTE, GL_FALSE, SourceVertexSize, (void *)SourceVertexOffsetOfPhaseTimeAndAmplitude, 1); + } + if(svideo_input_shader_program_) { svideo_input_shader_program_->enable_vertex_attribute_with_pointer( Shader::get_input_name(Shader::Input::InputStart), 2, GL_UNSIGNED_SHORT, GL_FALSE, SourceVertexSize, From c0b4dd65da33dcdc3209d928f08b6bccdf8543ca Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Wed, 4 Apr 2018 19:01:18 -0400 Subject: [PATCH 2/4] Mades the expected video signal usage explicit. --- Machines/ZX8081/Video.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Machines/ZX8081/Video.cpp b/Machines/ZX8081/Video.cpp index 82c6e59bd..703086c01 100644 --- a/Machines/ZX8081/Video.cpp +++ b/Machines/ZX8081/Video.cpp @@ -22,6 +22,7 @@ Video::Video() : "}"); // Show only the centre 80% of the TV frame. + crt_->set_video_signal(Outputs::CRT::VideoSignal::Composite); crt_->set_visible_area(Outputs::CRT::Rect(0.1f, 0.1f, 0.8f, 0.8f)); } From 36e0cb29c06ad319872536ca237f4b4580a60a16 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Wed, 4 Apr 2018 19:14:42 -0400 Subject: [PATCH 3/4] Ensures proper propagation of video choice through the Oric. --- Machines/CRTMachine.hpp | 13 ++++++++++++- Machines/Oric/Oric.cpp | 10 +++++----- Machines/Oric/Video.cpp | 12 ++++++------ Machines/Oric/Video.hpp | 4 ++-- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/Machines/CRTMachine.hpp b/Machines/CRTMachine.hpp index 56a8e7e8a..538c3da88 100644 --- a/Machines/CRTMachine.hpp +++ b/Machines/CRTMachine.hpp @@ -67,6 +67,10 @@ class Machine: public ROMMachine::Machine { return clock_rate_; } + /*! + Maps from Configurable::Display to Outputs::CRT::VideoSignal and calls + @c set_video_signal with the result. + */ void set_video_signal_configurable(Configurable::Display type) { Outputs::CRT::VideoSignal signal; switch(type) { @@ -81,7 +85,14 @@ class Machine: public ROMMachine::Machine { signal = Outputs::CRT::VideoSignal::Composite; break; } - get_crt()->set_video_signal(signal); + set_video_signal(signal); + } + + /*! + Forwards the video signal to the CRT returned by get_crt(). + */ + virtual void set_video_signal(Outputs::CRT::VideoSignal video_signal) { + get_crt()->set_video_signal(video_signal); } private: diff --git a/Machines/Oric/Oric.cpp b/Machines/Oric/Oric.cpp index 5215badf4..d65531d8b 100644 --- a/Machines/Oric/Oric.cpp +++ b/Machines/Oric/Oric.cpp @@ -263,10 +263,6 @@ class ConcreteMachine: use_fast_tape_hack_ = activate; } - void set_output_device(Outputs::CRT::VideoSignal output_device) { - video_output_->set_output_device(output_device); - } - // to satisfy ConfigurationTarget::Machine void configure_as_target(const Analyser::Static::Target *target) override final { auto *const oric_target = dynamic_cast(target); @@ -392,7 +388,7 @@ class ConcreteMachine: video_output_.reset(new VideoOutput(ram_)); if(!colour_rom_.empty()) video_output_->set_colour_rom(colour_rom_); - set_output_device(Outputs::CRT::VideoSignal::RGB); + set_video_signal(Outputs::CRT::VideoSignal::RGB); } void close_output() override final { @@ -469,6 +465,10 @@ class ConcreteMachine: } } + void set_video_signal(Outputs::CRT::VideoSignal video_signal) override { + video_output_->set_video_signal(video_signal); + } + Configurable::SelectionSet get_accurate_selections() override { Configurable::SelectionSet selection_set; Configurable::append_quick_load_tape_selection(selection_set, false); diff --git a/Machines/Oric/Video.cpp b/Machines/Oric/Video.cpp index fd8b34851..efb8fbfa2 100644 --- a/Machines/Oric/Video.cpp +++ b/Machines/Oric/Video.cpp @@ -41,13 +41,13 @@ VideoOutput::VideoOutput(uint8_t *memory) : ); crt_->set_composite_function_type(Outputs::CRT::CRT::CompositeSourceType::DiscreteFourSamplesPerCycle, 0.0f); - set_output_device(Outputs::CRT::VideoSignal::Composite); + set_video_signal(Outputs::CRT::VideoSignal::Composite); crt_->set_visible_area(crt_->get_rect_for_area(53, 224, 16 * 6, 40 * 6, 4.0f / 3.0f)); } -void VideoOutput::set_output_device(Outputs::CRT::VideoSignal output_device) { - output_device_ = output_device; - crt_->set_video_signal(output_device); +void VideoOutput::set_video_signal(Outputs::CRT::VideoSignal video_signal) { + video_signal_ = video_signal; + crt_->set_video_signal(video_signal); } void VideoOutput::set_colour_rom(const std::vector &rom) { @@ -129,7 +129,7 @@ void VideoOutput::run_for(const Cycles cycles) { if(control_byte & 0x60) { if(pixel_target_) { uint16_t colours[2]; - if(output_device_ == Outputs::CRT::VideoSignal::RGB) { + if(video_signal_ == Outputs::CRT::VideoSignal::RGB) { colours[0] = static_cast(paper_ ^ inverse_mask); colours[1] = static_cast(ink_ ^ inverse_mask); } else { @@ -183,7 +183,7 @@ void VideoOutput::run_for(const Cycles cycles) { pixel_target_[0] = pixel_target_[1] = pixel_target_[2] = pixel_target_[3] = pixel_target_[4] = pixel_target_[5] = - (output_device_ == Outputs::CRT::VideoSignal::RGB) ? paper_ ^ inverse_mask : colour_forms_[paper_ ^ inverse_mask]; + (video_signal_ == Outputs::CRT::VideoSignal::RGB) ? paper_ ^ inverse_mask : colour_forms_[paper_ ^ inverse_mask]; } } if(pixel_target_) pixel_target_ += 6; diff --git a/Machines/Oric/Video.hpp b/Machines/Oric/Video.hpp index c3b58436e..9de5a85d7 100644 --- a/Machines/Oric/Video.hpp +++ b/Machines/Oric/Video.hpp @@ -20,7 +20,7 @@ class VideoOutput { Outputs::CRT::CRT *get_crt(); void run_for(const Cycles cycles); void set_colour_rom(const std::vector &rom); - void set_output_device(Outputs::CRT::VideoSignal output_device); + void set_video_signal(Outputs::CRT::VideoSignal output_device); private: uint8_t *ram_; @@ -33,7 +33,7 @@ class VideoOutput { // Output target and device uint16_t *pixel_target_; uint16_t colour_forms_[8]; - Outputs::CRT::VideoSignal output_device_; + Outputs::CRT::VideoSignal video_signal_; // Registers uint8_t ink_, paper_; From 5044aac3376a103f91bb6d41809ee3dc3af20f3e Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Wed, 4 Apr 2018 19:18:22 -0400 Subject: [PATCH 4/4] Sizes up default window size better to fit machine selector. --- OSBindings/Mac/Clock Signal/Base.lproj/MachineDocument.xib | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/MachineDocument.xib b/OSBindings/Mac/Clock Signal/Base.lproj/MachineDocument.xib index 5525b968c..8e285ef41 100644 --- a/OSBindings/Mac/Clock Signal/Base.lproj/MachineDocument.xib +++ b/OSBindings/Mac/Clock Signal/Base.lproj/MachineDocument.xib @@ -18,15 +18,15 @@ - + - +