mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-07 03:13:49 +00:00
Disable RectBuffer optimization for bufferStorage.
Remove some code duplication.
This commit is contained in:
parent
7e360c613d
commit
ca7da5418e
|
@ -67,7 +67,7 @@ BufferedDrawer::~BufferedDrawer()
|
||||||
glDeleteVertexArrays(2, arrays);
|
glDeleteVertexArrays(2, arrays);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BufferedDrawer::_updateBuffer(Buffer & _buffer, u32 _dataSize, const void * _data)
|
void BufferedDrawer::_updateBuffer(Buffer & _buffer, u32 _count, u32 _dataSize, const void * _data)
|
||||||
{
|
{
|
||||||
if (_buffer.offset + _dataSize > _buffer.size) {
|
if (_buffer.offset + _dataSize > _buffer.size) {
|
||||||
_buffer.offset = 0;
|
_buffer.offset = 0;
|
||||||
|
@ -76,13 +76,15 @@ void BufferedDrawer::_updateBuffer(Buffer & _buffer, u32 _dataSize, const void *
|
||||||
|
|
||||||
if (m_glInfo.bufferStorage) {
|
if (m_glInfo.bufferStorage) {
|
||||||
memcpy(&_buffer.data[_buffer.offset], _data, _dataSize);
|
memcpy(&_buffer.data[_buffer.offset], _data, _dataSize);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
m_bindBuffer->bind(Parameter(_buffer.type), ObjectHandle(_buffer.handle));
|
m_bindBuffer->bind(Parameter(_buffer.type), ObjectHandle(_buffer.handle));
|
||||||
void* buffer_pointer = glMapBufferRange(_buffer.type, _buffer.offset, _dataSize, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
|
void* buffer_pointer = glMapBufferRange(_buffer.type, _buffer.offset, _dataSize, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
|
||||||
memcpy(buffer_pointer, _data, _dataSize);
|
memcpy(buffer_pointer, _data, _dataSize);
|
||||||
glUnmapBuffer(_buffer.type);
|
glUnmapBuffer(_buffer.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_buffer.offset += _dataSize;
|
||||||
|
_buffer.pos += _count;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BufferedDrawer::_updateRectBuffer(const graphics::Context::DrawRectParameters & _params)
|
void BufferedDrawer::_updateRectBuffer(const graphics::Context::DrawRectParameters & _params)
|
||||||
|
@ -95,20 +97,24 @@ void BufferedDrawer::_updateRectBuffer(const graphics::Context::DrawRectParamete
|
||||||
|
|
||||||
Buffer & buffer = m_rectsBuffers.vbo;
|
Buffer & buffer = m_rectsBuffers.vbo;
|
||||||
const size_t dataSize = _params.verticesCount * sizeof(RectVertex);
|
const size_t dataSize = _params.verticesCount * sizeof(RectVertex);
|
||||||
const u32 crc = CRC_Calculate(0xFFFFFFFF, _params.vertices, dataSize);
|
|
||||||
|
|
||||||
|
if (m_glInfo.bufferStorage) {
|
||||||
|
_updateBuffer(buffer, _params.verticesCount, dataSize, _params.vertices);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const u32 crc = CRC_Calculate(0xFFFFFFFF, _params.vertices, dataSize);
|
||||||
auto iter = m_rectBufferOffsets.find(crc);
|
auto iter = m_rectBufferOffsets.find(crc);
|
||||||
if (iter != m_rectBufferOffsets.end()) {
|
if (iter != m_rectBufferOffsets.end()) {
|
||||||
buffer.pos = iter->second;
|
buffer.pos = iter->second;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateBuffer(buffer, dataSize, _params.vertices);
|
const GLint prevPos = buffer.pos;
|
||||||
if (buffer.pos == 0)
|
_updateBuffer(buffer, _params.verticesCount, dataSize, _params.vertices);
|
||||||
|
if (buffer.pos < prevPos)
|
||||||
m_rectBufferOffsets.clear();
|
m_rectBufferOffsets.clear();
|
||||||
|
|
||||||
buffer.offset += dataSize;
|
|
||||||
buffer.pos = buffer.offset / sizeof(RectVertex);
|
|
||||||
m_rectBufferOffsets[crc] = buffer.pos;
|
m_rectBufferOffsets[crc] = buffer.pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,18 +166,14 @@ void BufferedDrawer::_updateTrianglesBuffers(const graphics::Context::DrawTriang
|
||||||
_convertFromSPVertex(_params.flatColors, _params.verticesCount, _params.vertices);
|
_convertFromSPVertex(_params.flatColors, _params.verticesCount, _params.vertices);
|
||||||
const GLsizeiptr vboDataSize = _params.verticesCount * sizeof(Vertex);
|
const GLsizeiptr vboDataSize = _params.verticesCount * sizeof(Vertex);
|
||||||
Buffer & vboBuffer = m_trisBuffers.vbo;
|
Buffer & vboBuffer = m_trisBuffers.vbo;
|
||||||
_updateBuffer(vboBuffer, vboDataSize, m_vertices);
|
_updateBuffer(vboBuffer, _params.verticesCount, vboDataSize, m_vertices);
|
||||||
vboBuffer.offset += vboDataSize;
|
|
||||||
vboBuffer.pos += _params.verticesCount;
|
|
||||||
|
|
||||||
if (_params.elements == nullptr)
|
if (_params.elements == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const GLsizeiptr eboDataSize = sizeof(GLubyte) * _params.elementsCount;
|
const GLsizeiptr eboDataSize = sizeof(GLubyte) * _params.elementsCount;
|
||||||
Buffer & eboBuffer = m_trisBuffers.ebo;
|
Buffer & eboBuffer = m_trisBuffers.ebo;
|
||||||
_updateBuffer(eboBuffer, eboDataSize, _params.elements);
|
_updateBuffer(eboBuffer, _params.elementsCount, eboDataSize, _params.elements);
|
||||||
eboBuffer.offset += eboDataSize;
|
|
||||||
eboBuffer.pos += _params.elementsCount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BufferedDrawer::drawTriangles(const graphics::Context::DrawTriangleParameters & _params)
|
void BufferedDrawer::drawTriangles(const graphics::Context::DrawTriangleParameters & _params)
|
||||||
|
@ -202,9 +204,7 @@ void BufferedDrawer::drawLine(f32 _width, SPVertex * _vertices)
|
||||||
_convertFromSPVertex(false, 2, _vertices);
|
_convertFromSPVertex(false, 2, _vertices);
|
||||||
const GLsizeiptr vboDataSize = 2 * sizeof(Vertex);
|
const GLsizeiptr vboDataSize = 2 * sizeof(Vertex);
|
||||||
Buffer & vboBuffer = m_trisBuffers.vbo;
|
Buffer & vboBuffer = m_trisBuffers.vbo;
|
||||||
_updateBuffer(vboBuffer, vboDataSize, m_vertices);
|
_updateBuffer(vboBuffer, 2, vboDataSize, m_vertices);
|
||||||
vboBuffer.offset += vboDataSize;
|
|
||||||
vboBuffer.pos += 2;
|
|
||||||
|
|
||||||
glDrawArrays(GL_LINES, m_trisBuffers.vbo.pos - 2, 2);
|
glDrawArrays(GL_LINES, m_trisBuffers.vbo.pos - 2, 2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@ namespace opengl {
|
||||||
};
|
};
|
||||||
|
|
||||||
void _initBuffer(Buffer & _buffer, GLuint _bufSize);
|
void _initBuffer(Buffer & _buffer, GLuint _bufSize);
|
||||||
void _updateBuffer(Buffer & _buffer, u32 _dataSize, const void * _data);
|
void _updateBuffer(Buffer & _buffer, u32 _count, u32 _dataSize, const void * _data);
|
||||||
void _convertFromSPVertex(bool _flatColors, u32 _count, const SPVertex * _data);
|
void _convertFromSPVertex(bool _flatColors, u32 _count, const SPVertex * _data);
|
||||||
|
|
||||||
const GLInfo & m_glInfo;
|
const GLInfo & m_glInfo;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user