mirror of
https://github.com/TomHarte/CLK.git
synced 2024-10-09 04:55:20 +00:00
Normalised on std::vector
rather than std::unique_ptr<uint8_t *>
as (probably?) more idiomatic. Improved structure slightly. Introduced a container for line data, albeit one that isn't yet used.
This commit is contained in:
parent
f84a28b566
commit
ba2adf8bb1
@ -80,9 +80,9 @@ static int getCircularRanges(GLsizei *start_pointer, GLsizei *end_pointer, GLsiz
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static GLsizei submitArrayData(GLuint buffer, uint8_t *source, GLsizei *length_pointer)
|
static GLsizei submitArrayData(GLuint buffer, uint8_t *source, size_t *length_pointer)
|
||||||
{
|
{
|
||||||
GLsizei length = *length_pointer;
|
GLsizei length = (GLsizei)*length_pointer;
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, buffer);
|
glBindBuffer(GL_ARRAY_BUFFER, buffer);
|
||||||
uint8_t *data = (uint8_t *)glMapBufferRange(GL_ARRAY_BUFFER, 0, length, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
|
uint8_t *data = (uint8_t *)glMapBufferRange(GL_ARRAY_BUFFER, 0, length, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
|
||||||
@ -114,16 +114,15 @@ OpenGLOutputBuilder::OpenGLOutputBuilder(unsigned int buffer_depth) :
|
|||||||
_cleared_composite_output_y(0),
|
_cleared_composite_output_y(0),
|
||||||
_composite_shader(nullptr),
|
_composite_shader(nullptr),
|
||||||
_rgb_shader(nullptr),
|
_rgb_shader(nullptr),
|
||||||
_output_buffer_data(new uint8_t[OutputVertexBufferDataSize]),
|
|
||||||
_source_buffer_data(new uint8_t[SourceVertexBufferDataSize]),
|
|
||||||
_output_buffer_data_pointer(0),
|
|
||||||
_source_buffer_data_pointer(0),
|
|
||||||
_last_output_width(0),
|
_last_output_width(0),
|
||||||
_last_output_height(0),
|
_last_output_height(0),
|
||||||
_fence(nullptr)
|
_fence(nullptr)
|
||||||
{
|
{
|
||||||
_buffer_builder.reset(new CRTInputBufferBuilder(buffer_depth));
|
_buffer_builder.reset(new CRTInputBufferBuilder(buffer_depth));
|
||||||
|
|
||||||
|
_output_buffer.data.resize(OutputVertexBufferDataSize);
|
||||||
|
_source_buffer.data.resize(OutputVertexBufferDataSize);
|
||||||
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_CONSTANT_COLOR);
|
glBlendFunc(GL_SRC_ALPHA, GL_CONSTANT_COLOR);
|
||||||
glBlendColor(0.6f, 0.6f, 0.6f, 1.0f);
|
glBlendColor(0.6f, 0.6f, 0.6f, 1.0f);
|
||||||
|
|
||||||
@ -224,10 +223,10 @@ void OpenGLOutputBuilder::draw_frame(unsigned int output_width, unsigned int out
|
|||||||
_output_mutex->lock();
|
_output_mutex->lock();
|
||||||
|
|
||||||
// release the mapping, giving up on trying to draw if data has been lost
|
// release the mapping, giving up on trying to draw if data has been lost
|
||||||
GLsizei submitted_output_data = submitArrayData(output_array_buffer, _output_buffer_data.get(), &_output_buffer_data_pointer);
|
GLsizei submitted_output_data = submitArrayData(output_array_buffer, _output_buffer.data.data(), &_output_buffer.pointer);
|
||||||
|
|
||||||
// bind and flush the source array buffer
|
// bind and flush the source array buffer
|
||||||
GLsizei submitted_source_data = submitArrayData(source_array_buffer, _source_buffer_data.get(), &_source_buffer_data_pointer);
|
GLsizei submitted_source_data = submitArrayData(source_array_buffer, _source_buffer.data.data(), &_source_buffer.pointer);
|
||||||
|
|
||||||
// determine how many lines are newly reclaimed; they'll need to be cleared
|
// determine how many lines are newly reclaimed; they'll need to be cleared
|
||||||
Range clearing_zones[2];
|
Range clearing_zones[2];
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "Shaders/IntermediateShader.hpp"
|
#include "Shaders/IntermediateShader.hpp"
|
||||||
|
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace Outputs {
|
namespace Outputs {
|
||||||
namespace CRT {
|
namespace CRT {
|
||||||
@ -93,6 +94,28 @@ class OpenGLOutputBuilder {
|
|||||||
OpenGLOutputBuilder(unsigned int buffer_depth);
|
OpenGLOutputBuilder(unsigned int buffer_depth);
|
||||||
~OpenGLOutputBuilder();
|
~OpenGLOutputBuilder();
|
||||||
|
|
||||||
|
inline uint8_t *get_next_source_run()
|
||||||
|
{
|
||||||
|
if(_source_buffer.pointer == SourceVertexBufferDataSize) return nullptr;
|
||||||
|
return &_source_buffer.data[_source_buffer.pointer];
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void complete_source_run()
|
||||||
|
{
|
||||||
|
_source_buffer.pointer += SourceVertexSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline uint8_t *get_next_output_run()
|
||||||
|
{
|
||||||
|
if(_output_buffer.pointer == OutputVertexBufferDataSize) return nullptr;
|
||||||
|
return &_output_buffer.data[_output_buffer.pointer];
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void complete_output_run()
|
||||||
|
{
|
||||||
|
_output_buffer.pointer += OutputVertexSize;
|
||||||
|
}
|
||||||
|
|
||||||
inline void set_colour_format(ColourSpace colour_space, unsigned int colour_cycle_numerator, unsigned int colour_cycle_denominator)
|
inline void set_colour_format(ColourSpace colour_space, unsigned int colour_cycle_numerator, unsigned int colour_cycle_denominator)
|
||||||
{
|
{
|
||||||
_output_mutex->lock();
|
_output_mutex->lock();
|
||||||
@ -108,31 +131,9 @@ class OpenGLOutputBuilder {
|
|||||||
_visible_area = visible_area;
|
_visible_area = visible_area;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline uint8_t *get_next_source_run()
|
|
||||||
{
|
|
||||||
if(_source_buffer_data_pointer == SourceVertexBufferDataSize) return nullptr;
|
|
||||||
return &_source_buffer_data.get()[_source_buffer_data_pointer];
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void complete_source_run()
|
|
||||||
{
|
|
||||||
_source_buffer_data_pointer += SourceVertexSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool composite_output_run_has_room_for_vertex()
|
inline bool composite_output_run_has_room_for_vertex()
|
||||||
{
|
{
|
||||||
return _output_buffer_data_pointer < OutputVertexBufferDataSize;
|
return _output_buffer.pointer < OutputVertexBufferDataSize;
|
||||||
}
|
|
||||||
|
|
||||||
inline uint8_t *get_next_output_run()
|
|
||||||
{
|
|
||||||
if(_output_buffer_data_pointer == OutputVertexBufferDataSize) return nullptr;
|
|
||||||
return &_output_buffer_data.get()[_output_buffer_data_pointer];
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void complete_output_run()
|
|
||||||
{
|
|
||||||
_output_buffer_data_pointer += OutputVertexSize;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void lock_output()
|
inline void lock_output()
|
||||||
@ -199,11 +200,11 @@ class OpenGLOutputBuilder {
|
|||||||
void set_output_device(OutputDevice output_device);
|
void set_output_device(OutputDevice output_device);
|
||||||
void set_timing(unsigned int input_frequency, unsigned int cycles_per_line, unsigned int height_of_display, unsigned int horizontal_scan_period, unsigned int vertical_scan_period, unsigned int vertical_period_divider);
|
void set_timing(unsigned int input_frequency, unsigned int cycles_per_line, unsigned int height_of_display, unsigned int horizontal_scan_period, unsigned int vertical_scan_period, unsigned int vertical_period_divider);
|
||||||
|
|
||||||
std::unique_ptr<uint8_t> _source_buffer_data;
|
struct Buffer {
|
||||||
GLsizei _source_buffer_data_pointer;
|
std::vector<uint8_t> data;
|
||||||
|
size_t pointer;
|
||||||
std::unique_ptr<uint8_t> _output_buffer_data;
|
Buffer() : pointer(0) {}
|
||||||
GLsizei _output_buffer_data_pointer;
|
} _line_buffer, _source_buffer, _output_buffer;
|
||||||
|
|
||||||
GLsync _fence;
|
GLsync _fence;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user