From 34d8347e39020b658bdff59061eee8b1c59830bf Mon Sep 17 00:00:00 2001 From: fzurita Date: Fri, 29 Mar 2019 23:01:59 -0400 Subject: [PATCH] blah --- src/Graphics/OpenGLContext/GLFunctions.h | 1 + .../ThreadedOpenGl/RingBufferPool.cpp | 36 ++++++++++++------- .../ThreadedOpenGl/RingBufferPool.h | 3 +- .../ThreadedOpenGl/opengl_Wrapper.cpp | 7 ++-- 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/Graphics/OpenGLContext/GLFunctions.h b/src/Graphics/OpenGLContext/GLFunctions.h index 944e23acb..3fc11bfa6 100644 --- a/src/Graphics/OpenGLContext/GLFunctions.h +++ b/src/Graphics/OpenGLContext/GLFunctions.h @@ -11,6 +11,7 @@ #include #include #include +#define GL_LUMINANCE 0x1909 #elif defined(OS_MAC_OS_X) #include #include diff --git a/src/Graphics/OpenGLContext/ThreadedOpenGl/RingBufferPool.cpp b/src/Graphics/OpenGLContext/ThreadedOpenGl/RingBufferPool.cpp index b6f6bd833..222e1bb02 100644 --- a/src/Graphics/OpenGLContext/ThreadedOpenGl/RingBufferPool.cpp +++ b/src/Graphics/OpenGLContext/ThreadedOpenGl/RingBufferPool.cpp @@ -8,14 +8,16 @@ namespace opengl { PoolBufferPointer::PoolBufferPointer() : m_offset(0), m_size(0), + m_realSize(0), m_isValid(false) { } -PoolBufferPointer::PoolBufferPointer(size_t _offset, size_t _size, bool _isValid) : +PoolBufferPointer::PoolBufferPointer(size_t _offset, size_t _size, size_t _realSize, bool _isValid) : m_offset(_offset), m_size(_size), + m_realSize(0), m_isValid(_isValid) { } @@ -23,6 +25,7 @@ PoolBufferPointer::PoolBufferPointer(size_t _offset, size_t _size, bool _isValid PoolBufferPointer::PoolBufferPointer(const PoolBufferPointer& other) : m_offset(other.m_offset), m_size(other.m_size), + m_realSize(other.m_realSize), m_isValid(other.m_isValid) { } @@ -31,6 +34,7 @@ PoolBufferPointer& PoolBufferPointer::operator=(const PoolBufferPointer& other) { m_offset = other.m_offset; m_size = other.m_size; + m_realSize = other.m_realSize; m_isValid = other.m_isValid; return *this; } @@ -54,10 +58,16 @@ RingBufferPool::RingBufferPool(size_t _poolSize) : PoolBufferPointer RingBufferPool::createPoolBuffer(const char* _buffer, size_t _bufferSize) { + size_t realBufferSize = _bufferSize; + size_t remainder = _bufferSize % 4; + + if (remainder != 0) + realBufferSize = _bufferSize + 4 - remainder; + size_t remaining = m_inUseStartOffset > m_inUseEndOffset ? static_cast(m_inUseStartOffset - m_inUseEndOffset) : m_poolBuffer.size() - m_inUseEndOffset + m_inUseStartOffset; - bool isValid = remaining >= _bufferSize; + bool isValid = remaining >= realBufferSize; size_t startOffset = 0; @@ -65,39 +75,39 @@ PoolBufferPointer RingBufferPool::createPoolBuffer(const char* _buffer, size_t _ if (isValid) { // We don't want to split data between the end of the ring buffer and the start // Re-check buffer size if we are going to start at the beginning of the ring buffer - if (m_inUseEndOffset + _bufferSize > m_poolBuffer.size()) { - isValid = _bufferSize < m_inUseStartOffset || m_inUseStartOffset == m_inUseEndOffset; + if (m_inUseEndOffset + realBufferSize > m_poolBuffer.size()) { + isValid = realBufferSize < m_inUseStartOffset || m_inUseStartOffset == m_inUseEndOffset; if (isValid) { startOffset = 0; - m_inUseEndOffset = _bufferSize; + m_inUseEndOffset = realBufferSize; } else { std::unique_lock lock(m_mutex); - m_condition.wait(lock, [this, _bufferSize]{ return _bufferSize < m_inUseStartOffset || m_inUseStartOffset == m_inUseEndOffset; }); + m_condition.wait(lock, [this, realBufferSize]{ return realBufferSize < m_inUseStartOffset || m_inUseStartOffset == m_inUseEndOffset; }); - return createPoolBuffer(_buffer, _bufferSize); + return createPoolBuffer(_buffer, realBufferSize); } } else { startOffset = m_inUseEndOffset; - m_inUseEndOffset += _bufferSize; + m_inUseEndOffset += realBufferSize; } } else { // Wait until enough space is avalable std::unique_lock lock(m_mutex); - m_condition.wait(lock, [this, _bufferSize]{ + m_condition.wait(lock, [this, realBufferSize]{ size_t remaining = m_inUseStartOffset > m_inUseEndOffset ? static_cast(m_inUseStartOffset - m_inUseEndOffset) : m_poolBuffer.size() - m_inUseEndOffset + m_inUseStartOffset; - return remaining >= _bufferSize; + return remaining >= realBufferSize; }); - return createPoolBuffer(_buffer, _bufferSize); + return createPoolBuffer(_buffer, realBufferSize); } if (isValid) { - std::copy_n(_buffer, _bufferSize, &m_poolBuffer[startOffset]); + std::copy_n(_buffer, realBufferSize, &m_poolBuffer[startOffset]); } - return PoolBufferPointer(startOffset, _bufferSize, isValid); + return PoolBufferPointer(startOffset, _bufferSize, realBufferSize, isValid); } const char* RingBufferPool::getBufferFromPool(PoolBufferPointer _poolBufferPointer) diff --git a/src/Graphics/OpenGLContext/ThreadedOpenGl/RingBufferPool.h b/src/Graphics/OpenGLContext/ThreadedOpenGl/RingBufferPool.h index 653fd4265..6efb3f2b4 100644 --- a/src/Graphics/OpenGLContext/ThreadedOpenGl/RingBufferPool.h +++ b/src/Graphics/OpenGLContext/ThreadedOpenGl/RingBufferPool.h @@ -18,10 +18,11 @@ class PoolBufferPointer bool isValid() const; size_t getSize() const; private: - PoolBufferPointer(size_t _offset, size_t _size, bool _isValid); + PoolBufferPointer(size_t _offset, size_t _size, size_t _realSize, bool _isValid); size_t m_offset; size_t m_size; + size_t m_realSize; bool m_isValid; friend class RingBufferPool; diff --git a/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.cpp b/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.cpp index cb5ed5b4b..249e26301 100644 --- a/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.cpp +++ b/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.cpp @@ -584,7 +584,7 @@ namespace opengl { void FunctionWrapper::wrUniform3fv(GLint location, GLsizei count, const GLfloat *value) { if (m_threaded_wrapper) { - PoolBufferPointer values = OpenGlCommand::m_ringBufferPool.createPoolBuffer(reinterpret_cast(value), 3 * sizeof(GLfloat)); + PoolBufferPointer values = OpenGlCommand::m_ringBufferPool.createPoolBuffer(reinterpret_cast(value), 3 * sizeof(GLfloat) * count); executeCommand(GlUniform3fvCommand::get(location, count, values)); } else ptrUniform3fv(location, count, value); @@ -593,7 +593,7 @@ namespace opengl { void FunctionWrapper::wrUniform4fv(GLint location, GLsizei count, const GLfloat *value) { if (m_threaded_wrapper) { - PoolBufferPointer values = OpenGlCommand::m_ringBufferPool.createPoolBuffer(reinterpret_cast(value), 4 * sizeof(GLfloat)); + PoolBufferPointer values = OpenGlCommand::m_ringBufferPool.createPoolBuffer(reinterpret_cast(value), 4 * sizeof(GLfloat) * count); executeCommand(GlUniform4fvCommand::get(location, count, values)); } else ptrUniform4fv(location, count, value); @@ -1483,6 +1483,9 @@ namespace opengl { case GL_DEPTH_STENCIL: components = 2; break; + case GL_LUMINANCE: + components = 1; + break; default: components = -1; }