Skip to content

Commit

Permalink
blah
Browse files Browse the repository at this point in the history
  • Loading branch information
fzurita committed Mar 30, 2019
1 parent 3bfbef9 commit 34d8347
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 16 deletions.
1 change: 1 addition & 0 deletions src/Graphics/OpenGLContext/GLFunctions.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <GL/glcorearb.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#define GL_LUMINANCE 0x1909
#elif defined(OS_MAC_OS_X)
#include <OpenGL/OpenGL.h>
#include <stddef.h>
Expand Down
36 changes: 23 additions & 13 deletions src/Graphics/OpenGLContext/ThreadedOpenGl/RingBufferPool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,24 @@ 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)
{
}

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)
{
}
Expand All @@ -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;
}
Expand All @@ -54,50 +58,56 @@ 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<size_t>(m_inUseStartOffset - m_inUseEndOffset) :
m_poolBuffer.size() - m_inUseEndOffset + m_inUseStartOffset;

bool isValid = remaining >= _bufferSize;
bool isValid = remaining >= realBufferSize;

size_t startOffset = 0;

// We have determined that it fits
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<std::mutex> 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<std::mutex> lock(m_mutex);
m_condition.wait(lock, [this, _bufferSize]{
m_condition.wait(lock, [this, realBufferSize]{
size_t remaining = m_inUseStartOffset > m_inUseEndOffset ? static_cast<size_t>(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)
Expand Down
3 changes: 2 additions & 1 deletion src/Graphics/OpenGLContext/ThreadedOpenGl/RingBufferPool.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
7 changes: 5 additions & 2 deletions src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<const char*>(value), 3 * sizeof(GLfloat));
PoolBufferPointer values = OpenGlCommand::m_ringBufferPool.createPoolBuffer(reinterpret_cast<const char*>(value), 3 * sizeof(GLfloat) * count);
executeCommand(GlUniform3fvCommand::get(location, count, values));
} else
ptrUniform3fv(location, count, value);
Expand All @@ -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<const char*>(value), 4 * sizeof(GLfloat));
PoolBufferPointer values = OpenGlCommand::m_ringBufferPool.createPoolBuffer(reinterpret_cast<const char*>(value), 4 * sizeof(GLfloat) * count);
executeCommand(GlUniform4fvCommand::get(location, count, values));
} else
ptrUniform4fv(location, count, value);
Expand Down Expand Up @@ -1483,6 +1483,9 @@ namespace opengl {
case GL_DEPTH_STENCIL:
components = 2;
break;
case GL_LUMINANCE:
components = 1;
break;
default:
components = -1;
}
Expand Down

0 comments on commit 34d8347

Please sign in to comment.