1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-07-30 23:29:08 +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:
Thomas Harte 2016-11-16 10:34:54 +08:00
parent f84a28b566
commit ba2adf8bb1
2 changed files with 36 additions and 36 deletions

View File

@ -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];

View File

@ -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;
}; };