mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-25 03:32:01 +00:00
Simplified interface by baking in last-minute-only updates.
This commit is contained in:
parent
ca50606e1d
commit
cb3c837e30
@ -140,7 +140,6 @@ void CRT::advance_cycles(unsigned int number_of_cycles, unsigned int source_divi
|
|||||||
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();
|
||||||
// Don't write output_y now, write it later; we won't necessarily know what it is outside of the locked region
|
// 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
|
||||||
@ -193,13 +192,7 @@ void CRT::advance_cycles(unsigned int number_of_cycles, unsigned int source_divi
|
|||||||
openGL_output_builder_.lock_output();
|
openGL_output_builder_.lock_output();
|
||||||
|
|
||||||
// Get and write all those previously unwritten output ys
|
// Get and write all those previously unwritten output ys
|
||||||
uint16_t output_y = openGL_output_builder_.get_composite_output_y();
|
const uint16_t output_y = openGL_output_builder_.get_composite_output_y();
|
||||||
size_t size;
|
|
||||||
uint8_t *buffered_lines = openGL_output_builder_.array_builder.get_unflushed_input(size);
|
|
||||||
for(size_t position = 0; position < size; position += SourceVertexSize)
|
|
||||||
{
|
|
||||||
(*(uint16_t *)&buffered_lines[position + SourceVertexOffsetOfOutputStart + 2]) = output_y;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Construct the output run
|
// Construct the output run
|
||||||
uint8_t *next_run = openGL_output_builder_.array_builder.get_output_storage(OutputVertexSize);
|
uint8_t *next_run = openGL_output_builder_.array_builder.get_output_storage(OutputVertexSize);
|
||||||
@ -210,7 +203,14 @@ void CRT::advance_cycles(unsigned int number_of_cycles, unsigned int source_divi
|
|||||||
output_tex_y() = output_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_.array_builder.flush();
|
openGL_output_builder_.array_builder.flush(
|
||||||
|
[output_y] (uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size)
|
||||||
|
{
|
||||||
|
for(size_t position = 0; position < input_size; position += SourceVertexSize)
|
||||||
|
{
|
||||||
|
(*(uint16_t *)&input_buffer[position + SourceVertexOffsetOfOutputStart + 2]) = output_y;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
openGL_output_builder_.unlock_output();
|
openGL_output_builder_.unlock_output();
|
||||||
}
|
}
|
||||||
|
@ -23,9 +23,8 @@ ArrayBuilder::ArrayBuilder(size_t input_size, size_t output_size, std::function<
|
|||||||
bool ArrayBuilder::is_full()
|
bool ArrayBuilder::is_full()
|
||||||
{
|
{
|
||||||
bool was_full;
|
bool was_full;
|
||||||
buffer_mutex_.lock();
|
std::lock_guard<std::mutex> guard(buffer_mutex_);
|
||||||
was_full = is_full_;
|
was_full = is_full_;
|
||||||
buffer_mutex_.unlock();
|
|
||||||
return was_full;
|
return was_full;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,30 +33,24 @@ uint8_t *ArrayBuilder::get_input_storage(size_t size)
|
|||||||
return get_storage(size, input_);
|
return get_storage(size, input_);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *ArrayBuilder::get_unflushed_input(size_t &size)
|
|
||||||
{
|
|
||||||
return input_.get_unflushed(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *ArrayBuilder::get_output_storage(size_t size)
|
uint8_t *ArrayBuilder::get_output_storage(size_t size)
|
||||||
{
|
{
|
||||||
return get_storage(size, output_);
|
return get_storage(size, output_);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *ArrayBuilder::get_unflushed_output(size_t &size)
|
void ArrayBuilder::flush(const std::function<void(uint8_t *input, size_t input_size, uint8_t *output, size_t output_size)> &function)
|
||||||
{
|
{
|
||||||
return output_.get_unflushed(size);
|
std::lock_guard<std::mutex> guard(buffer_mutex_);
|
||||||
}
|
|
||||||
|
|
||||||
void ArrayBuilder::flush()
|
|
||||||
{
|
|
||||||
buffer_mutex_.lock();
|
|
||||||
if(!is_full_)
|
if(!is_full_)
|
||||||
{
|
{
|
||||||
|
size_t input_size, output_size;
|
||||||
|
uint8_t *input = input_.get_unflushed(input_size);
|
||||||
|
uint8_t *output = output_.get_unflushed(output_size);
|
||||||
|
function(input, input_size, output, output_size);
|
||||||
|
|
||||||
input_.flush();
|
input_.flush();
|
||||||
output_.flush();
|
output_.flush();
|
||||||
}
|
}
|
||||||
buffer_mutex_.unlock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ArrayBuilder::bind_input()
|
void ArrayBuilder::bind_input()
|
||||||
@ -74,7 +67,7 @@ ArrayBuilder::Submission ArrayBuilder::submit()
|
|||||||
{
|
{
|
||||||
ArrayBuilder::Submission submission;
|
ArrayBuilder::Submission submission;
|
||||||
|
|
||||||
buffer_mutex_.lock();
|
std::lock_guard<std::mutex> guard(buffer_mutex_);
|
||||||
submission.input_size = input_.submit(true);
|
submission.input_size = input_.submit(true);
|
||||||
submission.output_size = output_.submit(false);
|
submission.output_size = output_.submit(false);
|
||||||
if(is_full_)
|
if(is_full_)
|
||||||
@ -83,7 +76,6 @@ ArrayBuilder::Submission ArrayBuilder::submit()
|
|||||||
input_.reset();
|
input_.reset();
|
||||||
output_.reset();
|
output_.reset();
|
||||||
}
|
}
|
||||||
buffer_mutex_.unlock();
|
|
||||||
|
|
||||||
return submission;
|
return submission;
|
||||||
}
|
}
|
||||||
@ -110,10 +102,9 @@ ArrayBuilder::Buffer::~Buffer()
|
|||||||
|
|
||||||
uint8_t *ArrayBuilder::get_storage(size_t size, Buffer &buffer)
|
uint8_t *ArrayBuilder::get_storage(size_t size, Buffer &buffer)
|
||||||
{
|
{
|
||||||
buffer_mutex_.lock();
|
std::lock_guard<std::mutex> guard(buffer_mutex_);
|
||||||
uint8_t *pointer = buffer.get_storage(size);
|
uint8_t *pointer = buffer.get_storage(size);
|
||||||
if(!pointer) is_full_ = true;
|
if(!pointer) is_full_ = true;
|
||||||
buffer_mutex_.unlock();
|
|
||||||
return pointer;
|
return pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,26 +41,17 @@ class ArrayBuilder {
|
|||||||
/// @returns a pointer to the allocated area if allocation was possible; @c nullptr otherwise.
|
/// @returns a pointer to the allocated area if allocation was possible; @c nullptr otherwise.
|
||||||
uint8_t *get_input_storage(size_t size);
|
uint8_t *get_input_storage(size_t size);
|
||||||
|
|
||||||
/// Gets the size of and a pointer to all data so far added to the input set but not yet flushed.
|
|
||||||
/// @returns a pointer from which it is safe to access @c size elements, which contains all regions returned via
|
|
||||||
/// @c get_input_storage in FIFO order.
|
|
||||||
uint8_t *get_unflushed_input(size_t &size);
|
|
||||||
|
|
||||||
/// Attempts to add @c size bytes to the output set.
|
/// Attempts to add @c size bytes to the output set.
|
||||||
/// @returns a pointer to the allocated area if allocation was possible; @c nullptr otherwise.
|
/// @returns a pointer to the allocated area if allocation was possible; @c nullptr otherwise.
|
||||||
uint8_t *get_output_storage(size_t size);
|
uint8_t *get_output_storage(size_t size);
|
||||||
|
|
||||||
/// Gets the size of and a pointer to all data so far added to the output set but not yet flushed.
|
|
||||||
/// @returns a pointer from which it is safe to access @c size elements, which contains all regions returned via
|
|
||||||
/// @c get_input_storage in FIFO order.
|
|
||||||
uint8_t *get_unflushed_output(size_t &size);
|
|
||||||
|
|
||||||
/// @returns @c true if either of the input or output storage areas is currently exhausted; @c false otherwise.
|
/// @returns @c true if either of the input or output storage areas is currently exhausted; @c false otherwise.
|
||||||
bool is_full();
|
bool is_full();
|
||||||
|
|
||||||
/// If neither input nor output was exhausted since the last flush, atomically commits both input and output
|
/// If neither input nor output was exhausted since the last flush, atomically commits both input and output
|
||||||
/// up to the currently allocated size for use upon the next @c submit. Otherwise acts as a no-op.
|
/// up to the currently allocated size for use upon the next @c submit, giving the supplied function a
|
||||||
void flush();
|
/// chance to perform last-minute processing. Otherwise acts as a no-op.
|
||||||
|
void flush(const std::function<void(uint8_t *input, size_t input_size, uint8_t *output, size_t output_size)> &);
|
||||||
|
|
||||||
/// Binds the input array to GL_ARRAY_BUFFER.
|
/// Binds the input array to GL_ARRAY_BUFFER.
|
||||||
void bind_input();
|
void bind_input();
|
||||||
|
Loading…
Reference in New Issue
Block a user