destroy buffers on fence
This commit is contained in:
parent
9b60b862e5
commit
269263d886
9 changed files with 35 additions and 8 deletions
|
@ -20,6 +20,7 @@ Engine::Engine(int width, int height, std::string name, const char *icon) : xeWi
|
||||||
};
|
};
|
||||||
|
|
||||||
Engine::~Engine() {
|
Engine::~Engine() {
|
||||||
|
xe::Model::submitDeleteQueue();
|
||||||
alutExit();
|
alutExit();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -155,4 +155,21 @@ void Model::Builder::loadModel(const std::string &filepath) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::vector<Model*> 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -41,6 +41,8 @@ class Model {
|
||||||
Model operator=(const Model &) = delete;
|
Model operator=(const Model &) = delete;
|
||||||
|
|
||||||
static Model* createModelFromFile(const std::string &filepath);
|
static Model* createModelFromFile(const std::string &filepath);
|
||||||
|
static void deleteModel(Model* model);
|
||||||
|
static void submitDeleteQueue();
|
||||||
|
|
||||||
void bind(VkCommandBuffer commandBuffer);
|
void bind(VkCommandBuffer commandBuffer);
|
||||||
void draw(VkCommandBuffer commandBuffer);
|
void draw(VkCommandBuffer commandBuffer);
|
||||||
|
|
|
@ -87,6 +87,9 @@ VkResult SwapChain::submitCommandBuffers(
|
||||||
if (imagesInFlight[*imageIndex] != VK_NULL_HANDLE) {
|
if (imagesInFlight[*imageIndex] != VK_NULL_HANDLE) {
|
||||||
vkWaitForFences(device.device(), 1, &imagesInFlight[*imageIndex], VK_TRUE, UINT64_MAX);
|
vkWaitForFences(device.device(), 1, &imagesInFlight[*imageIndex], VK_TRUE, UINT64_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Model::submitDeleteQueue();
|
||||||
|
|
||||||
imagesInFlight[*imageIndex] = inFlightFences[currentFrame];
|
imagesInFlight[*imageIndex] = inFlightFences[currentFrame];
|
||||||
|
|
||||||
VkSubmitInfo submitInfo = {};
|
VkSubmitInfo submitInfo = {};
|
||||||
|
@ -105,6 +108,8 @@ VkResult SwapChain::submitCommandBuffers(
|
||||||
submitInfo.signalSemaphoreCount = 1;
|
submitInfo.signalSemaphoreCount = 1;
|
||||||
submitInfo.pSignalSemaphores = signalSemaphores;
|
submitInfo.pSignalSemaphores = signalSemaphores;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
vkResetFences(device.device(), 1, &inFlightFences[currentFrame]);
|
vkResetFences(device.device(), 1, &inFlightFences[currentFrame]);
|
||||||
if (vkQueueSubmit(device.graphicsQueue(), 1, &submitInfo, inFlightFences[currentFrame]) !=
|
if (vkQueueSubmit(device.graphicsQueue(), 1, &submitInfo, inFlightFences[currentFrame]) !=
|
||||||
VK_SUCCESS) {
|
VK_SUCCESS) {
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include "xe_device.hpp"
|
#include "xe_device.hpp"
|
||||||
#include "xe_image.hpp"
|
#include "xe_image.hpp"
|
||||||
|
#include "xe_model.hpp"
|
||||||
|
|
||||||
#include <vulkan/vulkan.h>
|
#include <vulkan/vulkan.h>
|
||||||
|
|
||||||
|
|
|
@ -18,8 +18,7 @@ Chunk::Chunk(int32_t gridX, int32_t gridZ, uint32_t world_seed)
|
||||||
Chunk::~Chunk() {
|
Chunk::~Chunk() {
|
||||||
if(worker.joinable())
|
if(worker.joinable())
|
||||||
worker.join();
|
worker.join();
|
||||||
if(chunkMesh != nullptr)
|
xe::Model::deleteModel(chunkMesh);
|
||||||
delete 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() {
|
xe::Model* Chunk::getMesh() {
|
||||||
if(reloadRequired) {
|
if(reloadRequired) {
|
||||||
if(chunkMesh != nullptr)
|
if(chunkMesh != nullptr) {
|
||||||
delete chunkMesh;
|
xe::Model::deleteModel(chunkMesh);
|
||||||
|
chunkMesh = nullptr;
|
||||||
|
}
|
||||||
if(worker.joinable())
|
if(worker.joinable())
|
||||||
worker.join();
|
worker.join();
|
||||||
xe::Model::Builder builder{};
|
xe::Model::Builder builder{};
|
||||||
|
|
|
@ -73,8 +73,8 @@ void FirstApp::reloadLoadedChunks(xe::GameObject& viewer) {
|
||||||
int gridZ = static_cast<int>(floor(gameObject.transform.translation.z / 16.f));
|
int gridZ = static_cast<int>(floor(gameObject.transform.translation.z / 16.f));
|
||||||
int newGridX = minX + x;
|
int newGridX = minX + x;
|
||||||
int newGridZ = minZ + z;
|
int newGridZ = minZ + z;
|
||||||
if(gridX < minX || gridZ < minZ || gridX > maxX || gridZ > maxZ)
|
// if(gridX < minX || gridZ < minZ || gridX > maxX || gridZ > maxZ)
|
||||||
Chunk::deleteChunk(gridX, gridZ);
|
// Chunk::deleteChunk(gridX, gridZ);
|
||||||
Chunk* chunk = Chunk::getChunk(newGridX, newGridZ);
|
Chunk* chunk = Chunk::getChunk(newGridX, newGridZ);
|
||||||
if(chunk == nullptr) {
|
if(chunk == nullptr) {
|
||||||
chunk = Chunk::newChunk(newGridX, newGridZ, 12345);
|
chunk = Chunk::newChunk(newGridX, newGridZ, 12345);
|
||||||
|
|
|
@ -32,7 +32,7 @@ class FirstApp {
|
||||||
|
|
||||||
static constexpr int WIDTH = 800;
|
static constexpr int WIDTH = 800;
|
||||||
static constexpr int HEIGHT = 600;
|
static constexpr int HEIGHT = 600;
|
||||||
static constexpr int RENDER_DISTANCE = 10;
|
static constexpr int RENDER_DISTANCE = 32;
|
||||||
|
|
||||||
void createGameObjects(xe::GameObject& viewer);
|
void createGameObjects(xe::GameObject& viewer);
|
||||||
void reloadLoadedChunks(xe::GameObject& viewer);
|
void reloadLoadedChunks(xe::GameObject& viewer);
|
||||||
|
|
|
@ -36,7 +36,7 @@ namespace app {
|
||||||
xe::GameObject &viewerObject;
|
xe::GameObject &viewerObject;
|
||||||
|
|
||||||
KeyMappings keys{};
|
KeyMappings keys{};
|
||||||
float moveSpeed{10.f};
|
float moveSpeed{30.f};
|
||||||
float lookSpeed{1.5f};
|
float lookSpeed{1.5f};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue