1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-07-06 01:28:57 +00:00

Fixed error that could lead to split output run vertex writes.

This commit is contained in:
Thomas Harte 2016-05-08 20:30:59 -04:00
parent 1a214a8308
commit 986019f9f9
3 changed files with 6 additions and 22 deletions

View File

@ -69,7 +69,8 @@ CRT::CRT(unsigned int common_output_divisor) :
_common_output_divisor(common_output_divisor),
_is_writing_composite_run(false),
_delegate(nullptr),
_frames_since_last_delegate_call(0) {}
_frames_since_last_delegate_call(0),
_did_start_run(false) {}
CRT::CRT(unsigned int cycles_per_line, unsigned int common_output_divisor, unsigned int height_of_display, ColourSpace colour_space, unsigned int colour_cycle_numerator, unsigned int colour_cycle_denominator, unsigned int buffer_depth) : CRT(common_output_divisor)
{
@ -186,9 +187,9 @@ void CRT::advance_cycles(unsigned int number_of_cycles, unsigned int source_divi
if(needs_endpoint)
{
if(
_openGL_output_builder->composite_output_run_has_room_for_vertices(_did_start_run ? 6 : 3) &&
!_openGL_output_builder->composite_output_buffer_is_full() &&
_is_writing_composite_run == _did_start_run)
_is_writing_composite_run == _did_start_run &&
_openGL_output_builder->composite_output_run_has_room_for_vertices(_did_start_run ? 3 : 6) &&
!_openGL_output_builder->composite_output_buffer_is_full())
{
uint8_t *next_run = _openGL_output_builder->get_next_output_run();
if(next_run)

View File

@ -188,14 +188,6 @@ void OpenGLOutputBuilder::draw_frame(unsigned int output_width, unsigned int out
set_timing_uniforms();
set_colour_space_uniforms();
// This should return either an actual framebuffer number, if this is a target with a framebuffer intended for output,
// or 0 if no framebuffer is bound, in which case 0 is also what we want to supply to bind the implied framebuffer. So
// it works either way.
// glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint *)&defaultFramebuffer);
// TODO: is this sustainable, cross-platform? If so, why store it at all?
// defaultFramebuffer = 0;
}
// determine how many lines are newly reclaimed; they'll need to be cleared
@ -214,12 +206,6 @@ void OpenGLOutputBuilder::draw_frame(unsigned int output_width, unsigned int out
_drawn_source_buffer_data_pointer = _source_buffer_data_pointer;
_drawn_output_buffer_data_pointer = _output_buffer_data_pointer;
// drawing commands having been issued, reclaim the array buffer pointer
// glBindBuffer(GL_ARRAY_BUFFER, output_array_buffer);
//
// glBindBuffer(GL_ARRAY_BUFFER, source_array_buffer);
// _source_buffer_data = (uint8_t *)glMapBufferRange(GL_ARRAY_BUFFER, 0, SourceVertexBufferDataSize, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
if(_fence != nullptr)
{
glClientWaitSync(_fence, GL_SYNC_FLUSH_COMMANDS_BIT, GL_TIMEOUT_IGNORED);
@ -316,9 +302,6 @@ void OpenGLOutputBuilder::draw_frame(unsigned int output_width, unsigned int out
active_pipeline++;
}
// TODO: determine why the finish below is required
// glFinish();
}
// transfer to framebuffer

View File

@ -119,7 +119,7 @@ class OpenGLOutputBuilder {
inline bool composite_output_run_has_room_for_vertices(GLsizei vertices_to_write)
{
return _composite_src_output_y <= _cleared_composite_output_y + IntermediateBufferHeight - vertices_to_write * OutputVertexSize;
return _output_buffer_data_pointer <= _drawn_output_buffer_data_pointer + OutputVertexBufferDataSize - vertices_to_write * OutputVertexSize;
}
inline uint8_t *get_next_output_run()