From aa1696a7e6a275e613e7323e7f9553b7b7a0b7e0 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Sat, 8 Apr 2023 20:08:03 +0300 Subject: [PATCH] Use a buffer for quads indices also use glDrawRangeElements for quad drawing --- source/Irrlicht/OpenGL/Driver.cpp | 16 ++++++++++++---- source/Irrlicht/OpenGL/Driver.h | 5 +++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/source/Irrlicht/OpenGL/Driver.cpp b/source/Irrlicht/OpenGL/Driver.cpp index 6dec58f1..461a2f14 100644 --- a/source/Irrlicht/OpenGL/Driver.cpp +++ b/source/Irrlicht/OpenGL/Driver.cpp @@ -186,6 +186,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase() void COpenGL3DriverBase::initQuadsIndices(int max_vertex_count) { int max_quad_count = max_vertex_count / 4; + std::vector QuadsIndices; QuadsIndices.reserve(6 * max_quad_count); for (int k = 0; k < max_quad_count; k++) { QuadsIndices.push_back(4 * k + 0); @@ -195,6 +196,11 @@ COpenGL3DriverBase::~COpenGL3DriverBase() QuadsIndices.push_back(4 * k + 2); QuadsIndices.push_back(4 * k + 3); } + glGenBuffers(1, &QuadIndexBuffer); + glBindBuffer(GL_ARRAY_BUFFER, QuadIndexBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(QuadsIndices[0]) * QuadsIndices.size(), QuadsIndices.data(), GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + QuadIndexCount = QuadsIndices.size(); } bool COpenGL3DriverBase::genericDriverInit(const core::dimension2d& screenSize, bool stencilBuffer) @@ -919,7 +925,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase() } const irr::u32 drawCount = core::min_(positions.size(), sourceRects.size()); - assert(6 * std::size_t(drawCount) <= QuadsIndices.size()); + assert(6 * drawCount <= QuadIndexCount); // FIXME split the batch? or let it crash? core::array vtx(drawCount * 4); @@ -959,7 +965,9 @@ COpenGL3DriverBase::~COpenGL3DriverBase() tcoords.UpperLeftCorner.X, tcoords.LowerRightCorner.Y)); } - drawElements(GL_TRIANGLES, vt2DImage, vtx.const_pointer(), QuadsIndices.data(), 6 * drawCount); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, QuadIndexBuffer); + drawElements(GL_TRIANGLES, vt2DImage, vtx.const_pointer(), vtx.size(), 0, 6 * drawCount); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); if (clipRect) glDisable(GL_SCISSOR_TEST); @@ -1102,10 +1110,10 @@ COpenGL3DriverBase::~COpenGL3DriverBase() endDraw(vertexType); } - void COpenGL3DriverBase::drawElements(GLenum primitiveType, const VertexType &vertexType, const void *vertices, const u16 *indices, int indexCount) + void COpenGL3DriverBase::drawElements(GLenum primitiveType, const VertexType &vertexType, const void *vertices, int vertexCount, const u16 *indices, int indexCount) { beginDraw(vertexType, reinterpret_cast(vertices)); - glDrawElements(primitiveType, indexCount, GL_UNSIGNED_SHORT, indices); + glDrawRangeElements(primitiveType, 0, vertexCount - 1, indexCount, GL_UNSIGNED_SHORT, indices); endDraw(vertexType); } diff --git a/source/Irrlicht/OpenGL/Driver.h b/source/Irrlicht/OpenGL/Driver.h index c91ccfea..84cc62be 100644 --- a/source/Irrlicht/OpenGL/Driver.h +++ b/source/Irrlicht/OpenGL/Driver.h @@ -331,7 +331,7 @@ namespace video void drawQuad(const VertexType &vertexType, const S3DVertex (&vertices)[4]); void drawArrays(GLenum primitiveType, const VertexType &vertexType, const void *vertices, int vertexCount); - void drawElements(GLenum primitiveType, const VertexType &vertexType, const void *vertices, const u16 *indices, int indexCount); + void drawElements(GLenum primitiveType, const VertexType &vertexType, const void *vertices, int vertexCount, const u16 *indices, int indexCount); void drawElements(GLenum primitiveType, const VertexType &vertexType, uintptr_t vertices, uintptr_t indices, int indexCount); void beginDraw(const VertexType &vertexType, uintptr_t verticesBase); @@ -386,7 +386,8 @@ private: void addDummyMaterial(E_MATERIAL_TYPE type); - std::vector QuadsIndices; + unsigned QuadIndexCount; + GLuint QuadIndexBuffer = 0; void initQuadsIndices(int max_vertex_count = 65536); void debugCb(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message);