From 85847fd2e0dd53eb226f6f8f149d2e000c77525e Mon Sep 17 00:00:00 2001 From: kearwood Date: Wed, 13 Jul 2022 23:24:46 -0700 Subject: [PATCH] Beginning refactoring of KRTexture for Vulkan. Added KRTexture::TextureHandle. --- kraken/KRCamera.cpp | 3 +++ kraken/KRTexture.cpp | 23 +++++++++++++++-------- kraken/KRTexture.h | 11 ++++++++++- kraken/KRTextureManager.cpp | 3 +++ 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/kraken/KRCamera.cpp b/kraken/KRCamera.cpp index 196238e..6967aa0 100755 --- a/kraken/KRCamera.cpp +++ b/kraken/KRCamera.cpp @@ -587,6 +587,9 @@ void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface) // GLDEBUG(glBindTexture(GL_TEXTURE_2D, 0)); // } + // TODO - Test code for Vulkan conversion, remove once texture streaming working + // m_pContext->getTextureManager()->selectTexture(0, m_pContext->getTextureManager()->getTexture("font"), 0.0f, KRTexture::TEXTURE_USAGE_UI); + const char *szText = settings.m_debug_text.c_str(); std::string debug_text; diff --git a/kraken/KRTexture.cpp b/kraken/KRTexture.cpp index 69cad1e..ad6a99b 100755 --- a/kraken/KRTexture.cpp +++ b/kraken/KRTexture.cpp @@ -56,19 +56,26 @@ KRTexture::~KRTexture() void KRTexture::releaseHandles() { long mem_size = getMemSize(); + KRDeviceManager* deviceManager = getContext().getDeviceManager(); while(m_handle_lock.test_and_set()); // Spin lock - if(m_iNewHandle != 0) { - GLDEBUG(glDeleteTextures(1, &m_iNewHandle)); - m_iNewHandle = 0; - m_newTextureMemUsed = 0; + for (TextureHandle t : m_newHandles) { + std::unique_ptr& device = deviceManager->getDevice(t.device); + VmaAllocator allocator = device->getAllocator(); + vmaDestroyImage(allocator, t.image, t.allocation); } - if(m_iHandle != 0) { - GLDEBUG(glDeleteTextures(1, &m_iHandle)); - m_iHandle = 0; - m_textureMemUsed = 0; + m_newHandles.clear(); + m_newTextureMemUsed = 0; + + for (TextureHandle t : m_handles) { + std::unique_ptr& device = deviceManager->getDevice(t.device); + VmaAllocator allocator = device->getAllocator(); + vmaDestroyImage(allocator, t.image, t.allocation); } + m_handles.clear(); + m_textureMemUsed = 0; + m_current_lod_max_dim = 0; m_new_lod_max_dim = 0; diff --git a/kraken/KRTexture.h b/kraken/KRTexture.h index 6613593..4572f0e 100755 --- a/kraken/KRTexture.h +++ b/kraken/KRTexture.h @@ -91,7 +91,16 @@ protected: virtual bool createGLTexture(int lod_max_dim) = 0; GLuint getHandle(); - + struct TextureHandle { + VkImage image; + KrDeviceHandle device; + VmaAllocation allocation; + }; + + std::vector m_handles; + std::vector m_newHandles; + + // TODO - Remove m_iHandle and m_iNewHandle once Vulkan refactoring complete GLuint m_iHandle; GLuint m_iNewHandle; std::atomic_flag m_handle_lock; diff --git a/kraken/KRTextureManager.cpp b/kraken/KRTextureManager.cpp index 9821a7b..377e452 100755 --- a/kraken/KRTextureManager.cpp +++ b/kraken/KRTextureManager.cpp @@ -82,7 +82,10 @@ void KRTextureManager::_setActiveTexture(int i) { if(m_iActiveTexture != i) { m_iActiveTexture = i; + /* + // TODO - Vulkan refactoring GLDEBUG(glActiveTexture(GL_TEXTURE0 + i)); + */ } }