mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-18 01:30:56 +00:00
Manages to get a brilliant white out of the new pipeline.
This commit is contained in:
parent
d4ac79b0af
commit
a66a20f7fe
@ -28,11 +28,8 @@ constexpr GLenum SVideoLineBufferTextureUnit = GL_TEXTURE4;
|
|||||||
/// The texture unit which contains line-by-line records of luminance and separated, demodulated chrominance.
|
/// The texture unit which contains line-by-line records of luminance and separated, demodulated chrominance.
|
||||||
constexpr GLenum RGBLineBufferTextureUnit = GL_TEXTURE5;
|
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.
|
/// 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 TextureAddress(x, y) (((y) << 11) | (x))
|
||||||
#define TextureAddressGetY(v) uint16_t((v) >> 11)
|
#define TextureAddressGetY(v) uint16_t((v) >> 11)
|
||||||
@ -148,21 +145,10 @@ void ScanTarget::set_modals(Modals modals) {
|
|||||||
glBindVertexArray(line_vertex_array_);
|
glBindVertexArray(line_vertex_array_);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, line_buffer_name_);
|
glBindBuffer(GL_ARRAY_BUFFER, line_buffer_name_);
|
||||||
enable_vertex_attributes(ShaderType::Line, *output_shader_);
|
enable_vertex_attributes(ShaderType::Line, *output_shader_);
|
||||||
|
|
||||||
set_uniforms(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("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);
|
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.
|
// Establish such intermediary shaders as are required.
|
||||||
pipeline_stages_.clear();
|
pipeline_stages_.clear();
|
||||||
if(modals_.display_type == DisplayType::CompositeColour) {
|
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) {
|
if(modals_.display_type == DisplayType::SVideo || modals_.display_type == DisplayType::CompositeColour) {
|
||||||
pipeline_stages_.emplace_back(
|
pipeline_stages_.emplace_back(
|
||||||
svideo_to_rgb_shader(modals_.colour_cycle_numerator, modals_.colour_cycle_denominator, processing_width_).release(),
|
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.
|
// Cascade the texture units in use as per the pipeline stages.
|
||||||
std::vector<Shader *> input_shaders = {input_shader_.get()};
|
std::vector<Shader *> input_shaders = {input_shader_.get()};
|
||||||
GLint texture_unit = GLint(UnprocessedLineBufferTextureUnit - GL_TEXTURE0);
|
GLint texture_unit = GLint(UnprocessedLineBufferTextureUnit - GL_TEXTURE0);
|
||||||
for(const auto &stage: pipeline_stages_) {
|
for(const auto &stage: pipeline_stages_) {
|
||||||
input_shaders.push_back(stage.shader.get());
|
input_shaders.push_back(stage.shader.get());
|
||||||
|
|
||||||
stage.shader->set_uniform("textureName", texture_unit);
|
stage.shader->set_uniform("textureName", texture_unit);
|
||||||
set_uniforms(ShaderType::ProcessedScan, *stage.shader);
|
set_uniforms(ShaderType::ProcessedScan, *stage.shader);
|
||||||
|
enable_vertex_attributes(ShaderType::ProcessedScan, *stage.shader);
|
||||||
|
|
||||||
++texture_unit;
|
++texture_unit;
|
||||||
}
|
}
|
||||||
output_shader_->set_uniform("textureName", texture_unit);
|
output_shader_->set_uniform("textureName", texture_unit);
|
||||||
|
@ -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);";
|
"vec2 eyePosition = vec2(mix(startPoint.x, endPoint.x, lateral) * processingWidth, lineY + longitudinal) / vec2(scale.x, 2048.0);";
|
||||||
} else {
|
} else {
|
||||||
result +=
|
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[0] = (eyePosition - vec2(5.0, 0.0)) / textureSize(textureName, 0);"
|
||||||
"textureCoordinates[1] = (eyePosition - vec2(4.0, 0.0)) / textureSize(textureName, 0);"
|
"textureCoordinates[1] = (eyePosition - vec2(4.0, 0.0)) / textureSize(textureName, 0);"
|
||||||
@ -284,7 +284,7 @@ std::unique_ptr<Shader> ScanTarget::input_shader(InputDataType input_data_type,
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<Shader> ScanTarget::composite_to_svideo_shader(int colour_cycle_numerator, int colour_cycle_denominator, int processing_width) {
|
std::unique_ptr<Shader> 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
|
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.
|
from the original to get chrominance.
|
||||||
@ -312,7 +312,7 @@ std::unique_ptr<Shader> ScanTarget::composite_to_svideo_shader(int colour_cycle_
|
|||||||
return shader;
|
return shader;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<Shader> ScanTarget::svideo_to_rgb_shader(int colour_cycle_numerator, int colour_cycle_denominator, int processing_width) {
|
std::unique_ptr<Shader> 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 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 SignalProcessing::FIRFilter filter(11, float(LineBufferWidth), 0.0f, cycles_per_expanded_line * 0.5f);
|
||||||
const auto coefficients = filter.get_coefficients();
|
const auto coefficients = filter.get_coefficients();
|
||||||
|
@ -141,7 +141,7 @@ struct ScanTarget {
|
|||||||
InputDataType input_data_type;
|
InputDataType input_data_type;
|
||||||
|
|
||||||
/// Describes the type of display that the data is being shown on.
|
/// 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.
|
/// If being fed composite data, this defines the colour space in use.
|
||||||
ColourSpace composite_colour_space;
|
ColourSpace composite_colour_space;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user