From f59537bce926892a16e3bf7f205a019ae146b7c0 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Thu, 17 Nov 2016 14:06:16 +0800 Subject: [PATCH] Added a testing hook, but as of yet no tests. --- Outputs/CRT/Internals/ArrayBuilder.cpp | 48 ++++++++++++++++---------- Outputs/CRT/Internals/ArrayBuilder.hpp | 11 ++++-- 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/Outputs/CRT/Internals/ArrayBuilder.cpp b/Outputs/CRT/Internals/ArrayBuilder.cpp index d3666fb5c..1989f6e68 100644 --- a/Outputs/CRT/Internals/ArrayBuilder.cpp +++ b/Outputs/CRT/Internals/ArrayBuilder.cpp @@ -11,8 +11,13 @@ using namespace Outputs::CRT; ArrayBuilder::ArrayBuilder(size_t input_size, size_t output_size) : - output_(output_size), - input_(input_size) + output_(output_size, nullptr), + input_(input_size, nullptr) +{} + +ArrayBuilder::ArrayBuilder(size_t input_size, size_t output_size, std::function submission_function) : + output_(output_size, submission_function), + input_(input_size, submission_function) {} bool ArrayBuilder::is_full() @@ -70,8 +75,8 @@ ArrayBuilder::Submission ArrayBuilder::submit() ArrayBuilder::Submission submission; buffer_mutex_.lock(); - submission.input_size = input_.submit(); - submission.output_size = output_.submit(); + submission.input_size = input_.submit(true); + submission.output_size = output_.submit(false); if(is_full_) { is_full_ = false; @@ -83,18 +88,22 @@ ArrayBuilder::Submission ArrayBuilder::submit() return submission; } -ArrayBuilder::Buffer::Buffer(size_t size) : - allocated_data(0), flushed_data(0), submitted_data(0), is_full(false) +ArrayBuilder::Buffer::Buffer(size_t size, std::function submission_function) : + allocated_data(0), flushed_data(0), submitted_data(0), is_full(false), submission_function_(submission_function) { - glGenBuffers(1, &buffer); - glBindBuffer(GL_ARRAY_BUFFER, buffer); - glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, NULL, GL_STREAM_DRAW); + if(!submission_function_) + { + glGenBuffers(1, &buffer); + glBindBuffer(GL_ARRAY_BUFFER, buffer); + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, NULL, GL_STREAM_DRAW); + } data.resize(size); } ArrayBuilder::Buffer::~Buffer() { - glDeleteBuffers(1, &buffer); + if(!submission_function_) + glDeleteBuffers(1, &buffer); } uint8_t *ArrayBuilder::get_storage(size_t size, Buffer &buffer) @@ -151,16 +160,19 @@ void ArrayBuilder::Buffer::flush() } } -size_t ArrayBuilder::Buffer::submit() +size_t ArrayBuilder::Buffer::submit(bool is_input) { size_t length = flushed_data; - - glBindBuffer(GL_ARRAY_BUFFER, buffer); - uint8_t *destination = (uint8_t *)glMapBufferRange(GL_ARRAY_BUFFER, 0, (GLsizeiptr)length, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_FLUSH_EXPLICIT_BIT); - memcpy(destination, data.data(), length); - glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, (GLsizeiptr)length); - glUnmapBuffer(GL_ARRAY_BUFFER); - + if(submission_function_) + submission_function_(is_input, data.data(), length); + else + { + glBindBuffer(GL_ARRAY_BUFFER, buffer); + uint8_t *destination = (uint8_t *)glMapBufferRange(GL_ARRAY_BUFFER, 0, (GLsizeiptr)length, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_FLUSH_EXPLICIT_BIT); + memcpy(destination, data.data(), length); + glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, (GLsizeiptr)length); + glUnmapBuffer(GL_ARRAY_BUFFER); + } submitted_data = flushed_data; return length; } diff --git a/Outputs/CRT/Internals/ArrayBuilder.hpp b/Outputs/CRT/Internals/ArrayBuilder.hpp index 6d9a0587a..dd3e26497 100644 --- a/Outputs/CRT/Internals/ArrayBuilder.hpp +++ b/Outputs/CRT/Internals/ArrayBuilder.hpp @@ -32,6 +32,11 @@ class ArrayBuilder { /// @c input_size bytes of storage for the input buffer. ArrayBuilder(size_t input_size, size_t output_size); + /// Creates an instance of ArrayBuilder with @c output_size bytes of storage for the output buffer and + /// @c input_size bytes of storage for the input buffer that, rather than using OpenGL, will submit data + /// to the @c submission_function. [Teleological: this is provided as a testing hook.] + ArrayBuilder(size_t input_size, size_t output_size, std::function submission_function); + /// Attempts to add @c size bytes uint8_t *get_input_storage(size_t size); uint8_t *reget_input_storage(size_t &size); @@ -52,7 +57,7 @@ class ArrayBuilder { private: struct Buffer { - Buffer(size_t size); + Buffer(size_t size, std::function submission_function); ~Buffer(); std::vector data; @@ -66,14 +71,16 @@ class ArrayBuilder { uint8_t *reget_storage(size_t &size); void flush(); - size_t submit(); + size_t submit(bool is_input); void bind(); void reset(); + std::function submission_function_; } output_, input_; uint8_t *get_storage(size_t size, Buffer &buffer); std::mutex buffer_mutex_; bool is_full_; + ; }; }