diff --git a/src/graphics/glwrap.cpp b/src/graphics/glwrap.cpp index 8add41000..7387b9d8f 100644 --- a/src/graphics/glwrap.cpp +++ b/src/graphics/glwrap.cpp @@ -59,6 +59,8 @@ PFNGLBUFFERSUBDATAPROC glBufferSubData; PFNGLMAPBUFFERPROC glMapBuffer; PFNGLMAPBUFFERRANGEPROC glMapBufferRange; PFNGLUNMAPBUFFERPROC glUnmapBuffer; +PFNGLFENCESYNCPROC glFenceSync; +PFNGLCLIENTWAITSYNCPROC glClientWaitSync; PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer; PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARB; PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; @@ -183,6 +185,8 @@ void initGL() glMapBuffer = (PFNGLMAPBUFFERPROC)IRR_OGL_LOAD_EXTENSION("glMapBuffer"); glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)IRR_OGL_LOAD_EXTENSION("glMapBufferRange"); glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)IRR_OGL_LOAD_EXTENSION("glUnmapBuffer"); + glFenceSync = (PFNGLFENCESYNCPROC)IRR_OGL_LOAD_EXTENSION("glFenceSync"); + glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)IRR_OGL_LOAD_EXTENSION("glClientWaitSync"); glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)IRR_OGL_LOAD_EXTENSION("glVertexAttribPointer"); glCreateShader = (PFNGLCREATESHADERPROC)IRR_OGL_LOAD_EXTENSION("glCreateShader"); glCompileShader = (PFNGLCOMPILESHADERPROC)IRR_OGL_LOAD_EXTENSION("glCompileShader"); diff --git a/src/graphics/glwrap.hpp b/src/graphics/glwrap.hpp index 9a023c230..2ed1994e1 100644 --- a/src/graphics/glwrap.hpp +++ b/src/graphics/glwrap.hpp @@ -85,6 +85,8 @@ extern PFNGLBUFFERSUBDATAPROC glBufferSubData; extern PFNGLMAPBUFFERPROC glMapBuffer; extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange; extern PFNGLUNMAPBUFFERPROC glUnmapBuffer; +extern PFNGLFENCESYNCPROC glFenceSync; +extern PFNGLCLIENTWAITSYNCPROC glClientWaitSync; extern PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer; extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; diff --git a/src/graphics/render_geometry.cpp b/src/graphics/render_geometry.cpp index 8dc71634e..7c6d63c1d 100644 --- a/src/graphics/render_geometry.cpp +++ b/src/graphics/render_geometry.cpp @@ -195,6 +195,8 @@ void renderInstancedMeshes1stPass(const std::vector &TexUnits, std::vec } } +static GLsync m_sync; + void IrrDriver::renderSolidFirstPass() { m_rtts->getFBO(FBO_NORMAL_AND_DEPTHS).Bind(); @@ -220,6 +222,7 @@ void IrrDriver::renderSolidFirstPass() ListInstancedMatAlphaRef::getInstance()->clear(); ListInstancedMatGrass::getInstance()->clear(); ListInstancedMatNormalMap::getInstance()->clear(); + glClientWaitSync(m_sync, GL_SYNC_FLUSH_COMMANDS_BIT, 0); m_scene_manager->drawAll(scene::ESNRP_SOLID); if (!UserConfigParams::m_dynamic_lights) @@ -407,6 +410,8 @@ void IrrDriver::renderSolidSecondPass() renderInstancedMeshes2ndPass( TexUnits(TexUnit(MeshShader::InstancedGrassPass2Shader::getInstance()->TU_Albedo, true)), ListInstancedMatGrass::getInstance()); + + m_sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); } } diff --git a/src/graphics/stkanimatedmesh.cpp b/src/graphics/stkanimatedmesh.cpp index e1dbe0239..b74936ccd 100644 --- a/src/graphics/stkanimatedmesh.cpp +++ b/src/graphics/stkanimatedmesh.cpp @@ -119,9 +119,7 @@ void STKAnimatedMesh::render() glBindVertexArray(0); size_t size = mb->getVertexCount() * GLmeshes[i].Stride; glBindBuffer(GL_ARRAY_BUFFER, getVBO(mb->getVertexType())); - GLbitfield bitfield = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT; - if (irr_driver->getPhase() == TRANSPARENT_PASS) - bitfield |= GL_MAP_UNSYNCHRONIZED_BIT; + GLbitfield bitfield = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT | GL_MAP_UNSYNCHRONIZED_BIT; void * buf = glMapBufferRange(GL_ARRAY_BUFFER, GLmeshes[i].vaoBaseVertex * GLmeshes[i].Stride, size, bitfield); memcpy(buf, mb->getVertices(), size); glUnmapBuffer(GL_ARRAY_BUFFER);