From 5963ca515445ca725f692523ef12e8a924d0cfbc Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Thu, 29 May 2014 00:14:18 -0700 Subject: [PATCH] Refactoring of streamer code to integrate texture and vbo memory management in progress. --- KREngine/kraken/KRContext.cpp | 4 ++-- KREngine/kraken/KRMeshManager.cpp | 35 +------------------------------ KREngine/kraken/KRModel.cpp | 2 +- KREngine/kraken/KRScene.cpp | 11 ++++++++-- 4 files changed, 13 insertions(+), 39 deletions(-) diff --git a/KREngine/kraken/KRContext.cpp b/KREngine/kraken/KRContext.cpp index 14b95ff..31a81d0 100644 --- a/KREngine/kraken/KRContext.cpp +++ b/KREngine/kraken/KRContext.cpp @@ -334,8 +334,8 @@ void KRContext::getMemoryStats(long &free_memory) void KRContext::doStreaming() { if(m_streamingEnabled) { - long memoryRemaining = KRENGINE_TARGET_TEXTURE_MEM_MAX + KRENGINE_MAX_VBO_MEM; - long memoryRemainingThisFrame = KRENGINE_MAX_TEXTURE_MEM + KRENGINE_MAX_VBO_MEM - m_pTextureManager->getMemUsed() - m_pMeshManager->getMemUsed(); + long memoryRemaining = KRENGINE_TARGET_TEXTURE_MEM_MAX/* + KRENGINE_MAX_VBO_MEM*/; + long memoryRemainingThisFrame = KRENGINE_MAX_TEXTURE_MEM/* + KRENGINE_MAX_VBO_MEM */ - m_pTextureManager->getMemUsed() - m_pMeshManager->getMemUsed(); m_pMeshManager->doStreaming(memoryRemaining, memoryRemainingThisFrame); m_pTextureManager->doStreaming(memoryRemaining, memoryRemainingThisFrame); } diff --git a/KREngine/kraken/KRMeshManager.cpp b/KREngine/kraken/KRMeshManager.cpp index df3b5e3..0928cf9 100644 --- a/KREngine/kraken/KRMeshManager.cpp +++ b/KREngine/kraken/KRMeshManager.cpp @@ -153,39 +153,6 @@ void KRMeshManager::unbindVBO() { } } -/* -void KRMeshManager::releaseVBO(KRDataBlock &data) -{ - if(m_currentVBO) { - if(m_currentVBO->m_data == &data) { - unbindVBO(); - } - } - - if(m_vbosActive.find(&data) != m_vbosActive.end()) { - KRContext::Log(KRContext::LOG_LEVEL_WARNING, "glFinish called due to releasing a VBO that is active in the current frame."); - GLDEBUG(glFinish()); - - // The VBO is active - KRVBOData *vbo_to_release = m_vbosActive[&data]; - m_vbosActive.erase(&data); - - m_vboMemUsed -= vbo_to_release->getSize(); - switch(vbo_to_release->getType()) { - case KRVBOData::STREAMING: - vbo_to_release->unload(); - break; - case KRVBOData::TEMPORARY: - delete vbo_to_release; - break; - case KRVBOData::CONSTANT: - // CONSTANT VBO's are not unloaded - break; - } - } -} -*/ - void KRMeshManager::bindVBO(KRVBOData *vbo_data, float lodCoverage) { vbo_data->resetPoolExpiry(lodCoverage); @@ -239,7 +206,7 @@ void KRMeshManager::startFrame(float deltaTime) if(m_streamerComplete) { assert(m_activeVBOs_streamer_copy.size() == 0); // The streamer should have emptied this if it really did complete - const long KRENGINE_VBO_EXPIRY_FRAMES = 30; + const long KRENGINE_VBO_EXPIRY_FRAMES = 3; std::set expiredVBOs; for(auto itr=m_vbosActive.begin(); itr != m_vbosActive.end(); itr++) { diff --git a/KREngine/kraken/KRModel.cpp b/KREngine/kraken/KRModel.cpp index 421b83f..73506d1 100644 --- a/KREngine/kraken/KRModel.cpp +++ b/KREngine/kraken/KRModel.cpp @@ -149,7 +149,7 @@ void KRModel::loadModel() { void KRModel::render(KRCamera *pCamera, std::vector &point_lights, std::vector &directional_lights, std::vector&spot_lights, const KRViewport &viewport, KRNode::RenderPass renderPass) { - if(m_lod_visible == LOD_VISIBILITY_PRESTREAM && renderPass == KRNode::RENDER_PASS_PRESTREAM) { + if(m_lod_visible >= LOD_VISIBILITY_PRESTREAM && renderPass == KRNode::RENDER_PASS_PRESTREAM) { preStream(viewport); } diff --git a/KREngine/kraken/KRScene.cpp b/KREngine/kraken/KRScene.cpp index 76e6f5b..a75c570 100644 --- a/KREngine/kraken/KRScene.cpp +++ b/KREngine/kraken/KRScene.cpp @@ -213,8 +213,15 @@ void KRScene::render(KROctreeNode *pOctreeNode, unordered_map &visi pOctreeNode->m_occlusionQuery = 0; } } else { - - if(viewport.visible(pOctreeNode->getBounds())) { + bool in_viewport = false; + if(renderPass == KRNode::RENDER_PASS_PRESTREAM) { + // When pre-streaming, objects are streamed in behind and in-front of the camera + KRAABB viewportExtents = KRAABB(viewport.getCameraPosition() - KRVector3(pCamera->settings.getPerspectiveFarZ()), viewport.getCameraPosition() + KRVector3(pCamera->settings.getPerspectiveFarZ())); + in_viewport = octreeBounds.intersects(viewportExtents); + } else { + in_viewport = viewport.visible(pOctreeNode->getBounds()); + } + if(in_viewport) { // ----====---- Rendering and occlusion test pass ----====---- bool bVisible = false;