mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-29 12:50:28 +00:00
Fixed: the two shaders that use a common input array should use common bindings.
This commit is contained in:
parent
c94acb1ca2
commit
008f50832c
@ -306,6 +306,10 @@ void ScanTarget::setup_pipeline() {
|
|||||||
write_pointers_.write_area = 0;
|
write_pointers_.write_area = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Prepare to bind line shaders.
|
||||||
|
glBindVertexArray(line_vertex_array_);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, line_buffer_name_);
|
||||||
|
|
||||||
// Destroy or create a QAM buffer and shader, if appropriate.
|
// Destroy or create a QAM buffer and shader, if appropriate.
|
||||||
const bool needs_qam_buffer = (modals_.display_type == DisplayType::CompositeColour || modals_.display_type == DisplayType::SVideo);
|
const bool needs_qam_buffer = (modals_.display_type == DisplayType::CompositeColour || modals_.display_type == DisplayType::SVideo);
|
||||||
if(needs_qam_buffer) {
|
if(needs_qam_buffer) {
|
||||||
@ -314,8 +318,6 @@ void ScanTarget::setup_pipeline() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
qam_separation_shader_ = qam_separation_shader();
|
qam_separation_shader_ = qam_separation_shader();
|
||||||
glBindVertexArray(line_vertex_array_);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, line_buffer_name_);
|
|
||||||
enable_vertex_attributes(ShaderType::QAMSeparation, *qam_separation_shader_);
|
enable_vertex_attributes(ShaderType::QAMSeparation, *qam_separation_shader_);
|
||||||
set_uniforms(ShaderType::QAMSeparation, *qam_separation_shader_);
|
set_uniforms(ShaderType::QAMSeparation, *qam_separation_shader_);
|
||||||
qam_separation_shader_->set_uniform("textureName", GLint(UnprocessedLineBufferTextureUnit - GL_TEXTURE0));
|
qam_separation_shader_->set_uniform("textureName", GLint(UnprocessedLineBufferTextureUnit - GL_TEXTURE0));
|
||||||
@ -326,8 +328,6 @@ void ScanTarget::setup_pipeline() {
|
|||||||
|
|
||||||
// Establish an output shader.
|
// Establish an output shader.
|
||||||
output_shader_ = conversion_shader();
|
output_shader_ = conversion_shader();
|
||||||
glBindVertexArray(line_vertex_array_);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, line_buffer_name_);
|
|
||||||
enable_vertex_attributes(ShaderType::Conversion, *output_shader_);
|
enable_vertex_attributes(ShaderType::Conversion, *output_shader_);
|
||||||
set_uniforms(ShaderType::Conversion, *output_shader_);
|
set_uniforms(ShaderType::Conversion, *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);
|
||||||
@ -577,7 +577,8 @@ void ScanTarget::draw(bool synchronous, int output_width, int output_height) {
|
|||||||
if(qam_separation_shader_) {
|
if(qam_separation_shader_) {
|
||||||
qam_separation_shader_->bind();
|
qam_separation_shader_->bind();
|
||||||
qam_chroma_texture_->bind_framebuffer();
|
qam_chroma_texture_->bind_framebuffer();
|
||||||
// glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT); // TODO: this is here as a hint that the old framebuffer doesn't need reloading;
|
||||||
|
// test whether that's a valid optimisation on desktop OpenGL.
|
||||||
|
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
glDisable(GL_STENCIL_TEST);
|
glDisable(GL_STENCIL_TEST);
|
||||||
@ -608,8 +609,6 @@ void ScanTarget::draw(bool synchronous, int output_width, int output_height) {
|
|||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
accumulation_texture_->bind_texture();
|
accumulation_texture_->bind_texture();
|
||||||
accumulation_texture_->draw(float(output_width) / float(output_height), 4.0f / 255.0f);
|
accumulation_texture_->draw(float(output_width) / float(output_height), 4.0f / 255.0f);
|
||||||
// qam_chroma_texture_->bind_texture();
|
|
||||||
// qam_chroma_texture_->draw(float(output_width) / float(output_height));
|
|
||||||
|
|
||||||
// All data now having been spooled to the GPU, update the read pointers to
|
// All data now having been spooled to the GPU, update the read pointers to
|
||||||
// the submit pointer location.
|
// the submit pointer location.
|
||||||
|
@ -178,7 +178,8 @@ class ScanTarget: public Outputs::Display::ScanTarget {
|
|||||||
globals for shaders of @c type to @c target.
|
globals for shaders of @c type to @c target.
|
||||||
*/
|
*/
|
||||||
static void enable_vertex_attributes(ShaderType type, Shader &target);
|
static void enable_vertex_attributes(ShaderType type, Shader &target);
|
||||||
void set_uniforms(ShaderType type, Shader &target);
|
void set_uniforms(ShaderType type, Shader &target) const;
|
||||||
|
std::vector<std::string> bindings(ShaderType type) const;
|
||||||
|
|
||||||
GLsync fence_ = nullptr;
|
GLsync fence_ = nullptr;
|
||||||
std::atomic_flag is_drawing_;
|
std::atomic_flag is_drawing_;
|
||||||
|
@ -14,7 +14,7 @@ using namespace Outputs::Display::OpenGL;
|
|||||||
|
|
||||||
// MARK: - State setup for compiled shaders.
|
// MARK: - State setup for compiled shaders.
|
||||||
|
|
||||||
void Outputs::Display::OpenGL::ScanTarget::set_uniforms(ShaderType type, Shader &target) {
|
void Outputs::Display::OpenGL::ScanTarget::set_uniforms(ShaderType type, Shader &target) const {
|
||||||
// Slightly over-amping rowHeight here is a cheap way to make sure that lines
|
// Slightly over-amping rowHeight here is a cheap way to make sure that lines
|
||||||
// converge even allowing for the fact that they may not be spaced by exactly
|
// converge even allowing for the fact that they may not be spaced by exactly
|
||||||
// the expected distance. Cf. the stencil-powered logic for making sure all
|
// the expected distance. Cf. the stencil-powered logic for making sure all
|
||||||
@ -144,6 +144,30 @@ void ScanTarget::enable_vertex_attributes(ShaderType type, Shader &target) {
|
|||||||
#undef rt_offset_of
|
#undef rt_offset_of
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> ScanTarget::bindings(ShaderType type) const {
|
||||||
|
switch(type) {
|
||||||
|
case ShaderType::Composition: return {
|
||||||
|
"startDataX",
|
||||||
|
"startClock",
|
||||||
|
"endDataX",
|
||||||
|
"endClock",
|
||||||
|
"dataY",
|
||||||
|
"lineY"
|
||||||
|
};
|
||||||
|
|
||||||
|
default: return {
|
||||||
|
"startPoint",
|
||||||
|
"endPoint",
|
||||||
|
"startClock",
|
||||||
|
"endClock",
|
||||||
|
"lineY",
|
||||||
|
"lineCompositeAmplitude",
|
||||||
|
"startCompositeAngle",
|
||||||
|
"endCompositeAngle"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Shader code.
|
// MARK: - Shader code.
|
||||||
|
|
||||||
std::string ScanTarget::sampling_function() const {
|
std::string ScanTarget::sampling_function() const {
|
||||||
@ -421,16 +445,7 @@ std::unique_ptr<Shader> ScanTarget::conversion_shader() const {
|
|||||||
return std::unique_ptr<Shader>(new Shader(
|
return std::unique_ptr<Shader>(new Shader(
|
||||||
vertex_shader,
|
vertex_shader,
|
||||||
fragment_shader,
|
fragment_shader,
|
||||||
{
|
bindings(ShaderType::Conversion)
|
||||||
"startPoint",
|
|
||||||
"endPoint",
|
|
||||||
"startClock",
|
|
||||||
"endClock",
|
|
||||||
"lineY",
|
|
||||||
"lineCompositeAmplitude",
|
|
||||||
"startCompositeAngle",
|
|
||||||
"endCompositeAngle"
|
|
||||||
}
|
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -504,14 +519,7 @@ std::unique_ptr<Shader> ScanTarget::composition_shader() const {
|
|||||||
return std::unique_ptr<Shader>(new Shader(
|
return std::unique_ptr<Shader>(new Shader(
|
||||||
vertex_shader,
|
vertex_shader,
|
||||||
fragment_shader + "}",
|
fragment_shader + "}",
|
||||||
{
|
bindings(ShaderType::Composition)
|
||||||
"startDataX",
|
|
||||||
"startClock",
|
|
||||||
"endDataX",
|
|
||||||
"endClock",
|
|
||||||
"dataY",
|
|
||||||
"lineY",
|
|
||||||
}
|
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -624,14 +632,6 @@ std::unique_ptr<Shader> ScanTarget::qam_separation_shader() const {
|
|||||||
return std::unique_ptr<Shader>(new Shader(
|
return std::unique_ptr<Shader>(new Shader(
|
||||||
vertex_shader,
|
vertex_shader,
|
||||||
fragment_shader,
|
fragment_shader,
|
||||||
{
|
bindings(ShaderType::QAMSeparation)
|
||||||
"startClock",
|
|
||||||
"startCompositeAngle",
|
|
||||||
"endClock",
|
|
||||||
"endCompositeAngle",
|
|
||||||
|
|
||||||
"lineY",
|
|
||||||
"lineCompositeAmplitude"
|
|
||||||
}
|
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user