From 269263d88629c48027d71275dd778f7b01a569f1 Mon Sep 17 00:00:00 2001 From: tylermurphy534 Date: Tue, 27 Sep 2022 21:40:20 -0400 Subject: [PATCH] destroy buffers on fence --- engine/xe_engine.cpp | 1 + engine/xe_model.cpp | 17 +++++++++++++++++ engine/xe_model.hpp | 2 ++ engine/xe_swap_chain.cpp | 5 +++++ engine/xe_swap_chain.hpp | 1 + src/chunk.cpp | 9 +++++---- src/first_app.cpp | 4 ++-- src/first_app.hpp | 2 +- src/keyboard_movement_controller.hpp | 2 +- 9 files changed, 35 insertions(+), 8 deletions(-) diff --git a/engine/xe_engine.cpp b/engine/xe_engine.cpp index 201ea81..eabbdb1 100644 --- a/engine/xe_engine.cpp +++ b/engine/xe_engine.cpp @@ -20,6 +20,7 @@ Engine::Engine(int width, int height, std::string name, const char *icon) : xeWi }; Engine::~Engine() { + xe::Model::submitDeleteQueue(); alutExit(); }; diff --git a/engine/xe_model.cpp b/engine/xe_model.cpp index dc39584..f8001fd 100644 --- a/engine/xe_model.cpp +++ b/engine/xe_model.cpp @@ -155,4 +155,21 @@ void Model::Builder::loadModel(const std::string &filepath) { } +static std::vector deleteQueue{}; + +void Model::deleteModel(Model* model) { + deleteQueue.push_back(model); +} + +void Model::submitDeleteQueue() { + for(Model* model : deleteQueue) { + if(model == nullptr) return; + try { + delete model; + } catch (int err) {} + } + deleteQueue.clear(); +} + + } \ No newline at end of file diff --git a/engine/xe_model.hpp b/engine/xe_model.hpp index b75576e..e331ed1 100644 --- a/engine/xe_model.hpp +++ b/engine/xe_model.hpp @@ -41,6 +41,8 @@ class Model { Model operator=(const Model &) = delete; static Model* createModelFromFile(const std::string &filepath); + static void deleteModel(Model* model); + static void submitDeleteQueue(); void bind(VkCommandBuffer commandBuffer); void draw(VkCommandBuffer commandBuffer); diff --git a/engine/xe_swap_chain.cpp b/engine/xe_swap_chain.cpp index 67248f4..c631209 100755 --- a/engine/xe_swap_chain.cpp +++ b/engine/xe_swap_chain.cpp @@ -87,6 +87,9 @@ VkResult SwapChain::submitCommandBuffers( if (imagesInFlight[*imageIndex] != VK_NULL_HANDLE) { vkWaitForFences(device.device(), 1, &imagesInFlight[*imageIndex], VK_TRUE, UINT64_MAX); } + + Model::submitDeleteQueue(); + imagesInFlight[*imageIndex] = inFlightFences[currentFrame]; VkSubmitInfo submitInfo = {}; @@ -105,6 +108,8 @@ VkResult SwapChain::submitCommandBuffers( submitInfo.signalSemaphoreCount = 1; submitInfo.pSignalSemaphores = signalSemaphores; + + vkResetFences(device.device(), 1, &inFlightFences[currentFrame]); if (vkQueueSubmit(device.graphicsQueue(), 1, &submitInfo, inFlightFences[currentFrame]) != VK_SUCCESS) { diff --git a/engine/xe_swap_chain.hpp b/engine/xe_swap_chain.hpp index 380bd6e..d85345b 100755 --- a/engine/xe_swap_chain.hpp +++ b/engine/xe_swap_chain.hpp @@ -2,6 +2,7 @@ #include "xe_device.hpp" #include "xe_image.hpp" +#include "xe_model.hpp" #include diff --git a/src/chunk.cpp b/src/chunk.cpp index e830c57..cda92e8 100644 --- a/src/chunk.cpp +++ b/src/chunk.cpp @@ -18,8 +18,7 @@ Chunk::Chunk(int32_t gridX, int32_t gridZ, uint32_t world_seed) Chunk::~Chunk() { if(worker.joinable()) worker.join(); - if(chunkMesh != nullptr) - delete chunkMesh; + xe::Model::deleteModel(chunkMesh); } // @@ -155,8 +154,10 @@ void Chunk::addVerticies(Chunk* c, uint8_t side, int32_t x, int32_t y, int32_t z xe::Model* Chunk::getMesh() { if(reloadRequired) { - if(chunkMesh != nullptr) - delete chunkMesh; + if(chunkMesh != nullptr) { + xe::Model::deleteModel(chunkMesh); + chunkMesh = nullptr; + } if(worker.joinable()) worker.join(); xe::Model::Builder builder{}; diff --git a/src/first_app.cpp b/src/first_app.cpp index 43047f7..63a960d 100755 --- a/src/first_app.cpp +++ b/src/first_app.cpp @@ -73,8 +73,8 @@ void FirstApp::reloadLoadedChunks(xe::GameObject& viewer) { int gridZ = static_cast(floor(gameObject.transform.translation.z / 16.f)); int newGridX = minX + x; int newGridZ = minZ + z; - if(gridX < minX || gridZ < minZ || gridX > maxX || gridZ > maxZ) - Chunk::deleteChunk(gridX, gridZ); + // if(gridX < minX || gridZ < minZ || gridX > maxX || gridZ > maxZ) + // Chunk::deleteChunk(gridX, gridZ); Chunk* chunk = Chunk::getChunk(newGridX, newGridZ); if(chunk == nullptr) { chunk = Chunk::newChunk(newGridX, newGridZ, 12345); diff --git a/src/first_app.hpp b/src/first_app.hpp index d361296..f969724 100755 --- a/src/first_app.hpp +++ b/src/first_app.hpp @@ -32,7 +32,7 @@ class FirstApp { static constexpr int WIDTH = 800; static constexpr int HEIGHT = 600; - static constexpr int RENDER_DISTANCE = 10; + static constexpr int RENDER_DISTANCE = 32; void createGameObjects(xe::GameObject& viewer); void reloadLoadedChunks(xe::GameObject& viewer); diff --git a/src/keyboard_movement_controller.hpp b/src/keyboard_movement_controller.hpp index 1cc0456..5577bbf 100644 --- a/src/keyboard_movement_controller.hpp +++ b/src/keyboard_movement_controller.hpp @@ -36,7 +36,7 @@ namespace app { xe::GameObject &viewerObject; KeyMappings keys{}; - float moveSpeed{10.f}; + float moveSpeed{30.f}; float lookSpeed{1.5f}; };