[colobot] 282/377: Reimplemented drawing primitives in OpenGL 3.3 engine
Didier Raboud
odyx at moszumanska.debian.org
Wed Mar 30 13:34:27 UTC 2016
This is an automated email from the git hooks/post-receive script.
odyx pushed a commit to branch debian/master
in repository colobot.
commit 517d6f069ace13fcef2fdee0b456d5b6c927adb2
Author: Tomasz Kapuściński <tomaszkax86 at gmail.com>
Date: Mon Feb 15 20:31:32 2016 +0100
Reimplemented drawing primitives in OpenGL 3.3 engine
---
src/graphics/opengl/gl33device.cpp | 146 +++++++++++++++++--------------------
src/graphics/opengl/gl33device.h | 24 ++----
2 files changed, 76 insertions(+), 94 deletions(-)
diff --git a/src/graphics/opengl/gl33device.cpp b/src/graphics/opengl/gl33device.cpp
index 8f9a6b1..8d948d0 100644
--- a/src/graphics/opengl/gl33device.cpp
+++ b/src/graphics/opengl/gl33device.cpp
@@ -214,7 +214,7 @@ bool CGL33Device::Create()
GetLogger()->Info("Anisotropic filtering not available\n");
}
- glGetIntegerv(GL_MAX_FRAMEBUFFER_SAMPLES, &m_maxSamples);
+ glGetIntegerv(GL_MAX_SAMPLES, &m_maxSamples);
GetLogger()->Info("Multisampling supported, max samples: %d\n", m_maxSamples);
// Set just to be sure
@@ -386,21 +386,14 @@ bool CGL33Device::Create()
m_framebuffers["default"] = MakeUnique<CDefaultFramebuffer>(framebufferParams);
// create dynamic buffers
-
glGenVertexArrays(1, &m_auxiliaryVAO);
- for (int i = 0; i < 64; i++)
- {
- DynamicBuffer buffer;
-
- glGenBuffers(1, &buffer.vbo);
- BindVBO(buffer.vbo);
-
- buffer.size = 1024;
- glBufferData(GL_ARRAY_BUFFER, buffer.size, nullptr, GL_STREAM_DRAW);
+ m_bufferSize = 4 * 1024 * 1024;
- m_buffers.push_back(buffer);
- }
+ glGenBuffers(1, &m_buffer);
+ glBindBuffer(GL_ARRAY_BUFFER, m_buffer);
+ glBufferData(GL_ARRAY_BUFFER, m_bufferSize, nullptr, GL_STREAM_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
GetLogger()->Info("CDevice created successfully\n");
@@ -423,13 +416,9 @@ void CGL33Device::Destroy()
// Should not be strictly necessary, but just in case
DestroyAllTextures();
- // delete all dynamic buffers
- for (auto& buffer : m_buffers)
- {
- glDeleteBuffers(1, &buffer.vbo);
- }
+ // delete dynamic buffer
glDeleteVertexArrays(1, &m_auxiliaryVAO);
- m_buffers.clear();
+ glDeleteBuffers(1, &m_buffer);
m_lights.clear();
m_lightsEnabled.clear();
@@ -1215,24 +1204,22 @@ void CGL33Device::DrawPrimitive(PrimitiveType type, const Vertex *vertices, int
{
Vertex* vs = const_cast<Vertex*>(vertices);
- DynamicBuffer &buffer = m_buffers[m_nextBuffer];
-
unsigned int size = vertexCount * sizeof(Vertex);
BindVAO(m_auxiliaryVAO);
- BindVBO(buffer.vbo);
+ BindVBO(m_buffer);
- UpdateDynamicBuffer(buffer, size, vs);
+ unsigned int offset = UploadVertexData(vs, size);
// Vertex coordinate
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
- reinterpret_cast<void*>(offsetof(Vertex, coord)));
+ reinterpret_cast<void*>(offset + offsetof(Vertex, coord)));
// Normal
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
- reinterpret_cast<void*>(offsetof(Vertex, normal)));
+ reinterpret_cast<void*>(offset + offsetof(Vertex, normal)));
// Color
glDisableVertexAttribArray(2);
@@ -1241,7 +1228,7 @@ void CGL33Device::DrawPrimitive(PrimitiveType type, const Vertex *vertices, int
// Texture coordinate 0
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex),
- reinterpret_cast<void*>(offsetof(Vertex, texCoord)));
+ reinterpret_cast<void*>(offset + offsetof(Vertex, texCoord)));
// Texture coordinate 1
glDisableVertexAttribArray(4);
@@ -1250,32 +1237,28 @@ void CGL33Device::DrawPrimitive(PrimitiveType type, const Vertex *vertices, int
UpdateRenderingMode();
glDrawArrays(TranslateGfxPrimitive(type), 0, vertexCount);
-
- m_nextBuffer = (m_nextBuffer + 1) % m_buffers.size();
}
void CGL33Device::DrawPrimitive(PrimitiveType type, const VertexTex2 *vertices, int vertexCount, Color color)
{
VertexTex2* vs = const_cast<VertexTex2*>(vertices);
- DynamicBuffer &buffer = m_buffers[m_nextBuffer];
-
unsigned int size = vertexCount * sizeof(VertexTex2);
BindVAO(m_auxiliaryVAO);
- BindVBO(buffer.vbo);
+ BindVBO(m_buffer);
- UpdateDynamicBuffer(buffer, size, vs);
+ unsigned int offset = UploadVertexData(vs, size);
// Vertex coordinate
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexTex2),
- reinterpret_cast<void*>(offsetof(VertexTex2, coord)));
+ reinterpret_cast<void*>(offset + offsetof(VertexTex2, coord)));
// Normal
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(VertexTex2),
- reinterpret_cast<void*>(offsetof(VertexTex2, normal)));
+ reinterpret_cast<void*>(offset + offsetof(VertexTex2, normal)));
// Color
glDisableVertexAttribArray(2);
@@ -1284,37 +1267,33 @@ void CGL33Device::DrawPrimitive(PrimitiveType type, const VertexTex2 *vertices,
// Texture coordinate 0
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, sizeof(VertexTex2),
- reinterpret_cast<void*>(offsetof(VertexTex2, texCoord)));
+ reinterpret_cast<void*>(offset + offsetof(VertexTex2, texCoord)));
// Texture coordinate 1
glEnableVertexAttribArray(4);
glVertexAttribPointer(4, 2, GL_FLOAT, GL_FALSE, sizeof(VertexTex2),
- reinterpret_cast<void*>(offsetof(VertexTex2, texCoord2)));
+ reinterpret_cast<void*>(offset + offsetof(VertexTex2, texCoord2)));
UpdateRenderingMode();
glDrawArrays(TranslateGfxPrimitive(type), 0, vertexCount);
-
- m_nextBuffer = (m_nextBuffer + 1) % m_buffers.size();
}
void CGL33Device::DrawPrimitive(PrimitiveType type, const VertexCol *vertices, int vertexCount)
{
VertexCol* vs = const_cast<VertexCol*>(vertices);
- DynamicBuffer &buffer = m_buffers[m_nextBuffer];
-
unsigned int size = vertexCount * sizeof(VertexCol);
BindVAO(m_auxiliaryVAO);
- BindVBO(buffer.vbo);
+ BindVBO(m_buffer);
- UpdateDynamicBuffer(buffer, size, vs);
+ unsigned int offset = UploadVertexData(vs, size);
// Vertex coordinate
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexCol),
- reinterpret_cast<void*>(offsetof(VertexCol, coord)));
+ reinterpret_cast<void*>(offset + offsetof(VertexCol, coord)));
// Normal
glDisableVertexAttribArray(1);
@@ -1323,7 +1302,7 @@ void CGL33Device::DrawPrimitive(PrimitiveType type, const VertexCol *vertices, i
// Color
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, sizeof(VertexCol),
- reinterpret_cast<void*>(offsetof(VertexCol, color)));
+ reinterpret_cast<void*>(offset + offsetof(VertexCol, color)));
// Texture coordinate 0
glDisableVertexAttribArray(3);
@@ -1336,8 +1315,6 @@ void CGL33Device::DrawPrimitive(PrimitiveType type, const VertexCol *vertices, i
UpdateRenderingMode();
glDrawArrays(TranslateGfxPrimitive(type), 0, vertexCount);
-
- m_nextBuffer = (m_nextBuffer + 1) % m_buffers.size();
}
void CGL33Device::DrawPrimitives(PrimitiveType type, const Vertex *vertices,
@@ -1345,8 +1322,6 @@ void CGL33Device::DrawPrimitives(PrimitiveType type, const Vertex *vertices,
{
Vertex* vs = const_cast<Vertex*>(vertices);
- DynamicBuffer &buffer = m_buffers[m_nextBuffer];
-
int vertexCount = 0;
for (int i = 0; i < drawCount; i++)
@@ -1360,19 +1335,19 @@ void CGL33Device::DrawPrimitives(PrimitiveType type, const Vertex *vertices,
unsigned int size = vertexCount * sizeof(Vertex);
BindVAO(m_auxiliaryVAO);
- BindVBO(buffer.vbo);
+ BindVBO(m_buffer);
- UpdateDynamicBuffer(buffer, size, vs);
+ unsigned int offset = UploadVertexData(vs, size);
// Vertex coordinate
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
- reinterpret_cast<void*>(offsetof(Vertex, coord)));
+ reinterpret_cast<void*>(offset + offsetof(Vertex, coord)));
// Normal
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
- reinterpret_cast<void*>(offsetof(Vertex, normal)));
+ reinterpret_cast<void*>(offset + offsetof(Vertex, normal)));
// Color
glDisableVertexAttribArray(2);
@@ -1381,7 +1356,7 @@ void CGL33Device::DrawPrimitives(PrimitiveType type, const Vertex *vertices,
// Texture coordinate 0
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex),
- reinterpret_cast<void*>(offsetof(Vertex, texCoord)));
+ reinterpret_cast<void*>(offset + offsetof(Vertex, texCoord)));
// Texture coordinate 1
glDisableVertexAttribArray(4);
@@ -1390,8 +1365,6 @@ void CGL33Device::DrawPrimitives(PrimitiveType type, const Vertex *vertices,
UpdateRenderingMode();
glMultiDrawArrays(TranslateGfxPrimitive(type), first, count, drawCount);
-
- m_nextBuffer = (m_nextBuffer + 1) % m_buffers.size();
}
void CGL33Device::DrawPrimitives(PrimitiveType type, const VertexTex2 *vertices,
@@ -1399,8 +1372,6 @@ void CGL33Device::DrawPrimitives(PrimitiveType type, const VertexTex2 *vertices,
{
VertexTex2* vs = const_cast<VertexTex2*>(vertices);
- DynamicBuffer &buffer = m_buffers[m_nextBuffer];
-
int vertexCount = 0;
for (int i = 0; i < drawCount; i++)
@@ -1414,19 +1385,19 @@ void CGL33Device::DrawPrimitives(PrimitiveType type, const VertexTex2 *vertices,
unsigned int size = vertexCount * sizeof(VertexTex2);
BindVAO(m_auxiliaryVAO);
- BindVBO(buffer.vbo);
+ BindVBO(m_buffer);
- UpdateDynamicBuffer(buffer, size, vs);
+ unsigned int offset = UploadVertexData(vs, size);
// Vertex coordinate
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexTex2),
- reinterpret_cast<void*>(offsetof(VertexTex2, coord)));
+ reinterpret_cast<void*>(offset + offsetof(VertexTex2, coord)));
// Normal
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(VertexTex2),
- reinterpret_cast<void*>(offsetof(VertexTex2, normal)));
+ reinterpret_cast<void*>(offset + offsetof(VertexTex2, normal)));
// Color
glDisableVertexAttribArray(2);
@@ -1435,18 +1406,16 @@ void CGL33Device::DrawPrimitives(PrimitiveType type, const VertexTex2 *vertices,
// Texture coordinate 0
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, sizeof(VertexTex2),
- reinterpret_cast<void*>(offsetof(VertexTex2, texCoord)));
+ reinterpret_cast<void*>(offset + offsetof(VertexTex2, texCoord)));
// Texture coordinate 1
glEnableVertexAttribArray(4);
glVertexAttribPointer(4, 2, GL_FLOAT, GL_FALSE, sizeof(VertexTex2),
- reinterpret_cast<void*>(offsetof(VertexTex2, texCoord2)));
+ reinterpret_cast<void*>(offset + offsetof(VertexTex2, texCoord2)));
UpdateRenderingMode();
glMultiDrawArrays(TranslateGfxPrimitive(type), first, count, drawCount);
-
- m_nextBuffer = (m_nextBuffer + 1) % m_buffers.size();
}
void CGL33Device::DrawPrimitives(PrimitiveType type, const VertexCol *vertices,
@@ -1454,8 +1423,6 @@ void CGL33Device::DrawPrimitives(PrimitiveType type, const VertexCol *vertices,
{
VertexCol* vs = const_cast<VertexCol*>(vertices);
- DynamicBuffer &buffer = m_buffers[m_nextBuffer];
-
int vertexCount = 0;
for (int i = 0; i < drawCount; i++)
@@ -1469,14 +1436,14 @@ void CGL33Device::DrawPrimitives(PrimitiveType type, const VertexCol *vertices,
unsigned int size = vertexCount * sizeof(VertexCol);
BindVAO(m_auxiliaryVAO);
- BindVBO(buffer.vbo);
+ BindVBO(m_buffer);
- UpdateDynamicBuffer(buffer, size, vs);
+ unsigned int offset = UploadVertexData(vs, size);
// Vertex coordinate
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexCol),
- reinterpret_cast<void*>(offsetof(VertexCol, coord)));
+ reinterpret_cast<void*>(offset + offsetof(VertexCol, coord)));
// Normal
glDisableVertexAttribArray(1);
@@ -1485,7 +1452,7 @@ void CGL33Device::DrawPrimitives(PrimitiveType type, const VertexCol *vertices,
// Color
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, sizeof(VertexCol),
- reinterpret_cast<void*>(offsetof(VertexCol, color)));
+ reinterpret_cast<void*>(offset + offsetof(VertexCol, color)));
// Texture coordinate 0
glDisableVertexAttribArray(3);
@@ -1498,8 +1465,6 @@ void CGL33Device::DrawPrimitives(PrimitiveType type, const VertexCol *vertices,
UpdateRenderingMode();
glMultiDrawArrays(TranslateGfxPrimitive(type), first, count, drawCount);
-
- m_nextBuffer = (m_nextBuffer + 1) % m_buffers.size();
}
unsigned int CGL33Device::CreateStaticBuffer(PrimitiveType primitiveType, const Vertex* vertices, int vertexCount)
@@ -2135,17 +2100,42 @@ inline void CGL33Device::BindVAO(GLuint vao)
m_currentVAO = vao;
}
-inline void CGL33Device::UpdateDynamicBuffer(DynamicBuffer &buffer, unsigned int size, void* data)
+unsigned int CGL33Device::UploadVertexData(void* data, unsigned int size)
{
- if (buffer.size < size)
+ unsigned int nextOffset = m_bufferOffset + size;
+
+ // buffer limit exceeded
+ // invalidate buffer for the next round of buffer streaming
+ if (nextOffset > m_bufferSize)
+ {
+ glBufferData(GL_ARRAY_BUFFER, m_bufferSize, nullptr, GL_STREAM_DRAW);
+
+ m_bufferOffset = 0;
+ nextOffset = size;
+ }
+
+ unsigned int currentOffset = m_bufferOffset;
+
+ // map buffer for unsynchronized copying
+ void* ptr = glMapBufferRange(GL_ARRAY_BUFFER, currentOffset, size,
+ GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
+
+ if (ptr != nullptr)
{
- glBufferData(GL_ARRAY_BUFFER, size, data, GL_STREAM_DRAW);
- buffer.size = size;
+ memcpy(ptr, data, size);
+
+ glUnmapBuffer(GL_ARRAY_BUFFER);
}
+ // mapping failed, we must upload data with glBufferSubData
else
{
- glBufferSubData(GL_ARRAY_BUFFER, 0, size, data);
+ GetLogger()->Debug("Buffer mapping failed (offset %d, size %d)\n", currentOffset, size);
+ glBufferSubData(GL_ARRAY_BUFFER, currentOffset, size, data);
}
+
+ m_bufferOffset = nextOffset;
+
+ return currentOffset;
}
bool CGL33Device::IsAnisotropySupported()
diff --git a/src/graphics/opengl/gl33device.h b/src/graphics/opengl/gl33device.h
index 3d8c0a0..5bcdbec 100644
--- a/src/graphics/opengl/gl33device.h
+++ b/src/graphics/opengl/gl33device.h
@@ -45,16 +45,6 @@ namespace Gfx
{
/**
- \struct DynamicBuffer
- \brief Structure for storing dynamic buffer
-*/
-struct DynamicBuffer
-{
- GLuint vbo = 0;
- unsigned int size = 0;
-};
-
-/**
\class CGL33Device
\brief Implementation of CDevice interface in OpenGL 3.3
@@ -198,8 +188,8 @@ private:
//! Binds VAO
inline void BindVAO(GLuint vao);
- //! Updates dynamic buffer
- inline void UpdateDynamicBuffer(DynamicBuffer &buffer, unsigned int size, void* data);
+ //! Uploads data to dynamic buffer and returns offset to it
+ unsigned int UploadVertexData(void* data, unsigned int size);
private:
//! Current config
@@ -279,12 +269,14 @@ private:
//! true enables per-pixel lighting
bool m_perPixelLighting = false;
- //! Auxilliary buffers for rendering primitives with DrawPrimitive*
- std::vector<DynamicBuffer> m_buffers = {};
- //! Index to next auxilliary buffer
- int m_nextBuffer = 0;
//! Auxiliary VAO for rendering primitives with DrawPrimitive*
GLuint m_auxiliaryVAO = 0;
+ //! Dynamic buffer for rendering primitives
+ GLuint m_buffer = 0;
+ //! Dynamic buffer size
+ unsigned int m_bufferSize = 0;
+ //! Dynamic buffer offset
+ unsigned int m_bufferOffset = 0;
// Uniforms
//! Projection matrix
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git
More information about the Pkg-games-commits
mailing list