diff --git a/src/graphics/central_settings.cpp b/src/graphics/central_settings.cpp index 5020d7a9b..0cecaaae5 100644 --- a/src/graphics/central_settings.cpp +++ b/src/graphics/central_settings.cpp @@ -272,6 +272,11 @@ bool CentralVideoSettings::supportsIndirectInstancingRendering() const } bool CentralVideoSettings::supportsComputeShadersFiltering() const +{ + return isARBBufferStorageUsable() && isARBImageLoadStoreUsable() && isARBComputeShaderUsable(); +} + +bool CentralVideoSettings::supportsAsyncInstanceUpload() const { return isARBBufferStorageUsable() && isARBImageLoadStoreUsable(); } diff --git a/src/graphics/central_settings.hpp b/src/graphics/central_settings.hpp index 0dee55212..980c0a666 100644 --- a/src/graphics/central_settings.hpp +++ b/src/graphics/central_settings.hpp @@ -58,6 +58,7 @@ public: bool supportsGlobalIllumination() const; bool supportsIndirectInstancingRendering() const; bool supportsComputeShadersFiltering() const; + bool supportsAsyncInstanceUpload() const; // "Macro" around feature support and user config bool isShadowEnabled() const; diff --git a/src/graphics/stkanimatedmesh.cpp b/src/graphics/stkanimatedmesh.cpp index f2708057c..a91811c9a 100644 --- a/src/graphics/stkanimatedmesh.cpp +++ b/src/graphics/stkanimatedmesh.cpp @@ -181,7 +181,7 @@ void STKAnimatedMesh::updateGL() size_t size = mb->getVertexCount() * GLmeshes[i].Stride, offset = GLmeshes[i].vaoBaseVertex * GLmeshes[i].Stride; void *buf; - if (CVS->isARBBufferStorageUsable()) + if (CVS->supportsAsyncInstanceUpload()) { buf = VAOManager::getInstance()->getVBOPtr(mb->getVertexType()); buf = (char *)buf + offset; @@ -197,7 +197,7 @@ void STKAnimatedMesh::updateGL() buf = glMapBufferRange(GL_ARRAY_BUFFER, offset, size, bitfield); } memcpy(buf, mb->getVertices(), size); - if (!CVS->isARBBufferStorageUsable()) + if (!CVS->supportsAsyncInstanceUpload()) { glUnmapBuffer(GL_ARRAY_BUFFER); glBindBuffer(GL_ARRAY_BUFFER, 0); diff --git a/src/graphics/stkscenemanager.cpp b/src/graphics/stkscenemanager.cpp index 97a48d74a..e68da0f7f 100644 --- a/src/graphics/stkscenemanager.cpp +++ b/src/graphics/stkscenemanager.cpp @@ -634,7 +634,7 @@ PROFILER_POP_CPU_MARKER(); DrawElementsIndirectCommand *RSMCmdBuffer; DrawElementsIndirectCommand *GlowCmdBuffer; - if (CVS->isARBBufferStorageUsable()) + if (CVS->supportsAsyncInstanceUpload()) { InstanceBufferDualTex = (InstanceDataDualTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeDualTex); InstanceBufferThreeTex = (InstanceDataThreeTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeThreeTex); @@ -667,7 +667,7 @@ PROFILER_POP_CPU_MARKER(); #pragma omp section { size_t offset = 0, current_cmd = 0; - if (!CVS->isARBBufferStorageUsable()) + if (!CVS->supportsAsyncInstanceUpload()) { glBindBuffer(GL_ARRAY_BUFFER, VAOManager::getInstance()->getInstanceBuffer(InstanceTypeDualTex)); InstanceBufferDualTex = (InstanceDataDualTex*)glMapBufferRange(GL_ARRAY_BUFFER, 0, 10000 * sizeof(InstanceDataDualTex), GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); @@ -697,7 +697,7 @@ PROFILER_POP_CPU_MARKER(); FillInstances(MeshForSolidPass[Material::SHADERTYPE_VEGETATION], ListInstancedMatGrass::getInstance()->SolidPass, InstanceBufferDualTex, CmdBuffer, offset, current_cmd, SolidPoly); SolidPassCmd::getInstance()->Size[Material::SHADERTYPE_VEGETATION] = current_cmd - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_VEGETATION]; - if (!CVS->isARBBufferStorageUsable()) + if (!CVS->supportsAsyncInstanceUpload()) { glUnmapBuffer(GL_ARRAY_BUFFER); glBindBuffer(GL_ARRAY_BUFFER, VAOManager::getInstance()->getInstanceBuffer(InstanceTypeThreeTex)); @@ -715,7 +715,7 @@ PROFILER_POP_CPU_MARKER(); SolidPassCmd::getInstance()->Size[Material::SHADERTYPE_NORMAL_MAP] = current_cmd - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_NORMAL_MAP]; - if (!CVS->isARBBufferStorageUsable()) + if (!CVS->supportsAsyncInstanceUpload()) { glUnmapBuffer(GL_ARRAY_BUFFER); glUnmapBuffer(GL_DRAW_INDIRECT_BUFFER); @@ -725,7 +725,7 @@ PROFILER_POP_CPU_MARKER(); { size_t offset = 0, current_cmd = 0; - if (!CVS->isARBBufferStorageUsable()) + if (!CVS->supportsAsyncInstanceUpload()) { glBindBuffer(GL_ARRAY_BUFFER, VAOManager::getInstance()->getInstanceBuffer(InstanceTypeGlow)); GlowInstanceBuffer = (GlowInstanceData*)glMapBufferRange(GL_ARRAY_BUFFER, 0, 10000 * sizeof(InstanceDataDualTex), GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); @@ -749,7 +749,7 @@ PROFILER_POP_CPU_MARKER(); if (CVS->isAZDOEnabled()) GlowPassCmd::getInstance()->Size = current_cmd - GlowPassCmd::getInstance()->Offset; - if (!CVS->isARBBufferStorageUsable()) + if (!CVS->supportsAsyncInstanceUpload()) { glUnmapBuffer(GL_ARRAY_BUFFER); glUnmapBuffer(GL_DRAW_INDIRECT_BUFFER); @@ -760,7 +760,7 @@ PROFILER_POP_CPU_MARKER(); irr_driver->setPhase(SHADOW_PASS); size_t offset = 0, current_cmd = 0; - if (!CVS->isARBBufferStorageUsable()) + if (!CVS->supportsAsyncInstanceUpload()) { glBindBuffer(GL_ARRAY_BUFFER, VAOManager::getInstance()->getInstanceBuffer(InstanceTypeShadow)); ShadowInstanceBuffer = (InstanceDataSingleTex*)glMapBufferRange(GL_ARRAY_BUFFER, 0, 10000 * sizeof(InstanceDataDualTex), GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); @@ -785,7 +785,7 @@ PROFILER_POP_CPU_MARKER(); // Mat Grass GenDrawCalls(i, ListInstancedMatGrass::getInstance()->Shadows[i], ShadowInstanceBuffer, ShadowCmdBuffer, offset, current_cmd, ShadowPoly); } - if (!CVS->isARBBufferStorageUsable()) + if (!CVS->supportsAsyncInstanceUpload()) { glUnmapBuffer(GL_ARRAY_BUFFER); glUnmapBuffer(GL_DRAW_INDIRECT_BUFFER); @@ -795,7 +795,7 @@ PROFILER_POP_CPU_MARKER(); if (!m_rsm_map_available) { size_t offset = 0, current_cmd = 0; - if (!CVS->isARBBufferStorageUsable()) + if (!CVS->supportsAsyncInstanceUpload()) { glBindBuffer(GL_ARRAY_BUFFER, VAOManager::getInstance()->getInstanceBuffer(InstanceTypeRSM)); RSMInstanceBuffer = (InstanceDataSingleTex*)glMapBufferRange(GL_ARRAY_BUFFER, 0, 10000 * sizeof(InstanceDataDualTex), GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); @@ -824,7 +824,7 @@ PROFILER_POP_CPU_MARKER(); FillInstances(MeshForRSM[Material::SHADERTYPE_NORMAL_MAP], ListInstancedMatNormalMap::getInstance()->RSM, RSMInstanceBuffer, RSMCmdBuffer, offset, current_cmd, MiscPoly); RSMPassCmd::getInstance()->Size[Material::SHADERTYPE_NORMAL_MAP] = current_cmd - RSMPassCmd::getInstance()->Offset[Material::SHADERTYPE_NORMAL_MAP]; - if (!CVS->isARBBufferStorageUsable()) + if (!CVS->supportsAsyncInstanceUpload()) { glUnmapBuffer(GL_ARRAY_BUFFER); glUnmapBuffer(GL_DRAW_INDIRECT_BUFFER); @@ -835,6 +835,6 @@ PROFILER_POP_CPU_MARKER(); poly_count[SOLID_NORMAL_AND_DEPTH_PASS] += SolidPoly; poly_count[SHADOW_PASS] += ShadowPoly; - if (CVS->isARBBufferStorageUsable()) + if (CVS->supportsAsyncInstanceUpload()) glMemoryBarrier(GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT); } \ No newline at end of file diff --git a/src/graphics/stkscenemanager.hpp b/src/graphics/stkscenemanager.hpp index 03c60b384..a25ac34ff 100644 --- a/src/graphics/stkscenemanager.hpp +++ b/src/graphics/stkscenemanager.hpp @@ -21,7 +21,7 @@ public: { glGenBuffers(1, &drawindirectcmd); glBindBuffer(GL_DRAW_INDIRECT_BUFFER, drawindirectcmd); - if (CVS->isARBBufferStorageUsable()) + if (CVS->supportsAsyncInstanceUpload()) { glBufferStorage(GL_DRAW_INDIRECT_BUFFER, 10000 * sizeof(DrawElementsIndirectCommand), 0, GL_MAP_PERSISTENT_BIT | GL_MAP_WRITE_BIT); Ptr = (DrawElementsIndirectCommand *)glMapBufferRange(GL_DRAW_INDIRECT_BUFFER, 0, 10000 * sizeof(DrawElementsIndirectCommand), GL_MAP_PERSISTENT_BIT | GL_MAP_WRITE_BIT); diff --git a/src/graphics/vaomanager.cpp b/src/graphics/vaomanager.cpp index b42ed79c5..4d4ee1d41 100644 --- a/src/graphics/vaomanager.cpp +++ b/src/graphics/vaomanager.cpp @@ -21,7 +21,7 @@ VAOManager::VAOManager() { glGenBuffers(1, &instance_vbo[i]); glBindBuffer(GL_ARRAY_BUFFER, instance_vbo[i]); - if (CVS->isARBBufferStorageUsable()) + if (CVS->supportsAsyncInstanceUpload()) { glBufferStorage(GL_ARRAY_BUFFER, 10000 * sizeof(InstanceDataDualTex), 0, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT); Ptr[i] = glMapBufferRange(GL_ARRAY_BUFFER, 0, 10000 * sizeof(InstanceDataDualTex), GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT); @@ -70,7 +70,7 @@ resizeBufferIfNecessary(size_t &lastIndex, size_t newLastIndex, size_t bufferSiz GLuint newVBO; glGenBuffers(1, &newVBO); glBindBuffer(type, newVBO); - if (CVS->isARBBufferStorageUsable()) + if (CVS->supportsAsyncInstanceUpload()) { glBufferStorage(type, bufferSize *stride, 0, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT); Pointer = glMapBufferRange(type, 0, bufferSize * stride, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT); @@ -271,7 +271,7 @@ void VAOManager::append(scene::IMeshBuffer *mb, VTXTYPE tp) size_t old_idx_cnt = last_index[tp]; regenerateBuffer(tp, old_vtx_cnt + mb->getVertexCount(), old_idx_cnt + mb->getIndexCount()); - if (CVS->isARBBufferStorageUsable()) + if (CVS->supportsAsyncInstanceUpload()) { void *tmp = (char*)VBOPtr[tp] + old_vtx_cnt * getVertexPitch(tp); memcpy(tmp, mb->getVertices(), mb->getVertexCount() * getVertexPitch(tp)); @@ -281,7 +281,7 @@ void VAOManager::append(scene::IMeshBuffer *mb, VTXTYPE tp) glBindBuffer(GL_ARRAY_BUFFER, vbo[tp]); glBufferSubData(GL_ARRAY_BUFFER, old_vtx_cnt * getVertexPitch(tp), mb->getVertexCount() * getVertexPitch(tp), mb->getVertices()); } - if (CVS->isARBBufferStorageUsable()) + if (CVS->supportsAsyncInstanceUpload()) { void *tmp = (char*)IBOPtr[tp] + old_idx_cnt * sizeof(u16); memcpy(tmp, mb->getIndices(), mb->getIndexCount() * sizeof(u16));