mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-25 18:30:21 +00:00
Improves filtering slightly, and ensures coefficients are always set when needed.
This commit is contained in:
parent
694783efe9
commit
79707a3c66
@ -397,6 +397,7 @@ void ScanTarget::draw(bool synchronous, int output_width, int output_height) {
|
|||||||
while(is_drawing_.test_and_set());
|
while(is_drawing_.test_and_set());
|
||||||
|
|
||||||
// Establish the pipeline if necessary.
|
// Establish the pipeline if necessary.
|
||||||
|
const bool did_setup_pipeline = modals_are_dirty_;
|
||||||
if(modals_are_dirty_) {
|
if(modals_are_dirty_) {
|
||||||
setup_pipeline();
|
setup_pipeline();
|
||||||
modals_are_dirty_ = false;
|
modals_are_dirty_ = false;
|
||||||
@ -534,8 +535,8 @@ void ScanTarget::draw(bool synchronous, int output_width, int output_height) {
|
|||||||
// in fidelity. TODO: make this decision a function of computer speed.
|
// in fidelity. TODO: make this decision a function of computer speed.
|
||||||
const int framebuffer_height = std::min(output_height, 1080);
|
const int framebuffer_height = std::min(output_height, 1080);
|
||||||
const int proportional_width = (framebuffer_height * 4) / 3;
|
const int proportional_width = (framebuffer_height * 4) / 3;
|
||||||
if(!accumulation_texture_ || ( /* !synchronous && */ (accumulation_texture_->get_width() != proportional_width || accumulation_texture_->get_height() != framebuffer_height))) {
|
const bool did_create_accumulation_texture = !accumulation_texture_ || ( /* !synchronous && */ (accumulation_texture_->get_width() != proportional_width || accumulation_texture_->get_height() != framebuffer_height));
|
||||||
set_sampling_window(proportional_width, framebuffer_height, *output_shader_);
|
if(did_create_accumulation_texture) {
|
||||||
std::unique_ptr<OpenGL::TextureTarget> new_framebuffer(
|
std::unique_ptr<OpenGL::TextureTarget> new_framebuffer(
|
||||||
new TextureTarget(
|
new TextureTarget(
|
||||||
GLsizei(proportional_width),
|
GLsizei(proportional_width),
|
||||||
@ -563,6 +564,10 @@ void ScanTarget::draw(bool synchronous, int output_width, int output_height) {
|
|||||||
stencil_is_valid_ = false;
|
stencil_is_valid_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(did_setup_pipeline || did_create_accumulation_texture) {
|
||||||
|
set_sampling_window(proportional_width, framebuffer_height, *output_shader_);
|
||||||
|
}
|
||||||
|
|
||||||
// Figure out how many new lines are ready.
|
// Figure out how many new lines are ready.
|
||||||
uint16_t new_lines = (submit_pointers.line + LineBufferHeight - read_pointers.line) % LineBufferHeight;
|
uint16_t new_lines = (submit_pointers.line + LineBufferHeight - read_pointers.line) % LineBufferHeight;
|
||||||
if(new_lines) {
|
if(new_lines) {
|
||||||
|
@ -58,12 +58,12 @@ void ScanTarget::set_uniforms(ShaderType type, Shader &target) const {
|
|||||||
|
|
||||||
void ScanTarget::set_sampling_window(int output_width, int output_height, Shader &target) {
|
void ScanTarget::set_sampling_window(int output_width, int output_height, Shader &target) {
|
||||||
if(modals_.display_type != DisplayType::CompositeColour) {
|
if(modals_.display_type != DisplayType::CompositeColour) {
|
||||||
const float one_pixel_width = float(output_width) * modals_.visible_area.size.width / float(modals_.cycles_per_line);
|
const float one_pixel_width = float(modals_.cycles_per_line) * modals_.visible_area.size.width / float(output_width);
|
||||||
const float clocks_per_angle = float(modals_.cycles_per_line) * float(modals_.colour_cycle_denominator) / float(modals_.colour_cycle_numerator);
|
const float clocks_per_angle = float(modals_.cycles_per_line) * float(modals_.colour_cycle_denominator) / float(modals_.colour_cycle_numerator);
|
||||||
GLfloat texture_offsets[4];
|
GLfloat texture_offsets[4];
|
||||||
GLfloat angles[4];
|
GLfloat angles[4];
|
||||||
for(int c = 0; c < 4; ++c) {
|
for(int c = 0; c < 4; ++c) {
|
||||||
texture_offsets[c] = ((one_pixel_width * float(c)) / 3.0f) - (one_pixel_width * 0.5f);
|
texture_offsets[c] = 1.5f * (((one_pixel_width * float(c)) / 3.0f) - (one_pixel_width * 0.5f));
|
||||||
angles[c] = GLfloat((texture_offsets[c] / clocks_per_angle) * 2.0f * M_PI);
|
angles[c] = GLfloat((texture_offsets[c] / clocks_per_angle) * 2.0f * M_PI);
|
||||||
}
|
}
|
||||||
target.set_uniform("textureCoordinateOffsets", 1, 4, texture_offsets);
|
target.set_uniform("textureCoordinateOffsets", 1, 4, texture_offsets);
|
||||||
|
Loading…
Reference in New Issue
Block a user