1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-07-11 04:28:58 +00:00

At the expense of API simplicity, at least for now, resolved the most glaring cause of dirty lines.

This commit is contained in:
Thomas Harte 2016-11-16 11:34:05 +08:00
parent 44d3fd6d5b
commit 9ee11d7765
3 changed files with 23 additions and 5 deletions

View File

@ -141,7 +141,8 @@ void CRT::advance_cycles(unsigned int number_of_cycles, unsigned int source_divi
source_input_position_x1() = tex_x; source_input_position_x1() = tex_x;
source_input_position_y() = tex_y; source_input_position_y() = tex_y;
source_output_position_x1() = (uint16_t)_horizontal_flywheel->get_current_output_position(); source_output_position_x1() = (uint16_t)_horizontal_flywheel->get_current_output_position();
source_output_position_y() = _openGL_output_builder->get_composite_output_y(); // Don't write output_y now, write it later; we won't necessarily know what it is outside of the locked region
// source_output_position_y() = _openGL_output_builder->get_composite_output_y();
source_phase() = _colour_burst_phase; source_phase() = _colour_burst_phase;
source_amplitude() = _colour_burst_amplitude; source_amplitude() = _colour_burst_amplitude;
source_phase_time() = (uint8_t)_colour_burst_time; // assumption: burst was within the first 1/16 of the line source_phase_time() = (uint8_t)_colour_burst_time; // assumption: burst was within the first 1/16 of the line
@ -190,17 +191,28 @@ void CRT::advance_cycles(unsigned int number_of_cycles, unsigned int source_divi
{ {
_output_run.x1 = (uint16_t)_horizontal_flywheel->get_current_output_position(); _output_run.x1 = (uint16_t)_horizontal_flywheel->get_current_output_position();
_output_run.y = (uint16_t)(_vertical_flywheel->get_current_output_position() / _vertical_flywheel_output_divider); _output_run.y = (uint16_t)(_vertical_flywheel->get_current_output_position() / _vertical_flywheel_output_divider);
_output_run.tex_y = _openGL_output_builder->get_composite_output_y();
} }
else else
{ {
_openGL_output_builder->lock_output(); _openGL_output_builder->lock_output();
// Get and write all those previously unwritten output ys
uint16_t output_y = _openGL_output_builder->get_composite_output_y();
size_t size;
uint8_t *buffered_lines = _openGL_output_builder->get_buffered_source_runs(size);
for(size_t position = 0; position < size; position += SourceVertexSize)
{
(*(uint16_t *)&buffered_lines[position + SourceVertexOffsetOfOutputStart + 2]) = output_y;
}
// Construct the output run
uint8_t *next_run = _openGL_output_builder->get_next_output_run(); uint8_t *next_run = _openGL_output_builder->get_next_output_run();
output_x1() = _output_run.x1; output_x1() = _output_run.x1;
output_position_y() = _output_run.y; output_position_y() = _output_run.y;
output_tex_y() = _output_run.tex_y; output_tex_y() = output_y;
output_x2() = (uint16_t)_horizontal_flywheel->get_current_output_position(); output_x2() = (uint16_t)_horizontal_flywheel->get_current_output_position();
_openGL_output_builder->complete_output_run(); _openGL_output_builder->complete_output_run();
_openGL_output_builder->unlock_output(); _openGL_output_builder->unlock_output();
} }
_is_writing_composite_run ^= true; _is_writing_composite_run ^= true;

View File

@ -83,7 +83,7 @@ class CRT {
// temporary storage used during the construction of output runs // temporary storage used during the construction of output runs
struct { struct {
uint16_t x1, y, tex_y; uint16_t x1, y;
} _output_run; } _output_run;
// The delegate // The delegate

View File

@ -105,6 +105,12 @@ class OpenGLOutputBuilder {
_line_buffer.pointer += SourceVertexSize; _line_buffer.pointer += SourceVertexSize;
} }
inline uint8_t *get_buffered_source_runs(size_t &size)
{
size = _line_buffer.pointer;
return _line_buffer.data.data();
}
inline uint8_t *get_next_output_run() inline uint8_t *get_next_output_run()
{ {
if(_output_buffer.pointer == OutputVertexBufferDataSize) return nullptr; if(_output_buffer.pointer == OutputVertexBufferDataSize) return nullptr;
@ -161,7 +167,7 @@ class OpenGLOutputBuilder {
inline uint16_t get_composite_output_y() inline uint16_t get_composite_output_y()
{ {
return _composite_src_output_y % IntermediateBufferHeight; return (uint16_t)_composite_src_output_y;
} }
inline bool composite_output_buffer_is_full() inline bool composite_output_buffer_is_full()