From ab195e13233ba86eda694640d9ecf0e5fe3acdf4 Mon Sep 17 00:00:00 2001 From: kearwood Date: Mon, 3 Oct 2022 23:05:05 -0700 Subject: [PATCH] Implement MIP Level streaming helper functions --- kraken/KRDevice.cpp | 15 ++++++++++++++- kraken/KRDevice.h | 4 +++- kraken/KRTextureTGA.cpp | 2 +- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/kraken/KRDevice.cpp b/kraken/KRDevice.cpp index 0543775..3b0a15d 100644 --- a/kraken/KRDevice.cpp +++ b/kraken/KRDevice.cpp @@ -812,13 +812,26 @@ void KRDevice::graphicsUpload(VkCommandBuffer& commandBuffer, void* data, size_t m_graphicsStagingBuffer.usage += size; } -void KRDevice::streamUpload(void* data, size_t size, Vector2i dimensions, VkImage destination) +void KRDevice::streamUpload(void* data, size_t size, Vector3i dimensions, VkImage destination) { checkFlushStreamBuffer(size); memcpy((uint8_t*)m_streamingStagingBuffer.data + m_streamingStagingBuffer.usage, data, size); + + streamUploadImpl(size, dimensions, destination, 0, 1); +} +void KRDevice::streamUpload(KRDataBlock& data, VkImage destination, size_t offset, size_t size, Vector3i dimensions, uint32_t baseMipLevel, uint32_t levelCount) +{ + checkFlushStreamBuffer(size); + data.copy((uint8_t*)m_streamingStagingBuffer.data + m_streamingStagingBuffer.usage, offset, size); + + streamUploadImpl(size, dimensions, destination, 0, 1); +} + +void KRDevice::streamUploadImpl(size_t size, Vector3i dimensions, VkImage destination, uint32_t baseMipLevel, uint32_t levelCount) +{ // TODO - Refactor memory barriers into helper functions VkPipelineStageFlags sourceStage; VkPipelineStageFlags destinationStage; diff --git a/kraken/KRDevice.h b/kraken/KRDevice.h index b92f86e..ded7483 100644 --- a/kraken/KRDevice.h +++ b/kraken/KRDevice.h @@ -76,8 +76,9 @@ public: void streamStart(); void streamUpload(KRDataBlock& data, VkBuffer destination); + void streamUpload(KRDataBlock& data, VkImage destination, size_t offset, size_t size, Vector3i dimensions, uint32_t baseMipLevel, uint32_t levelCount); void streamUpload(void* data, size_t size, VkBuffer destination); - void streamUpload(void* data, size_t size, Vector2i dimensions, VkImage destination); + void streamUpload(void* data, size_t size, Vector3i dimensions, VkImage destination); void streamEnd(); void graphicsUpload(VkCommandBuffer& commandBuffer, KRDataBlock& data, VkBuffer destination); @@ -144,4 +145,5 @@ private: #endif // KRENGINE_DEBUG_GPU_LABELS ); bool initDescriptorPool(); + void streamUploadImpl(size_t size, Vector3i dimensions, VkImage destination, uint32_t baseMipLevel, uint32_t levelCount); }; diff --git a/kraken/KRTextureTGA.cpp b/kraken/KRTextureTGA.cpp index 807587d..fa7ce5c 100755 --- a/kraken/KRTextureTGA.cpp +++ b/kraken/KRTextureTGA.cpp @@ -129,7 +129,7 @@ bool KRTextureTGA::uploadTexture(KRDevice& device, VkImage& image, int lod_max_d return false; // Mapped colors not supported } - Vector2i dimensions = { pHeader->width, pHeader->height }; + Vector3i dimensions = { pHeader->width, pHeader->height, 1 }; switch (pHeader->imagetype) { case 2: // rgb