mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-26 09:29:45 +00:00
Corrected for potential lost lines.
This commit is contained in:
parent
a75259ce9f
commit
ccdbec3ffc
@ -40,8 +40,8 @@ const GLsizei IntermediateBufferWidth = 2048;
|
||||
const GLsizei IntermediateBufferHeight = 512;
|
||||
|
||||
// Some internal buffer sizes
|
||||
const GLsizeiptr OutputVertexBufferDataSize = 44928; // a multiple of 6 * OutputVertexSize
|
||||
const GLsizeiptr SourceVertexBufferDataSize = 29952; // a multiple of 2 * SourceVertexSize
|
||||
const GLsizeiptr OutputVertexBufferDataSize = 6 * 8 * 312 * 10; // a multiple of 6 * OutputVertexSize
|
||||
const GLsizeiptr SourceVertexBufferDataSize = 2 * 16 * 312 * 10; // a multiple of 2 * SourceVertexSize
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -49,16 +49,25 @@ void CRTInputBufferBuilder::allocate_write_area(size_t required_length)
|
||||
|
||||
void CRTInputBufferBuilder::release_write_pointer()
|
||||
{
|
||||
if(_should_reset)
|
||||
{
|
||||
_next_write_x_position = _next_write_y_position = 0;
|
||||
}
|
||||
// if(_should_reset)
|
||||
// {
|
||||
// _next_write_x_position = _next_write_y_position = 0;
|
||||
// }
|
||||
}
|
||||
|
||||
bool CRTInputBufferBuilder::reduce_previous_allocation_to(size_t actual_length)
|
||||
{
|
||||
if(_next_write_y_position == InputBufferBuilderHeight) return false;
|
||||
|
||||
// correct if the writing cursor was reset while a client was writing
|
||||
if(_next_write_x_position == 0 && _next_write_y_position == 0 && _write_target_pointer != 1)
|
||||
{
|
||||
memmove(&_image[1], &_image[_write_target_pointer], actual_length);
|
||||
_write_target_pointer = 1;
|
||||
_last_allocation_amount = actual_length;
|
||||
_next_write_x_position = (uint16_t)(actual_length + 2);
|
||||
}
|
||||
|
||||
// book end the allocation with duplicates of the first and last pixel, to protect
|
||||
// against rounding errors when this run is drawn
|
||||
memcpy( &_image[(_write_target_pointer - 1) * _bytes_per_pixel],
|
||||
@ -82,9 +91,8 @@ uint8_t *CRTInputBufferBuilder::get_image_pointer()
|
||||
|
||||
uint16_t CRTInputBufferBuilder::get_and_finalise_current_line()
|
||||
{
|
||||
// TODO: we may have a vended allocate_write_area in play that'll be lost by this step; fix.
|
||||
uint16_t result = _write_y_position + (_next_write_x_position ? 1 : 0);
|
||||
_should_reset = (_next_write_y_position == InputBufferBuilderHeight);
|
||||
_next_write_x_position = _next_write_y_position = 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -185,7 +185,7 @@ void OpenGLOutputBuilder::draw_frame(unsigned int output_width, unsigned int out
|
||||
int number_of_clearing_zones = getCircularRanges(_cleared_composite_output_y, _composite_src_output_y, IntermediateBufferHeight, 1, clearing_zones);
|
||||
int number_of_source_drawing_zones = getCircularRanges(_drawn_source_buffer_data_pointer, _source_buffer_data_pointer, SourceVertexBufferDataSize, 2*SourceVertexSize, source_drawing_zones);
|
||||
int number_of_output_drawing_zones = getCircularRanges(_drawn_output_buffer_data_pointer, _output_buffer_data_pointer, OutputVertexBufferDataSize, 6*OutputVertexSize, output_drawing_zones);
|
||||
uint16_t completed_texture_y = _buffer_builder->get_and_finalise_current_line();
|
||||
uint16_t completed_texture_y = _buffer_builder->get_and_finalise_current_line();
|
||||
|
||||
_composite_src_output_y %= IntermediateBufferHeight;
|
||||
_source_buffer_data_pointer %= SourceVertexBufferDataSize;
|
||||
|
Loading…
Reference in New Issue
Block a user